43 T inv[Rows * Cols], det;
45 inv[0] = m.v[0][5] * m.v[0][10] * m.v[0][15] -
46 m.v[0][5] * m.v[0][11] * m.v[0][14] -
47 m.v[0][9] * m.v[0][6] * m.v[0][15] +
48 m.v[0][9] * m.v[0][7] * m.v[0][14] +
49 m.v[0][13] * m.v[0][6] * m.v[0][11] -
50 m.v[0][13] * m.v[0][7] * m.v[0][10];
52 inv[4] = -m.v[0][4] * m.v[0][10] * m.v[0][15] +
53 m.v[0][4] * m.v[0][11] * m.v[0][14] +
54 m.v[0][8] * m.v[0][6] * m.v[0][15] -
55 m.v[0][8] * m.v[0][7] * m.v[0][14] -
56 m.v[0][12] * m.v[0][6] * m.v[0][11] +
57 m.v[0][12] * m.v[0][7] * m.v[0][10];
59 inv[8] = m.v[0][4] * m.v[0][9] * m.v[0][15] -
60 m.v[0][4] * m.v[0][11] * m.v[0][13] -
61 m.v[0][8] * m.v[0][5] * m.v[0][15] +
62 m.v[0][8] * m.v[0][7] * m.v[0][13] +
63 m.v[0][12] * m.v[0][5] * m.v[0][11] -
64 m.v[0][12] * m.v[0][7] * m.v[0][9];
66 inv[12] = -m.v[0][4] * m.v[0][9] * m.v[0][14] +
67 m.v[0][4] * m.v[0][10] * m.v[0][13] +
68 m.v[0][8] * m.v[0][5] * m.v[0][14] -
69 m.v[0][8] * m.v[0][6] * m.v[0][13] -
70 m.v[0][12] * m.v[0][5] * m.v[0][10] +
71 m.v[0][12] * m.v[0][6] * m.v[0][9];
73 inv[1] = -m.v[0][1] * m.v[0][10] * m.v[0][15] +
74 m.v[0][1] * m.v[0][11] * m.v[0][14] +
75 m.v[0][9] * m.v[0][2] * m.v[0][15] -
76 m.v[0][9] * m.v[0][3] * m.v[0][14] -
77 m.v[0][13] * m.v[0][2] * m.v[0][11] +
78 m.v[0][13] * m.v[0][3] * m.v[0][10];
80 inv[5] = m.v[0][0] * m.v[0][10] * m.v[0][15] -
81 m.v[0][0] * m.v[0][11] * m.v[0][14] -
82 m.v[0][8] * m.v[0][2] * m.v[0][15] +
83 m.v[0][8] * m.v[0][3] * m.v[0][14] +
84 m.v[0][12] * m.v[0][2] * m.v[0][11] -
85 m.v[0][12] * m.v[0][3] * m.v[0][10];
87 inv[9] = -m.v[0][0] * m.v[0][9] * m.v[0][15] +
88 m.v[0][0] * m.v[0][11] * m.v[0][13] +
89 m.v[0][8] * m.v[0][1] * m.v[0][15] -
90 m.v[0][8] * m.v[0][3] * m.v[0][13] -
91 m.v[0][12] * m.v[0][1] * m.v[0][11] +
92 m.v[0][12] * m.v[0][3] * m.v[0][9];
94 inv[13] = m.v[0][0] * m.v[0][9] * m.v[0][14] -
95 m.v[0][0] * m.v[0][10] * m.v[0][13] -
96 m.v[0][8] * m.v[0][1] * m.v[0][14] +
97 m.v[0][8] * m.v[0][2] * m.v[0][13] +
98 m.v[0][12] * m.v[0][1] * m.v[0][10] -
99 m.v[0][12] * m.v[0][2] * m.v[0][9];
101 inv[2] = m.v[0][1] * m.v[0][6] * m.v[0][15] -
102 m.v[0][1] * m.v[0][7] * m.v[0][14] -
103 m.v[0][5] * m.v[0][2] * m.v[0][15] +
104 m.v[0][5] * m.v[0][3] * m.v[0][14] +
105 m.v[0][13] * m.v[0][2] * m.v[0][7] -
106 m.v[0][13] * m.v[0][3] * m.v[0][6];
108 inv[6] = -m.v[0][0] * m.v[0][6] * m.v[0][15] +
109 m.v[0][0] * m.v[0][7] * m.v[0][14] +
110 m.v[0][4] * m.v[0][2] * m.v[0][15] -
111 m.v[0][4] * m.v[0][3] * m.v[0][14] -
112 m.v[0][12] * m.v[0][2] * m.v[0][7] +
113 m.v[0][12] * m.v[0][3] * m.v[0][6];
115 inv[10] = m.v[0][0] * m.v[0][5] * m.v[0][15] -
116 m.v[0][0] * m.v[0][7] * m.v[0][13] -
117 m.v[0][4] * m.v[0][1] * m.v[0][15] +
118 m.v[0][4] * m.v[0][3] * m.v[0][13] +
119 m.v[0][12] * m.v[0][1] * m.v[0][7] -
120 m.v[0][12] * m.v[0][3] * m.v[0][5];
122 inv[14] = -m.v[0][0] * m.v[0][5] * m.v[0][14] +
123 m.v[0][0] * m.v[0][6] * m.v[0][13] +
124 m.v[0][4] * m.v[0][1] * m.v[0][14] -
125 m.v[0][4] * m.v[0][2] * m.v[0][13] -
126 m.v[0][12] * m.v[0][1] * m.v[0][6] +
127 m.v[0][12] * m.v[0][2] * m.v[0][5];
129 inv[3] = -m.v[0][1] * m.v[0][6] * m.v[0][11] +
130 m.v[0][1] * m.v[0][7] * m.v[0][10] +
131 m.v[0][5] * m.v[0][2] * m.v[0][11] -
132 m.v[0][5] * m.v[0][3] * m.v[0][10] -
133 m.v[0][9] * m.v[0][2] * m.v[0][7] +
134 m.v[0][9] * m.v[0][3] * m.v[0][6];
136 inv[7] = m.v[0][0] * m.v[0][6] * m.v[0][11] -
137 m.v[0][0] * m.v[0][7] * m.v[0][10] -
138 m.v[0][4] * m.v[0][2] * m.v[0][11] +
139 m.v[0][4] * m.v[0][3] * m.v[0][10] +
140 m.v[0][8] * m.v[0][2] * m.v[0][7] -
141 m.v[0][8] * m.v[0][3] * m.v[0][6];
143 inv[11] = -m.v[0][0] * m.v[0][5] * m.v[0][11] +
144 m.v[0][0] * m.v[0][7] * m.v[0][9] +
145 m.v[0][4] * m.v[0][1] * m.v[0][11] -
146 m.v[0][4] * m.v[0][3] * m.v[0][9] -
147 m.v[0][8] * m.v[0][1] * m.v[0][7] +
148 m.v[0][8] * m.v[0][3] * m.v[0][5];
150 inv[15] = m.v[0][0] * m.v[0][5] * m.v[0][10] -
151 m.v[0][0] * m.v[0][6] * m.v[0][9] -
152 m.v[0][4] * m.v[0][1] * m.v[0][10] +
153 m.v[0][4] * m.v[0][2] * m.v[0][9] +
154 m.v[0][8] * m.v[0][1] * m.v[0][6] -
155 m.v[0][8] * m.v[0][2] * m.v[0][5];
157 det = m.v[0][0] * inv[0] + m.v[0][1] * inv[4] + m.v[0][2] * inv[8] + m.v[0][3] * inv[12];
164 for (
u32 i = 0; i < 16; i++)
166 m.v[i >> 2][i & 0x3] = inv[i] * det;