History

Don't do an O(N^2) operation on cluster matrices

Brad Davis committed 11 years ago

Commit 35e44401 parent 23853312 files · +27 −5Browse files

Showing the changes to libraries/render-utils/src/Model.cpp (1 of 2 files). Show all

Unified · Split

libraries/render-utils/src/Model.cpp+26−5
@@ -798,7 +798,7 @@ namespace render { · 797 unmodified lines
798798 return payload->model->renderPart(args, payload->meshIndex, payload->partIndex, payload->transparent);
799799 }
800800 }
801−
801+
802802 /* template <> const model::MaterialKey& shapeGetMaterialKey(const MeshPartPayload::Pointer& payload) {
803803 return payload->model->getPartMaterial(payload->meshIndex, payload->partIndex);
804804 }*/
@@ -829,6 +829,9 @@ bool Model::addToScene(std::shared_ptr<render::Scene> scene, render::PendingChan · 24 unmodified lines
829829 auto renderData = MeshPartPayload::Pointer(renderItem);
830830 auto renderPayload = std::make_shared<MeshPartPayload::Payload>(renderData);
831831 pendingChanges.resetItem(item, renderPayload);
832+ pendingChanges.updateItem<MeshPartPayload>(item, [&](MeshPartPayload& data) {
833+ data.model->_needsUpdateClusterMatrices = true;
834+ });
832835 _renderItems.insert(item, renderPayload);
833836 somethingAdded = true;
834837 }
@@ -838,6 +841,9 @@ bool Model::addToScene(std::shared_ptr<render::Scene> scene, render::PendingChan · 3 unmodified lines
838841 auto renderData = MeshPartPayload::Pointer(renderItem);
839842 auto renderPayload = std::make_shared<MeshPartPayload::Payload>(renderData);
840843 pendingChanges.resetItem(item, renderPayload);
844+ pendingChanges.updateItem<MeshPartPayload>(item, [&](MeshPartPayload& data) {
845+ data.model->_needsUpdateClusterMatrices = true;
846+ });
841847 _renderItems.insert(item, renderPayload);
842848 somethingAdded = true;
843849 }
@@ -860,6 +866,9 @@ bool Model::addToScene(std::shared_ptr<render::Scene> scene, render::PendingChan · 16 unmodified lines
860866 auto renderPayload = std::make_shared<MeshPartPayload::Payload>(renderData);
861867 renderPayload->addStatusGetters(statusGetters);
862868 pendingChanges.resetItem(item, renderPayload);
869+ pendingChanges.updateItem<MeshPartPayload>(item, [&](MeshPartPayload& data) {
870+ data.model->_needsUpdateClusterMatrices = true;
871+ });
863872 _renderItems.insert(item, renderPayload);
864873 somethingAdded = true;
865874 }
@@ -870,6 +879,9 @@ bool Model::addToScene(std::shared_ptr<render::Scene> scene, render::PendingChan · 4 unmodified lines
870879 auto renderPayload = std::make_shared<MeshPartPayload::Payload>(renderData);
871880 renderPayload->addStatusGetters(statusGetters);
872881 pendingChanges.resetItem(item, renderPayload);
882+ pendingChanges.updateItem<MeshPartPayload>(item, [&](MeshPartPayload& data) {
883+ data.model->_needsUpdateClusterMatrices = true;
884+ });
873885 _renderItems.insert(item, renderPayload);
874886 somethingAdded = true;
875887 }
@@ -1293,11 +1305,15 @@ void Model::simulateInternal(float deltaTime) { · 417 unmodified lines
12931305 updateRig(deltaTime, parentTransform);
12941306 }
12951307 void Model::updateClusterMatrices() {
1308+ if (!_needsUpdateClusterMatrices) {
1309+ return;
1310+ }
1311+ _needsUpdateClusterMatrices = false;
12961312 const FBXGeometry& geometry = _geometry->getFBXGeometry();
12971313 glm::mat4 zeroScale(glm::vec4(0.0f, 0.0f, 0.0f, 0.0f),
1298− glm::vec4(0.0f, 0.0f, 0.0f, 0.0f),
1299− glm::vec4(0.0f, 0.0f, 0.0f, 0.0f),
1300− glm::vec4(0.0f, 0.0f, 0.0f, 1.0f));
1314+ glm::vec4(0.0f, 0.0f, 0.0f, 0.0f),
1315+ glm::vec4(0.0f, 0.0f, 0.0f, 0.0f),
1316+ glm::vec4(0.0f, 0.0f, 0.0f, 1.0f));
13011317 auto cauterizeMatrix = _rig->getJointTransform(geometry.neckJointIndex) * zeroScale;
13021318
13031319 glm::mat4 modelToWorld = glm::mat4_cast(_rotation);
@@ -1803,13 +1819,15 @@ bool Model::initWhenReady(render::ScenePointer scene) { · 499 unmodified lines
18031819 segregateMeshGroups();
18041820
18051821 render::PendingChanges pendingChanges;
1806−
18071822 foreach (auto renderItem, _transparentRenderItems) {
18081823 auto item = scene->allocateID();
18091824 auto renderData = MeshPartPayload::Pointer(renderItem);
18101825 auto renderPayload = std::make_shared<MeshPartPayload::Payload>(renderData);
18111826 _renderItems.insert(item, renderPayload);
18121827 pendingChanges.resetItem(item, renderPayload);
1828+ pendingChanges.updateItem<MeshPartPayload>(item, [&](MeshPartPayload& data) {
1829+ data.model->_needsUpdateClusterMatrices = true;
1830+ });
18131831 }
18141832
18151833 foreach (auto renderItem, _opaqueRenderItems) {
@@ -1818,6 +1836,9 @@ bool Model::initWhenReady(render::ScenePointer scene) { · 2 unmodified lines
18181836 auto renderPayload = std::make_shared<MeshPartPayload::Payload>(renderData);
18191837 _renderItems.insert(item, renderPayload);
18201838 pendingChanges.resetItem(item, renderPayload);
1839+ pendingChanges.updateItem<MeshPartPayload>(item, [&](MeshPartPayload& data) {
1840+ data.model->_needsUpdateClusterMatrices = true;
1841+ });
18211842 }
18221843 scene->enqueuePendingChanges(pendingChanges);
18231844