|
9 | 9 | #include <nbl/builtin/hlsl/cpp_compat/intrinsics.hlsl> |
10 | 10 | #include <nbl/builtin/hlsl/concepts.hlsl> |
11 | 11 | #include <nbl/builtin/hlsl/math/quaternions.hlsl> |
12 | | - |
| 12 | +#include <nbl/builtin/hlsl/math/linalg/basic.hlsl> |
13 | 13 |
|
14 | 14 | namespace nbl |
15 | 15 | { |
@@ -177,17 +177,23 @@ struct cofactors |
177 | 177 | template<typename Mat3x4 NBL_FUNC_REQUIRES(is_matrix_v<Mat3x4>) // TODO: allow any matrix type AND our emulated ones |
178 | 178 | Mat3x4 pseudoInverse3x4(NBL_CONST_REF_ARG(Mat3x4) tform, NBL_CONST_REF_ARG(matrix<scalar_type_t<Mat3x4>,3,3>) sub3x3Inv) |
179 | 179 | { |
180 | | - Mat3x4 retval; |
181 | | - retval[0] = sub3x3Inv[0]; |
182 | | - retval[1] = sub3x3Inv[1]; |
183 | | - retval[2] = sub3x3Inv[2]; |
184 | | - retval[3] = -hlsl::mul(sub3x3Inv,tform[3]); |
185 | | - return retval; |
| 180 | + using scalar_type = scalar_type_t<Mat3x4>; |
| 181 | + using Mat4x3 = matrix<scalar_type,4,3>; |
| 182 | + Mat4x3 retval_T; |
| 183 | + retval_T[0] = sub3x3Inv[0]; |
| 184 | + retval_T[1] = sub3x3Inv[1]; |
| 185 | + retval_T[2] = sub3x3Inv[2]; |
| 186 | + const vector<scalar_type,3> tform3 = vector<scalar_type,3>(tform[0][3], tform[1][3], tform[2][3]); |
| 187 | + retval_T[3] = -hlsl::mul(sub3x3Inv,tform3); |
| 188 | + return hlsl::transpose(retval_T); |
186 | 189 | } |
187 | 190 | template<typename Mat3x4 NBL_FUNC_REQUIRES(is_matrix_v<Mat3x4>) // TODO: allow any matrix type AND our emulated ones |
188 | 191 | Mat3x4 pseudoInverse3x4(NBL_CONST_REF_ARG(Mat3x4) tform) |
189 | 192 | { |
190 | | - return pseudoInverse3x4(tform,inverse(matrix<scalar_type_t<Mat3x4>,3,3>(tform))); |
| 193 | + using scalar_type = scalar_type_t<Mat3x4>; |
| 194 | + using Mat3x3 = matrix<scalar_type,3,3>; |
| 195 | + Mat3x3 tform3x3 = math::linalg::truncate<3,3,3,4,scalar_type>(tform); |
| 196 | + return pseudoInverse3x4(tform,inverse(tform3x3)); |
191 | 197 | } |
192 | 198 |
|
193 | 199 |
|
|
0 commit comments