10 MUDA_INLINE MUDA_GENERIC Eigen::Matrix<T, 2, 2> operator()(
const Eigen::Matrix<T, 2, 2>& m)
12 Eigen::Matrix<T, 2, 2> result;
13 invert2x2(m.data(), result.data());
18 MUDA_INLINE MUDA_GENERIC Eigen::Matrix<T, 3, 3> operator()(
const Eigen::Matrix<T, 3, 3>& m)
20 Eigen::Matrix<T, 3, 3> result;
21 invert3x3(m.data(), result.data());
26 MUDA_INLINE MUDA_GENERIC Eigen::Matrix<T, 4, 4> operator()(
const Eigen::Matrix<T, 4, 4>& m)
28 Eigen::Matrix<T, 4, 4> result;
29 invert4x4(m.data(), result.data());
35 MUDA_INLINE MUDA_GENERIC
void invert2x2(
const T* src, T* dst)
48 det = src[0] * dst[0] + src[1] * dst[2];
61 MUDA_INLINE MUDA_GENERIC
void invert3x3(
const T* src, T* dst)
67 dst[0] = +src[4] * src[8] - src[5] * src[7];
68 dst[1] = -src[1] * src[8] + src[2] * src[7];
69 dst[2] = +src[1] * src[5] - src[2] * src[4];
70 dst[3] = -src[3] * src[8] + src[5] * src[6];
71 dst[4] = +src[0] * src[8] - src[2] * src[6];
72 dst[5] = -src[0] * src[5] + src[2] * src[3];
73 dst[6] = +src[3] * src[7] - src[4] * src[6];
74 dst[7] = -src[0] * src[7] + src[1] * src[6];
75 dst[8] = +src[0] * src[4] - src[1] * src[3];
79 det = src[0] * dst[0] + src[1] * dst[3] + src[2] * dst[6];
97 MUDA_INLINE MUDA_GENERIC
void invert4x4(
const T* src, T* dst)
103 dst[0] = +src[5] * src[10] * src[15] - src[5] * src[11] * src[14]
104 - src[9] * src[6] * src[15] + src[9] * src[7] * src[14]
105 + src[13] * src[6] * src[11] - src[13] * src[7] * src[10];
107 dst[1] = -src[1] * src[10] * src[15] + src[1] * src[11] * src[14]
108 + src[9] * src[2] * src[15] - src[9] * src[3] * src[14]
109 - src[13] * src[2] * src[11] + src[13] * src[3] * src[10];
111 dst[2] = +src[1] * src[6] * src[15] - src[1] * src[7] * src[14]
112 - src[5] * src[2] * src[15] + src[5] * src[3] * src[14]
113 + src[13] * src[2] * src[7] - src[13] * src[3] * src[6];
115 dst[3] = -src[1] * src[6] * src[11] + src[1] * src[7] * src[10]
116 + src[5] * src[2] * src[11] - src[5] * src[3] * src[10]
117 - src[9] * src[2] * src[7] + src[9] * src[3] * src[6];
119 dst[4] = -src[4] * src[10] * src[15] + src[4] * src[11] * src[14]
120 + src[8] * src[6] * src[15] - src[8] * src[7] * src[14]
121 - src[12] * src[6] * src[11] + src[12] * src[7] * src[10];
123 dst[5] = +src[0] * src[10] * src[15] - src[0] * src[11] * src[14]
124 - src[8] * src[2] * src[15] + src[8] * src[3] * src[14]
125 + src[12] * src[2] * src[11] - src[12] * src[3] * src[10];
127 dst[6] = -src[0] * src[6] * src[15] + src[0] * src[7] * src[14]
128 + src[4] * src[2] * src[15] - src[4] * src[3] * src[14]
129 - src[12] * src[2] * src[7] + src[12] * src[3] * src[6];
131 dst[7] = +src[0] * src[6] * src[11] - src[0] * src[7] * src[10]
132 - src[4] * src[2] * src[11] + src[4] * src[3] * src[10]
133 + src[8] * src[2] * src[7] - src[8] * src[3] * src[6];
135 dst[8] = +src[4] * src[9] * src[15] - src[4] * src[11] * src[13]
136 - src[8] * src[5] * src[15] + src[8] * src[7] * src[13]
137 + src[12] * src[5] * src[11] - src[12] * src[7] * src[9];
139 dst[9] = -src[0] * src[9] * src[15] + src[0] * src[11] * src[13]
140 + src[8] * src[1] * src[15] - src[8] * src[3] * src[13]
141 - src[12] * src[1] * src[11] + src[12] * src[3] * src[9];
143 dst[10] = +src[0] * src[5] * src[15] - src[0] * src[7] * src[13]
144 - src[4] * src[1] * src[15] + src[4] * src[3] * src[13]
145 + src[12] * src[1] * src[7] - src[12] * src[3] * src[5];
147 dst[11] = -src[0] * src[5] * src[11] + src[0] * src[7] * src[9]
148 + src[4] * src[1] * src[11] - src[4] * src[3] * src[9]
149 - src[8] * src[1] * src[7] + src[8] * src[3] * src[5];
151 dst[12] = -src[4] * src[9] * src[14] + src[4] * src[10] * src[13]
152 + src[8] * src[5] * src[14] - src[8] * src[6] * src[13]
153 - src[12] * src[5] * src[10] + src[12] * src[6] * src[9];
155 dst[13] = +src[0] * src[9] * src[14] - src[0] * src[10] * src[13]
156 - src[8] * src[1] * src[14] + src[8] * src[2] * src[13]
157 + src[12] * src[1] * src[10] - src[12] * src[2] * src[9];
159 dst[14] = -src[0] * src[5] * src[14] + src[0] * src[6] * src[13]
160 + src[4] * src[1] * src[14] - src[4] * src[2] * src[13]
161 - src[12] * src[1] * src[6] + src[12] * src[2] * src[5];
163 dst[15] = +src[0] * src[5] * src[10] - src[0] * src[6] * src[9]
164 - src[4] * src[1] * src[10] + src[4] * src[2] * src[9]
165 + src[8] * src[1] * src[6] - src[8] * src[2] * src[5];
169 det = +src[0] * dst[0] + src[1] * dst[4] + src[2] * dst[8] + src[3] * dst[12];