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
798 return payload->model->renderPart(args, payload->meshIndex, payload->partIndex, payload->transparent);798 return payload->model->renderPart(args, payload->meshIndex, payload->partIndex, payload->transparent);
799 }799 }
800 }800 }
801 801
802 /* template <> const model::MaterialKey& shapeGetMaterialKey(const MeshPartPayload::Pointer& payload) {802 /* template <> const model::MaterialKey& shapeGetMaterialKey(const MeshPartPayload::Pointer& payload) {
803 return payload->model->getPartMaterial(payload->meshIndex, payload->partIndex);803 return payload->model->getPartMaterial(payload->meshIndex, payload->partIndex);
804 }*/804 }*/
@@ -829,6 +829,9 @@ bool Model::addToScene(std::shared_ptr<render::Scene> scene, render::PendingChan · 24 unmodified lines
829 auto renderData = MeshPartPayload::Pointer(renderItem);829 auto renderData = MeshPartPayload::Pointer(renderItem);
830 auto renderPayload = std::make_shared<MeshPartPayload::Payload>(renderData);830 auto renderPayload = std::make_shared<MeshPartPayload::Payload>(renderData);
831 pendingChanges.resetItem(item, renderPayload);831 pendingChanges.resetItem(item, renderPayload);
832 pendingChanges.updateItem<MeshPartPayload>(item, [&](MeshPartPayload& data) {
833 data.model->_needsUpdateClusterMatrices = true;
834 });
832 _renderItems.insert(item, renderPayload);835 _renderItems.insert(item, renderPayload);
833 somethingAdded = true;836 somethingAdded = true;
834 }837 }
@@ -838,6 +841,9 @@ bool Model::addToScene(std::shared_ptr<render::Scene> scene, render::PendingChan · 3 unmodified lines
838 auto renderData = MeshPartPayload::Pointer(renderItem);841 auto renderData = MeshPartPayload::Pointer(renderItem);
839 auto renderPayload = std::make_shared<MeshPartPayload::Payload>(renderData);842 auto renderPayload = std::make_shared<MeshPartPayload::Payload>(renderData);
840 pendingChanges.resetItem(item, renderPayload);843 pendingChanges.resetItem(item, renderPayload);
844 pendingChanges.updateItem<MeshPartPayload>(item, [&](MeshPartPayload& data) {
845 data.model->_needsUpdateClusterMatrices = true;
846 });
841 _renderItems.insert(item, renderPayload);847 _renderItems.insert(item, renderPayload);
842 somethingAdded = true;848 somethingAdded = true;
843 }849 }
@@ -860,6 +866,9 @@ bool Model::addToScene(std::shared_ptr<render::Scene> scene, render::PendingChan · 16 unmodified lines
860 auto renderPayload = std::make_shared<MeshPartPayload::Payload>(renderData);866 auto renderPayload = std::make_shared<MeshPartPayload::Payload>(renderData);
861 renderPayload->addStatusGetters(statusGetters);867 renderPayload->addStatusGetters(statusGetters);
862 pendingChanges.resetItem(item, renderPayload);868 pendingChanges.resetItem(item, renderPayload);
869 pendingChanges.updateItem<MeshPartPayload>(item, [&](MeshPartPayload& data) {
870 data.model->_needsUpdateClusterMatrices = true;
871 });
863 _renderItems.insert(item, renderPayload);872 _renderItems.insert(item, renderPayload);
864 somethingAdded = true;873 somethingAdded = true;
865 }874 }
@@ -870,6 +879,9 @@ bool Model::addToScene(std::shared_ptr<render::Scene> scene, render::PendingChan · 4 unmodified lines
870 auto renderPayload = std::make_shared<MeshPartPayload::Payload>(renderData);879 auto renderPayload = std::make_shared<MeshPartPayload::Payload>(renderData);
871 renderPayload->addStatusGetters(statusGetters);880 renderPayload->addStatusGetters(statusGetters);
872 pendingChanges.resetItem(item, renderPayload);881 pendingChanges.resetItem(item, renderPayload);
882 pendingChanges.updateItem<MeshPartPayload>(item, [&](MeshPartPayload& data) {
883 data.model->_needsUpdateClusterMatrices = true;
884 });
873 _renderItems.insert(item, renderPayload);885 _renderItems.insert(item, renderPayload);
874 somethingAdded = true;886 somethingAdded = true;
875 }887 }
@@ -1293,11 +1305,15 @@ void Model::simulateInternal(float deltaTime) { · 417 unmodified lines
1293 updateRig(deltaTime, parentTransform);1305 updateRig(deltaTime, parentTransform);
1294}1306}
1295void Model::updateClusterMatrices() {1307void Model::updateClusterMatrices() {
1308 if (!_needsUpdateClusterMatrices) {
1309 return;
1310 }
1311 _needsUpdateClusterMatrices = false;
1296 const FBXGeometry& geometry = _geometry->getFBXGeometry();1312 const FBXGeometry& geometry = _geometry->getFBXGeometry();
1297 glm::mat4 zeroScale(glm::vec4(0.0f, 0.0f, 0.0f, 0.0f),1313 glm::mat4 zeroScale(glm::vec4(0.0f, 0.0f, 0.0f, 0.0f),
1298 glm::vec4(0.0f, 0.0f, 0.0f, 0.0f),1314 glm::vec4(0.0f, 0.0f, 0.0f, 0.0f),
1299 glm::vec4(0.0f, 0.0f, 0.0f, 0.0f),1315 glm::vec4(0.0f, 0.0f, 0.0f, 0.0f),
1300 glm::vec4(0.0f, 0.0f, 0.0f, 1.0f));1316 glm::vec4(0.0f, 0.0f, 0.0f, 1.0f));
1301 auto cauterizeMatrix = _rig->getJointTransform(geometry.neckJointIndex) * zeroScale;1317 auto cauterizeMatrix = _rig->getJointTransform(geometry.neckJointIndex) * zeroScale;
1302 1318
1303 glm::mat4 modelToWorld = glm::mat4_cast(_rotation);1319 glm::mat4 modelToWorld = glm::mat4_cast(_rotation);
@@ -1803,13 +1819,15 @@ bool Model::initWhenReady(render::ScenePointer scene) { · 499 unmodified lines
1803 segregateMeshGroups();1819 segregateMeshGroups();
1804 1820
1805 render::PendingChanges pendingChanges;1821 render::PendingChanges pendingChanges;
1806
1807 foreach (auto renderItem, _transparentRenderItems) {1822 foreach (auto renderItem, _transparentRenderItems) {
1808 auto item = scene->allocateID();1823 auto item = scene->allocateID();
1809 auto renderData = MeshPartPayload::Pointer(renderItem);1824 auto renderData = MeshPartPayload::Pointer(renderItem);
1810 auto renderPayload = std::make_shared<MeshPartPayload::Payload>(renderData);1825 auto renderPayload = std::make_shared<MeshPartPayload::Payload>(renderData);
1811 _renderItems.insert(item, renderPayload);1826 _renderItems.insert(item, renderPayload);
1812 pendingChanges.resetItem(item, renderPayload);1827 pendingChanges.resetItem(item, renderPayload);
1828 pendingChanges.updateItem<MeshPartPayload>(item, [&](MeshPartPayload& data) {
1829 data.model->_needsUpdateClusterMatrices = true;
1830 });
1813 }1831 }
1814 1832
1815 foreach (auto renderItem, _opaqueRenderItems) {1833 foreach (auto renderItem, _opaqueRenderItems) {
@@ -1818,6 +1836,9 @@ bool Model::initWhenReady(render::ScenePointer scene) { · 2 unmodified lines
1818 auto renderPayload = std::make_shared<MeshPartPayload::Payload>(renderData);1836 auto renderPayload = std::make_shared<MeshPartPayload::Payload>(renderData);
1819 _renderItems.insert(item, renderPayload);1837 _renderItems.insert(item, renderPayload);
1820 pendingChanges.resetItem(item, renderPayload);1838 pendingChanges.resetItem(item, renderPayload);
1839 pendingChanges.updateItem<MeshPartPayload>(item, [&](MeshPartPayload& data) {
1840 data.model->_needsUpdateClusterMatrices = true;
1841 });
1821 }1842 }
1822 scene->enqueuePendingChanges(pendingChanges);1843 scene->enqueuePendingChanges(pendingChanges);
1823 1844