diff --git a/libraries/fbx/src/FBXSerializer.cpp b/libraries/fbx/src/FBXSerializer.cpp index f15443aeb5..8d2d1336a9 100644 --- a/libraries/fbx/src/FBXSerializer.cpp +++ b/libraries/fbx/src/FBXSerializer.cpp @@ -1592,7 +1592,7 @@ HFMModel* FBXSerializer::extractHFMModel(const hifi::VariantHash& mapping, const } // whether we're skinned depends on how many clusters are attached - if (clusterIDs.size() > 1) { + if (clusterIDs.size() > 0) { hfm::DynamicTransform dynamicTransform; auto& clusters = dynamicTransform.clusters; std::vector deformers; @@ -1670,7 +1670,7 @@ HFMModel* FBXSerializer::extractHFMModel(const hifi::VariantHash& mapping, const shape.dynamicTransform = dynamicTransformID; } } else { - // this is a single-joint mesh + // this is a no cluster mesh HFMJoint& joint = hfmModel.joints[rootJointIndex]; // Apply geometric offset, if present, by transforming the vertices directly diff --git a/libraries/render-utils/src/CauterizedModel.cpp b/libraries/render-utils/src/CauterizedModel.cpp index 3e7c694768..7d94cd61a5 100644 --- a/libraries/render-utils/src/CauterizedModel.cpp +++ b/libraries/render-utils/src/CauterizedModel.cpp @@ -319,7 +319,8 @@ void CauterizedModel::updateRenderItems() { const auto& meshState = self->getMeshState(deformerIndex); const auto& cauterizedMeshState = self->getCauterizeMeshState(deformerIndex); - transaction.updateItem(itemID, [modelTransform, shapeState, meshState, useDualQuaternionSkinning, cauterizedMeshState, invalidatePayloadShapeKey, + transaction.updateItem(itemID, + [modelTransform, shapeState, meshState, useDualQuaternionSkinning, cauterizedMeshState, invalidatePayloadShapeKey, primitiveMode, renderItemKeyGlobalFlags, enableCauterization](ModelMeshPartPayload& mmppData) { CauterizedMeshPartPayload& data = static_cast(mmppData); if (useDualQuaternionSkinning) { @@ -331,26 +332,30 @@ void CauterizedModel::updateRenderItems() { } Transform renderTransform = modelTransform; - // if (meshState.clusterMatrices.size() <= 2) { - renderTransform = modelTransform.worldTransform(shapeState._rootFromJointTransform); + // if (meshState.clusterMatrices.size() <= 2) { + // renderTransform = modelTransform.worldTransform(shapeState._rootFromJointTransform); // } data.updateTransform(renderTransform); data.updateTransformForCauterizedMesh(renderTransform); + data.updateTransformAndBound(modelTransform.worldTransform(shapeState._rootFromJointTransform)); data.setEnableCauterization(enableCauterization); data.updateKey(renderItemKeyGlobalFlags); data.setShapeKey(invalidatePayloadShapeKey, primitiveMode, useDualQuaternionSkinning); }); } else { - transaction.updateItem(itemID, [modelTransform, shapeState, invalidatePayloadShapeKey, primitiveMode, renderItemKeyGlobalFlags](ModelMeshPartPayload& data) { + transaction.updateItem(itemID, + [modelTransform, shapeState, invalidatePayloadShapeKey, primitiveMode, renderItemKeyGlobalFlags, enableCauterization] + (ModelMeshPartPayload& mmppData) { + CauterizedMeshPartPayload& data = static_cast(mmppData); Transform renderTransform = modelTransform; - // if (meshState.clusterMatrices.size() <= 1) { - renderTransform = modelTransform.worldTransform(shapeState._rootFromJointTransform); - // } - data.updateTransform(renderTransform); - // data.setEnableCauterization(enableCauterization); + renderTransform = modelTransform.worldTransform(shapeState._rootFromJointTransform); + data.updateTransform(renderTransform); + data.updateTransformForCauterizedMesh(renderTransform); + + data.setEnableCauterization(enableCauterization); data.updateKey(renderItemKeyGlobalFlags); data.setShapeKey(invalidatePayloadShapeKey, primitiveMode, false); }); diff --git a/libraries/render-utils/src/MeshPartPayload.cpp b/libraries/render-utils/src/MeshPartPayload.cpp index a242c94299..5dc39d8674 100644 --- a/libraries/render-utils/src/MeshPartPayload.cpp +++ b/libraries/render-utils/src/MeshPartPayload.cpp @@ -70,6 +70,11 @@ void MeshPartPayload::updateTransform(const Transform& transform) { _worldBound.transform(_worldFromLocalTransform); } +void MeshPartPayload::updateTransformAndBound(const Transform& transform) { + _worldBound = _localBound; + _worldBound.transform(transform); +} + void MeshPartPayload::addMaterial(graphics::MaterialLayer material) { _drawMaterials.push(material); } diff --git a/libraries/render-utils/src/MeshPartPayload.h b/libraries/render-utils/src/MeshPartPayload.h index 50e06c024c..5d351e90d4 100644 --- a/libraries/render-utils/src/MeshPartPayload.h +++ b/libraries/render-utils/src/MeshPartPayload.h @@ -39,6 +39,7 @@ public: virtual void notifyLocationChanged() {} void updateTransform(const Transform& transform); + void updateTransformAndBound(const Transform& transform ); // Render Item interface virtual render::ItemKey getKey() const; diff --git a/libraries/render-utils/src/Model.cpp b/libraries/render-utils/src/Model.cpp index 56dadf0537..1e258a8dd1 100644 --- a/libraries/render-utils/src/Model.cpp +++ b/libraries/render-utils/src/Model.cpp @@ -257,9 +257,10 @@ void Model::updateRenderItems() { Transform renderTransform = modelTransform; // if (meshState.clusterMatrices.size() <= 1) { - renderTransform = modelTransform.worldTransform(shapeState._rootFromJointTransform); + // renderTransform = modelTransform.worldTransform(shapeState._rootFromJointTransform); // } data.updateTransform(renderTransform); + data.updateTransformAndBound(modelTransform.worldTransform(shapeState._rootFromJointTransform)); data.setCauterized(cauterized); data.updateKey(renderItemKeyGlobalFlags);