diff --git a/examples_tests b/examples_tests index 779ce1fe46..f90ce30d64 160000 --- a/examples_tests +++ b/examples_tests @@ -1 +1 @@ -Subproject commit 779ce1fe4630135f82c1bcee1c57e3a37c3fa5cf +Subproject commit f90ce30d643ba03c6e0585f2db015009e27aa912 diff --git a/include/nbl/asset/utils/CQuantQuaternionCache.h b/include/nbl/asset/utils/CQuantQuaternionCache.h index dc8d18545a..c4b13e9c38 100644 --- a/include/nbl/asset/utils/CQuantQuaternionCache.h +++ b/include/nbl/asset/utils/CQuantQuaternionCache.h @@ -7,6 +7,7 @@ #include "nbl/asset/utils/CDirQuantCacheBase.h" +#include "nbl/builtin/hlsl/math/quaternions.hlsl" namespace nbl @@ -68,4 +69,4 @@ class CQuantQuaternionCache : public CDirQuantCacheBase +#ifndef _NBL_BUILTIN_HLSL_MATH_LINALG_BASIC_INCLUDED_ +#define _NBL_BUILTIN_HLSL_MATH_LINALG_BASIC_INCLUDED_ // TODO: remove this header when deleting vectorSIMDf.hlsl #ifndef __HLSL_VERSION #include #include "vectorSIMD.h" #endif +#include #include #include @@ -53,10 +53,50 @@ inline matrix truncate(const NBL_CONST_REF_ARG(matrix -inline matrix getSub3x3(NBL_CONST_REF_ARG(matrix) mat) +namespace impl +{ +template +struct zero_expand_helper +{ + static vector __call(const vector inVec) + { + return vector(inVec, vector(0)); + } +}; +template +struct zero_expand_helper { - return matrix(mat); + static vector __call(const vector inVec) + { + return inVec; + } +}; +} + +template= MIn) +vector zero_expand(vector inVec) +{ + return impl::zero_expand_helper::__call(inVec); +} + +template = NIn && MOut >= MIn) +matrix promote_affine(const matrix inMatrix) +{ + matrix retval; + + using out_row_t = hlsl::vector; + + NBL_UNROLL for (uint32_t row_i = 0; row_i < NIn; row_i++) + { + retval[row_i] = zero_expand(inMatrix[row_i]); + } + NBL_UNROLL for (uint32_t row_i = NIn; row_i < NOut; row_i++) + { + retval[row_i] = promote(0.0); + if (row_i < MOut) + retval[row_i][row_i] = T(1.0); + } + return retval; } } @@ -89,9 +129,28 @@ namespace impl return retval; } }; + + template + struct static_cast_helper, vector, void> + { + using To = vector; + using From = vector; + + static inline To cast(From vec) + { + To retval; + + NBL_UNROLL for (int i = 0; i < N; ++i) + { + retval[i] = hlsl::_static_cast(vec[i]); + } + + return retval; + } + }; } } } -#endif \ No newline at end of file +#endif diff --git a/include/nbl/builtin/hlsl/math/linalg/fast_affine.hlsl b/include/nbl/builtin/hlsl/math/linalg/fast_affine.hlsl index f9d7cd3546..605a107b83 100644 --- a/include/nbl/builtin/hlsl/math/linalg/fast_affine.hlsl +++ b/include/nbl/builtin/hlsl/math/linalg/fast_affine.hlsl @@ -8,6 +8,7 @@ #include #include #include +#include namespace nbl @@ -77,6 +78,27 @@ vector promoted_mul(NBL_CONST_REF_ARG(matrix) lhs, const vector return retval; } +template +inline void setRotation(NBL_REF_ARG(matrix) outMat, NBL_CONST_REF_ARG(math::quaternion) quat) +{ + static_assert(N == 3 || N == 4); + matrix mat = _static_cast >(quat); + + outMat[0] = mat[0]; + outMat[1] = mat[1]; + outMat[2] = mat[2]; +} + +template +inline void setTranslation(NBL_REF_ARG(matrix) outMat, NBL_CONST_REF_ARG(vector) translation) +{ + static_assert(N == 3 || N == 4); + + outMat[0].w = translation.x; + outMat[1].w = translation.y; + outMat[2].w = translation.z; +} + // useful for fast computation of a Normal Matrix template struct cofactors_base; @@ -173,4 +195,4 @@ Mat3x4 pseudoInverse3x4(NBL_CONST_REF_ARG(Mat3x4) tform) } } } -#endif \ No newline at end of file +#endif diff --git a/include/nbl/builtin/hlsl/math/linalg/transform.hlsl b/include/nbl/builtin/hlsl/math/linalg/transform.hlsl index e13a333ade..e46dfe997b 100644 --- a/include/nbl/builtin/hlsl/math/linalg/transform.hlsl +++ b/include/nbl/builtin/hlsl/math/linalg/transform.hlsl @@ -7,6 +7,7 @@ #include #include #include +#include namespace nbl { @@ -17,83 +18,6 @@ namespace math namespace linalg { -/// Builds a rotation 3 * 3 matrix created from an axis vector and an angle. -/// -/// @param angle Rotation angle expressed in radians. -/// @param axis Rotation axis, must be normalized. -/// -/// @tparam T A floating-point scalar type -template -matrix rotation_mat(T angle, const vector axis) -{ - const T a = angle; - const T c = cos(a); - const T s = sin(a); - - vector temp = hlsl::promote >((T(1.0) - c) * axis); - - matrix rotation; - rotation[0][0] = c + temp[0] * axis[0]; - rotation[0][1] = temp[1] * axis[0] - s * axis[2]; - rotation[0][2] = temp[2] * axis[0] + s * axis[1]; - - rotation[1][0] = temp[0] * axis[1] + s * axis[2]; - rotation[1][1] = c + temp[1] * axis[1]; - rotation[1][2] = temp[2] * axis[1] - s * axis[0]; - - rotation[2][0] = temp[0] * axis[2] - s * axis[1]; - rotation[2][1] = temp[1] * axis[2] + s * axis[0]; - rotation[2][2] = c + temp[2] * axis[2]; - - return rotation; -} - -namespace impl -{ -template -struct zero_expand_helper -{ - static vector __call(const vector inVec) - { - return vector(inVec, vector(0)); - } -}; -template -struct zero_expand_helper -{ - static vector __call(const vector inVec) - { - return inVec; - } -}; -} - -template= MIn) -vector zero_expand(vector inVec) -{ - return impl::zero_expand_helper::__call(inVec); -} - -template = NIn && MOut >= MIn) -matrix promote_affine(const matrix inMatrix) -{ - matrix retval; - - using out_row_t = hlsl::vector; - - NBL_UNROLL for (uint32_t row_i = 0; row_i < NIn; row_i++) - { - retval[row_i] = zero_expand(inMatrix[row_i]); - } - NBL_UNROLL for (uint32_t row_i = NIn; row_i < NOut; row_i++) - { - retval[row_i] = promote(0.0); - if (row_i < MOut) - retval[row_i][row_i] = T(1.0); - } - return retval; -} - // /Arek: glm:: for normalize till dot product is fixed (ambiguity with glm namespace + linker issues) template inline matrix lhLookAt( @@ -131,19 +55,6 @@ inline matrix rhLookAt( return r; } -template -inline void setTranslation(NBL_REF_ARG(matrix) outMat, NBL_CONST_REF_ARG(vector) translation) -{ - // TODO: not sure if it will be compatible with hlsl - static_assert(M > 0 && N > 0); - static_assert(M >= VecN); - - NBL_CONSTEXPR int16_t indexOfTheLastRowComponent = M - 1; - - for(int i = 0; i < VecN; ++i) - outMat[i][indexOfTheLastRowComponent] = translation[i]; -} - } } } diff --git a/include/nbl/builtin/hlsl/math/quaternions.hlsl b/include/nbl/builtin/hlsl/math/quaternions.hlsl index 25fa61162d..49a8f95d22 100644 --- a/include/nbl/builtin/hlsl/math/quaternions.hlsl +++ b/include/nbl/builtin/hlsl/math/quaternions.hlsl @@ -6,7 +6,7 @@ #include "nbl/builtin/hlsl/cpp_compat.hlsl" #include "nbl/builtin/hlsl/tgmath.hlsl" -#include "nbl/builtin/hlsl/math/linalg/matrix_runtime_traits.hlsl" +#include "nbl/builtin/hlsl/matrix_utils/matrix_runtime_traits.hlsl" namespace nbl { @@ -102,12 +102,12 @@ struct quaternion static this_t create(NBL_CONST_REF_ARG(matrix_type) _m, const bool dontAssertValidMatrix=false) { - scalar_type uniformScaleSq; + scalar_type uniformColumnSqNorm; { // only orthogonal and uniform scale mats can be converted linalg::RuntimeTraits traits = linalg::RuntimeTraits::create(_m); - bool valid = traits.orthogonal && !hlsl::isnan(traits.uniformScaleSq); - uniformScaleSq = traits.uniformScaleSq; + bool valid = traits.orthogonal && !hlsl::isnan(traits.uniformColumnSqNorm); + uniformColumnSqNorm = traits.uniformColumnSqNorm; if (dontAssertValidMatrix) { @@ -121,14 +121,14 @@ struct quaternion else assert(valid); } - if (uniformScaleSq < numeric_limits::min) + if (uniformColumnSqNorm < numeric_limits::min) { this_t retval; retval.data = hlsl::promote(bit_cast(numeric_limits::quiet_NaN)); return retval; } - const scalar_type uniformScale = hlsl::sqrt(uniformScaleSq); + const scalar_type uniformScale = hlsl::sqrt(uniformColumnSqNorm); matrix_type m = _m; m /= uniformScale; diff --git a/include/nbl/builtin/hlsl/math/thin_lens_projection.hlsl b/include/nbl/builtin/hlsl/math/thin_lens_projection.hlsl index 70c46fdb37..985ec8a6a3 100644 --- a/include/nbl/builtin/hlsl/math/thin_lens_projection.hlsl +++ b/include/nbl/builtin/hlsl/math/thin_lens_projection.hlsl @@ -82,7 +82,30 @@ inline matrix lhProjectionOrthoMatrix(FloatingPoint widthOf } } + +template) +inline matrix buildProjectionMatrixPerspectiveFovRH(FloatingPoint fieldOfViewRadians, FloatingPoint aspectRatio, FloatingPoint zNear, FloatingPoint zFar) +{ + return math::thin_lens::rhPerspectiveFovMatrix(fieldOfViewRadians, aspectRatio, zNear, zFar); +} +template) +inline matrix buildProjectionMatrixPerspectiveFovLH(FloatingPoint fieldOfViewRadians, FloatingPoint aspectRatio, FloatingPoint zNear, FloatingPoint zFar) +{ + return math::thin_lens::lhPerspectiveFovMatrix(fieldOfViewRadians, aspectRatio, zNear, zFar); +} + +template) +inline matrix buildProjectionMatrixOrthoRH(FloatingPoint widthOfViewVolume, FloatingPoint heightOfViewVolume, FloatingPoint zNear, FloatingPoint zFar) +{ + return math::thin_lens::rhProjectionOrthoMatrix(widthOfViewVolume, heightOfViewVolume, zNear, zFar); +} +template) +inline matrix buildProjectionMatrixOrthoLH(FloatingPoint widthOfViewVolume, FloatingPoint heightOfViewVolume, FloatingPoint zNear, FloatingPoint zFar) +{ + return math::thin_lens::lhProjectionOrthoMatrix(widthOfViewVolume, heightOfViewVolume, zNear, zFar); +} + } } -#endif \ No newline at end of file +#endif diff --git a/include/nbl/builtin/hlsl/math/linalg/matrix_runtime_traits.hlsl b/include/nbl/builtin/hlsl/matrix_utils/matrix_runtime_traits.hlsl similarity index 74% rename from include/nbl/builtin/hlsl/math/linalg/matrix_runtime_traits.hlsl rename to include/nbl/builtin/hlsl/matrix_utils/matrix_runtime_traits.hlsl index 3ed2f549c9..02f28dafde 100644 --- a/include/nbl/builtin/hlsl/math/linalg/matrix_runtime_traits.hlsl +++ b/include/nbl/builtin/hlsl/matrix_utils/matrix_runtime_traits.hlsl @@ -1,8 +1,8 @@ // Copyright (C) 2018-2025 - DevSH Graphics Programming Sp. z O.O. // This file is part of the "Nabla Engine". // For conditions of distribution and use, see copyright notice in nabla.h -#ifndef _NBL_BUILTIN_HLSL_MATH_LINALG_MATRIX_RUNTIME_TRAITS_INCLUDED_ -#define _NBL_BUILTIN_HLSL_MATH_LINALG_MATRIX_RUNTIME_TRAITS_INCLUDED_ +#ifndef _NBL_BUILTIN_HLSL_MATRIX_UTILS_MATRIX_RUNTIME_TRAITS_INCLUDED_ +#define _NBL_BUILTIN_HLSL_MATRIX_UTILS_MATRIX_RUNTIME_TRAITS_INCLUDED_ #include "nbl/builtin/hlsl/cpp_compat.hlsl" #include "nbl/builtin/hlsl/tgmath.hlsl" @@ -38,25 +38,25 @@ struct RuntimeTraits } { const matrix_t m_T = hlsl::transpose(m); - scalar_t uniformScaleSq = hlsl::dot(m_T[0], m_T[0]); + scalar_t uniformColumnSqNorm = hlsl::dot(m_T[0], m_T[0]); NBL_UNROLL for (uint16_t i = 1; i < N; i++) { - if (!testing::relativeApproxCompare(hlsl::dot(m_T[i], m_T[i]), uniformScaleSq, 1e-4)) + if (!testing::relativeApproxCompare(hlsl::dot(m_T[i], m_T[i]), uniformColumnSqNorm, 1e-4)) { - uniformScaleSq = bit_cast(numeric_limits::quiet_NaN); + uniformColumnSqNorm = bit_cast(numeric_limits::quiet_NaN); break; } } - retval.uniformScaleSq = uniformScaleSq; - retval.orthonormal = retval.orthogonal && testing::relativeApproxCompare(uniformScaleSq, scalar_t(1.0), 1e-5); + retval.uniformColumnSqNorm = uniformColumnSqNorm; + retval.orthonormal = retval.orthogonal && testing::relativeApproxCompare(uniformColumnSqNorm, scalar_t(1.0), 1e-5); } return retval; } bool invertible; bool orthogonal; - scalar_t uniformScaleSq; // TODO: rename to `uniformColumnSqNorm` and move this whole header to `nbl/builtin/hlsl/matrix_utils/` and associated namespace + scalar_t uniformColumnSqNorm; bool orthonormal; }; diff --git a/include/nbl/builtin/hlsl/matrix_utils/transformation_matrix_utils.hlsl b/include/nbl/builtin/hlsl/matrix_utils/transformation_matrix_utils.hlsl deleted file mode 100644 index dc2cdf3f02..0000000000 --- a/include/nbl/builtin/hlsl/matrix_utils/transformation_matrix_utils.hlsl +++ /dev/null @@ -1,222 +0,0 @@ -#ifndef _NBL_BUILTIN_HLSL_TRANSFORMATION_MATRIX_UTILS_INCLUDED_ -#define _NBL_BUILTIN_HLSL_TRANSFORMATION_MATRIX_UTILS_INCLUDED_ - -#include -#include - -namespace nbl -{ -namespace hlsl -{ -//TODO: stolen from cameraz branch, don't have epsilonEqual here, maybe uncomment when merging from imguizmo-lights branch -//// TODO: -> move somewhere else and nbl:: to implement it -//template -//bool isOrthoBase(const T& x, const T& y, const T& z, const E epsilon = 1e-6) -//{ -// auto isNormalized = [](const auto& v, const auto& epsilon) -> bool -// { -// return glm::epsilonEqual(glm::length(v), 1.0, epsilon); -// }; -// -// auto isOrthogonal = [](const auto& a, const auto& b, const auto& epsilon) -> bool -// { -// return glm::epsilonEqual(glm::dot(a, b), 0.0, epsilon); -// }; -// -// return isNormalized(x, epsilon) && isNormalized(y, epsilon) && isNormalized(z, epsilon) && -// isOrthogonal(x, y, epsilon) && isOrthogonal(x, z, epsilon) && isOrthogonal(y, z, epsilon); -//} -//// <- - -template -matrix getMatrix3x4As4x4(const matrix& mat) -{ - matrix output; - for (int i = 0; i < 3; ++i) - output[i] = mat[i]; - output[3] = float32_t4(0.0f, 0.0f, 0.0f, 1.0f); - - return output; -} - -template -matrix getMatrix3x3As4x4(const matrix& mat) -{ - matrix output; - for (int i = 0; i < 3; ++i) - output[i] = float32_t4(mat[i], 1.0f); - output[3] = float32_t4(0.0f, 0.0f, 0.0f, 1.0f); - - return output; -} - -template -inline vector getCastedVector(const vector& in) -{ - vector out; - - for (int i = 0; i < N; ++i) - out[i] = (Tout)(in[i]); - - return out; -} - -template -inline matrix getCastedMatrix(const matrix& in) -{ - matrix out; - - for (int i = 0; i < N; ++i) - out[i] = getCastedVector(in[i]); - - return out; -} - -// TODO: remove -//! multiplies matrices a and b, 3x4 matrices are treated as 4x4 matrices with 4th row set to (0, 0, 0 ,1) -template -inline matrix concatenateBFollowedByA(const matrix& a, const matrix& b) -{ - const auto a4x4 = getMatrix3x4As4x4(a); - const auto b4x4 = getMatrix3x4As4x4(b); - return matrix(mul(a4x4, b4x4)); -} - -// /Arek: glm:: for normalize till dot product is fixed (ambiguity with glm namespace + linker issues) - -template -inline matrix buildCameraLookAtMatrixLH( - const vector& position, - const vector& target, - const vector& upVector) -{ - const vector zaxis = glm::normalize(target - position); - const vector xaxis = glm::normalize(hlsl::cross(upVector, zaxis)); - const vector yaxis = hlsl::cross(zaxis, xaxis); - - matrix r; - r[0] = vector(xaxis, -hlsl::dot(xaxis, position)); - r[1] = vector(yaxis, -hlsl::dot(yaxis, position)); - r[2] = vector(zaxis, -hlsl::dot(zaxis, position)); - - return r; -} - -template -inline matrix buildCameraLookAtMatrixRH( - const vector& position, - const vector& target, - const vector& upVector) -{ - const vector zaxis = glm::normalize(position - target); - const vector xaxis = glm::normalize(hlsl::cross(upVector, zaxis)); - const vector yaxis = hlsl::cross(zaxis, xaxis); - - matrix r; - r[0] = vector(xaxis, -hlsl::dot(xaxis, position)); - r[1] = vector(yaxis, -hlsl::dot(yaxis, position)); - r[2] = vector(zaxis, -hlsl::dot(zaxis, position)); - - return r; -} - -// TODO: test, check if there is better implementation -// TODO: move quaternion to nbl::hlsl -// TODO: why NBL_REF_ARG(MatType) doesn't work????? - -//! Replaces curent rocation and scale by rotation represented by quaternion `quat`, leaves 4th row and 4th colum unchanged -template -inline void setRotation(matrix& outMat, NBL_CONST_REF_ARG(math::quaternion) quat) -{ - static_assert(N == 3 || N == 4); - matrix mat = _static_cast>(quat); - - outMat[0] = mat[0]; - - outMat[1] = mat[1]; - - outMat[2] = mat[2]; -} - -template -inline void setTranslation(matrix& outMat, NBL_CONST_REF_ARG(vector) translation) -{ - static_assert(N == 3 || N == 4); - - outMat[0].w = translation.x; - outMat[1].w = translation.y; - outMat[2].w = translation.z; -} - - -template -inline matrix buildProjectionMatrixPerspectiveFovRH(float fieldOfViewRadians, float aspectRatio, float zNear, float zFar) -{ - const float h = core::reciprocal(tanf(fieldOfViewRadians * 0.5f)); - _NBL_DEBUG_BREAK_IF(aspectRatio == 0.f); //division by zero - const float w = h / aspectRatio; - - _NBL_DEBUG_BREAK_IF(zNear == zFar); //division by zero - - matrix m; - m[0] = vector(w, 0.f, 0.f, 0.f); - m[1] = vector(0.f, -h, 0.f, 0.f); - m[2] = vector(0.f, 0.f, -zFar / (zFar - zNear), -zNear * zFar / (zFar - zNear)); - m[3] = vector(0.f, 0.f, -1.f, 0.f); - - return m; -} -template -inline matrix buildProjectionMatrixPerspectiveFovLH(float fieldOfViewRadians, float aspectRatio, float zNear, float zFar) -{ - const float h = core::reciprocal(tanf(fieldOfViewRadians * 0.5f)); - _NBL_DEBUG_BREAK_IF(aspectRatio == 0.f); //division by zero - const float w = h / aspectRatio; - - _NBL_DEBUG_BREAK_IF(zNear == zFar); //division by zero - - matrix m; - m[0] = vector(w, 0.f, 0.f, 0.f); - m[1] = vector(0.f, -h, 0.f, 0.f); - m[2] = vector(0.f, 0.f, zFar / (zFar - zNear), -zNear * zFar / (zFar - zNear)); - m[3] = vector(0.f, 0.f, 1.f, 0.f); - - return m; -} - -template -inline matrix buildProjectionMatrixOrthoRH(float widthOfViewVolume, float heightOfViewVolume, float zNear, float zFar) -{ - _NBL_DEBUG_BREAK_IF(widthOfViewVolume == 0.f); //division by zero - _NBL_DEBUG_BREAK_IF(heightOfViewVolume == 0.f); //division by zero - _NBL_DEBUG_BREAK_IF(zNear == zFar); //division by zero - - matrix m; - m[0] = vector(2.f / widthOfViewVolume, 0.f, 0.f, 0.f); - m[1] = vector(0.f, -2.f / heightOfViewVolume, 0.f, 0.f); - m[2] = vector(0.f, 0.f, -1.f / (zFar - zNear), -zNear / (zFar - zNear)); - m[3] = vector(0.f, 0.f, 0.f, 1.f); - - return m; -} - -template -inline matrix buildProjectionMatrixOrthoLH(float widthOfViewVolume, float heightOfViewVolume, float zNear, float zFar) -{ - _NBL_DEBUG_BREAK_IF(widthOfViewVolume == 0.f); //division by zero - _NBL_DEBUG_BREAK_IF(heightOfViewVolume == 0.f); //division by zero - _NBL_DEBUG_BREAK_IF(zNear == zFar); //division by zero - - matrix m; - m[0] = vector(2.f / widthOfViewVolume, 0.f, 0.f, 0.f); - m[1] = vector(0.f, -2.f / heightOfViewVolume, 0.f, 0.f); - m[2] = vector(0.f, 0.f, 1.f / (zFar - zNear), -zNear / (zFar - zNear)); - m[3] = vector(0.f, 0.f, 0.f, 1.f); - - return m; -} - -} -} - -#endif \ No newline at end of file diff --git a/include/nbl/core/math/plane3dSIMD.h b/include/nbl/core/math/plane3dSIMD.h index edad0a1287..25451553c1 100644 --- a/include/nbl/core/math/plane3dSIMD.h +++ b/include/nbl/core/math/plane3dSIMD.h @@ -4,8 +4,7 @@ // See the original file in irrlicht source for authors #include "vectorSIMD.h" -#include -#include +#include #ifndef __NBL_CORE_PLANE_3D_H_INCLUDED__ #define __NBL_CORE_PLANE_3D_H_INCLUDED__ diff --git a/include/nbl/ext/MitsubaLoader/CElementShape.h b/include/nbl/ext/MitsubaLoader/CElementShape.h index db0ca020e2..b641c964d2 100644 --- a/include/nbl/ext/MitsubaLoader/CElementShape.h +++ b/include/nbl/ext/MitsubaLoader/CElementShape.h @@ -10,8 +10,7 @@ #include "nbl/ext/MitsubaLoader/CElementBSDF.h" #include "nbl/ext/MitsubaLoader/CElementEmitter.h" -// awful path -#include "nbl/builtin/hlsl/math/linalg/matrix_utils/transformation_matrix_utils.hlsl" +#include "nbl/builtin/hlsl/math/linalg/basic.hlsl" namespace nbl::ext::MitsubaLoader @@ -295,4 +294,4 @@ class CElementShape final : public IElement } -#endif \ No newline at end of file +#endif diff --git a/src/nbl/asset/utils/CGeometryCreator.cpp b/src/nbl/asset/utils/CGeometryCreator.cpp index 2aa2e08fe5..b8f9ffc4e2 100644 --- a/src/nbl/asset/utils/CGeometryCreator.cpp +++ b/src/nbl/asset/utils/CGeometryCreator.cpp @@ -6,6 +6,7 @@ #include "nbl/asset/utils/CGeometryCreator.h" #include "nbl/builtin/hlsl/tgmath.hlsl" #include "nbl/builtin/hlsl/math/linalg/transform.hlsl" +#include "nbl/builtin/hlsl/math/quaternions.hlsl" #include #include @@ -746,7 +747,8 @@ core::smart_refctd_ptr CGeometryCreator::createArrow( geometries->push_back({ .geometry = cylinder }); - const auto coneTransform = hlsl::math::linalg::rotation_mat(hlsl::numbers::pi * -0.5f, hlsl::float32_t3(1.f, 0.f, 0.f)); + const auto coneRotation = hlsl::math::quaternion::create(hlsl::float32_t3(1.f, 0.f, 0.f), hlsl::numbers::pi * -0.5f); + const auto coneTransform = hlsl::math::linalg::promote_affine<3, 4>(hlsl::_static_cast(coneRotation)); geometries->push_back({ .transform = hlsl::math::linalg::promote_affine<3, 4>(coneTransform), .geometry = cone diff --git a/src/nbl/builtin/CMakeLists.txt b/src/nbl/builtin/CMakeLists.txt index 9a439987b5..631c531767 100644 --- a/src/nbl/builtin/CMakeLists.txt +++ b/src/nbl/builtin/CMakeLists.txt @@ -161,6 +161,7 @@ LIST_BUILTIN_RESOURCE(NBL_RESOURCES_TO_EMBED "hlsl/ieee754/impl.hlsl") LIST_BUILTIN_RESOURCE(NBL_RESOURCES_TO_EMBED "hlsl/array_accessors.hlsl") LIST_BUILTIN_RESOURCE(NBL_RESOURCES_TO_EMBED "hlsl/vector_utils/vector_traits.hlsl") LIST_BUILTIN_RESOURCE(NBL_RESOURCES_TO_EMBED "hlsl/matrix_utils/matrix_traits.hlsl") +LIST_BUILTIN_RESOURCE(NBL_RESOURCES_TO_EMBED "hlsl/matrix_utils/matrix_runtime_traits.hlsl") #spirv intrinsics LIST_BUILTIN_RESOURCE(NBL_RESOURCES_TO_EMBED "hlsl/spirv_intrinsics/core.hlsl") LIST_BUILTIN_RESOURCE(NBL_RESOURCES_TO_EMBED "hlsl/spirv_intrinsics/fragment_shader_pixel_interlock.hlsl") @@ -222,8 +223,7 @@ LIST_BUILTIN_RESOURCE(NBL_RESOURCES_TO_EMBED "hlsl/format.hlsl") #linear algebra LIST_BUILTIN_RESOURCE(NBL_RESOURCES_TO_EMBED "hlsl/math/linalg/fast_affine.hlsl") LIST_BUILTIN_RESOURCE(NBL_RESOURCES_TO_EMBED "hlsl/math/linalg/transform.hlsl") -LIST_BUILTIN_RESOURCE(NBL_RESOURCES_TO_EMBED "hlsl/math/linalg/matrix_utils/transformation_matrix_utils.hlsl") -LIST_BUILTIN_RESOURCE(NBL_RESOURCES_TO_EMBED "hlsl/math/linalg/matrix_runtime_traits.hlsl") +LIST_BUILTIN_RESOURCE(NBL_RESOURCES_TO_EMBED "hlsl/math/linalg/basic.hlsl") # TODO: rename `equations` to `polynomials` probably LIST_BUILTIN_RESOURCE(NBL_RESOURCES_TO_EMBED "hlsl/math/functions.hlsl") LIST_BUILTIN_RESOURCE(NBL_RESOURCES_TO_EMBED "hlsl/math/geometry.hlsl") diff --git a/src/nbl/ext/MitsubaLoader/PropertyElement.cpp b/src/nbl/ext/MitsubaLoader/PropertyElement.cpp index 6283076825..5ea0353a48 100644 --- a/src/nbl/ext/MitsubaLoader/PropertyElement.cpp +++ b/src/nbl/ext/MitsubaLoader/PropertyElement.cpp @@ -12,6 +12,7 @@ #include "nbl/ext/MitsubaLoader/ParserUtil.h" #include "nbl/builtin/hlsl/math/linalg/transform.hlsl" +#include "nbl/builtin/hlsl/math/quaternions.hlsl" #include "glm/gtc/matrix_transform.hpp" @@ -202,9 +203,9 @@ std::optional CPropertyElementManager::createPropertyData invalidXMLFileStructure(logger,"Invalid element, name:\'"+result.name+"\' Axis can't be (0,0,0)"); return {}; } - // TODO: quaternion after the rework - using namespace nbl::hlsl::math;//::linalg; - result.mvalue = linalg::promote_affine<4,4>(linalg::rotation_mat(hlsl::radians(atof(desiredAttributes[0])),axis)); + using namespace nbl::hlsl::math; + const auto rotation = quaternion::create(axis, hlsl::radians(atof(desiredAttributes[0]))); + result.mvalue = linalg::promote_affine<4,4>(hlsl::_static_cast(rotation)); } break; case SPropertyElementData::Type::SCALE: @@ -376,4 +377,4 @@ hlsl::float32_t4 CPropertyElementManager::retrieveHex(const std::string_view& _d return retval/255.f; } -} \ No newline at end of file +}