diff --git a/cmake-modules/FindPkgMacros.cmake b/cmake-modules/FindPkgMacros.cmake index 074cce352..d3a6042a7 100644 --- a/cmake-modules/FindPkgMacros.cmake +++ b/cmake-modules/FindPkgMacros.cmake @@ -54,7 +54,7 @@ macro(clear_if_changed TESTVAR) set(${var} "NOTFOUND" CACHE STRING "x" FORCE) endforeach(var) endif () - set(${TESTVAR}_INT_CHECK ${${TESTVAR}} CACHE INTERNAL "x" FORCE) + set(${TESTVAR}_INT_CHECK "${${TESTVAR}}" CACHE INTERNAL "x" FORCE) endmacro(clear_if_changed) # Try to get some hints from pkg-config, if available diff --git a/code/AssetLib/glTF2/glTF2Importer.cpp b/code/AssetLib/glTF2/glTF2Importer.cpp index 293d3dea7..4788ecd97 100644 --- a/code/AssetLib/glTF2/glTF2Importer.cpp +++ b/code/AssetLib/glTF2/glTF2Importer.cpp @@ -970,8 +970,10 @@ static void BuildVertexWeightMapping(Mesh::Primitive &primitive, std::vectorExtractData(weights); + Weights **weights = new Weights*[attr.weight.size()]; + for (size_t w = 0; w < attr.weight.size(); ++w) { + attr.weight[w]->ExtractData(weights[w]); + } struct Indices8 { uint8_t values[4]; @@ -979,12 +981,18 @@ static void BuildVertexWeightMapping(Mesh::Primitive &primitive, std::vectorGetElementSize() == 4) { - attr.joint[0]->ExtractData(indices8); + indices8 = new Indices8*[attr.joint.size()]; + for (size_t j = 0; j < attr.joint.size(); ++j) { + attr.joint[j]->ExtractData(indices8[j]); + } } else { - attr.joint[0]->ExtractData(indices16); + indices16 = new Indices16 *[attr.joint.size()]; + for (size_t j = 0; j < attr.joint.size(); ++j) { + attr.joint[j]->ExtractData(indices16[j]); + } } // if (nullptr == indices8 && nullptr == indices16) { @@ -993,17 +1001,26 @@ static void BuildVertexWeightMapping(Mesh::Primitive &primitive, std::vector 0 && bone < map.size()) { - map[bone].reserve(8); - map[bone].emplace_back(static_cast(i), weight); + for (size_t w = 0; w < attr.weight.size(); ++w) { + for (size_t i = 0; i < num_vertices; ++i) { + for (int j = 0; j < 4; ++j) { + const unsigned int bone = (indices8 != nullptr) ? indices8[w][i].values[j] : indices16[w][i].values[j]; + const float weight = weights[w][i].values[j]; + if (weight > 0 && bone < map.size()) { + map[bone].reserve(8); + map[bone].emplace_back(static_cast(i), weight); + } } } } + for (size_t w = 0; w < attr.weight.size(); ++w) { + delete[] weights[w]; + if(indices8) + delete[] indices8[w]; + if (indices16) + delete[] indices16[w]; + } delete[] weights; delete[] indices8; delete[] indices16;