portals use exit as ignoreItem

This commit is contained in:
HifiExperiments 2023-11-19 14:54:31 -08:00
parent a630a6f9c9
commit 3336efb6ee
12 changed files with 51 additions and 44 deletions

View file

@ -226,7 +226,7 @@ bool EntityRenderer::passesZoneOcclusionTest(const std::unordered_set<QUuid>& 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<EntityTreeRenderer>()->renderableIdForEntityId(portalExitID) : Item::INVALID_ITEM_ID;
}
void EntityRenderer::render(RenderArgs* args) {

View file

@ -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<QUuid>& 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); }

View file

@ -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<GeometryCache>()->renderQuad(

View file

@ -316,7 +316,7 @@ bool entities::TextPayload::passesZoneOcclusionTest(const std::unordered_set<QUu
return false;
}
void entities::TextPayload::computeMirrorView(ViewFrustum& viewFrustum) const {
ItemID entities::TextPayload::computeMirrorView(ViewFrustum& viewFrustum) const {
auto entityTreeRenderer = DependencyManager::get<EntityTreeRenderer>();
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;
}
}

View file

@ -101,7 +101,7 @@ public:
ShapeKey getShapeKey() const;
void render(RenderArgs* args);
bool passesZoneOcclusionTest(const std::unordered_set<QUuid>& 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<QUuid>& 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

View file

@ -384,10 +384,10 @@ bool ModelMeshPartPayload::passesZoneOcclusionTest(const std::unordered_set<QUui
return true;
}
void ModelMeshPartPayload::computeMirrorView(ViewFrustum& viewFrustum) const {
ItemID ModelMeshPartPayload::computeMirrorView(ViewFrustum& viewFrustum) const {
Transform transform = _parentTransform;
transform = transform.worldTransform(_localTransform);
MirrorModeHelpers::computeMirrorView(viewFrustum, transform.getTranslation(), transform.getRotation(), _mirrorMode, _portalExitID);
return MirrorModeHelpers::computeMirrorView(viewFrustum, transform.getTranslation(), transform.getRotation(), _mirrorMode, _portalExitID);
}
void ModelMeshPartPayload::setBlendshapeBuffer(const std::unordered_map<int, gpu::BufferPointer>& blendshapeBuffers, const QVector<int>& 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;
}
}

View file

@ -61,7 +61,7 @@ public:
void setMirrorMode(MirrorMode mirrorMode) { _mirrorMode = mirrorMode; }
void setPortalExitID(const QUuid& portalExitID) { _portalExitID = portalExitID; }
bool passesZoneOcclusionTest(const std::unordered_set<QUuid>& 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<QUuid>& containingZones);
template <> void payloadComputeMirrorView(const ModelMeshPartPayload::Pointer& payload, ViewFrustum& viewFrustum);
template <> ItemID payloadComputeMirrorView(const ModelMeshPartPayload::Pointer& payload, ViewFrustum& viewFrustum);
}

View file

@ -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.

View file

@ -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);
}
}

View file

@ -450,7 +450,7 @@ public:
virtual bool passesZoneOcclusionTest(const std::unordered_set<QUuid>& 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<QUuid>& 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 <class T> uint32_t metaFetchMetaSubItems(const std::shared_ptr<T>& payl
template <class T> bool payloadPassesZoneOcclusionTest(const std::shared_ptr<T>& payloadData, const std::unordered_set<QUuid>& containingZones) { return true; }
// Mirror Interface
template <class T> void payloadComputeMirrorView(const std::shared_ptr<T>& payloadData, ViewFrustum& viewFrustum) { return; }
template <class T> ItemID payloadComputeMirrorView(const std::shared_ptr<T>& 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<QUuid>& containingZones) const override { return payloadPassesZoneOcclusionTest<T>(_data, containingZones); }
virtual void computeMirrorView(ViewFrustum& viewFrustum) const override { return payloadComputeMirrorView<T>(_data, viewFrustum); }
virtual ItemID computeMirrorView(ViewFrustum& viewFrustum) const override { return payloadComputeMirrorView<T>(_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<QUuid>& 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<BlendshapeOffset>& 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<QUuid>& 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<PayloadPointer> Payloads;

View file

@ -15,8 +15,8 @@ const char* MirrorModeNames[] = {
};
static const size_t MIRROR_MODE_NAMES = (sizeof(MirrorModeNames) / sizeof(MirrorModeNames[0]));
std::function<void(ViewFrustum&, const glm::vec3&, const glm::quat&, MirrorMode, const QUuid&)> MirrorModeHelpers::_computeMirrorViewOperator =
[](ViewFrustum&, const glm::vec3&, const glm::quat&, MirrorMode, const QUuid&) { return; };
std::function<uint32_t(ViewFrustum&, const glm::vec3&, const glm::quat&, MirrorMode, const QUuid&)> 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<void(ViewFrustum&, const glm::vec3&, const glm::quat&, MirrorMode, const QUuid&)> computeMirrorViewOperator) {
void MirrorModeHelpers::setComputeMirrorViewOperator(std::function<uint32_t(ViewFrustum&, const glm::vec3&, const glm::quat&, MirrorMode, const QUuid&)> 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);
}

View file

@ -40,12 +40,12 @@ class MirrorModeHelpers {
public:
static QString getNameForMirrorMode(MirrorMode mode);
static void setComputeMirrorViewOperator(std::function<void(ViewFrustum&, const glm::vec3&, const glm::quat&, MirrorMode, const QUuid&)> computeMirrorViewOperator);
static void computeMirrorView(ViewFrustum& viewFrustum, const glm::vec3& inPropertiesPosition, const glm::quat& inPropertiesRotation,
MirrorMode mirrorMode, const QUuid& portalExitID);
static void setComputeMirrorViewOperator(std::function<uint32_t(ViewFrustum&, const glm::vec3&, const glm::quat&, MirrorMode, const QUuid&)> computeMirrorViewOperator);
static uint32_t computeMirrorView(ViewFrustum& viewFrustum, const glm::vec3& inPropertiesPosition, const glm::quat& inPropertiesRotation,
MirrorMode mirrorMode, const QUuid& portalExitID);
private:
static std::function<void(ViewFrustum&, const glm::vec3&, const glm::quat&, MirrorMode, const QUuid&)> _computeMirrorViewOperator;
static std::function<uint32_t(ViewFrustum&, const glm::vec3&, const glm::quat&, MirrorMode, const QUuid&)> _computeMirrorViewOperator;
};
#endif // hifi_MirrorMode_h