From 543a4f06e471d4aebea396198a96985849c0cfda Mon Sep 17 00:00:00 2001 From: Jan Date: Mon, 9 Sep 2024 18:53:36 +0200 Subject: [PATCH] refactor: extract TangentData from JsonXModelLoader --- .../Game/T6/XModel/JsonXModelLoader.cpp | 52 +------------------ src/ObjLoading/XModel/TangentData.cpp | 47 +++++++++++++++++ src/ObjLoading/XModel/TangentData.h | 15 ++++++ 3 files changed, 63 insertions(+), 51 deletions(-) create mode 100644 src/ObjLoading/XModel/TangentData.cpp create mode 100644 src/ObjLoading/XModel/TangentData.h diff --git a/src/ObjLoading/Game/T6/XModel/JsonXModelLoader.cpp b/src/ObjLoading/Game/T6/XModel/JsonXModelLoader.cpp index 2f0639c1..8b3f6e9b 100644 --- a/src/ObjLoading/Game/T6/XModel/JsonXModelLoader.cpp +++ b/src/ObjLoading/Game/T6/XModel/JsonXModelLoader.cpp @@ -16,6 +16,7 @@ #pragma warning(pop) #include "XModel/PartClassificationState.h" +#include "XModel/TangentData.h" #include "XModel/Tangentspace.h" #include @@ -60,57 +61,6 @@ namespace }; static_assert(std::extent_v == HITLOC_COUNT); - class TangentData - { - public: - void CreateTangentData(const XModelCommon& common) - { - if (common.m_vertices.empty()) - return; - - const auto vertexCount = common.m_vertices.size(); - m_tangents.resize(vertexCount); - m_binormals.resize(vertexCount); - - auto triCount = 0u; - for (const auto& object : common.m_objects) - triCount += object.m_faces.size(); - - std::vector indices(triCount * 3u); - auto triOffset = 0u; - for (const auto& object : common.m_objects) - { - for (const auto& face : object.m_faces) - { - indices[triOffset++] = static_cast(face.vertexIndex[0]); - indices[triOffset++] = static_cast(face.vertexIndex[1]); - indices[triOffset++] = static_cast(face.vertexIndex[2]); - } - } - - const auto& firstVertex = common.m_vertices[0]; - - tangent_space::VertexData vertexData{ - firstVertex.coordinates, - sizeof(XModelVertex), - firstVertex.normal, - sizeof(XModelVertex), - firstVertex.uv, - sizeof(XModelVertex), - m_tangents.data(), - sizeof(float) * 3, - m_binormals.data(), - sizeof(float) * 3, - indices.data(), - }; - - tangent_space::CalculateTangentSpace(vertexData, triCount, vertexCount); - } - - std::vector> m_tangents; - std::vector> m_binormals; - }; - class JsonLoader { public: diff --git a/src/ObjLoading/XModel/TangentData.cpp b/src/ObjLoading/XModel/TangentData.cpp new file mode 100644 index 00000000..a09c25f3 --- /dev/null +++ b/src/ObjLoading/XModel/TangentData.cpp @@ -0,0 +1,47 @@ +#include "TangentData.h" + +#include "Tangentspace.h" + +void TangentData::CreateTangentData(const XModelCommon& common) +{ + if (common.m_vertices.empty()) + return; + + const auto vertexCount = common.m_vertices.size(); + m_tangents.resize(vertexCount); + m_binormals.resize(vertexCount); + + auto triCount = 0u; + for (const auto& object : common.m_objects) + triCount += object.m_faces.size(); + + std::vector indices(triCount * 3u); + auto triOffset = 0u; + for (const auto& object : common.m_objects) + { + for (const auto& face : object.m_faces) + { + indices[triOffset++] = static_cast(face.vertexIndex[0]); + indices[triOffset++] = static_cast(face.vertexIndex[1]); + indices[triOffset++] = static_cast(face.vertexIndex[2]); + } + } + + const auto& firstVertex = common.m_vertices[0]; + + tangent_space::VertexData vertexData{ + firstVertex.coordinates, + sizeof(XModelVertex), + firstVertex.normal, + sizeof(XModelVertex), + firstVertex.uv, + sizeof(XModelVertex), + m_tangents.data(), + sizeof(float) * 3, + m_binormals.data(), + sizeof(float) * 3, + indices.data(), + }; + + tangent_space::CalculateTangentSpace(vertexData, triCount, vertexCount); +} diff --git a/src/ObjLoading/XModel/TangentData.h b/src/ObjLoading/XModel/TangentData.h new file mode 100644 index 00000000..87ae77a4 --- /dev/null +++ b/src/ObjLoading/XModel/TangentData.h @@ -0,0 +1,15 @@ +#pragma once + +#include "XModel/XModelCommon.h" + +#include +#include + +class TangentData +{ +public: + void CreateTangentData(const XModelCommon& common); + + std::vector> m_tangents; + std::vector> m_binormals; +};