From 8ce77cf8bfc6627ad4aadc80ed30cfd88cd070ab Mon Sep 17 00:00:00 2001 From: Patrick Wuttke Date: Fri, 15 Dec 2023 02:20:50 +0100 Subject: [PATCH] Fixed tangent generation and added Vector4 type. --- source/mijin/geo/geometry_traits.hpp | 32 ++++++++++++++++++++++--- source/mijin/geo/glm_traits.hpp | 15 ++++++++++++ source/mijin/geo/tangent_generation.hpp | 12 +++++----- 3 files changed, 50 insertions(+), 9 deletions(-) diff --git a/source/mijin/geo/geometry_traits.hpp b/source/mijin/geo/geometry_traits.hpp index aa597d0..9b65a9e 100644 --- a/source/mijin/geo/geometry_traits.hpp +++ b/source/mijin/geo/geometry_traits.hpp @@ -36,6 +36,22 @@ concept Vector3 = requires(const std::decay_t constObject, std::decay_t no { mijin::Vector3Traits>{}.setZ(nonConstObject, 0.f) }; }; +template +struct Vector4Traits; + +template +concept Vector4 = requires(const std::decay_t constObject, std::decay_t nonConstObject) +{ + { mijin::Vector4Traits>{}.getX(constObject) } -> std::convertible_to; + { mijin::Vector4Traits>{}.getY(constObject) } -> std::convertible_to; + { mijin::Vector4Traits>{}.getZ(constObject) } -> std::convertible_to; + { mijin::Vector4Traits>{}.getW(constObject) } -> std::convertible_to; + { mijin::Vector4Traits>{}.setX(nonConstObject, 0.f) }; + { mijin::Vector4Traits>{}.setY(nonConstObject, 0.f) }; + { mijin::Vector4Traits>{}.setZ(nonConstObject, 0.f) }; + { mijin::Vector4Traits>{}.setW(nonConstObject, 0.f) }; +}; + template concept Index = std::convertible_to; @@ -51,12 +67,21 @@ concept Vector3Iterator = requires(T object) { std::iterator_traits::value_type } -> Vector3; }; +template +concept Vector4Iterator = requires(T object) +{ + { std::iterator_traits::value_type } -> Vector4; +}; + template concept Vector2Range = std::ranges::random_access_range && Vector2>; template concept Vector3Range = std::ranges::random_access_range && Vector3>; +template +concept Vector4Range = std::ranges::random_access_range && Vector4>; + template concept IndexRange = std::ranges::random_access_range && Index>; @@ -83,10 +108,11 @@ concept Mesh3DWithNormals = Mesh3D && requires(const T constObject, T nonCons }; template -concept Mesh3DWithTangents = Mesh3D && requires(const T constObject, T nonConstObject, mijin::Mesh3DTraits::index_t index, mijin::Mesh3DTraits::vector3_t vec3Value) +concept Mesh3DWithTangents = Mesh3D && requires(const T constObject, T nonConstObject, mijin::Mesh3DTraits::index_t index, mijin::Mesh3DTraits::vector4_t vec4Value) { - { mijin::Mesh3DTraits{}.getTangent(constObject, index, index) } -> Vector3; - { mijin::Mesh3DTraits{}.setTangent(nonConstObject, index, index, vec3Value) }; + { typename mijin::Mesh3DTraits::vector4_t() } -> Vector4; + { mijin::Mesh3DTraits{}.getTangent(constObject, index, index) } -> Vector4; + { mijin::Mesh3DTraits{}.setTangent(nonConstObject, index, index, vec4Value) }; }; template diff --git a/source/mijin/geo/glm_traits.hpp b/source/mijin/geo/glm_traits.hpp index 1bc2c82..fc47b7f 100644 --- a/source/mijin/geo/glm_traits.hpp +++ b/source/mijin/geo/glm_traits.hpp @@ -7,6 +7,7 @@ #include #include +#include #include "./geometry_traits.hpp" namespace mijin @@ -32,6 +33,20 @@ struct Vector3Traits constexpr void setZ(glm::vec3& vector, float value) const noexcept { vector.z = value; } }; static_assert(Vector3, "Vector3Adapter not working."); + +template<> +struct Vector4Traits +{ + constexpr float getX(const glm::vec4& vector) const noexcept { return vector.x; } + constexpr float getY(const glm::vec4& vector) const noexcept { return vector.y; } + constexpr float getZ(const glm::vec4& vector) const noexcept { return vector.z; } + constexpr float getW(const glm::vec4& vector) const noexcept { return vector.w; } + constexpr void setX(glm::vec4& vector, float value) const noexcept { vector.x = value; } + constexpr void setY(glm::vec4& vector, float value) const noexcept { vector.y = value; } + constexpr void setZ(glm::vec4& vector, float value) const noexcept { vector.z = value; } + constexpr void setW(glm::vec4& vector, float value) const noexcept { vector.w = value; } +}; +static_assert(Vector4, "Vector4Adapter not working."); } #endif // MIJIN_GEO_GLM_ADAPTER_HPP_INCLUDED diff --git a/source/mijin/geo/tangent_generation.hpp b/source/mijin/geo/tangent_generation.hpp index ebb8e2e..4ac7f07 100644 --- a/source/mijin/geo/tangent_generation.hpp +++ b/source/mijin/geo/tangent_generation.hpp @@ -18,6 +18,7 @@ struct MikktData Mesh3DTraits traits; Vector2Traits vec2Traits; Vector3Traits vec3Traits; + Vector4Traits vec4Traits; TMesh* mesh; }; @@ -67,13 +68,12 @@ void mikktGetTexCoord(const SMikkTSpaceContext* context, float texcOut[], const template void mikktSetTSpaceBasic(const SMikkTSpaceContext* context, const float resultTangent[], const float sign, const int face, const int vert) // NOLINT { - // TODO: what do we do with sign? (it should be used for the direction of the bitangent) - (void) sign; const MikktData& data = *static_cast*>(context->m_pUserData); - typename Mesh3DTraits::vector3_t tangent; - data.vec3Traits.setX(tangent, resultTangent[0]); - data.vec3Traits.setY(tangent, resultTangent[1]); - data.vec3Traits.setZ(tangent, resultTangent[2]); + typename Mesh3DTraits::vector4_t tangent; + data.vec4Traits.setX(tangent, resultTangent[0]); + data.vec4Traits.setY(tangent, resultTangent[1]); + data.vec4Traits.setZ(tangent, resultTangent[2]); + data.vec4Traits.setW(tangent, sign); data.traits.setTangent(*data.mesh, face, vert, tangent); } }