History

Merge branch 'master' into bug-fix/entity-mat-avatar-dual-quaternions

Anthony J. Thibault committed 8 years ago

Commit 86351f12 parents d2c1991 3764502268 files · +12812 −5797Browse files

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

Unified · Split

libraries/render-utils/src/Model.cpp+94−16
@@ -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
701void Model::setVisibleInScene(bool isVisible, const render::ScenePointer& scene, uint8_t viewTagBits) {702void 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
1552std::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
1573void 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
1598void 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
1545class CollisionRenderGeometry : public Geometry {1623class CollisionRenderGeometry : public Geometry {
1546public:1624public:
1547 CollisionRenderGeometry(graphics::MeshPointer mesh) {1625 CollisionRenderGeometry(graphics::MeshPointer mesh) {

Keyboard shortcuts

General

Show keyboard shortcuts
?
Focus the current search
/

Issues and pull requests

Open filters
f

Issues, pull requests and Inbox

Select next item
j↓
Select previous item
k↑
Open selected item
Enter
Dismiss filters or clear selection
Esc

Repository code

Go to file
t