@@ -60,6 +60,86 @@ namespace FCT
6060 };
6161 *this = *this * trans;
6262 }
63+
64+ Mat4 transpose () const
65+ {
66+ return Mat4 (
67+ m[0 ], m[4 ], m[8 ], m[12 ],
68+ m[1 ], m[5 ], m[9 ], m[13 ],
69+ m[2 ], m[6 ], m[10 ], m[14 ],
70+ m[3 ], m[7 ], m[11 ], m[15 ]
71+ );
72+ }
73+
74+ Mat4 inverse () const
75+ {
76+ Mat4 inv;
77+ float det;
78+
79+ inv.m [0 ] = m[5 ] * m[10 ] * m[15 ] - m[5 ] * m[11 ] * m[14 ] - m[9 ] * m[6 ] * m[15 ] +
80+ m[9 ] * m[7 ] * m[14 ] + m[13 ] * m[6 ] * m[11 ] - m[13 ] * m[7 ] * m[10 ];
81+
82+ inv.m [4 ] = -m[4 ] * m[10 ] * m[15 ] + m[4 ] * m[11 ] * m[14 ] + m[8 ] * m[6 ] * m[15 ] -
83+ m[8 ] * m[7 ] * m[14 ] - m[12 ] * m[6 ] * m[11 ] + m[12 ] * m[7 ] * m[10 ];
84+
85+ inv.m [8 ] = m[4 ] * m[9 ] * m[15 ] - m[4 ] * m[11 ] * m[13 ] - m[8 ] * m[5 ] * m[15 ] +
86+ m[8 ] * m[7 ] * m[13 ] + m[12 ] * m[5 ] * m[11 ] - m[12 ] * m[7 ] * m[9 ];
87+
88+ inv.m [12 ] = -m[4 ] * m[9 ] * m[14 ] + m[4 ] * m[10 ] * m[13 ] + m[8 ] * m[5 ] * m[14 ] -
89+ m[8 ] * m[6 ] * m[13 ] - m[12 ] * m[5 ] * m[10 ] + m[12 ] * m[6 ] * m[9 ];
90+
91+ inv.m [1 ] = -m[1 ] * m[10 ] * m[15 ] + m[1 ] * m[11 ] * m[14 ] + m[9 ] * m[2 ] * m[15 ] -
92+ m[9 ] * m[3 ] * m[14 ] - m[13 ] * m[2 ] * m[11 ] + m[13 ] * m[3 ] * m[10 ];
93+
94+ inv.m [5 ] = m[0 ] * m[10 ] * m[15 ] - m[0 ] * m[11 ] * m[14 ] - m[8 ] * m[2 ] * m[15 ] +
95+ m[8 ] * m[3 ] * m[14 ] + m[12 ] * m[2 ] * m[11 ] - m[12 ] * m[3 ] * m[10 ];
96+
97+ inv.m [9 ] = -m[0 ] * m[9 ] * m[15 ] + m[0 ] * m[11 ] * m[13 ] + m[8 ] * m[1 ] * m[15 ] -
98+ m[8 ] * m[3 ] * m[13 ] - m[12 ] * m[1 ] * m[11 ] + m[12 ] * m[3 ] * m[9 ];
99+
100+ inv.m [13 ] = m[0 ] * m[9 ] * m[14 ] - m[0 ] * m[10 ] * m[13 ] - m[8 ] * m[1 ] * m[14 ] +
101+ m[8 ] * m[2 ] * m[13 ] + m[12 ] * m[1 ] * m[10 ] - m[12 ] * m[2 ] * m[9 ];
102+
103+ inv.m [2 ] = m[1 ] * m[6 ] * m[15 ] - m[1 ] * m[7 ] * m[14 ] - m[5 ] * m[2 ] * m[15 ] +
104+ m[5 ] * m[3 ] * m[14 ] + m[13 ] * m[2 ] * m[7 ] - m[13 ] * m[3 ] * m[6 ];
105+
106+ inv.m [6 ] = -m[0 ] * m[6 ] * m[15 ] + m[0 ] * m[7 ] * m[14 ] + m[4 ] * m[2 ] * m[15 ] -
107+ m[4 ] * m[3 ] * m[14 ] - m[12 ] * m[2 ] * m[7 ] + m[12 ] * m[3 ] * m[6 ];
108+
109+ inv.m [10 ] = m[0 ] * m[5 ] * m[15 ] - m[0 ] * m[7 ] * m[13 ] - m[4 ] * m[1 ] * m[15 ] +
110+ m[4 ] * m[3 ] * m[13 ] + m[12 ] * m[1 ] * m[7 ] - m[12 ] * m[3 ] * m[5 ];
111+
112+ inv.m [14 ] = -m[0 ] * m[5 ] * m[14 ] + m[0 ] * m[6 ] * m[13 ] + m[4 ] * m[1 ] * m[14 ] -
113+ m[4 ] * m[2 ] * m[13 ] - m[12 ] * m[1 ] * m[6 ] + m[12 ] * m[2 ] * m[5 ];
114+
115+ inv.m [3 ] = -m[1 ] * m[6 ] * m[11 ] + m[1 ] * m[7 ] * m[10 ] + m[5 ] * m[2 ] * m[11 ] -
116+ m[5 ] * m[3 ] * m[10 ] - m[9 ] * m[2 ] * m[7 ] + m[9 ] * m[3 ] * m[6 ];
117+
118+ inv.m [7 ] = m[0 ] * m[6 ] * m[11 ] - m[0 ] * m[7 ] * m[10 ] - m[4 ] * m[2 ] * m[11 ] +
119+ m[4 ] * m[3 ] * m[10 ] + m[8 ] * m[2 ] * m[7 ] - m[8 ] * m[3 ] * m[6 ];
120+
121+ inv.m [11 ] = -m[0 ] * m[5 ] * m[11 ] + m[0 ] * m[7 ] * m[9 ] + m[4 ] * m[1 ] * m[11 ] -
122+ m[4 ] * m[3 ] * m[9 ] - m[8 ] * m[1 ] * m[7 ] + m[8 ] * m[3 ] * m[5 ];
123+
124+ inv.m [15 ] = m[0 ] * m[5 ] * m[10 ] - m[0 ] * m[6 ] * m[9 ] - m[4 ] * m[1 ] * m[10 ] +
125+ m[4 ] * m[2 ] * m[9 ] + m[8 ] * m[1 ] * m[6 ] - m[8 ] * m[2 ] * m[5 ];
126+
127+ det = m[0 ] * inv.m [0 ] + m[1 ] * inv.m [4 ] + m[2 ] * inv.m [8 ] + m[3 ] * inv.m [12 ];
128+
129+ if (det == 0 .0f )
130+ {
131+ inv.identity ();
132+ return inv;
133+ }
134+
135+ det = 1 .0f / det;
136+ for (int i = 0 ; i < 16 ; i++)
137+ {
138+ inv.m [i] *= det;
139+ }
140+
141+ return inv;
142+ }
63143 void rotateX (float degrees)
64144 {
65145 float radians = degrees * 3 .14159265f / 180 .0f ;
0 commit comments