1     type Matrix4<T> = struct
2         m11 : T
3         m12 : T
4         m13 : T
5         m14 : T
6         m21 : T
7         m22 : T
8         m23 : T
9         m24 : T
10        m31 : T
11        m32 : T
12        m33 : T
13        m34 : T
14        m41 : T
15        m42 : T
16        m43 : T
17        m44 : T
18    
19        def transpose = Matrix4 m11 m21 m31 m41
20                                m12 m22 m32 m42
21                                m13 m23 m33 m43
22                                m14 m24 m34 m44
23    
24        def to_string =
25            "$m11 $m12 $m13 $m14 $m21 $m22 $m23 $m24 $m31 $m32 $m33 $m34 $m41 $m42 $m43 $m44"
26    
27        def display =
28            "$m11 $m12 $m13 $m14\n$m21 $m22 $m23 $m24\n$m31 $m32 $m33 $m34\n$m41 $m42 $m43 $m44"
29    
30    type Matrix4<T> where T : Number
31        def (*) rhs =
32            let r11 = m11 * rhs.m11 + m12 * rhs.m21 + m13 * rhs.m31 + m14 * rhs.m41
33            let r12 = m11 * rhs.m12 + m12 * rhs.m22 + m13 * rhs.m32 + m14 * rhs.m42
34            let r13 = m11 * rhs.m13 + m12 * rhs.m23 + m13 * rhs.m33 + m14 * rhs.m43
35            let r14 = m11 * rhs.m14 + m12 * rhs.m24 + m13 * rhs.m34 + m14 * rhs.m44
36            let r21 = m21 * rhs.m11 + m22 * rhs.m21 + m23 * rhs.m31 + m24 * rhs.m41
37            let r22 = m21 * rhs.m12 + m22 * rhs.m22 + m23 * rhs.m32 + m24 * rhs.m42
38            let r23 = m21 * rhs.m13 + m22 * rhs.m23 + m23 * rhs.m33 + m24 * rhs.m43
39            let r24 = m21 * rhs.m14 + m22 * rhs.m24 + m23 * rhs.m34 + m24 * rhs.m44
40            let r31 = m31 * rhs.m11 + m32 * rhs.m21 + m33 * rhs.m31 + m34 * rhs.m41
41            let r32 = m31 * rhs.m12 + m32 * rhs.m22 + m33 * rhs.m32 + m34 * rhs.m42
42            let r33 = m31 * rhs.m13 + m32 * rhs.m23 + m33 * rhs.m33 + m34 * rhs.m43
43            let r34 = m31 * rhs.m14 + m32 * rhs.m24 + m33 * rhs.m34 + m34 * rhs.m44
44            let r41 = m41 * rhs.m11 + m42 * rhs.m21 + m43 * rhs.m31 + m44 * rhs.m41
45            let r42 = m41 * rhs.m12 + m42 * rhs.m22 + m43 * rhs.m32 + m44 * rhs.m42
46            let r43 = m41 * rhs.m13 + m42 * rhs.m23 + m43 * rhs.m33 + m44 * rhs.m43
47            let r44 = m41 * rhs.m14 + m42 * rhs.m24 + m43 * rhs.m34 + m44 * rhs.m44
48    
49            Matrix4 r11 r12 r13 r14
50                    r21 r22 r23 r24
51                    r31 r32 r33 r34
52                    r41 r42 r43 r44
53    
54        def (*) (rhs : Vector4<T>) =
55            let x = m11 * rhs.x + m12 * rhs.y + m13 * rhs.z + m14 * rhs.w
56            let y = m21 * rhs.x + m22 * rhs.y + m23 * rhs.z + m24 * rhs.w
57            let z = m31 * rhs.x + m32 * rhs.y + m33 * rhs.z + m34 * rhs.w
58            let w = m41 * rhs.x + m42 * rhs.y + m43 * rhs.z + m44 * rhs.w
59    
60            Vector4 x y z w
61    
62        def (/) (rhs : T) =
63            let r11 = m11 / rhs
64            let r12 = m12 / rhs
65            let r13 = m13 / rhs
66            let r14 = m14 / rhs
67            let r21 = m21 / rhs
68            let r22 = m22 / rhs
69            let r23 = m23 / rhs
70            let r24 = m24 / rhs
71            let r31 = m31 / rhs
72            let r32 = m32 / rhs
73            let r33 = m33 / rhs
74            let r34 = m34 / rhs
75            let r41 = m41 / rhs
76            let r42 = m42 / rhs
77            let r43 = m43 / rhs
78            let r44 = m44 / rhs
79    
80            Matrix4 r11 r12 r13 r14
81                    r21 r22 r23 r24
82                    r31 r32 r33 r34
83                    r41 r42 r43 r44
84    
85        def rotation = Matrix3 m11 m12 m13
86                               m21 m22 m23
87                               m31 m32 m33
88    
89        def determinant =
90            let b = Matrix3 m22 m23 m24 m32 m33 m34 m42 m43 m44
91            let c = Matrix3 m21 m23 m24 m31 m33 m34 m41 m43 m44
92            let d = Matrix3 m21 m22 m24 m31 m32 m34 m41 m42 m44
93            let e = Matrix3 m21 m22 m23 m31 m32 m33 m41 m42 m43
94            let db = b.determinant
95            let dc = c.determinant
96            let dd = d.determinant
97            let de = e.determinant
98    
99            m11 * db - m12 * dc + m13 * dd - m14 * de
100   
101       def adjugate =
102           let r11 = -m24 * m33 * m42
103                     + m23 * m34 * m42
104                     + m24 * m32 * m43
105                     - m22 * m34 * m43
106                     - m23 * m32 * m44
107                     + m22 * m33 * m44
108           let r12 = m14 * m33 * m42
109                     - m13 * m34 * m42
110                     - m14 * m32 * m43
111                     + m12 * m34 * m43
112                     + m13 * m32 * m44
113                     - m12 * m33 * m44
114           let r13 = -m14 * m23 * m42
115                     + m13 * m24 * m42
116                     + m14 * m22 * m43
117                     - m12 * m24 * m43
118                     - m13 * m22 * m44
119                     + m12 * m23 * m44
120           let r14 = m14 * m23 * m32
121                     - m13 * m24 * m32
122                     - m14 * m22 * m33
123                     + m12 * m24 * m33
124                     + m13 * m22 * m34
125                     - m12 * m23 * m34
126           let r21 = m24 * m33 * m41
127                     - m23 * m34 * m41
128                     - m24 * m31 * m43
129                     + m21 * m34 * m43
130                     + m23 * m31 * m44
131                     - m21 * m33 * m44
132           let r22 = -m14 * m33 * m41
133                     + m13 * m34 * m41
134                     + m14 * m31 * m43
135                     - m11 * m34 * m43
136                     - m13 * m31 * m44
137                     + m11 * m33 * m44
138           let r23 = m14 * m23 * m41
139                     - m13 * m24 * m41
140                     - m14 * m21 * m43
141                     + m11 * m24 * m43
142                     + m13 * m21 * m44
143                     - m11 * m23 * m44
144           let r24 = -m14 * m23 * m31
145                     + m13 * m24 * m31
146                     + m14 * m21 * m33
147                     - m11 * m24 * m33
148                     - m13 * m21 * m34
149                     + m11 * m23 * m34
150           let r31 = -m24 * m32 * m41
151                     + m22 * m34 * m41
152                     + m24 * m31 * m42
153                     - m21 * m34 * m42
154                     - m22 * m31 * m44
155                     + m21 * m32 * m44
156           let r32 = m14 * m32 * m41
157                     - m12 * m34 * m41
158                     - m14 * m31 * m42
159                     + m11 * m34 * m42
160                     + m12 * m31 * m44
161                     - m11 * m32 * m44
162           let r33 = -m14 * m22 * m41
163                     + m12 * m24 * m41
164                     + m14 * m21 * m42
165                     - m11 * m24 * m42
166                     - m12 * m21 * m44
167                     + m11 * m22 * m44
168           let r34 = m14 * m22 * m31
169                     - m12 * m24 * m31
170                     - m14 * m21 * m32
171                     + m11 * m24 * m32
172                     + m12 * m21 * m34
173                     - m11 * m22 * m34
174           let r41 = m23 * m32 * m41
175                     - m22 * m33 * m41
176                     - m23 * m31 * m42
177                     + m21 * m33 * m42
178                     + m22 * m31 * m43
179                     - m21 * m32 * m43
180           let r42 = -m13 * m32 * m41
181                     + m12 * m33 * m41
182                     + m13 * m31 * m42
183                     - m11 * m33 * m42
184                     - m12 * m31 * m43
185                     + m11 * m32 * m43
186           let r43 = m13 * m22 * m41
187                     - m12 * m23 * m41
188                     - m13 * m21 * m42
189                     + m11 * m23 * m42
190                     + m12 * m21 * m43
191                     - m11 * m22 * m43
192           let r44 = -m13 * m22 * m31
193                     + m12 * m23 * m31
194                     + m13 * m21 * m32
195                     - m11 * m23 * m32
196                     - m12 * m21 * m33
197                     + m11 * m22 * m33
198   
199           Matrix4 r11 r12 r13 r14
200                   r21 r22 r23 r24
201                   r31 r32 r33 r34
202                   r41 r42 r43 r44
203   
204   type Matrix4<T> where T : Real
205       def inverse = adjugate / determinant
206   
207   type Matrix3<T> where T : Number
208       def to_matrix4 = Matrix4<T> m11 m12 m13 0
209                                   m21 m22 m23 0
210                                   m31 m32 m33 0
211                                   0   0   0   1
212   
213   object Matrix4<T> =
214       val identity = Matrix4<T> 1 0 0 0
215                                 0 1 0 0
216                                 0 0 1 0
217                                 0 0 0 1
218   
219   object Matrix4 =
220       def parse (s : String) =
221           let xs = s.split ' ' |> map { f32.parse _ }
222   
223           Matrix4 xs[0]  xs[1]  xs[2]  xs[3]
224                   xs[4]  xs[5]  xs[6]  xs[7]
225                   xs[8]  xs[9]  xs[10] xs[11]
226                   xs[12] xs[13] xs[14] xs[15]
227