From c435afb728f46d4c437cbe61fd6dc8f49c97a68b Mon Sep 17 00:00:00 2001 From: samcake Date: Mon, 19 Dec 2016 13:17:56 -0800 Subject: [PATCH] Introducing a fix for the overlayered model drawn in front --- interface/src/ui/overlays/ModelOverlay.cpp | 1 + .../render-utils/src/MeshPartPayload.cpp | 21 +++++++++++++++++++ libraries/render-utils/src/MeshPartPayload.h | 2 ++ libraries/render-utils/src/Model.cpp | 16 ++++++++++++++ libraries/render-utils/src/Model.h | 5 +++++ 5 files changed, 45 insertions(+) diff --git a/interface/src/ui/overlays/ModelOverlay.cpp b/interface/src/ui/overlays/ModelOverlay.cpp index 694a1e1ddc..f70537a952 100644 --- a/interface/src/ui/overlays/ModelOverlay.cpp +++ b/interface/src/ui/overlays/ModelOverlay.cpp @@ -81,6 +81,7 @@ void ModelOverlay::render(RenderArgs* args) { } _model->setVisibleInScene(_visible, scene); + _model->setLayeredInFront(getDrawInFront(), scene); scene->enqueuePendingChanges(pendingChanges); } diff --git a/libraries/render-utils/src/MeshPartPayload.cpp b/libraries/render-utils/src/MeshPartPayload.cpp index c791c1f98e..767d6f14db 100644 --- a/libraries/render-utils/src/MeshPartPayload.cpp +++ b/libraries/render-utils/src/MeshPartPayload.cpp @@ -304,6 +304,12 @@ template <> const Item::Bound payloadGetBound(const ModelMeshPartPayload::Pointe } return Item::Bound(); } +template <> int payloadGetLayer(const ModelMeshPartPayload::Pointer& payload) { + if (payload) { + return payload->getLayer(); + } + return 0; +} template <> const ShapeKey shapeGetShapeKey(const ModelMeshPartPayload::Pointer& payload) { if (payload) { @@ -378,6 +384,10 @@ ItemKey ModelMeshPartPayload::getKey() const { builder.withInvisible(); } + if (_model->isLayeredInFront()) { + builder.withLayered(); + } + if (_isBlendShaped || _isSkinned) { builder.withDeformed(); } @@ -396,6 +406,17 @@ ItemKey ModelMeshPartPayload::getKey() const { return builder.build(); } +int ModelMeshPartPayload::getLayer() const { + // MAgic number while we are defining the layering mechanism: + const int LAYER_3D_FRONT = 1; + const int LAYER_3D = 0; + if (_model->isLayeredInFront()) { + return LAYER_3D_FRONT; + } else { + return LAYER_3D; + } +} + ShapeKey ModelMeshPartPayload::getShapeKey() const { // guard against partially loaded meshes diff --git a/libraries/render-utils/src/MeshPartPayload.h b/libraries/render-utils/src/MeshPartPayload.h index 04b63874cd..3b882a9bb9 100644 --- a/libraries/render-utils/src/MeshPartPayload.h +++ b/libraries/render-utils/src/MeshPartPayload.h @@ -95,6 +95,7 @@ public: // Render Item interface render::ItemKey getKey() const override; + int getLayer() const; render::ShapeKey getShapeKey() const override; // shape interface void render(RenderArgs* args) const override; @@ -122,6 +123,7 @@ private: namespace render { template <> const ItemKey payloadGetKey(const ModelMeshPartPayload::Pointer& payload); template <> const Item::Bound payloadGetBound(const ModelMeshPartPayload::Pointer& payload); + template <> int payloadGetLayer(const ModelMeshPartPayload::Pointer& payload); template <> const ShapeKey shapeGetShapeKey(const ModelMeshPartPayload::Pointer& payload); template <> void payloadRender(const ModelMeshPartPayload::Pointer& payload, RenderArgs* args); } diff --git a/libraries/render-utils/src/Model.cpp b/libraries/render-utils/src/Model.cpp index 03abfb35e4..87ea455482 100644 --- a/libraries/render-utils/src/Model.cpp +++ b/libraries/render-utils/src/Model.cpp @@ -620,6 +620,22 @@ void Model::setVisibleInScene(bool newValue, std::shared_ptr scen } } + +void Model::setLayeredInFront(bool layered, std::shared_ptr scene) { + if (_isLayeredInFront != layered) { + _isLayeredInFront = layered; + + render::PendingChanges pendingChanges; + foreach(auto item, _modelMeshRenderItems.keys()) { + pendingChanges.resetItem(item, _modelMeshRenderItems[item]); + } + foreach(auto item, _collisionRenderItems.keys()) { + pendingChanges.resetItem(item, _collisionRenderItems[item]); + } + scene->enqueuePendingChanges(pendingChanges); + } +} + bool Model::addToScene(std::shared_ptr scene, render::PendingChanges& pendingChanges, render::Item::Status::Getters& statusGetters) { diff --git a/libraries/render-utils/src/Model.h b/libraries/render-utils/src/Model.h index 0ab028f8eb..d4387a6a9a 100644 --- a/libraries/render-utils/src/Model.h +++ b/libraries/render-utils/src/Model.h @@ -80,6 +80,7 @@ public: // new Scene/Engine rendering support void setVisibleInScene(bool newValue, std::shared_ptr scene); + void setLayeredInFront(bool layered, std::shared_ptr scene); bool needsFixupInScene() const; bool needsReload() const { return _needsReload; } @@ -98,6 +99,8 @@ public: bool isVisible() const { return _isVisible; } + bool isLayeredInFront() const { return _isLayeredInFront; } + void updateRenderItems(); void setRenderItemsNeedUpdate() { _renderItemsNeedUpdate = true; } bool getRenderItemsNeedUpdate() { return _renderItemsNeedUpdate; } @@ -413,6 +416,8 @@ protected: int _renderInfoDrawCalls { 0 }; int _renderInfoHasTransparent { false }; + bool _isLayeredInFront { false }; + private: float _loadingPriority { 0.0f };