From 98d8ea9005deb592af039bffad1a6df6b7542e6c Mon Sep 17 00:00:00 2001 From: Michael Oliver Date: Mon, 27 Apr 2026 13:17:59 +0100 Subject: [PATCH] fix: xmodel glTF dumps dropping `COLOR_0` vertex attributes --- src/ObjCommon/XModel/Gltf/JsonGltf.h | 2 +- src/ObjWriting/XModel/Gltf/GltfWriter.cpp | 17 +++++++++++++++++ 2 files changed, 18 insertions(+), 1 deletion(-) diff --git a/src/ObjCommon/XModel/Gltf/JsonGltf.h b/src/ObjCommon/XModel/Gltf/JsonGltf.h index fe081504..09a3c7f8 100644 --- a/src/ObjCommon/XModel/Gltf/JsonGltf.h +++ b/src/ObjCommon/XModel/Gltf/JsonGltf.h @@ -265,7 +265,7 @@ namespace gltf std::optional WEIGHTS_0; }; - NLOHMANN_DEFINE_TYPE_EXTENSION(JsonMeshPrimitivesAttributes, POSITION, NORMAL, TEXCOORD_0, JOINTS_0, WEIGHTS_0); + NLOHMANN_DEFINE_TYPE_EXTENSION(JsonMeshPrimitivesAttributes, POSITION, NORMAL, COLOR_0, TEXCOORD_0, JOINTS_0, WEIGHTS_0); class JsonMeshPrimitives { diff --git a/src/ObjWriting/XModel/Gltf/GltfWriter.cpp b/src/ObjWriting/XModel/Gltf/GltfWriter.cpp index 7dc5a564..0aacfc79 100644 --- a/src/ObjWriting/XModel/Gltf/GltfWriter.cpp +++ b/src/ObjWriting/XModel/Gltf/GltfWriter.cpp @@ -23,6 +23,7 @@ namespace { float coordinates[3]; float normal[3]; + float color[4]; float uv[2]; }; @@ -190,6 +191,7 @@ namespace primitives.attributes.POSITION = m_position_accessor; primitives.attributes.NORMAL = m_normal_accessor; + primitives.attributes.COLOR_0 = m_color_accessor; primitives.attributes.TEXCOORD_0 = m_uv_accessor; if (hasBoneWeightData) @@ -455,6 +457,15 @@ namespace m_normal_accessor = static_cast(gltf.accessors->size()); gltf.accessors->emplace_back(normalAccessor); + JsonAccessor colorAccessor; + colorAccessor.bufferView = m_vertex_buffer_view; + colorAccessor.byteOffset = static_cast(offsetof(GltfVertex, color)); + colorAccessor.componentType = JsonAccessorComponentType::FLOAT; + colorAccessor.count = static_cast(xmodel.m_vertices.size()); + colorAccessor.type = JsonAccessorType::VEC4; + m_color_accessor = static_cast(gltf.accessors->size()); + gltf.accessors->emplace_back(colorAccessor); + JsonAccessor uvAccessor; uvAccessor.bufferView = m_vertex_buffer_view; uvAccessor.byteOffset = static_cast(offsetof(GltfVertex, uv)); @@ -545,6 +556,11 @@ namespace vertex->normal[2] = commonVertex.normal[2]; LhcToRhcCoordinates(vertex->normal); + vertex->color[0] = commonVertex.color[0]; + vertex->color[1] = commonVertex.color[1]; + vertex->color[2] = commonVertex.color[2]; + vertex->color[3] = commonVertex.color[3]; + vertex->uv[0] = commonVertex.uv[0]; vertex->uv[1] = commonVertex.uv[1]; @@ -681,6 +697,7 @@ namespace unsigned m_first_bone_node = 0u; unsigned m_position_accessor = 0u; unsigned m_normal_accessor = 0u; + unsigned m_color_accessor = 0u; unsigned m_uv_accessor = 0u; unsigned m_joints_accessor = 0u; unsigned m_weights_accessor = 0u;