Fixed tangent generation and added Vector4 type.

This commit is contained in:
Patrick 2023-12-15 02:20:50 +01:00
parent b692425f83
commit 8ce77cf8bf
3 changed files with 50 additions and 9 deletions

View File

@ -36,6 +36,22 @@ concept Vector3 = requires(const std::decay_t<T> constObject, std::decay_t<T> no
{ mijin::Vector3Traits<std::decay_t<T>>{}.setZ(nonConstObject, 0.f) };
};
template<typename T>
struct Vector4Traits;
template<typename T>
concept Vector4 = requires(const std::decay_t<T> constObject, std::decay_t<T> nonConstObject)
{
{ mijin::Vector4Traits<std::decay_t<T>>{}.getX(constObject) } -> std::convertible_to<float>;
{ mijin::Vector4Traits<std::decay_t<T>>{}.getY(constObject) } -> std::convertible_to<float>;
{ mijin::Vector4Traits<std::decay_t<T>>{}.getZ(constObject) } -> std::convertible_to<float>;
{ mijin::Vector4Traits<std::decay_t<T>>{}.getW(constObject) } -> std::convertible_to<float>;
{ mijin::Vector4Traits<std::decay_t<T>>{}.setX(nonConstObject, 0.f) };
{ mijin::Vector4Traits<std::decay_t<T>>{}.setY(nonConstObject, 0.f) };
{ mijin::Vector4Traits<std::decay_t<T>>{}.setZ(nonConstObject, 0.f) };
{ mijin::Vector4Traits<std::decay_t<T>>{}.setW(nonConstObject, 0.f) };
};
template<typename T>
concept Index = std::convertible_to<T, std::size_t>;
@ -51,12 +67,21 @@ concept Vector3Iterator = requires(T object)
{ std::iterator_traits<T>::value_type } -> Vector3;
};
template<typename T>
concept Vector4Iterator = requires(T object)
{
{ std::iterator_traits<T>::value_type } -> Vector4;
};
template<typename T>
concept Vector2Range = std::ranges::random_access_range<T> && Vector2<std::ranges::range_value_t<T>>;
template<typename T>
concept Vector3Range = std::ranges::random_access_range<T> && Vector3<std::ranges::range_value_t<T>>;
template<typename T>
concept Vector4Range = std::ranges::random_access_range<T> && Vector4<std::ranges::range_value_t<T>>;
template<typename T>
concept IndexRange = std::ranges::random_access_range<T> && Index<std::ranges::range_value_t<T>>;
@ -83,10 +108,11 @@ concept Mesh3DWithNormals = Mesh3D<T> && requires(const T constObject, T nonCons
};
template<typename T>
concept Mesh3DWithTangents = Mesh3D<T> && requires(const T constObject, T nonConstObject, mijin::Mesh3DTraits<T>::index_t index, mijin::Mesh3DTraits<T>::vector3_t vec3Value)
concept Mesh3DWithTangents = Mesh3D<T> && requires(const T constObject, T nonConstObject, mijin::Mesh3DTraits<T>::index_t index, mijin::Mesh3DTraits<T>::vector4_t vec4Value)
{
{ mijin::Mesh3DTraits<T>{}.getTangent(constObject, index, index) } -> Vector3;
{ mijin::Mesh3DTraits<T>{}.setTangent(nonConstObject, index, index, vec3Value) };
{ typename mijin::Mesh3DTraits<T>::vector4_t() } -> Vector4;
{ mijin::Mesh3DTraits<T>{}.getTangent(constObject, index, index) } -> Vector4;
{ mijin::Mesh3DTraits<T>{}.setTangent(nonConstObject, index, index, vec4Value) };
};
template<typename T>

View File

@ -7,6 +7,7 @@
#include <glm/vec2.hpp>
#include <glm/vec3.hpp>
#include <glm/vec4.hpp>
#include "./geometry_traits.hpp"
namespace mijin
@ -32,6 +33,20 @@ struct Vector3Traits<glm::vec3>
constexpr void setZ(glm::vec3& vector, float value) const noexcept { vector.z = value; }
};
static_assert(Vector3<glm::vec3>, "Vector3Adapter not working.");
template<>
struct Vector4Traits<glm::vec4>
{
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<glm::vec4>, "Vector4Adapter not working.");
}
#endif // MIJIN_GEO_GLM_ADAPTER_HPP_INCLUDED

View File

@ -18,6 +18,7 @@ struct MikktData
Mesh3DTraits<TMesh> traits;
Vector2Traits<typename TMesh::vector2_t> vec2Traits;
Vector3Traits<typename TMesh::vector3_t> vec3Traits;
Vector4Traits<typename TMesh::vector4_t> vec4Traits;
TMesh* mesh;
};
@ -67,13 +68,12 @@ void mikktGetTexCoord(const SMikkTSpaceContext* context, float texcOut[], const
template<FullMesh3D TMesh>
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<TMesh>& data = *static_cast<MikktData<TMesh>*>(context->m_pUserData);
typename Mesh3DTraits<TMesh>::vector3_t tangent;
data.vec3Traits.setX(tangent, resultTangent[0]);
data.vec3Traits.setY(tangent, resultTangent[1]);
data.vec3Traits.setZ(tangent, resultTangent[2]);
typename Mesh3DTraits<TMesh>::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);
}
}