diff --git a/libraries/fbx/src/FBXSerializer.cpp b/libraries/fbx/src/FBXSerializer.cpp index 4b3311c95a..2c03c3c3ae 100644 --- a/libraries/fbx/src/FBXSerializer.cpp +++ b/libraries/fbx/src/FBXSerializer.cpp @@ -1671,6 +1671,7 @@ HFMModel* FBXSerializer::extractHFMModel(const hifi::VariantHash& mapping, const } mesh.clusterIndices = std::move(reweightedDeformers.indices); mesh.clusterWeights = std::move(reweightedDeformers.weights); + mesh.clusterWeightsPerVertex = reweightedDeformers.weightsPerVertex; } // Store the model's dynamic transform, and put its ID in the shapes diff --git a/libraries/hfm/src/hfm/HFM.h b/libraries/hfm/src/hfm/HFM.h index b2d8147ac6..3d7f33383d 100644 --- a/libraries/hfm/src/hfm/HFM.h +++ b/libraries/hfm/src/hfm/HFM.h @@ -250,6 +250,7 @@ public: // Skinning cluster attributes std::vector clusterIndices; std::vector clusterWeights; + uint16_t clusterWeightsPerVertex { 0 }; // Blendshape attributes QVector blendshapes; diff --git a/libraries/hfm/src/hfm/HFMModelMath.cpp b/libraries/hfm/src/hfm/HFMModelMath.cpp index 09083ab4cc..93687b08b0 100644 --- a/libraries/hfm/src/hfm/HFMModelMath.cpp +++ b/libraries/hfm/src/hfm/HFMModelMath.cpp @@ -75,6 +75,7 @@ ReweightedDeformers getReweightedDeformers(const size_t numMeshVertices, const s size_t numClusterIndices = numMeshVertices * weightsPerVertex; reweightedDeformers.indices.resize(numClusterIndices, (uint16_t)(skinClusters.size() - 1)); reweightedDeformers.weights.resize(numClusterIndices, 0); + reweightedDeformers.weightsPerVertex = weightsPerVertex; std::vector weightAccumulators; weightAccumulators.resize(numClusterIndices, 0.0f); diff --git a/libraries/hfm/src/hfm/HFMModelMath.h b/libraries/hfm/src/hfm/HFMModelMath.h index 9420c96f08..b80adad3d0 100644 --- a/libraries/hfm/src/hfm/HFMModelMath.h +++ b/libraries/hfm/src/hfm/HFMModelMath.h @@ -25,16 +25,17 @@ void calculateExtentsForShape(hfm::Shape& shape, const std::vector& m void calculateExtentsForModel(Extents& modelExtents, const std::vector& shapes); -const uint16_t NUM_SKINNING_WEIGHTS_PER_VERTEX = 4; - class ReweightedDeformers { public: std::vector indices; std::vector weights; + uint16_t weightsPerVertex { 0 }; bool trimmedToMatch { false }; }; -ReweightedDeformers getReweightedDeformers(const size_t numMeshVertices, const std::vector skinClusters, const uint16_t weightsPerVertex = NUM_SKINNING_WEIGHTS_PER_VERTEX); +const uint16_t DEFAULT_SKINNING_WEIGHTS_PER_VERTEX = 4; + +ReweightedDeformers getReweightedDeformers(const size_t numMeshVertices, const std::vector skinClusters, const uint16_t weightsPerVertex = DEFAULT_SKINNING_WEIGHTS_PER_VERTEX); }; #endif // #define hifi_hfm_ModelMath_h diff --git a/libraries/model-baker/src/model-baker/BuildGraphicsMeshTask.cpp b/libraries/model-baker/src/model-baker/BuildGraphicsMeshTask.cpp index 6af0f9edf7..66429ed2c4 100644 --- a/libraries/model-baker/src/model-baker/BuildGraphicsMeshTask.cpp +++ b/libraries/model-baker/src/model-baker/BuildGraphicsMeshTask.cpp @@ -92,7 +92,7 @@ void buildGraphicsMesh(const hfm::Mesh& hfmMesh, graphics::MeshPointer& graphics const auto clusterWeightElement = gpu::Element(gpu::VEC4, gpu::NUINT16, gpu::XYZW); // Record cluster sizes - const size_t numVertClusters = hfmMesh.clusterIndices.size() / hfm::NUM_SKINNING_WEIGHTS_PER_VERTEX; + const size_t numVertClusters = hfmMesh.clusterWeightsPerVertex == 0 ? 0 : hfmMesh.clusterIndices.size() / hfmMesh.clusterWeightsPerVertex; const size_t clusterIndicesSize = numVertClusters * clusterIndiceElement.getSize(); const size_t clusterWeightsSize = numVertClusters * clusterWeightElement.getSize(); diff --git a/libraries/model-baker/src/model-baker/CollectShapeVerticesTask.cpp b/libraries/model-baker/src/model-baker/CollectShapeVerticesTask.cpp index 5ede25a42c..13bc75ced9 100644 --- a/libraries/model-baker/src/model-baker/CollectShapeVerticesTask.cpp +++ b/libraries/model-baker/src/model-baker/CollectShapeVerticesTask.cpp @@ -62,7 +62,7 @@ void CollectShapeVerticesTask::run(const baker::BakeContextPointer& context, con const auto& vertices = mesh.vertices; const glm::mat4 meshToJoint = cluster.inverseBindMatrix; - const uint16_t weightsPerVertex = hfm::NUM_SKINNING_WEIGHTS_PER_VERTEX; + const uint16_t weightsPerVertex = mesh.clusterWeightsPerVertex; if (weightsPerVertex == 0) { for (int vertexIndex = 0; vertexIndex < (int)vertices.size(); ++vertexIndex) { const glm::mat4 vertexTransform = meshToJoint * glm::translate(vertices[vertexIndex]);