refactor: extract TangentData from JsonXModelLoader

This commit is contained in:
Jan 2024-09-09 18:53:36 +02:00
parent b282e611fc
commit 543a4f06e4
No known key found for this signature in database
GPG Key ID: 44B581F78FF5C57C
3 changed files with 63 additions and 51 deletions

View File

@ -16,6 +16,7 @@
#pragma warning(pop)
#include "XModel/PartClassificationState.h"
#include "XModel/TangentData.h"
#include "XModel/Tangentspace.h"
#include <algorithm>
@ -60,57 +61,6 @@ namespace
};
static_assert(std::extent_v<decltype(HITLOC_NAMES)> == 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<uint16_t> indices(triCount * 3u);
auto triOffset = 0u;
for (const auto& object : common.m_objects)
{
for (const auto& face : object.m_faces)
{
indices[triOffset++] = static_cast<uint16_t>(face.vertexIndex[0]);
indices[triOffset++] = static_cast<uint16_t>(face.vertexIndex[1]);
indices[triOffset++] = static_cast<uint16_t>(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<std::array<float, 3>> m_tangents;
std::vector<std::array<float, 3>> m_binormals;
};
class JsonLoader
{
public:

View File

@ -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<uint16_t> indices(triCount * 3u);
auto triOffset = 0u;
for (const auto& object : common.m_objects)
{
for (const auto& face : object.m_faces)
{
indices[triOffset++] = static_cast<uint16_t>(face.vertexIndex[0]);
indices[triOffset++] = static_cast<uint16_t>(face.vertexIndex[1]);
indices[triOffset++] = static_cast<uint16_t>(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);
}

View File

@ -0,0 +1,15 @@
#pragma once
#include "XModel/XModelCommon.h"
#include <array>
#include <vector>
class TangentData
{
public:
void CreateTangentData(const XModelCommon& common);
std::vector<std::array<float, 3>> m_tangents;
std::vector<std::array<float, 3>> m_binormals;
};