From ebccd676763b7ae5740114764ac28d818503a2c6 Mon Sep 17 00:00:00 2001 From: Jan Date: Sat, 4 May 2024 20:06:31 +0200 Subject: [PATCH] chore: fill dumped gltf min max fields for position accessor --- src/ObjWriting/XModel/Gltf/GltfWriter.cpp | 34 +++++++++++++++++++++-- 1 file changed, 32 insertions(+), 2 deletions(-) diff --git a/src/ObjWriting/XModel/Gltf/GltfWriter.cpp b/src/ObjWriting/XModel/Gltf/GltfWriter.cpp index 18fe88dc..3db6698b 100644 --- a/src/ObjWriting/XModel/Gltf/GltfWriter.cpp +++ b/src/ObjWriting/XModel/Gltf/GltfWriter.cpp @@ -45,7 +45,7 @@ namespace CreateAccessors(gltf, xmodel); CreateMesh(gltf, xmodel); CreateScene(gltf, xmodel); - FillBufferData(xmodel, bufferData); + FillBufferData(gltf, xmodel, bufferData); CreateBuffer(gltf, xmodel, bufferData); const json jRoot = gltf; @@ -274,13 +274,24 @@ namespace } } - static void FillBufferData(const XModelCommon& xmodel, std::vector& bufferData) + void FillBufferData(JsonRoot& gltf, const XModelCommon& xmodel, std::vector& bufferData) const { const auto expectedBufferSize = GetExpectedBufferSize(xmodel); bufferData.resize(expectedBufferSize); auto currentBufferOffset = 0u; + float minPosition[3]{ + std::numeric_limits::max(), + std::numeric_limits::max(), + std::numeric_limits::max(), + }; + float maxPosition[3]{ + -std::numeric_limits::max(), + -std::numeric_limits::max(), + -std::numeric_limits::max(), + }; + for (const auto& commonVertex : xmodel.m_vertices) { auto* vertex = reinterpret_cast(&bufferData[currentBufferOffset]); @@ -289,6 +300,19 @@ namespace vertex->coordinates[1] = commonVertex.coordinates[2]; vertex->coordinates[2] = -commonVertex.coordinates[1]; + if (minPosition[0] > vertex->coordinates[0]) + minPosition[0] = vertex->coordinates[0]; + if (minPosition[1] > vertex->coordinates[1]) + minPosition[1] = vertex->coordinates[1]; + if (minPosition[2] > vertex->coordinates[2]) + minPosition[2] = vertex->coordinates[2]; + if (maxPosition[0] < vertex->coordinates[0]) + maxPosition[0] = vertex->coordinates[0]; + if (maxPosition[1] < vertex->coordinates[1]) + maxPosition[1] = vertex->coordinates[1]; + if (maxPosition[2] < vertex->coordinates[2]) + maxPosition[2] = vertex->coordinates[2]; + vertex->normal[0] = commonVertex.normal[0]; vertex->normal[1] = commonVertex.normal[2]; vertex->normal[2] = -commonVertex.normal[1]; @@ -299,6 +323,12 @@ namespace currentBufferOffset += sizeof(GltfVertex); } + if (gltf.accessors.has_value()) + { + gltf.accessors.value()[m_position_accessor].min = std::vector({minPosition[0], minPosition[1], minPosition[2]}); + gltf.accessors.value()[m_position_accessor].max = std::vector({maxPosition[0], maxPosition[1], maxPosition[2]}); + } + for (const auto& object : xmodel.m_objects) { for (const auto& face : object.m_faces)