From ed5c53f23c0f2cdd142a7dfccd2db3f7c73dfd66 Mon Sep 17 00:00:00 2001 From: Zach Pomerantz Date: Wed, 13 Jan 2016 22:49:00 -0800 Subject: [PATCH] Add getCorners to ViewFrustum --- libraries/octree/src/ViewFrustum.cpp | 17 +++++++++++++++++ libraries/octree/src/ViewFrustum.h | 13 ++++++++++++- 2 files changed, 29 insertions(+), 1 deletion(-) diff --git a/libraries/octree/src/ViewFrustum.cpp b/libraries/octree/src/ViewFrustum.cpp index fd175a8e5b..0e7df1d9a4 100644 --- a/libraries/octree/src/ViewFrustum.cpp +++ b/libraries/octree/src/ViewFrustum.cpp @@ -736,6 +736,23 @@ void ViewFrustum::getFurthestPointFromCamera(const AACube& box, glm::vec3& furth } } +const ViewFrustum::Corners ViewFrustum::getCorners(const float& depth) { + glm::vec3 normal = glm::normalize(_direction); + + auto getCorner = [&](enum::BoxVertex nearCorner, enum::BoxVertex farCorner) { + const auto dir = glm::normalize(_cornersWorld[nearCorner] - _cornersWorld[farCorner]); + const auto factor = depth / glm::dot(dir, normal); + return _position + factor * dir; + }; + + return Corners{ + getCorner(TOP_LEFT_NEAR, TOP_LEFT_FAR), + getCorner(TOP_RIGHT_NEAR, TOP_RIGHT_FAR), + getCorner(BOTTOM_LEFT_NEAR, BOTTOM_LEFT_FAR), + getCorner(BOTTOM_RIGHT_NEAR, BOTTOM_RIGHT_FAR) + }; +} + float ViewFrustum::distanceToCamera(const glm::vec3& point) const { glm::vec3 temp = getPosition() - point; float distanceToPoint = sqrtf(glm::dot(temp, temp)); diff --git a/libraries/octree/src/ViewFrustum.h b/libraries/octree/src/ViewFrustum.h index 795a259a3c..4a39ac5f44 100644 --- a/libraries/octree/src/ViewFrustum.h +++ b/libraries/octree/src/ViewFrustum.h @@ -61,11 +61,22 @@ public: float getFarClip() const { return _farClip; } float getFocalLength() const { return _focalLength; } + const class Corners{ + public: + Corners(glm::vec3&& topLeft, glm::vec3&& topRight, glm::vec3&& bottomLeft, glm::vec3&& bottomRight) + : topLeft{ topLeft }, topRight{ topRight }, bottomLeft{ bottomLeft }, bottomRight{ bottomRight } {} + glm::vec3 topLeft; + glm::vec3 topRight; + glm::vec3 bottomLeft; + glm::vec3 bottomRight; + // Get the corners depth units from frustum position, along frustum orientation + } getCorners(const float& depth); + + // getters for corners const glm::vec3& getFarTopLeft() const { return _cornersWorld[TOP_LEFT_FAR]; } const glm::vec3& getFarTopRight() const { return _cornersWorld[TOP_RIGHT_FAR]; } const glm::vec3& getFarBottomLeft() const { return _cornersWorld[BOTTOM_LEFT_FAR]; } const glm::vec3& getFarBottomRight() const { return _cornersWorld[BOTTOM_RIGHT_FAR]; } - const glm::vec3& getNearTopLeft() const { return _cornersWorld[TOP_LEFT_NEAR]; } const glm::vec3& getNearTopRight() const { return _cornersWorld[TOP_RIGHT_NEAR]; } const glm::vec3& getNearBottomLeft() const { return _cornersWorld[BOTTOM_LEFT_NEAR]; }