diff --git a/libraries/entities-renderer/src/RenderableEntityItem.cpp b/libraries/entities-renderer/src/RenderableEntityItem.cpp index aec9f092b9..0c93a795ed 100644 --- a/libraries/entities-renderer/src/RenderableEntityItem.cpp +++ b/libraries/entities-renderer/src/RenderableEntityItem.cpp @@ -226,7 +226,7 @@ bool EntityRenderer::passesZoneOcclusionTest(const std::unordered_set& co return true; } -void EntityRenderer::computeMirrorView(ViewFrustum& viewFrustum) const { +ItemID EntityRenderer::computeMirrorView(ViewFrustum& viewFrustum) const { glm::vec3 inPropertiesPosition; glm::quat inPropertiesRotation; MirrorMode mirrorMode; @@ -237,11 +237,11 @@ void EntityRenderer::computeMirrorView(ViewFrustum& viewFrustum) const { mirrorMode = _mirrorMode; portalExitID = _portalExitID; }); - computeMirrorViewOperator(viewFrustum, inPropertiesPosition, inPropertiesRotation, mirrorMode, portalExitID); + return computeMirrorViewOperator(viewFrustum, inPropertiesPosition, inPropertiesRotation, mirrorMode, portalExitID); } -void EntityRenderer::computeMirrorViewOperator(ViewFrustum& viewFrustum, const glm::vec3& inPropertiesPosition, const glm::quat& inPropertiesRotation, - MirrorMode mirrorMode, const QUuid& portalExitID) { +ItemID EntityRenderer::computeMirrorViewOperator(ViewFrustum& viewFrustum, const glm::vec3& inPropertiesPosition, const glm::quat& inPropertiesRotation, + MirrorMode mirrorMode, const QUuid& portalExitID) { glm::mat4 inToWorld = glm::translate(inPropertiesPosition) * glm::mat4_cast(inPropertiesRotation); glm::mat4 worldToIn = glm::inverse(inToWorld); @@ -313,6 +313,8 @@ void EntityRenderer::computeMirrorViewOperator(ViewFrustum& viewFrustum, const g projection[3][2] = c.w; viewFrustum.setProjection(projection, true); + + return (mirrorMode == MirrorMode::PORTAL && !portalExitID.isNull()) ? DependencyManager::get()->renderableIdForEntityId(portalExitID) : Item::INVALID_ITEM_ID; } void EntityRenderer::render(RenderArgs* args) { diff --git a/libraries/entities-renderer/src/RenderableEntityItem.h b/libraries/entities-renderer/src/RenderableEntityItem.h index fceba6f0e6..99dbffbc72 100644 --- a/libraries/entities-renderer/src/RenderableEntityItem.h +++ b/libraries/entities-renderer/src/RenderableEntityItem.h @@ -75,9 +75,9 @@ public: virtual uint32_t metaFetchMetaSubItems(ItemIDs& subItems) const override; virtual Item::Bound getBound(RenderArgs* args) override; bool passesZoneOcclusionTest(const std::unordered_set& containingZones) const override; - void computeMirrorView(ViewFrustum& viewFrustum) const override; - static void computeMirrorViewOperator(ViewFrustum& viewFrustum, const glm::vec3& inPropertiesPosition, const glm::quat& inPropertiesRotation, - MirrorMode mirrorMode, const QUuid& portalExitID); + ItemID computeMirrorView(ViewFrustum& viewFrustum) const override; + static ItemID computeMirrorViewOperator(ViewFrustum& viewFrustum, const glm::vec3& inPropertiesPosition, const glm::quat& inPropertiesRotation, + MirrorMode mirrorMode, const QUuid& portalExitID); protected: virtual bool needsRenderUpdateFromEntity() const final { return needsRenderUpdateFromEntity(_entity); } diff --git a/libraries/entities-renderer/src/RenderableImageEntityItem.cpp b/libraries/entities-renderer/src/RenderableImageEntityItem.cpp index 4c18653d4f..66a5d0d609 100644 --- a/libraries/entities-renderer/src/RenderableImageEntityItem.cpp +++ b/libraries/entities-renderer/src/RenderableImageEntityItem.cpp @@ -199,8 +199,10 @@ void ImageEntityRenderer::doRender(RenderArgs* args) { procedural->prepare(*batch, transform.getTranslation(), transform.getScale(), transform.getRotation(), _created, ProceduralProgramKey(transparent)); } else if (pipelineType == Pipeline::SIMPLE) { batch->setResourceTexture(0, _texture->getGPUTexture()); - } else if (RenderPipelines::bindMaterials(materials, *batch, args->_renderMode, args->_enableTexturing)) { - args->_details._materialSwitches++; + } else if (pipelineType == Pipeline::MATERIAL) { + if (RenderPipelines::bindMaterials(materials, *batch, args->_renderMode, args->_enableTexturing)) { + args->_details._materialSwitches++; + } } DependencyManager::get()->renderQuad( diff --git a/libraries/entities-renderer/src/RenderableTextEntityItem.cpp b/libraries/entities-renderer/src/RenderableTextEntityItem.cpp index 6fd99a69fd..a15e2839a4 100644 --- a/libraries/entities-renderer/src/RenderableTextEntityItem.cpp +++ b/libraries/entities-renderer/src/RenderableTextEntityItem.cpp @@ -316,7 +316,7 @@ bool entities::TextPayload::passesZoneOcclusionTest(const std::unordered_set(); if (entityTreeRenderer) { auto renderable = entityTreeRenderer->renderableForEntityId(_entityID); @@ -324,6 +324,7 @@ void entities::TextPayload::computeMirrorView(ViewFrustum& viewFrustum) const { return renderable->computeMirrorView(viewFrustum); } } + return Item::INVALID_ITEM_ID; } void entities::TextPayload::render(RenderArgs* args) { @@ -417,10 +418,11 @@ template <> bool payloadPassesZoneOcclusionTest(const entities::TextPayload::Poi return false; } -template <> void payloadComputeMirrorView(const entities::TextPayload::Pointer& payload, ViewFrustum& viewFrustum) { +template <> ItemID payloadComputeMirrorView(const entities::TextPayload::Pointer& payload, ViewFrustum& viewFrustum) { if (payload) { - payload->computeMirrorView(viewFrustum); + return payload->computeMirrorView(viewFrustum); } + return Item::INVALID_ITEM_ID; } } diff --git a/libraries/entities-renderer/src/RenderableTextEntityItem.h b/libraries/entities-renderer/src/RenderableTextEntityItem.h index 00b9a1ec19..f48bb8085f 100644 --- a/libraries/entities-renderer/src/RenderableTextEntityItem.h +++ b/libraries/entities-renderer/src/RenderableTextEntityItem.h @@ -101,7 +101,7 @@ public: ShapeKey getShapeKey() const; void render(RenderArgs* args); bool passesZoneOcclusionTest(const std::unordered_set& containingZones) const; - void computeMirrorView(ViewFrustum& viewFrustum) const; + ItemID computeMirrorView(ViewFrustum& viewFrustum) const; protected: QUuid _entityID; @@ -118,7 +118,7 @@ namespace render { template <> const ShapeKey shapeGetShapeKey(const entities::TextPayload::Pointer& payload); template <> void payloadRender(const entities::TextPayload::Pointer& payload, RenderArgs* args); template <> bool payloadPassesZoneOcclusionTest(const entities::TextPayload::Pointer& payload, const std::unordered_set& containingZones); - template <> void payloadComputeMirrorView(const entities::TextPayload::Pointer& payload, ViewFrustum& viewFrustum); + template <> ItemID payloadComputeMirrorView(const entities::TextPayload::Pointer& payload, ViewFrustum& viewFrustum); } #endif // hifi_RenderableTextEntityItem_h diff --git a/libraries/render-utils/src/MeshPartPayload.cpp b/libraries/render-utils/src/MeshPartPayload.cpp index 43d0f379bf..9adeb39e7c 100644 --- a/libraries/render-utils/src/MeshPartPayload.cpp +++ b/libraries/render-utils/src/MeshPartPayload.cpp @@ -384,10 +384,10 @@ bool ModelMeshPartPayload::passesZoneOcclusionTest(const std::unordered_set& blendshapeBuffers, const QVector& blendedMeshSizes) { @@ -440,9 +440,10 @@ template <> bool payloadPassesZoneOcclusionTest(const ModelMeshPartPayload::Poin return false; } -template <> void payloadComputeMirrorView(const ModelMeshPartPayload::Pointer& payload, ViewFrustum& viewFrustum) { +template <> ItemID payloadComputeMirrorView(const ModelMeshPartPayload::Pointer& payload, ViewFrustum& viewFrustum) { if (payload) { - payload->computeMirrorView(viewFrustum); + return payload->computeMirrorView(viewFrustum); } + return Item::INVALID_ITEM_ID; } } diff --git a/libraries/render-utils/src/MeshPartPayload.h b/libraries/render-utils/src/MeshPartPayload.h index 6e0bb91a30..7e331a9497 100644 --- a/libraries/render-utils/src/MeshPartPayload.h +++ b/libraries/render-utils/src/MeshPartPayload.h @@ -61,7 +61,7 @@ public: void setMirrorMode(MirrorMode mirrorMode) { _mirrorMode = mirrorMode; } void setPortalExitID(const QUuid& portalExitID) { _portalExitID = portalExitID; } bool passesZoneOcclusionTest(const std::unordered_set& containingZones) const; - void computeMirrorView(ViewFrustum& viewFrustum) const; + render::ItemID computeMirrorView(ViewFrustum& viewFrustum) const; void addMaterial(graphics::MaterialLayer material) { _drawMaterials.push(material); } void removeMaterial(graphics::MaterialPointer material) { _drawMaterials.remove(material); } @@ -112,7 +112,7 @@ namespace render { template <> const ShapeKey shapeGetShapeKey(const ModelMeshPartPayload::Pointer& payload); template <> void payloadRender(const ModelMeshPartPayload::Pointer& payload, RenderArgs* args); template <> bool payloadPassesZoneOcclusionTest(const ModelMeshPartPayload::Pointer& payload, const std::unordered_set& containingZones); - template <> void payloadComputeMirrorView(const ModelMeshPartPayload::Pointer& payload, ViewFrustum& viewFrustum); + template <> ItemID payloadComputeMirrorView(const ModelMeshPartPayload::Pointer& payload, ViewFrustum& viewFrustum); } diff --git a/libraries/render-utils/src/RenderCommonTask.cpp b/libraries/render-utils/src/RenderCommonTask.cpp index a3355ea805..7647a1b8d2 100644 --- a/libraries/render-utils/src/RenderCommonTask.cpp +++ b/libraries/render-utils/src/RenderCommonTask.cpp @@ -300,12 +300,12 @@ public: _cachedArgsPointer->_ignoreItem = args->_ignoreItem; _cachedArgsPointer->_mirrorDepth = args->_mirrorDepth; - args->_blitFramebuffer = _mirrorFramebuffer; - args->_ignoreItem = mirror.id; - args->_mirrorDepth = _depth; - ViewFrustum srcViewFrustum = args->getViewFrustum(); - args->_scene->getItem(mirror.id).computeMirrorView(srcViewFrustum); + ItemID portalExitID = args->_scene->getItem(mirror.id).computeMirrorView(srcViewFrustum); + + args->_blitFramebuffer = _mirrorFramebuffer; + args->_ignoreItem = portalExitID != Item::INVALID_ITEM_ID ? portalExitID : mirror.id; + args->_mirrorDepth = _depth; // Without calculating the bound planes, the mirror will use the same culling frustum as the main camera, // which is not what we want here. diff --git a/libraries/render/src/render/Item.cpp b/libraries/render/src/render/Item.cpp index 23e5570736..1633523267 100644 --- a/libraries/render/src/render/Item.cpp +++ b/libraries/render/src/render/Item.cpp @@ -161,10 +161,10 @@ namespace render { return payload->passesZoneOcclusionTest(containingZones); } - template <> void payloadComputeMirrorView(const PayloadProxyInterface::Pointer& payload, ViewFrustum& viewFrustum) { + template <> ItemID payloadComputeMirrorView(const PayloadProxyInterface::Pointer& payload, ViewFrustum& viewFrustum) { if (!payload) { - return; + return Item::INVALID_ITEM_ID; } - payload->computeMirrorView(viewFrustum); + return payload->computeMirrorView(viewFrustum); } } diff --git a/libraries/render/src/render/Item.h b/libraries/render/src/render/Item.h index c2f03b4e05..f91b887fcb 100644 --- a/libraries/render/src/render/Item.h +++ b/libraries/render/src/render/Item.h @@ -450,7 +450,7 @@ public: virtual bool passesZoneOcclusionTest(const std::unordered_set& containingZones) const = 0; - virtual void computeMirrorView(ViewFrustum& viewFrustum) const = 0; + virtual ItemID computeMirrorView(ViewFrustum& viewFrustum) const = 0; ~PayloadInterface() {} @@ -505,7 +505,7 @@ public: bool passesZoneOcclusionTest(const std::unordered_set& containingZones) const { return _payload->passesZoneOcclusionTest(containingZones); } - void computeMirrorView(ViewFrustum& viewFrustum) const { _payload->computeMirrorView(viewFrustum); } + ItemID computeMirrorView(ViewFrustum& viewFrustum) const { return _payload->computeMirrorView(viewFrustum); } // Access the status const StatusPointer& getStatus() const { return _payload->getStatus(); } @@ -562,7 +562,7 @@ template uint32_t metaFetchMetaSubItems(const std::shared_ptr& payl template bool payloadPassesZoneOcclusionTest(const std::shared_ptr& payloadData, const std::unordered_set& containingZones) { return true; } // Mirror Interface -template void payloadComputeMirrorView(const std::shared_ptr& payloadData, ViewFrustum& viewFrustum) { return; } +template ItemID payloadComputeMirrorView(const std::shared_ptr& payloadData, ViewFrustum& viewFrustum) { return Item::INVALID_ITEM_ID; } // THe Payload class is the real Payload to be used // THis allow anything to be turned into a Payload as long as the required interface functions are available @@ -590,7 +590,7 @@ public: virtual bool passesZoneOcclusionTest(const std::unordered_set& containingZones) const override { return payloadPassesZoneOcclusionTest(_data, containingZones); } - virtual void computeMirrorView(ViewFrustum& viewFrustum) const override { return payloadComputeMirrorView(_data, viewFrustum); } + virtual ItemID computeMirrorView(ViewFrustum& viewFrustum) const override { return payloadComputeMirrorView(_data, viewFrustum); } protected: DataPointer _data; @@ -647,7 +647,7 @@ public: virtual void render(RenderArgs* args) = 0; virtual uint32_t metaFetchMetaSubItems(ItemIDs& subItems) const = 0; virtual bool passesZoneOcclusionTest(const std::unordered_set& containingZones) const = 0; - virtual void computeMirrorView(ViewFrustum& viewFrustum) const = 0; + virtual ItemID computeMirrorView(ViewFrustum& viewFrustum) const = 0; // FIXME: this isn't the best place for this since it's only used for ModelEntities, but currently all Entities use PayloadProxyInterface virtual void handleBlendedVertices(int blendshapeNumber, const QVector& blendshapeOffsets, @@ -660,7 +660,7 @@ template <> void payloadRender(const PayloadProxyInterface::Pointer& payload, Re template <> uint32_t metaFetchMetaSubItems(const PayloadProxyInterface::Pointer& payload, ItemIDs& subItems); template <> const ShapeKey shapeGetShapeKey(const PayloadProxyInterface::Pointer& payload); template <> bool payloadPassesZoneOcclusionTest(const PayloadProxyInterface::Pointer& payload, const std::unordered_set& containingZones); -template <> void payloadComputeMirrorView(const PayloadProxyInterface::Pointer& payload, ViewFrustum& viewFrustum); +template <> ItemID payloadComputeMirrorView(const PayloadProxyInterface::Pointer& payload, ViewFrustum& viewFrustum); typedef Item::PayloadPointer PayloadPointer; typedef std::vector Payloads; diff --git a/libraries/shared/src/MirrorMode.cpp b/libraries/shared/src/MirrorMode.cpp index f84948c6e4..272eb5d7c0 100644 --- a/libraries/shared/src/MirrorMode.cpp +++ b/libraries/shared/src/MirrorMode.cpp @@ -15,8 +15,8 @@ const char* MirrorModeNames[] = { }; static const size_t MIRROR_MODE_NAMES = (sizeof(MirrorModeNames) / sizeof(MirrorModeNames[0])); -std::function MirrorModeHelpers::_computeMirrorViewOperator = - [](ViewFrustum&, const glm::vec3&, const glm::quat&, MirrorMode, const QUuid&) { return; }; +std::function MirrorModeHelpers::_computeMirrorViewOperator = + [](ViewFrustum&, const glm::vec3&, const glm::quat&, MirrorMode, const QUuid&) { return 0; }; QString MirrorModeHelpers::getNameForMirrorMode(MirrorMode mode) { if (((int)mode <= 0) || ((int)mode >= (int)MIRROR_MODE_NAMES)) { @@ -26,11 +26,11 @@ QString MirrorModeHelpers::getNameForMirrorMode(MirrorMode mode) { return MirrorModeNames[(int)mode]; } -void MirrorModeHelpers::setComputeMirrorViewOperator(std::function computeMirrorViewOperator) { +void MirrorModeHelpers::setComputeMirrorViewOperator(std::function computeMirrorViewOperator) { _computeMirrorViewOperator = computeMirrorViewOperator; } -void MirrorModeHelpers::computeMirrorView(ViewFrustum& viewFrustum, const glm::vec3& inPropertiesPosition, const glm::quat& inPropertiesRotation, - MirrorMode mirrorMode, const QUuid& portalExitID) { - _computeMirrorViewOperator(viewFrustum, inPropertiesPosition, inPropertiesRotation, mirrorMode, portalExitID); +uint32_t MirrorModeHelpers::computeMirrorView(ViewFrustum& viewFrustum, const glm::vec3& inPropertiesPosition, const glm::quat& inPropertiesRotation, + MirrorMode mirrorMode, const QUuid& portalExitID) { + return _computeMirrorViewOperator(viewFrustum, inPropertiesPosition, inPropertiesRotation, mirrorMode, portalExitID); } \ No newline at end of file diff --git a/libraries/shared/src/MirrorMode.h b/libraries/shared/src/MirrorMode.h index 2b2fa1d62e..e48e564df0 100644 --- a/libraries/shared/src/MirrorMode.h +++ b/libraries/shared/src/MirrorMode.h @@ -40,12 +40,12 @@ class MirrorModeHelpers { public: static QString getNameForMirrorMode(MirrorMode mode); - static void setComputeMirrorViewOperator(std::function computeMirrorViewOperator); - static void computeMirrorView(ViewFrustum& viewFrustum, const glm::vec3& inPropertiesPosition, const glm::quat& inPropertiesRotation, - MirrorMode mirrorMode, const QUuid& portalExitID); + static void setComputeMirrorViewOperator(std::function computeMirrorViewOperator); + static uint32_t computeMirrorView(ViewFrustum& viewFrustum, const glm::vec3& inPropertiesPosition, const glm::quat& inPropertiesRotation, + MirrorMode mirrorMode, const QUuid& portalExitID); private: - static std::function _computeMirrorViewOperator; + static std::function _computeMirrorViewOperator; }; #endif // hifi_MirrorMode_h