diff --git a/source/Irrlicht/CGLTFMeshFileLoader.cpp b/source/Irrlicht/CGLTFMeshFileLoader.cpp index 1938bc593..d347a2921 100644 --- a/source/Irrlicht/CGLTFMeshFileLoader.cpp +++ b/source/Irrlicht/CGLTFMeshFileLoader.cpp @@ -238,12 +238,12 @@ core::vector2df CGLTFMeshFileLoader::MeshExtractor::readVec2DF( */ core::vector3df CGLTFMeshFileLoader::MeshExtractor::readVec3DF( const BufferOffset& readFrom, - const float scale = 1.0f) + const core::vector3df scale = {1.0f,1.0f,1.0f}) { return core::vector3df( - scale * readPrimitive(readFrom), - scale * readPrimitive(BufferOffset(readFrom, sizeof(float))), - -scale * readPrimitive(BufferOffset(readFrom, 2 * + scale.X * readPrimitive(readFrom), + scale.Y * readPrimitive(BufferOffset(readFrom, sizeof(float))), + -scale.Z * readPrimitive(BufferOffset(readFrom, 2 * sizeof(float)))); } @@ -311,13 +311,15 @@ void CGLTFMeshFileLoader::MeshExtractor::copyTCoords( * Required: NO * @returns: core::vector2df */ -float CGLTFMeshFileLoader::MeshExtractor::getScale() const +core::vector3df CGLTFMeshFileLoader::MeshExtractor::getScale() const { - if (m_model.nodes[0].scale.size() > 0) { - return static_cast(m_model.nodes[0].scale[0]); + core::vector3df buffer{1.0f,1.0f,1.0f}; + if (m_model.nodes[0].scale.size() == 3) { + buffer.X = static_cast(m_model.nodes[0].scale[0]); + buffer.Y = static_cast(m_model.nodes[0].scale[1]); + buffer.Z = static_cast(m_model.nodes[0].scale[2]); } - - return 1.0f; + return buffer; } /** diff --git a/source/Irrlicht/CGLTFMeshFileLoader.h b/source/Irrlicht/CGLTFMeshFileLoader.h index 3e03ce1dd..3a9970d7f 100644 --- a/source/Irrlicht/CGLTFMeshFileLoader.h +++ b/source/Irrlicht/CGLTFMeshFileLoader.h @@ -85,7 +85,7 @@ private: */ static core::vector3df readVec3DF( const BufferOffset& readFrom, - const float scale); + const core::vector3df scale); void copyPositions(const std::size_t accessorIdx, std::vector& vertices) const; @@ -100,7 +100,7 @@ private: * * Returns vec3(1.0, 1.0, 1.0) if no scale factor is present. */ - float getScale() const; + core::vector3df getScale() const; std::size_t getElemCount(const std::size_t accessorIdx) const; diff --git a/source/Irrlicht/tests/assets/blender_cube_scaled.gltf b/source/Irrlicht/tests/assets/blender_cube_scaled.gltf new file mode 100644 index 000000000..151cb5b76 --- /dev/null +++ b/source/Irrlicht/tests/assets/blender_cube_scaled.gltf @@ -0,0 +1,105 @@ +{ + "asset" : { + "generator" : "Khronos glTF Blender I/O v1.7.33", + "version" : "2.0" + }, + "scene" : 0, + "scenes" : [ + { + "name" : "Scene", + "nodes" : [ + 0 + ] + } + ], + "nodes" : [ + { + "mesh" : 0, + "name" : "Cube", + "scale" : [ + 150, + 1, + 21.5 + ] + } + ], + "meshes" : [ + { + "name" : "Cube.004", + "primitives" : [ + { + "attributes" : { + "POSITION" : 0, + "NORMAL" : 1, + "TEXCOORD_0" : 2 + }, + "indices" : 3 + } + ] + } + ], + "accessors" : [ + { + "bufferView" : 0, + "componentType" : 5126, + "count" : 24, + "max" : [ + 1, + 1, + 1 + ], + "min" : [ + -1, + -1, + -1 + ], + "type" : "VEC3" + }, + { + "bufferView" : 1, + "componentType" : 5126, + "count" : 24, + "type" : "VEC3" + }, + { + "bufferView" : 2, + "componentType" : 5126, + "count" : 24, + "type" : "VEC2" + }, + { + "bufferView" : 3, + "componentType" : 5123, + "count" : 36, + "type" : "SCALAR" + } + ], + "bufferViews" : [ + { + "buffer" : 0, + "byteLength" : 288, + "byteOffset" : 0 + }, + { + "buffer" : 0, + "byteLength" : 288, + "byteOffset" : 288 + }, + { + "buffer" : 0, + "byteLength" : 192, + "byteOffset" : 576 + }, + { + "buffer" : 0, + "byteLength" : 72, + "byteOffset" : 768 + } + ], + "buffers" : [ + { + "byteLength" : 840, + "uri" : "data:application/octet-stream;base64,AACAvwAAgL8AAIA/AACAvwAAgL8AAIA/AACAvwAAgL8AAIA/AACAvwAAgD8AAIA/AACAvwAAgD8AAIA/AACAvwAAgD8AAIA/AACAvwAAgL8AAIC/AACAvwAAgL8AAIC/AACAvwAAgL8AAIC/AACAvwAAgD8AAIC/AACAvwAAgD8AAIC/AACAvwAAgD8AAIC/AACAPwAAgL8AAIA/AACAPwAAgL8AAIA/AACAPwAAgL8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgL8AAIC/AACAPwAAgL8AAIC/AACAPwAAgL8AAIC/AACAPwAAgD8AAIC/AACAPwAAgD8AAIC/AACAPwAAgD8AAIC/AACAvwAAAAAAAACAAAAAAAAAgL8AAACAAAAAAAAAAAAAAIA/AACAvwAAAAAAAACAAAAAAAAAAAAAAIA/AAAAAAAAgD8AAACAAACAvwAAAAAAAACAAAAAAAAAgL8AAACAAAAAAAAAAAAAAIC/AACAvwAAAAAAAACAAAAAAAAAAAAAAIC/AAAAAAAAgD8AAACAAAAAAAAAgL8AAACAAAAAAAAAAAAAAIA/AACAPwAAAAAAAACAAAAAAAAAAAAAAIA/AAAAAAAAgD8AAACAAACAPwAAAAAAAACAAAAAAAAAgL8AAACAAAAAAAAAAAAAAIC/AACAPwAAAAAAAACAAAAAAAAAAAAAAIC/AAAAAAAAgD8AAACAAACAPwAAAAAAAACAAADAPgAAgD8AAAA+AACAPgAAwD4AAAAAAAAgPwAAgD8AACA/AAAAAAAAYD8AAIA+AADAPgAAQD8AAAA+AAAAPwAAwD4AAEA/AAAgPwAAQD8AACA/AABAPwAAYD8AAAA/AADAPgAAgD4AAMA+AACAPgAAwD4AAIA+AAAgPwAAgD4AACA/AACAPgAAID8AAIA+AADAPgAAAD8AAMA+AAAAPwAAwD4AAAA/AAAgPwAAAD8AACA/AAAAPwAAID8AAAA/AAADAAkAAAAJAAYACAAKABUACAAVABMAFAAXABEAFAARAA4ADQAPAAQADQAEAAIABwASAAwABwAMAAEAFgALAAUAFgAFABAA" + } + ] +} diff --git a/source/Irrlicht/tests/testCGLTFMeshFileLoader.cpp b/source/Irrlicht/tests/testCGLTFMeshFileLoader.cpp index ea75c738c..888043b2b 100644 --- a/source/Irrlicht/tests/testCGLTFMeshFileLoader.cpp +++ b/source/Irrlicht/tests/testCGLTFMeshFileLoader.cpp @@ -143,6 +143,27 @@ TEST_CASE("invalid JSON returns nullptr") { CHECK(sm.getMesh() == nullptr); } +TEST_CASE("blender cube scaled") { + ScopedMesh sm("source/Irrlicht/tests/assets/blender_cube_scaled.gltf"); + REQUIRE(sm.getMesh() != nullptr); + REQUIRE(sm.getMesh()->getMeshBufferCount() == 1); + + SECTION("Scaling is correct") { + REQUIRE(sm.getMesh()->getMeshBuffer(0)->getVertexCount() == 24); + const auto* vertices = reinterpret_cast( + sm.getMesh()->getMeshBuffer(0)->getVertices()); + + CHECK(vertices[0].Pos == irr::core::vector3df{-150.0f, -1.0f, -21.5f}); + CHECK(vertices[3].Pos == irr::core::vector3df{-150.0f, 1.0f, -21.5f}); + CHECK(vertices[6].Pos == irr::core::vector3df{-150.0f, -1.0f, 21.5f}); + CHECK(vertices[9].Pos == irr::core::vector3df{-150.0f, 1.0f, 21.5f}); + CHECK(vertices[12].Pos == irr::core::vector3df{150.0f, -1.0f, -21.5f}); + CHECK(vertices[15].Pos == irr::core::vector3df{150.0f, 1.0f, -21.5f}); + CHECK(vertices[18].Pos == irr::core::vector3df{150.0f, -1.0f, 21.5f}); + CHECK(vertices[21].Pos == irr::core::vector3df{150.0f, 1.0f, 21.5f}); + } +} + TEST_CASE("snow man") { ScopedMesh sm("source/Irrlicht/tests/assets/snow_man.gltf"); REQUIRE(sm.getMesh() != nullptr);