From 5a184bd584d84d761662197d5755a385a81380ef Mon Sep 17 00:00:00 2001 From: SamGondelman Date: Tue, 30 Apr 2019 13:38:11 -0700 Subject: [PATCH] fix model bounds --- .../src/avatars-renderer/SkeletonModel.cpp | 2 +- libraries/render-utils/src/CauterizedModel.cpp | 2 ++ libraries/render-utils/src/MeshPartPayload.cpp | 12 ++++++------ libraries/render-utils/src/Model.cpp | 15 ++------------- libraries/render-utils/src/Model.h | 1 - 5 files changed, 11 insertions(+), 21 deletions(-) diff --git a/libraries/avatars-renderer/src/avatars-renderer/SkeletonModel.cpp b/libraries/avatars-renderer/src/avatars-renderer/SkeletonModel.cpp index 295a0e9f52..d8f24208b0 100644 --- a/libraries/avatars-renderer/src/avatars-renderer/SkeletonModel.cpp +++ b/libraries/avatars-renderer/src/avatars-renderer/SkeletonModel.cpp @@ -164,7 +164,7 @@ void SkeletonModel::simulate(float deltaTime, bool fullUpdate) { Parent::simulate(deltaTime, fullUpdate); } - // FIXME: This texture loading logic should probably live in Avatar, to mirror RenderableModelEntityItem and ModelOverlay, + // FIXME: This texture loading logic should probably live in Avatar, to mirror RenderableModelEntityItem, // but Avatars don't get updates in the same way if (!_texturesLoaded && getGeometry() && getGeometry()->areTexturesLoaded()) { _texturesLoaded = true; diff --git a/libraries/render-utils/src/CauterizedModel.cpp b/libraries/render-utils/src/CauterizedModel.cpp index 7cad337dd5..c700f1ad3f 100644 --- a/libraries/render-utils/src/CauterizedModel.cpp +++ b/libraries/render-utils/src/CauterizedModel.cpp @@ -237,9 +237,11 @@ void CauterizedModel::updateRenderItems() { if (useDualQuaternionSkinning) { data.updateClusterBuffer(meshState.clusterDualQuaternions, cauterizedMeshState.clusterDualQuaternions); + data.computeAdjustedLocalBound(meshState.clusterDualQuaternions); } else { data.updateClusterBuffer(meshState.clusterMatrices, cauterizedMeshState.clusterMatrices); + data.computeAdjustedLocalBound(meshState.clusterMatrices); } Transform renderTransform = modelTransform; diff --git a/libraries/render-utils/src/MeshPartPayload.cpp b/libraries/render-utils/src/MeshPartPayload.cpp index 7be5f93a95..cb3aa76468 100644 --- a/libraries/render-utils/src/MeshPartPayload.cpp +++ b/libraries/render-utils/src/MeshPartPayload.cpp @@ -450,9 +450,9 @@ void ModelMeshPartPayload::render(RenderArgs* args) { void ModelMeshPartPayload::computeAdjustedLocalBound(const std::vector& clusterMatrices) { _adjustedLocalBound = _localBound; if (clusterMatrices.size() > 0) { - _adjustedLocalBound.transform(clusterMatrices[0]); + _adjustedLocalBound.transform(clusterMatrices.back()); - for (int i = 1; i < (int)clusterMatrices.size(); ++i) { + for (int i = 0; i < (int)clusterMatrices.size() - 1; ++i) { AABox clusterBound = _localBound; clusterBound.transform(clusterMatrices[i]); _adjustedLocalBound += clusterBound; @@ -463,12 +463,12 @@ void ModelMeshPartPayload::computeAdjustedLocalBound(const std::vector& clusterDualQuaternions) { _adjustedLocalBound = _localBound; if (clusterDualQuaternions.size() > 0) { - Transform rootTransform(clusterDualQuaternions[0].getRotation(), - clusterDualQuaternions[0].getScale(), - clusterDualQuaternions[0].getTranslation()); + Transform rootTransform(clusterDualQuaternions.back().getRotation(), + clusterDualQuaternions.back().getScale(), + clusterDualQuaternions.back().getTranslation()); _adjustedLocalBound.transform(rootTransform); - for (int i = 1; i < (int)clusterDualQuaternions.size(); ++i) { + for (int i = 0; i < (int)clusterDualQuaternions.size() - 1; ++i) { AABox clusterBound = _localBound; Transform transform(clusterDualQuaternions[i].getRotation(), clusterDualQuaternions[i].getScale(), diff --git a/libraries/render-utils/src/Model.cpp b/libraries/render-utils/src/Model.cpp index e2d78a8d94..8b79ca2572 100644 --- a/libraries/render-utils/src/Model.cpp +++ b/libraries/render-utils/src/Model.cpp @@ -241,8 +241,10 @@ void Model::updateRenderItems() { invalidatePayloadShapeKey, primitiveMode, renderItemKeyGlobalFlags, cauterized](ModelMeshPartPayload& data) { if (useDualQuaternionSkinning) { data.updateClusterBuffer(meshState.clusterDualQuaternions); + data.computeAdjustedLocalBound(meshState.clusterDualQuaternions); } else { data.updateClusterBuffer(meshState.clusterMatrices); + data.computeAdjustedLocalBound(meshState.clusterMatrices); } Transform renderTransform = modelTransform; @@ -1367,8 +1369,6 @@ void Model::simulate(float deltaTime, bool fullUpdate) { // update the world space transforms for all joints glm::mat4 parentTransform = glm::scale(_scale) * glm::translate(_offset); updateRig(deltaTime, parentTransform); - - computeMeshPartLocalBounds(); } } @@ -1379,17 +1379,6 @@ void Model::updateRig(float deltaTime, glm::mat4 parentTransform) { _rig.updateAnimations(deltaTime, parentTransform, rigToWorldTransform); } -void Model::computeMeshPartLocalBounds() { - for (auto& part : _modelMeshRenderItems) { - const Model::MeshState& state = _meshStates.at(part->_meshIndex); - if (_useDualQuaternionSkinning) { - part->computeAdjustedLocalBound(state.clusterDualQuaternions); - } else { - part->computeAdjustedLocalBound(state.clusterMatrices); - } - } -} - // virtual void Model::updateClusterMatrices() { DETAILED_PERFORMANCE_TIMER("Model::updateClusterMatrices"); diff --git a/libraries/render-utils/src/Model.h b/libraries/render-utils/src/Model.h index 1431b5e3f9..34b8a90f87 100644 --- a/libraries/render-utils/src/Model.h +++ b/libraries/render-utils/src/Model.h @@ -427,7 +427,6 @@ protected: void setScaleInternal(const glm::vec3& scale); void snapToRegistrationPoint(); - void computeMeshPartLocalBounds(); virtual void updateRig(float deltaTime, glm::mat4 parentTransform); /// Allow sub classes to force invalidating the bboxes