mirror of
https://github.com/overte-org/overte.git
synced 2025-04-11 12:20:26 +02:00
portals use exit as ignoreItem
This commit is contained in:
parent
a630a6f9c9
commit
3336efb6ee
12 changed files with 51 additions and 44 deletions
|
@ -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) {
|
||||
|
|
|
@ -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); }
|
||||
|
|
|
@ -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(
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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);
|
||||
|
||||
}
|
||||
|
||||
|
|
|
@ -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.
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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);
|
||||
}
|
|
@ -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
|
||||
|
|
Loading…
Reference in a new issue