mirror of
https://github.com/overte-org/overte.git
synced 2025-04-11 04:12:09 +02:00
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:
parent
108d331d86
commit
f049ab7887
5 changed files with 24 additions and 12 deletions
libraries
fbx/src
render-utils/src
|
@ -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
|
||||
|
|
|
@ -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);
|
||||
});
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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);
|
||||
|
|
Loading…
Reference in a new issue