From ff4e21e50490c0ef947db7b7c5d24b3a78f47efb Mon Sep 17 00:00:00 2001 From: Andrzej Kapolka Date: Fri, 3 May 2013 20:12:46 -0700 Subject: [PATCH] Remaining pick bits. --- libraries/voxels/src/AABox.cpp | 6 +++--- libraries/voxels/src/ViewFrustum.cpp | 4 ++++ libraries/voxels/src/ViewFrustum.h | 1 + libraries/voxels/src/VoxelTree.cpp | 2 +- 4 files changed, 9 insertions(+), 4 deletions(-) diff --git a/libraries/voxels/src/AABox.cpp b/libraries/voxels/src/AABox.cpp index d79c36882c..1d85b3181a 100755 --- a/libraries/voxels/src/AABox.cpp +++ b/libraries/voxels/src/AABox.cpp @@ -101,13 +101,13 @@ bool AABox::findRayIntersection(const glm::vec3& origin, const glm::vec3& direct } // check each direction float nt; - if (findIntersection(origin.x, direction.x, _corner.x, _size.x, &nt) && + if (findIntersection(origin.x, direction.x, _corner.x, _size.x, &nt) && nt >= 0 && isWithin(origin.y + nt*direction.y, _corner.y, _size.y) && isWithin(origin.z + nt*direction.z, _corner.z, _size.z) || - findIntersection(origin.y, direction.y, _corner.y, _size.y, &nt) && + findIntersection(origin.y, direction.y, _corner.y, _size.y, &nt) && nt >= 0 && isWithin(origin.x + nt*direction.x, _corner.x, _size.x) && isWithin(origin.z + nt*direction.z, _corner.z, _size.z) || - findIntersection(origin.z, direction.z, _corner.z, _size.z, &nt) && + findIntersection(origin.z, direction.z, _corner.z, _size.z, &nt) && nt >= 0 && isWithin(origin.y + nt*direction.y, _corner.y, _size.y) && isWithin(origin.x + nt*direction.x, _corner.x, _size.x)) { *t = nt; diff --git a/libraries/voxels/src/ViewFrustum.cpp b/libraries/voxels/src/ViewFrustum.cpp index 8bdb2d97cb..4f725ff1b4 100644 --- a/libraries/voxels/src/ViewFrustum.cpp +++ b/libraries/voxels/src/ViewFrustum.cpp @@ -225,3 +225,7 @@ int ViewFrustum::boxInFrustum(const AABox& box) const { return(result); } +void ViewFrustum::computePickRay(float x, float y, glm::vec3* origin, glm::vec3* direction) const { + *origin = _nearTopLeft + x*(_nearTopRight - _nearTopLeft) + y*(_nearBottomLeft - _nearTopLeft); + *direction = glm::normalize(*origin - _position); +} diff --git a/libraries/voxels/src/ViewFrustum.h b/libraries/voxels/src/ViewFrustum.h index d05bb9e1cf..feb1ecc8c6 100644 --- a/libraries/voxels/src/ViewFrustum.h +++ b/libraries/voxels/src/ViewFrustum.h @@ -98,6 +98,7 @@ public: int sphereInFrustum(const glm::vec3& center, float radius) const; int boxInFrustum(const AABox& box) const; + void computePickRay(float x, float y, glm::vec3* origin, glm::vec3* direction) const; }; diff --git a/libraries/voxels/src/VoxelTree.cpp b/libraries/voxels/src/VoxelTree.cpp index a13675f00d..263c2f016e 100644 --- a/libraries/voxels/src/VoxelTree.cpp +++ b/libraries/voxels/src/VoxelTree.cpp @@ -577,7 +577,7 @@ bool findRayOperation(VoxelNode* node, void* extraData) { bool VoxelTree::findRayIntersection(const glm::vec3& origin, const glm::vec3& direction, VoxelNode** node, float* t) { - RayArgs args = { origin, direction, node, t }; + RayArgs args = { origin / (float)TREE_SCALE, direction, node, t }; recurseTreeWithOperation(findRayOperation, &args); return args.found; }