From 3f688f92d343f74ca41f4ab026a340c71932a497 Mon Sep 17 00:00:00 2001 From: Brad Davis Date: Mon, 14 Sep 2015 16:09:13 -0700 Subject: [PATCH] Don't do an O(N^2) operation on cluster matrices --- libraries/render-utils/src/Model.cpp | 31 +++++++++++++++++++++++----- libraries/render-utils/src/Model.h | 1 + 2 files changed, 27 insertions(+), 5 deletions(-) diff --git a/libraries/render-utils/src/Model.cpp b/libraries/render-utils/src/Model.cpp index 4c9279c8fd..cfbcd0599a 100644 --- a/libraries/render-utils/src/Model.cpp +++ b/libraries/render-utils/src/Model.cpp @@ -798,7 +798,7 @@ namespace render { return payload->model->renderPart(args, payload->meshIndex, payload->partIndex, payload->transparent); } } - + /* template <> const model::MaterialKey& shapeGetMaterialKey(const MeshPartPayload::Pointer& payload) { return payload->model->getPartMaterial(payload->meshIndex, payload->partIndex); }*/ @@ -829,6 +829,9 @@ bool Model::addToScene(std::shared_ptr scene, render::PendingChan auto renderData = MeshPartPayload::Pointer(renderItem); auto renderPayload = std::make_shared(renderData); pendingChanges.resetItem(item, renderPayload); + pendingChanges.updateItem(item, [&](MeshPartPayload& data) { + data.model->_needsUpdateClusterMatrices = true; + }); _renderItems.insert(item, renderPayload); somethingAdded = true; } @@ -838,6 +841,9 @@ bool Model::addToScene(std::shared_ptr scene, render::PendingChan auto renderData = MeshPartPayload::Pointer(renderItem); auto renderPayload = std::make_shared(renderData); pendingChanges.resetItem(item, renderPayload); + pendingChanges.updateItem(item, [&](MeshPartPayload& data) { + data.model->_needsUpdateClusterMatrices = true; + }); _renderItems.insert(item, renderPayload); somethingAdded = true; } @@ -860,6 +866,9 @@ bool Model::addToScene(std::shared_ptr scene, render::PendingChan auto renderPayload = std::make_shared(renderData); renderPayload->addStatusGetters(statusGetters); pendingChanges.resetItem(item, renderPayload); + pendingChanges.updateItem(item, [&](MeshPartPayload& data) { + data.model->_needsUpdateClusterMatrices = true; + }); _renderItems.insert(item, renderPayload); somethingAdded = true; } @@ -870,6 +879,9 @@ bool Model::addToScene(std::shared_ptr scene, render::PendingChan auto renderPayload = std::make_shared(renderData); renderPayload->addStatusGetters(statusGetters); pendingChanges.resetItem(item, renderPayload); + pendingChanges.updateItem(item, [&](MeshPartPayload& data) { + data.model->_needsUpdateClusterMatrices = true; + }); _renderItems.insert(item, renderPayload); somethingAdded = true; } @@ -1293,11 +1305,15 @@ void Model::simulateInternal(float deltaTime) { updateRig(deltaTime, parentTransform); } void Model::updateClusterMatrices() { + if (!_needsUpdateClusterMatrices) { + return; + } + _needsUpdateClusterMatrices = false; const FBXGeometry& geometry = _geometry->getFBXGeometry(); glm::mat4 zeroScale(glm::vec4(0.0f, 0.0f, 0.0f, 0.0f), - glm::vec4(0.0f, 0.0f, 0.0f, 0.0f), - glm::vec4(0.0f, 0.0f, 0.0f, 0.0f), - glm::vec4(0.0f, 0.0f, 0.0f, 1.0f)); + glm::vec4(0.0f, 0.0f, 0.0f, 0.0f), + glm::vec4(0.0f, 0.0f, 0.0f, 0.0f), + glm::vec4(0.0f, 0.0f, 0.0f, 1.0f)); auto cauterizeMatrix = _rig->getJointTransform(geometry.neckJointIndex) * zeroScale; glm::mat4 modelToWorld = glm::mat4_cast(_rotation); @@ -1803,13 +1819,15 @@ bool Model::initWhenReady(render::ScenePointer scene) { segregateMeshGroups(); render::PendingChanges pendingChanges; - foreach (auto renderItem, _transparentRenderItems) { auto item = scene->allocateID(); auto renderData = MeshPartPayload::Pointer(renderItem); auto renderPayload = std::make_shared(renderData); _renderItems.insert(item, renderPayload); pendingChanges.resetItem(item, renderPayload); + pendingChanges.updateItem(item, [&](MeshPartPayload& data) { + data.model->_needsUpdateClusterMatrices = true; + }); } foreach (auto renderItem, _opaqueRenderItems) { @@ -1818,6 +1836,9 @@ bool Model::initWhenReady(render::ScenePointer scene) { auto renderPayload = std::make_shared(renderData); _renderItems.insert(item, renderPayload); pendingChanges.resetItem(item, renderPayload); + pendingChanges.updateItem(item, [&](MeshPartPayload& data) { + data.model->_needsUpdateClusterMatrices = true; + }); } scene->enqueuePendingChanges(pendingChanges); diff --git a/libraries/render-utils/src/Model.h b/libraries/render-utils/src/Model.h index 348e5cf549..93b98da8b5 100644 --- a/libraries/render-utils/src/Model.h +++ b/libraries/render-utils/src/Model.h @@ -497,6 +497,7 @@ private: QMap _renderItems; bool _readyWhenAdded = false; bool _needsReload = true; + bool _needsUpdateClusterMatrices = true; protected: RigPointer _rig;