Showing the changes to libraries/render-utils/src/Model.cpp (1 of 268 files). Show all
Unified · Split
| @@ -271,6 +271,7 @@ void Model::updateRenderItems() { · 270 unmodified lines | |||
| 271 | uint8_t viewTagBits = self->getViewTagBits(); | 271 | uint8_t viewTagBits = self->getViewTagBits(); |
| 272 | bool isLayeredInFront = self->isLayeredInFront(); | 272 | bool isLayeredInFront = self->isLayeredInFront(); |
| 273 | bool isLayeredInHUD = self->isLayeredInHUD(); | 273 | bool isLayeredInHUD = self->isLayeredInHUD(); |
| 274 | bool isGroupCulled = self->isGroupCulled(); | ||
| 274 | 275 | ||
| 275 | render::Transaction transaction; | 276 | render::Transaction transaction; |
| 276 | for (int i = 0; i < (int) self->_modelMeshRenderItemIDs.size(); i++) { | 277 | for (int i = 0; i < (int) self->_modelMeshRenderItemIDs.size(); i++) { |
| @@ -286,7 +287,7 @@ void Model::updateRenderItems() { · 9 unmodified lines | |||
| 286 | transaction.updateItem<ModelMeshPartPayload>(itemID, [modelTransform, meshState, useDualQuaternionSkinning, | 287 | transaction.updateItem<ModelMeshPartPayload>(itemID, [modelTransform, meshState, useDualQuaternionSkinning, |
| 287 | invalidatePayloadShapeKey, isWireframe, isVisible, | 288 | invalidatePayloadShapeKey, isWireframe, isVisible, |
| 288 | viewTagBits, isLayeredInFront, | 289 | viewTagBits, isLayeredInFront, |
| 289 | isLayeredInHUD](ModelMeshPartPayload& data) { | 290 | isLayeredInHUD, isGroupCulled](ModelMeshPartPayload& data) { |
| 290 | if (useDualQuaternionSkinning) { | 291 | if (useDualQuaternionSkinning) { |
| 291 | data.updateClusterBuffer(meshState.clusterDualQuaternions); | 292 | data.updateClusterBuffer(meshState.clusterDualQuaternions); |
| 292 | } else { | 293 | } else { |
| @@ -310,7 +311,7 @@ void Model::updateRenderItems() { · 17 unmodified lines | |||
| 310 | } | 311 | } |
| 311 | data.updateTransformForSkinnedMesh(renderTransform, modelTransform); | 312 | data.updateTransformForSkinnedMesh(renderTransform, modelTransform); |
| 312 | 313 | ||
| 313 | data.updateKey(isVisible, isLayeredInFront || isLayeredInHUD, viewTagBits); | 314 | data.updateKey(isVisible, isLayeredInFront || isLayeredInHUD, viewTagBits, isGroupCulled); |
| 314 | data.setLayer(isLayeredInFront, isLayeredInHUD); | 315 | data.setLayer(isLayeredInFront, isLayeredInHUD); |
| 315 | data.setShapeKey(invalidatePayloadShapeKey, isWireframe); | 316 | data.setShapeKey(invalidatePayloadShapeKey, isWireframe); |
| 316 | }); | 317 | }); |
| @@ -698,10 +699,11 @@ void Model::calculateTriangleSets() { · 381 unmodified lines | |||
| 698 | } | 699 | } |
| 699 | } | 700 | } |
| 700 | 701 | ||
| 701 | void Model::setVisibleInScene(bool isVisible, const render::ScenePointer& scene, uint8_t viewTagBits) { | 702 | void Model::setVisibleInScene(bool isVisible, const render::ScenePointer& scene, uint8_t viewTagBits, bool isGroupCulled) { |
| 702 | if (_isVisible != isVisible || _viewTagBits != viewTagBits) { | 703 | if (_isVisible != isVisible || _viewTagBits != viewTagBits || _isGroupCulled != isGroupCulled) { |
| 703 | _isVisible = isVisible; | 704 | _isVisible = isVisible; |
| 704 | _viewTagBits = viewTagBits; | 705 | _viewTagBits = viewTagBits; |
| 706 | _isGroupCulled = isGroupCulled; | ||
| 705 | 707 | ||
| 706 | bool isLayeredInFront = _isLayeredInFront; | 708 | bool isLayeredInFront = _isLayeredInFront; |
| 707 | bool isLayeredInHUD = _isLayeredInHUD; | 709 | bool isLayeredInHUD = _isLayeredInHUD; |
| @@ -709,14 +711,14 @@ void Model::setVisibleInScene(bool isVisible, const render::ScenePointer& scene, · 1 unmodified line | |||
| 709 | render::Transaction transaction; | 711 | render::Transaction transaction; |
| 710 | foreach (auto item, _modelMeshRenderItemsMap.keys()) { | 712 | foreach (auto item, _modelMeshRenderItemsMap.keys()) { |
| 711 | transaction.updateItem<ModelMeshPartPayload>(item, [isVisible, viewTagBits, isLayeredInFront, | 713 | transaction.updateItem<ModelMeshPartPayload>(item, [isVisible, viewTagBits, isLayeredInFront, |
| 712 | isLayeredInHUD](ModelMeshPartPayload& data) { | 714 | isLayeredInHUD, isGroupCulled](ModelMeshPartPayload& data) { |
| 713 | data.updateKey(isVisible, isLayeredInFront || isLayeredInHUD, viewTagBits); | 715 | data.updateKey(isVisible, isLayeredInFront || isLayeredInHUD, viewTagBits, isGroupCulled); |
| 714 | }); | 716 | }); |
| 715 | } | 717 | } |
| 716 | foreach(auto item, _collisionRenderItemsMap.keys()) { | 718 | foreach(auto item, _collisionRenderItemsMap.keys()) { |
| 717 | transaction.updateItem<ModelMeshPartPayload>(item, [isVisible, viewTagBits, isLayeredInFront, | 719 | transaction.updateItem<ModelMeshPartPayload>(item, [isVisible, viewTagBits, isLayeredInFront, |
| 718 | isLayeredInHUD](ModelMeshPartPayload& data) { | 720 | isLayeredInHUD, isGroupCulled](ModelMeshPartPayload& data) { |
| 719 | data.updateKey(isVisible, isLayeredInFront || isLayeredInHUD, viewTagBits); | 721 | data.updateKey(isVisible, isLayeredInFront || isLayeredInHUD, viewTagBits, isGroupCulled); |
| 720 | }); | 722 | }); |
| 721 | } | 723 | } |
| 722 | scene->enqueueTransaction(transaction); | 724 | scene->enqueueTransaction(transaction); |
| @@ -731,19 +733,20 @@ void Model::setLayeredInFront(bool isLayeredInFront, const render::ScenePointer& · 8 unmodified lines | |||
| 731 | bool isVisible = _isVisible; | 733 | bool isVisible = _isVisible; |
| 732 | uint8_t viewTagBits = _viewTagBits; | 734 | uint8_t viewTagBits = _viewTagBits; |
| 733 | bool isLayeredInHUD = _isLayeredInHUD; | 735 | bool isLayeredInHUD = _isLayeredInHUD; |
| 736 | bool isGroupCulled = _isGroupCulled; | ||
| 734 | 737 | ||
| 735 | render::Transaction transaction; | 738 | render::Transaction transaction; |
| 736 | foreach(auto item, _modelMeshRenderItemsMap.keys()) { | 739 | foreach(auto item, _modelMeshRenderItemsMap.keys()) { |
| 737 | transaction.updateItem<ModelMeshPartPayload>(item, [isVisible, viewTagBits, isLayeredInFront, | 740 | transaction.updateItem<ModelMeshPartPayload>(item, [isVisible, viewTagBits, isLayeredInFront, |
| 738 | isLayeredInHUD](ModelMeshPartPayload& data) { | 741 | isLayeredInHUD, isGroupCulled](ModelMeshPartPayload& data) { |
| 739 | data.updateKey(isVisible, isLayeredInFront || isLayeredInHUD, viewTagBits); | 742 | data.updateKey(isVisible, isLayeredInFront || isLayeredInHUD, viewTagBits, isGroupCulled); |
| 740 | data.setLayer(isLayeredInFront, isLayeredInHUD); | 743 | data.setLayer(isLayeredInFront, isLayeredInHUD); |
| 741 | }); | 744 | }); |
| 742 | } | 745 | } |
| 743 | foreach(auto item, _collisionRenderItemsMap.keys()) { | 746 | foreach(auto item, _collisionRenderItemsMap.keys()) { |
| 744 | transaction.updateItem<ModelMeshPartPayload>(item, [isVisible, viewTagBits, isLayeredInFront, | 747 | transaction.updateItem<ModelMeshPartPayload>(item, [isVisible, viewTagBits, isLayeredInFront, |
| 745 | isLayeredInHUD](ModelMeshPartPayload& data) { | 748 | isLayeredInHUD, isGroupCulled](ModelMeshPartPayload& data) { |
| 746 | data.updateKey(isVisible, isLayeredInFront || isLayeredInHUD, viewTagBits); | 749 | data.updateKey(isVisible, isLayeredInFront || isLayeredInHUD, viewTagBits, isGroupCulled); |
| 747 | data.setLayer(isLayeredInFront, isLayeredInHUD); | 750 | data.setLayer(isLayeredInFront, isLayeredInHUD); |
| 748 | }); | 751 | }); |
| 749 | } | 752 | } |
| @@ -758,19 +761,20 @@ void Model::setLayeredInHUD(bool isLayeredInHUD, const render::ScenePointer& sce · 8 unmodified lines | |||
| 758 | bool isVisible = _isVisible; | 761 | bool isVisible = _isVisible; |
| 759 | uint8_t viewTagBits = _viewTagBits; | 762 | uint8_t viewTagBits = _viewTagBits; |
| 760 | bool isLayeredInFront = _isLayeredInFront; | 763 | bool isLayeredInFront = _isLayeredInFront; |
| 764 | bool isGroupCulled = _isGroupCulled; | ||
| 761 | 765 | ||
| 762 | render::Transaction transaction; | 766 | render::Transaction transaction; |
| 763 | foreach(auto item, _modelMeshRenderItemsMap.keys()) { | 767 | foreach(auto item, _modelMeshRenderItemsMap.keys()) { |
| 764 | transaction.updateItem<ModelMeshPartPayload>(item, [isVisible, viewTagBits, isLayeredInFront, | 768 | transaction.updateItem<ModelMeshPartPayload>(item, [isVisible, viewTagBits, isLayeredInFront, |
| 765 | isLayeredInHUD](ModelMeshPartPayload& data) { | 769 | isLayeredInHUD, isGroupCulled](ModelMeshPartPayload& data) { |
| 766 | data.updateKey(isVisible, isLayeredInFront || isLayeredInHUD, viewTagBits); | 770 | data.updateKey(isVisible, isLayeredInFront || isLayeredInHUD, viewTagBits, isGroupCulled); |
| 767 | data.setLayer(isLayeredInFront, isLayeredInHUD); | 771 | data.setLayer(isLayeredInFront, isLayeredInHUD); |
| 768 | }); | 772 | }); |
| 769 | } | 773 | } |
| 770 | foreach(auto item, _collisionRenderItemsMap.keys()) { | 774 | foreach(auto item, _collisionRenderItemsMap.keys()) { |
| 771 | transaction.updateItem<ModelMeshPartPayload>(item, [isVisible, viewTagBits, isLayeredInFront, | 775 | transaction.updateItem<ModelMeshPartPayload>(item, [isVisible, viewTagBits, isLayeredInFront, |
| 772 | isLayeredInHUD](ModelMeshPartPayload& data) { | 776 | isLayeredInHUD, isGroupCulled](ModelMeshPartPayload& data) { |
| 773 | data.updateKey(isVisible, isLayeredInFront || isLayeredInHUD, viewTagBits); | 777 | data.updateKey(isVisible, isLayeredInFront || isLayeredInHUD, viewTagBits, isGroupCulled); |
| 774 | data.setLayer(isLayeredInFront, isLayeredInHUD); | 778 | data.setLayer(isLayeredInFront, isLayeredInHUD); |
| 775 | }); | 779 | }); |
| 776 | } | 780 | } |
| @@ -842,6 +846,7 @@ void Model::removeFromScene(const render::ScenePointer& scene, render::Transacti · 65 unmodified lines | |||
| 842 | _modelMeshRenderItemIDs.clear(); | 846 | _modelMeshRenderItemIDs.clear(); |
| 843 | _modelMeshRenderItemsMap.clear(); | 847 | _modelMeshRenderItemsMap.clear(); |
| 844 | _modelMeshRenderItems.clear(); | 848 | _modelMeshRenderItems.clear(); |
| 849 | _modelMeshMaterialNames.clear(); | ||
| 845 | _modelMeshRenderItemShapes.clear(); | 850 | _modelMeshRenderItemShapes.clear(); |
| 846 | 851 | ||
| 847 | foreach(auto item, _collisionRenderItemsMap.keys()) { | 852 | foreach(auto item, _collisionRenderItemsMap.keys()) { |
| @@ -1474,6 +1479,7 @@ void Model::createVisibleRenderItemSet() { · 626 unmodified lines | |||
| 1474 | Q_ASSERT(_modelMeshRenderItems.isEmpty()); | 1479 | Q_ASSERT(_modelMeshRenderItems.isEmpty()); |
| 1475 | 1480 | ||
| 1476 | _modelMeshRenderItems.clear(); | 1481 | _modelMeshRenderItems.clear(); |
| 1482 | _modelMeshMaterialNames.clear(); | ||
| 1477 | _modelMeshRenderItemShapes.clear(); | 1483 | _modelMeshRenderItemShapes.clear(); |
| 1478 | 1484 | ||
| 1479 | Transform transform; | 1485 | Transform transform; |
| @@ -1497,6 +1503,7 @@ void Model::createVisibleRenderItemSet() { · 17 unmodified lines | |||
| 1497 | int numParts = (int)mesh->getNumParts(); | 1503 | int numParts = (int)mesh->getNumParts(); |
| 1498 | for (int partIndex = 0; partIndex < numParts; partIndex++) { | 1504 | for (int partIndex = 0; partIndex < numParts; partIndex++) { |
| 1499 | _modelMeshRenderItems << std::make_shared<ModelMeshPartPayload>(shared_from_this(), i, partIndex, shapeID, transform, offset); | 1505 | _modelMeshRenderItems << std::make_shared<ModelMeshPartPayload>(shared_from_this(), i, partIndex, shapeID, transform, offset); |
| 1506 | _modelMeshMaterialNames.push_back(getGeometry()->getShapeMaterial(shapeID)->getName()); | ||
| 1500 | _modelMeshRenderItemShapes.emplace_back(ShapeInfo{ (int)i }); | 1507 | _modelMeshRenderItemShapes.emplace_back(ShapeInfo{ (int)i }); |
| 1501 | shapeID++; | 1508 | shapeID++; |
| 1502 | } | 1509 | } |
| @@ -1542,6 +1549,77 @@ bool Model::isRenderable() const { · 39 unmodified lines | |||
| 1542 | return !_meshStates.empty() || (isLoaded() && _renderGeometry->getMeshes().empty()); | 1549 | return !_meshStates.empty() || (isLoaded() && _renderGeometry->getMeshes().empty()); |
| 1543 | } | 1550 | } |
| 1544 | 1551 | ||
| 1552 | std::vector<unsigned int> Model::getMeshIDsFromMaterialID(QString parentMaterialName) { | ||
| 1553 | // try to find all meshes with materials that match parentMaterialName as a string | ||
| 1554 | // if none, return parentMaterialName as a uint | ||
| 1555 | std::vector<unsigned int> toReturn; | ||
| 1556 | const QString MATERIAL_NAME_PREFIX = "mat::"; | ||
| 1557 | if (parentMaterialName.startsWith(MATERIAL_NAME_PREFIX)) { | ||
| 1558 | parentMaterialName.replace(0, MATERIAL_NAME_PREFIX.size(), QString("")); | ||
| 1559 | for (unsigned int i = 0; i < (unsigned int)_modelMeshMaterialNames.size(); i++) { | ||
| 1560 | if (_modelMeshMaterialNames[i] == parentMaterialName.toStdString()) { | ||
| 1561 | toReturn.push_back(i); | ||
| 1562 | } | ||
| 1563 | } | ||
| 1564 | } | ||
| 1565 | |||
| 1566 | if (toReturn.empty()) { | ||
| 1567 | toReturn.push_back(parentMaterialName.toUInt()); | ||
| 1568 | } | ||
| 1569 | |||
| 1570 | return toReturn; | ||
| 1571 | } | ||
| 1572 | |||
| 1573 | void Model::addMaterial(graphics::MaterialLayer material, const std::string& parentMaterialName) { | ||
| 1574 | std::vector<unsigned int> shapeIDs = getMeshIDsFromMaterialID(QString(parentMaterialName.c_str())); | ||
| 1575 | render::Transaction transaction; | ||
| 1576 | for (auto shapeID : shapeIDs) { | ||
| 1577 | if (shapeID < _modelMeshRenderItemIDs.size()) { | ||
| 1578 | auto itemID = _modelMeshRenderItemIDs[shapeID]; | ||
| 1579 | bool visible = isVisible(); | ||
| 1580 | uint8_t viewTagBits = getViewTagBits(); | ||
| 1581 | bool layeredInFront = isLayeredInFront(); | ||
| 1582 | bool layeredInHUD = isLayeredInHUD(); | ||
| 1583 | bool wireframe = isWireframe(); | ||
| 1584 | auto meshIndex = _modelMeshRenderItemShapes[shapeID].meshIndex; | ||
| 1585 | bool invalidatePayloadShapeKey = shouldInvalidatePayloadShapeKey(meshIndex); | ||
| 1586 | transaction.updateItem<ModelMeshPartPayload>(itemID, [material, visible, layeredInFront, layeredInHUD, viewTagBits, | ||
| 1587 | invalidatePayloadShapeKey, wireframe](ModelMeshPartPayload& data) { | ||
| 1588 | data.addMaterial(material); | ||
| 1589 | // if the material changed, we might need to update our item key or shape key | ||
| 1590 | data.updateKey(visible, layeredInFront || layeredInHUD, viewTagBits); | ||
| 1591 | data.setShapeKey(invalidatePayloadShapeKey, wireframe); | ||
| 1592 | }); | ||
| 1593 | } | ||
| 1594 | } | ||
| 1595 | AbstractViewStateInterface::instance()->getMain3DScene()->enqueueTransaction(transaction); | ||
| 1596 | } | ||
| 1597 | |||
| 1598 | void Model::removeMaterial(graphics::MaterialPointer material, const std::string& parentMaterialName) { | ||
| 1599 | std::vector<unsigned int> shapeIDs = getMeshIDsFromMaterialID(QString(parentMaterialName.c_str())); | ||
| 1600 | render::Transaction transaction; | ||
| 1601 | for (auto shapeID : shapeIDs) { | ||
| 1602 | if (shapeID < _modelMeshRenderItemIDs.size()) { | ||
| 1603 | auto itemID = _modelMeshRenderItemIDs[shapeID]; | ||
| 1604 | bool visible = isVisible(); | ||
| 1605 | uint8_t viewTagBits = getViewTagBits(); | ||
| 1606 | bool layeredInFront = isLayeredInFront(); | ||
| 1607 | bool layeredInHUD = isLayeredInHUD(); | ||
| 1608 | bool wireframe = isWireframe(); | ||
| 1609 | auto meshIndex = _modelMeshRenderItemShapes[shapeID].meshIndex; | ||
| 1610 | bool invalidatePayloadShapeKey = shouldInvalidatePayloadShapeKey(meshIndex); | ||
| 1611 | transaction.updateItem<ModelMeshPartPayload>(itemID, [material, visible, layeredInFront, layeredInHUD, viewTagBits, | ||
| 1612 | invalidatePayloadShapeKey, wireframe](ModelMeshPartPayload& data) { | ||
| 1613 | data.removeMaterial(material); | ||
| 1614 | // if the material changed, we might need to update our item key or shape key | ||
| 1615 | data.updateKey(visible, layeredInFront || layeredInHUD, viewTagBits); | ||
| 1616 | data.setShapeKey(invalidatePayloadShapeKey, wireframe); | ||
| 1617 | }); | ||
| 1618 | } | ||
| 1619 | } | ||
| 1620 | AbstractViewStateInterface::instance()->getMain3DScene()->enqueueTransaction(transaction); | ||
| 1621 | } | ||
| 1622 | |||
| 1545 | class CollisionRenderGeometry : public Geometry { | 1623 | class CollisionRenderGeometry : public Geometry { |
| 1546 | public: | 1624 | public: |
| 1547 | CollisionRenderGeometry(graphics::MeshPointer mesh) { | 1625 | CollisionRenderGeometry(graphics::MeshPointer mesh) { |