Understanding that CLuster can be just one for a mesh and we need the bindingMatrix to be applied correctly, differenciating intentionnally the transform for bound evaluation and the one used for render in the case of SKinned mesh because the clusterMatrices contain the extra offset from rig to model

This commit is contained in:
Sam Gateau 2019-10-15 18:12:09 -07:00
parent 108d331d86
commit f049ab7887
5 changed files with 24 additions and 12 deletions

View file

@ -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<hfm::Deformer> 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

View file

@ -319,7 +319,8 @@ void CauterizedModel::updateRenderItems() {
const auto& meshState = self->getMeshState(deformerIndex);
const auto& cauterizedMeshState = self->getCauterizeMeshState(deformerIndex);
transaction.updateItem<ModelMeshPartPayload>(itemID, [modelTransform, shapeState, meshState, useDualQuaternionSkinning, cauterizedMeshState, invalidatePayloadShapeKey,
transaction.updateItem<ModelMeshPartPayload>(itemID,
[modelTransform, shapeState, meshState, useDualQuaternionSkinning, cauterizedMeshState, invalidatePayloadShapeKey,
primitiveMode, renderItemKeyGlobalFlags, enableCauterization](ModelMeshPartPayload& mmppData) {
CauterizedMeshPartPayload& data = static_cast<CauterizedMeshPartPayload&>(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<ModelMeshPartPayload>(itemID, [modelTransform, shapeState, invalidatePayloadShapeKey, primitiveMode, renderItemKeyGlobalFlags](ModelMeshPartPayload& data) {
transaction.updateItem<ModelMeshPartPayload>(itemID,
[modelTransform, shapeState, invalidatePayloadShapeKey, primitiveMode, renderItemKeyGlobalFlags, enableCauterization]
(ModelMeshPartPayload& mmppData) {
CauterizedMeshPartPayload& data = static_cast<CauterizedMeshPartPayload&>(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);
});

View file

@ -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);
}

View file

@ -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;

View file

@ -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);