From 6466a05740cc63980f4beab9e80579538a39af49 Mon Sep 17 00:00:00 2001 From: David Back Date: Fri, 10 Nov 2017 17:15:47 -0800 Subject: [PATCH 1/6] alternate approach to mirror projection wip --- interface/src/SecondaryCamera.cpp | 89 ++++++++++++++++++++++++++++--- interface/src/SecondaryCamera.h | 2 + 2 files changed, 84 insertions(+), 7 deletions(-) diff --git a/interface/src/SecondaryCamera.cpp b/interface/src/SecondaryCamera.cpp index 9d19b8fb0f..768328a6b1 100644 --- a/interface/src/SecondaryCamera.cpp +++ b/interface/src/SecondaryCamera.cpp @@ -14,6 +14,9 @@ #include #include #include +#include +#include +#include using RenderArgsPointer = std::shared_ptr; @@ -48,6 +51,63 @@ public: _farClipPlaneDistance = config.farClipPlaneDistance; _textureWidth = config.textureWidth; _textureHeight = config.textureHeight; + _mirrorProjection = config.mirrorProjection; + } + + void setMirrorProjection(ViewFrustum& srcViewFrustum) { + if (_attachedEntityId.isNull()) { + return; + } + + glm::vec3 mainCamPos = qApp->getCamera().getPosition(); + + EntityItemProperties entityProperties = _entityScriptingInterface->getEntityProperties(_attachedEntityId, _attachedEntityPropertyFlags); + glm::vec3 mirrorPropsPos = entityProperties.getPosition(); + glm::quat mirrorPropsRot = entityProperties.getRotation(); + glm::vec3 mirrorPropsDim = entityProperties.getDimensions(); + + // get mirrored camera's position and rotation reflected about the mirror plane + glm::vec3 mirrorLocalPos = mirrorPropsRot * glm::vec3(0.f, 0.f, 0.f); + glm::vec3 mirrorWorldPos = mirrorPropsPos + mirrorLocalPos; + glm::vec3 mirrorToHeadVec = mainCamPos - mirrorWorldPos; + glm::vec3 zLocalVecNormalized = mirrorPropsRot * Vectors::UNIT_Z; + float distanceFromMirror = glm::dot(zLocalVecNormalized, mirrorToHeadVec); + glm::vec3 eyePos = mainCamPos - (2.f * distanceFromMirror * zLocalVecNormalized); + glm::quat eyeOrientation = glm::inverse(glm::lookAt(eyePos, mirrorWorldPos, mirrorPropsRot * Vectors::UP)); + srcViewFrustum.setPosition(eyePos); + srcViewFrustum.setOrientation(eyeOrientation); + + // setup world from mirrored camera transformation matrix + glm::mat4 worldFromEyeRot = glm::mat4_cast(eyeOrientation); + glm::mat4 worldFromEyeTrans = glm::translate(eyePos); + glm::mat4 worldFromEye = worldFromEyeTrans * worldFromEyeRot; + + // setup mirror from world inverse of world from mirror transformation matrices + glm::mat4 worldFromMirrorRot = glm::mat4_cast(mirrorPropsRot) * glm::scale(vec3(-1.f, 1.f, -1.f)); + glm::mat4 worldFromMirrorTrans = glm::translate(mirrorWorldPos); + glm::mat4 worldFromMirror = worldFromMirrorTrans * worldFromMirrorRot; + glm::mat4 mirrorFromWorld = glm::inverse(worldFromMirror); + + glm::mat4 mirrorFromEye = mirrorFromWorld * worldFromEye; + glm::vec4 mirrorCenterPos = vec4(mirrorFromEye[3]); + mirrorFromEye[3] = vec4(0.f, 0.f, 0.f, 1.f); + + float n = mirrorCenterPos.z + mirrorPropsDim.z * 2.f; + float f = _farClipPlaneDistance; + float r = -mirrorCenterPos.x + mirrorPropsDim.x / 2.f; + float l = -mirrorCenterPos.x - mirrorPropsDim.x / 2.f; + float t = mirrorCenterPos.y + mirrorPropsDim.y / 2.f; + float b = mirrorCenterPos.y - mirrorPropsDim.y / 2.f; + + glm::mat4 frustum = glm::frustum(l, r, b, t, n, f); + glm::mat4 projection = frustum * mirrorFromEye; + srcViewFrustum.setProjection(projection); + + glm::vec3 mirrorCenterPos3World = transformPoint(worldFromMirror, glm::vec3(mirrorCenterPos)); + qDebug() << "mirrorCenterPos3World " << mirrorCenterPos3World.x << " , " << mirrorCenterPos3World.y << " , " << mirrorCenterPos3World.z; + qDebug() << "mirrorWorldPos " << mirrorWorldPos.x << " , " << mirrorWorldPos.y << " , " << mirrorWorldPos.z; + DebugDraw::getInstance().drawRay(mirrorCenterPos3World, mirrorCenterPos3World + glm::vec3(0.f, 5.f, 0.f), glm::vec4(0.f, 1.f, 0.f, 1.f)); // green + DebugDraw::getInstance().drawRay(mirrorWorldPos, mirrorWorldPos + glm::vec3(0.f, 5.f, 0.f), glm::vec4(1.f, 0.5f, 0.f, 1.f)); // orange } void run(const render::RenderContextPointer& renderContext, RenderArgsPointer& cachedArgs) { @@ -71,20 +131,34 @@ public: }); auto srcViewFrustum = args->getViewFrustum(); - if (!_attachedEntityId.isNull()) { - EntityItemProperties entityProperties = _entityScriptingInterface->getEntityProperties(_attachedEntityId, _attachedEntityPropertyFlags); - srcViewFrustum.setPosition(entityProperties.getPosition()); - srcViewFrustum.setOrientation(entityProperties.getRotation()); + if (_mirrorProjection && !_attachedEntityId.isNull()) { + setMirrorProjection(srcViewFrustum); } else { - srcViewFrustum.setPosition(_position); - srcViewFrustum.setOrientation(_orientation); + if (!_attachedEntityId.isNull()) { + EntityItemProperties entityProperties = _entityScriptingInterface->getEntityProperties(_attachedEntityId, _attachedEntityPropertyFlags); + srcViewFrustum.setPosition(entityProperties.getPosition()); + srcViewFrustum.setOrientation(entityProperties.getRotation()); + } + else { + srcViewFrustum.setPosition(_position); + srcViewFrustum.setOrientation(_orientation); + } + srcViewFrustum.setProjection(glm::perspective(glm::radians(_vFoV), ((float)args->_viewport.z / (float)args->_viewport.w), _nearClipPlaneDistance, _farClipPlaneDistance)); } - srcViewFrustum.setProjection(glm::perspective(glm::radians(_vFoV), ((float)args->_viewport.z / (float)args->_viewport.w), _nearClipPlaneDistance, _farClipPlaneDistance)); // Without calculating the bound planes, the secondary camera will use the same culling frustum as the main camera, // which is not what we want here. srcViewFrustum.calculate(); args->pushViewFrustum(srcViewFrustum); cachedArgs = _cachedArgsPointer; + + glm::vec3 dirNorm = glm::normalize(srcViewFrustum.getDirection()); + glm::vec3 nearPos = srcViewFrustum.getPosition() + dirNorm * srcViewFrustum.getNearClip(); + + DebugDraw::getInstance().drawRay(srcViewFrustum.getPosition(), srcViewFrustum.getPosition() + dirNorm * srcViewFrustum.getNearClip(), glm::vec4(1.f, 0.f, 0.f, 1.f)); // red + DebugDraw::getInstance().drawRay(nearPos, nearPos + srcViewFrustum.getRight(), glm::vec4(0.f, 0.f, 1.f, 1.f)); // blue + DebugDraw::getInstance().drawRay(nearPos, nearPos + srcViewFrustum.getUp(), glm::vec4(0.5f, 0.f, 1.f, 1.f)); // purple + + srcViewFrustum.printDebugDetails(); } } @@ -101,6 +175,7 @@ private: float _farClipPlaneDistance; int _textureWidth; int _textureHeight; + bool _mirrorProjection; EntityPropertyFlags _attachedEntityPropertyFlags; QSharedPointer _entityScriptingInterface; }; diff --git a/interface/src/SecondaryCamera.h b/interface/src/SecondaryCamera.h index a9b438ec6f..a919429c39 100644 --- a/interface/src/SecondaryCamera.h +++ b/interface/src/SecondaryCamera.h @@ -35,6 +35,7 @@ class SecondaryCameraJobConfig : public render::Task::Config { // Exposes second Q_PROPERTY(float vFoV MEMBER vFoV NOTIFY dirty) // Secondary camera's vertical field of view. In degrees. Q_PROPERTY(float nearClipPlaneDistance MEMBER nearClipPlaneDistance NOTIFY dirty) // Secondary camera's near clip plane distance. In meters. Q_PROPERTY(float farClipPlaneDistance MEMBER farClipPlaneDistance NOTIFY dirty) // Secondary camera's far clip plane distance. In meters. + Q_PROPERTY(bool mirrorProjection MEMBER mirrorProjection NOTIFY dirty) // Flag to apply oblique near-plane clipping using perspective projection from attached mirror entity public: QUuid attachedEntityId; glm::vec3 position; @@ -44,6 +45,7 @@ public: float farClipPlaneDistance { DEFAULT_FAR_CLIP }; int textureWidth { TextureCache::DEFAULT_SPECTATOR_CAM_WIDTH }; int textureHeight { TextureCache::DEFAULT_SPECTATOR_CAM_HEIGHT }; + bool mirrorProjection { false }; SecondaryCameraJobConfig() : render::Task::Config(false) {} signals: From fee7701890f0f3f42bc3c90081f06290c16482e5 Mon Sep 17 00:00:00 2001 From: David Back Date: Wed, 15 Nov 2017 12:49:39 -0800 Subject: [PATCH 2/6] working mirror projection for secondary camera --- interface/src/SecondaryCamera.cpp | 72 +++++++++++-------------------- 1 file changed, 24 insertions(+), 48 deletions(-) diff --git a/interface/src/SecondaryCamera.cpp b/interface/src/SecondaryCamera.cpp index 768328a6b1..4667cba625 100644 --- a/interface/src/SecondaryCamera.cpp +++ b/interface/src/SecondaryCamera.cpp @@ -51,63 +51,48 @@ public: _farClipPlaneDistance = config.farClipPlaneDistance; _textureWidth = config.textureWidth; _textureHeight = config.textureHeight; - _mirrorProjection = config.mirrorProjection; + _mirrorProjection = config.mirrorProjection; } void setMirrorProjection(ViewFrustum& srcViewFrustum) { if (_attachedEntityId.isNull()) { + qDebug() << "ERROR: Cannot set mirror projection for SecondaryCamera without an attachedEntityId set."; return; } - - glm::vec3 mainCamPos = qApp->getCamera().getPosition(); - + EntityItemProperties entityProperties = _entityScriptingInterface->getEntityProperties(_attachedEntityId, _attachedEntityPropertyFlags); glm::vec3 mirrorPropsPos = entityProperties.getPosition(); glm::quat mirrorPropsRot = entityProperties.getRotation(); glm::vec3 mirrorPropsDim = entityProperties.getDimensions(); - // get mirrored camera's position and rotation reflected about the mirror plane - glm::vec3 mirrorLocalPos = mirrorPropsRot * glm::vec3(0.f, 0.f, 0.f); - glm::vec3 mirrorWorldPos = mirrorPropsPos + mirrorLocalPos; - glm::vec3 mirrorToHeadVec = mainCamPos - mirrorWorldPos; - glm::vec3 zLocalVecNormalized = mirrorPropsRot * Vectors::UNIT_Z; - float distanceFromMirror = glm::dot(zLocalVecNormalized, mirrorToHeadVec); - glm::vec3 eyePos = mainCamPos - (2.f * distanceFromMirror * zLocalVecNormalized); - glm::quat eyeOrientation = glm::inverse(glm::lookAt(eyePos, mirrorWorldPos, mirrorPropsRot * Vectors::UP)); - srcViewFrustum.setPosition(eyePos); - srcViewFrustum.setOrientation(eyeOrientation); - - // setup world from mirrored camera transformation matrix - glm::mat4 worldFromEyeRot = glm::mat4_cast(eyeOrientation); - glm::mat4 worldFromEyeTrans = glm::translate(eyePos); - glm::mat4 worldFromEye = worldFromEyeTrans * worldFromEyeRot; - - // setup mirror from world inverse of world from mirror transformation matrices + // setup mirror from world as inverse of world from mirror transformation using inverted x and z to mirror glm::mat4 worldFromMirrorRot = glm::mat4_cast(mirrorPropsRot) * glm::scale(vec3(-1.f, 1.f, -1.f)); - glm::mat4 worldFromMirrorTrans = glm::translate(mirrorWorldPos); + glm::mat4 worldFromMirrorTrans = glm::translate(mirrorPropsPos); glm::mat4 worldFromMirror = worldFromMirrorTrans * worldFromMirrorRot; glm::mat4 mirrorFromWorld = glm::inverse(worldFromMirror); - glm::mat4 mirrorFromEye = mirrorFromWorld * worldFromEye; - glm::vec4 mirrorCenterPos = vec4(mirrorFromEye[3]); - mirrorFromEye[3] = vec4(0.f, 0.f, 0.f, 1.f); + // get mirror cam position by reflecting main cam position's z coord in mirror space + glm::vec3 mainCamPosWorld = qApp->getCamera().getPosition(); + glm::vec3 mainCamPosMirror = vec3(mirrorFromWorld * vec4(mainCamPosWorld, 1.f)); + glm::vec3 mirrorCamPosMirror = vec3(mainCamPosMirror.x, mainCamPosMirror.y, -mainCamPosMirror.z); + glm::vec3 mirrorCamPosWorld = vec3(worldFromMirror * vec4(mirrorCamPosMirror, 1.f)); - float n = mirrorCenterPos.z + mirrorPropsDim.z * 2.f; + // set frustum position to be mirrored camera and set orientation to mirror's adjusted rotation + glm::vec3 eyePos = mirrorCamPosWorld; + glm::quat eyeOri = glm::quat_cast(worldFromMirrorRot); + srcViewFrustum.setPosition(eyePos); + srcViewFrustum.setOrientation(eyeOri); + + // build frustum using mirror space translation of mirrored camera + float n = mirrorCamPosMirror.z + mirrorPropsDim.z * 2.f; float f = _farClipPlaneDistance; - float r = -mirrorCenterPos.x + mirrorPropsDim.x / 2.f; - float l = -mirrorCenterPos.x - mirrorPropsDim.x / 2.f; - float t = mirrorCenterPos.y + mirrorPropsDim.y / 2.f; - float b = mirrorCenterPos.y - mirrorPropsDim.y / 2.f; + float r = -mirrorCamPosMirror.x + mirrorPropsDim.x / 2.f; + float l = -mirrorCamPosMirror.x - mirrorPropsDim.x / 2.f; + float t = -mirrorCamPosMirror.y + mirrorPropsDim.y / 2.f; + float b = -mirrorCamPosMirror.y - mirrorPropsDim.y / 2.f; glm::mat4 frustum = glm::frustum(l, r, b, t, n, f); - glm::mat4 projection = frustum * mirrorFromEye; - srcViewFrustum.setProjection(projection); - - glm::vec3 mirrorCenterPos3World = transformPoint(worldFromMirror, glm::vec3(mirrorCenterPos)); - qDebug() << "mirrorCenterPos3World " << mirrorCenterPos3World.x << " , " << mirrorCenterPos3World.y << " , " << mirrorCenterPos3World.z; - qDebug() << "mirrorWorldPos " << mirrorWorldPos.x << " , " << mirrorWorldPos.y << " , " << mirrorWorldPos.z; - DebugDraw::getInstance().drawRay(mirrorCenterPos3World, mirrorCenterPos3World + glm::vec3(0.f, 5.f, 0.f), glm::vec4(0.f, 1.f, 0.f, 1.f)); // green - DebugDraw::getInstance().drawRay(mirrorWorldPos, mirrorWorldPos + glm::vec3(0.f, 5.f, 0.f), glm::vec4(1.f, 0.5f, 0.f, 1.f)); // orange + srcViewFrustum.setProjection(frustum); } void run(const render::RenderContextPointer& renderContext, RenderArgsPointer& cachedArgs) { @@ -131,7 +116,7 @@ public: }); auto srcViewFrustum = args->getViewFrustum(); - if (_mirrorProjection && !_attachedEntityId.isNull()) { + if (_mirrorProjection) { setMirrorProjection(srcViewFrustum); } else { if (!_attachedEntityId.isNull()) { @@ -150,15 +135,6 @@ public: srcViewFrustum.calculate(); args->pushViewFrustum(srcViewFrustum); cachedArgs = _cachedArgsPointer; - - glm::vec3 dirNorm = glm::normalize(srcViewFrustum.getDirection()); - glm::vec3 nearPos = srcViewFrustum.getPosition() + dirNorm * srcViewFrustum.getNearClip(); - - DebugDraw::getInstance().drawRay(srcViewFrustum.getPosition(), srcViewFrustum.getPosition() + dirNorm * srcViewFrustum.getNearClip(), glm::vec4(1.f, 0.f, 0.f, 1.f)); // red - DebugDraw::getInstance().drawRay(nearPos, nearPos + srcViewFrustum.getRight(), glm::vec4(0.f, 0.f, 1.f, 1.f)); // blue - DebugDraw::getInstance().drawRay(nearPos, nearPos + srcViewFrustum.getUp(), glm::vec4(0.5f, 0.f, 1.f, 1.f)); // purple - - srcViewFrustum.printDebugDetails(); } } From e0ce15447220bfbe8b66a6998caff3a44bb0bf23 Mon Sep 17 00:00:00 2001 From: David Back Date: Wed, 15 Nov 2017 13:37:15 -0800 Subject: [PATCH 3/6] remove includes, fix comment --- interface/src/SecondaryCamera.cpp | 6 ++---- interface/src/SecondaryCamera.h | 2 +- 2 files changed, 3 insertions(+), 5 deletions(-) diff --git a/interface/src/SecondaryCamera.cpp b/interface/src/SecondaryCamera.cpp index 4667cba625..fcdab48b58 100644 --- a/interface/src/SecondaryCamera.cpp +++ b/interface/src/SecondaryCamera.cpp @@ -14,9 +14,7 @@ #include #include #include -#include #include -#include using RenderArgsPointer = std::shared_ptr; @@ -65,13 +63,13 @@ public: glm::quat mirrorPropsRot = entityProperties.getRotation(); glm::vec3 mirrorPropsDim = entityProperties.getDimensions(); - // setup mirror from world as inverse of world from mirror transformation using inverted x and z to mirror + // setup mirror from world as inverse of world from mirror transformation using inverted x and z for mirrored image glm::mat4 worldFromMirrorRot = glm::mat4_cast(mirrorPropsRot) * glm::scale(vec3(-1.f, 1.f, -1.f)); glm::mat4 worldFromMirrorTrans = glm::translate(mirrorPropsPos); glm::mat4 worldFromMirror = worldFromMirrorTrans * worldFromMirrorRot; glm::mat4 mirrorFromWorld = glm::inverse(worldFromMirror); - // get mirror cam position by reflecting main cam position's z coord in mirror space + // get mirror camera position by reflecting main camera position's z coordinate in mirror space glm::vec3 mainCamPosWorld = qApp->getCamera().getPosition(); glm::vec3 mainCamPosMirror = vec3(mirrorFromWorld * vec4(mainCamPosWorld, 1.f)); glm::vec3 mirrorCamPosMirror = vec3(mainCamPosMirror.x, mainCamPosMirror.y, -mainCamPosMirror.z); diff --git a/interface/src/SecondaryCamera.h b/interface/src/SecondaryCamera.h index a919429c39..38d75c391e 100644 --- a/interface/src/SecondaryCamera.h +++ b/interface/src/SecondaryCamera.h @@ -35,7 +35,7 @@ class SecondaryCameraJobConfig : public render::Task::Config { // Exposes second Q_PROPERTY(float vFoV MEMBER vFoV NOTIFY dirty) // Secondary camera's vertical field of view. In degrees. Q_PROPERTY(float nearClipPlaneDistance MEMBER nearClipPlaneDistance NOTIFY dirty) // Secondary camera's near clip plane distance. In meters. Q_PROPERTY(float farClipPlaneDistance MEMBER farClipPlaneDistance NOTIFY dirty) // Secondary camera's far clip plane distance. In meters. - Q_PROPERTY(bool mirrorProjection MEMBER mirrorProjection NOTIFY dirty) // Flag to apply oblique near-plane clipping using perspective projection from attached mirror entity + Q_PROPERTY(bool mirrorProjection MEMBER mirrorProjection NOTIFY dirty) // Flag to use attached mirror entity to build frustum for the mirror and set mirrored camera position/orientation. public: QUuid attachedEntityId; glm::vec3 position; From 9bfbcb4434fd72813f4bee243f87eea082d00db9 Mon Sep 17 00:00:00 2001 From: David Back Date: Wed, 15 Nov 2017 18:06:49 -0800 Subject: [PATCH 4/6] code review updates --- interface/src/SecondaryCamera.cpp | 55 ++++++++++++++++--------------- 1 file changed, 28 insertions(+), 27 deletions(-) diff --git a/interface/src/SecondaryCamera.cpp b/interface/src/SecondaryCamera.cpp index fcdab48b58..3c4f75616f 100644 --- a/interface/src/SecondaryCamera.cpp +++ b/interface/src/SecondaryCamera.cpp @@ -54,42 +54,41 @@ public: void setMirrorProjection(ViewFrustum& srcViewFrustum) { if (_attachedEntityId.isNull()) { - qDebug() << "ERROR: Cannot set mirror projection for SecondaryCamera without an attachedEntityId set."; + qWarning() << "ERROR: Cannot set mirror projection for SecondaryCamera without an attachedEntityId set."; return; } - EntityItemProperties entityProperties = _entityScriptingInterface->getEntityProperties(_attachedEntityId, _attachedEntityPropertyFlags); - glm::vec3 mirrorPropsPos = entityProperties.getPosition(); - glm::quat mirrorPropsRot = entityProperties.getRotation(); - glm::vec3 mirrorPropsDim = entityProperties.getDimensions(); + EntityItemProperties entityProperties = _entityScriptingInterface->getEntityProperties(_attachedEntityId, + _attachedEntityPropertyFlags); + glm::vec3 mirrorPropertiesPosition = entityProperties.getPosition(); + glm::quat mirrorPropertiesRotation = entityProperties.getRotation(); + glm::vec3 mirrorPropertiesDimensions = entityProperties.getDimensions(); + glm::vec3 halfMirrorPropertiesDimensions = 0.5f * mirrorPropertiesDimensions; // setup mirror from world as inverse of world from mirror transformation using inverted x and z for mirrored image - glm::mat4 worldFromMirrorRot = glm::mat4_cast(mirrorPropsRot) * glm::scale(vec3(-1.f, 1.f, -1.f)); - glm::mat4 worldFromMirrorTrans = glm::translate(mirrorPropsPos); - glm::mat4 worldFromMirror = worldFromMirrorTrans * worldFromMirrorRot; + glm::mat4 worldFromMirrorRotation = glm::mat4_cast(mirrorPropertiesRotation) * glm::scale(vec3(-1.0f, 1.0f, -1.0f)); + glm::mat4 worldFromMirrorTranslation = glm::translate(mirrorPropertiesPosition); + glm::mat4 worldFromMirror = worldFromMirrorTranslation * worldFromMirrorRotation; glm::mat4 mirrorFromWorld = glm::inverse(worldFromMirror); // get mirror camera position by reflecting main camera position's z coordinate in mirror space - glm::vec3 mainCamPosWorld = qApp->getCamera().getPosition(); - glm::vec3 mainCamPosMirror = vec3(mirrorFromWorld * vec4(mainCamPosWorld, 1.f)); - glm::vec3 mirrorCamPosMirror = vec3(mainCamPosMirror.x, mainCamPosMirror.y, -mainCamPosMirror.z); - glm::vec3 mirrorCamPosWorld = vec3(worldFromMirror * vec4(mirrorCamPosMirror, 1.f)); + glm::vec3 mainCameraPositionWorld = qApp->getCamera().getPosition(); + glm::vec3 mainCameraPositionMirror = vec3(mirrorFromWorld * vec4(mainCameraPositionWorld, 1.0f)); + glm::vec3 mirrorCameraPositionMirror = vec3(mainCameraPositionMirror.x, mainCameraPositionMirror.y, + -mainCameraPositionMirror.z); + glm::vec3 mirrorCameraPositionWorld = vec3(worldFromMirror * vec4(mirrorCameraPositionMirror, 1.0f)); // set frustum position to be mirrored camera and set orientation to mirror's adjusted rotation - glm::vec3 eyePos = mirrorCamPosWorld; - glm::quat eyeOri = glm::quat_cast(worldFromMirrorRot); - srcViewFrustum.setPosition(eyePos); - srcViewFrustum.setOrientation(eyeOri); + glm::quat mirrorCamOrientation = glm::quat_cast(worldFromMirrorRotation); + srcViewFrustum.setPosition(mirrorCameraPositionWorld); + srcViewFrustum.setOrientation(mirrorCamOrientation); // build frustum using mirror space translation of mirrored camera - float n = mirrorCamPosMirror.z + mirrorPropsDim.z * 2.f; - float f = _farClipPlaneDistance; - float r = -mirrorCamPosMirror.x + mirrorPropsDim.x / 2.f; - float l = -mirrorCamPosMirror.x - mirrorPropsDim.x / 2.f; - float t = -mirrorCamPosMirror.y + mirrorPropsDim.y / 2.f; - float b = -mirrorCamPosMirror.y - mirrorPropsDim.y / 2.f; + float nearClip = mirrorCameraPositionMirror.z + mirrorPropertiesDimensions.z * 2.0f; + glm::vec3 upperRight = halfMirrorPropertiesDimensions - mirrorCameraPositionMirror; + glm::vec3 bottomLeft = -halfMirrorPropertiesDimensions - mirrorCameraPositionMirror; + glm::mat4 frustum = glm::frustum(bottomLeft.x, upperRight.x, bottomLeft.y, upperRight.y, nearClip, _farClipPlaneDistance); - glm::mat4 frustum = glm::frustum(l, r, b, t, n, f); srcViewFrustum.setProjection(frustum); } @@ -118,15 +117,17 @@ public: setMirrorProjection(srcViewFrustum); } else { if (!_attachedEntityId.isNull()) { - EntityItemProperties entityProperties = _entityScriptingInterface->getEntityProperties(_attachedEntityId, _attachedEntityPropertyFlags); + EntityItemProperties entityProperties = _entityScriptingInterface->getEntityProperties(_attachedEntityId, + _attachedEntityPropertyFlags); srcViewFrustum.setPosition(entityProperties.getPosition()); srcViewFrustum.setOrientation(entityProperties.getRotation()); - } - else { + } else { srcViewFrustum.setPosition(_position); srcViewFrustum.setOrientation(_orientation); } - srcViewFrustum.setProjection(glm::perspective(glm::radians(_vFoV), ((float)args->_viewport.z / (float)args->_viewport.w), _nearClipPlaneDistance, _farClipPlaneDistance)); + srcViewFrustum.setProjection(glm::perspective(glm::radians(_vFoV), + ((float)args->_viewport.z / (float)args->_viewport.w), + _nearClipPlaneDistance, _farClipPlaneDistance)); } // Without calculating the bound planes, the secondary camera will use the same culling frustum as the main camera, // which is not what we want here. From 4b2ff68fa339e84f5441820bfa074989f03e663d Mon Sep 17 00:00:00 2001 From: David Back Date: Wed, 15 Nov 2017 19:05:44 -0800 Subject: [PATCH 5/6] var name and empty line --- interface/src/SecondaryCamera.cpp | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/interface/src/SecondaryCamera.cpp b/interface/src/SecondaryCamera.cpp index 3c4f75616f..dcb921dcdb 100644 --- a/interface/src/SecondaryCamera.cpp +++ b/interface/src/SecondaryCamera.cpp @@ -79,16 +79,15 @@ public: glm::vec3 mirrorCameraPositionWorld = vec3(worldFromMirror * vec4(mirrorCameraPositionMirror, 1.0f)); // set frustum position to be mirrored camera and set orientation to mirror's adjusted rotation - glm::quat mirrorCamOrientation = glm::quat_cast(worldFromMirrorRotation); + glm::quat mirrorCameraOrientation = glm::quat_cast(worldFromMirrorRotation); srcViewFrustum.setPosition(mirrorCameraPositionWorld); - srcViewFrustum.setOrientation(mirrorCamOrientation); + srcViewFrustum.setOrientation(mirrorCameraOrientation); // build frustum using mirror space translation of mirrored camera float nearClip = mirrorCameraPositionMirror.z + mirrorPropertiesDimensions.z * 2.0f; glm::vec3 upperRight = halfMirrorPropertiesDimensions - mirrorCameraPositionMirror; glm::vec3 bottomLeft = -halfMirrorPropertiesDimensions - mirrorCameraPositionMirror; glm::mat4 frustum = glm::frustum(bottomLeft.x, upperRight.x, bottomLeft.y, upperRight.y, nearClip, _farClipPlaneDistance); - srcViewFrustum.setProjection(frustum); } From abba9653286d7bdce7b3de7ba0c29d5de4bf6aa4 Mon Sep 17 00:00:00 2001 From: David Back Date: Thu, 16 Nov 2017 11:41:28 -0800 Subject: [PATCH 6/6] todo comment --- interface/src/SecondaryCamera.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/interface/src/SecondaryCamera.cpp b/interface/src/SecondaryCamera.cpp index dcb921dcdb..4cfa4d6156 100644 --- a/interface/src/SecondaryCamera.cpp +++ b/interface/src/SecondaryCamera.cpp @@ -66,6 +66,7 @@ public: glm::vec3 halfMirrorPropertiesDimensions = 0.5f * mirrorPropertiesDimensions; // setup mirror from world as inverse of world from mirror transformation using inverted x and z for mirrored image + // TODO: we are assuming here that UP is world y-axis glm::mat4 worldFromMirrorRotation = glm::mat4_cast(mirrorPropertiesRotation) * glm::scale(vec3(-1.0f, 1.0f, -1.0f)); glm::mat4 worldFromMirrorTranslation = glm::translate(mirrorPropertiesPosition); glm::mat4 worldFromMirror = worldFromMirrorTranslation * worldFromMirrorRotation;