From 056365932be7cad76bc454ea1351448ea2f3f148 Mon Sep 17 00:00:00 2001 From: David Rowe Date: Thu, 5 Feb 2015 09:37:08 -0800 Subject: [PATCH 1/3] Make circle3d dimension property specify overall size not half size --- interface/src/ui/overlays/Circle3DOverlay.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/interface/src/ui/overlays/Circle3DOverlay.cpp b/interface/src/ui/overlays/Circle3DOverlay.cpp index f890999174..463e63a187 100644 --- a/interface/src/ui/overlays/Circle3DOverlay.cpp +++ b/interface/src/ui/overlays/Circle3DOverlay.cpp @@ -119,7 +119,7 @@ void Circle3DOverlay::render(RenderArgs* args) { glPushMatrix(); glm::vec3 positionToCenter = center - position; glTranslatef(positionToCenter.x, positionToCenter.y, positionToCenter.z); - glScalef(dimensions.x, dimensions.y, 1.0f); + glScalef(dimensions.x / 2.0f, dimensions.y / 2.0f, 1.0f); glLineWidth(_lineWidth); From 2f6749ff691c8e4e072df804a3ca400a74bd008e Mon Sep 17 00:00:00 2001 From: David Rowe Date: Thu, 5 Feb 2015 09:38:45 -0800 Subject: [PATCH 2/3] Implement dimensions test for 3D planar overlay intersection --- interface/src/ui/overlays/Planar3DOverlay.cpp | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/interface/src/ui/overlays/Planar3DOverlay.cpp b/interface/src/ui/overlays/Planar3DOverlay.cpp index 628ff6a7dc..508b5c4227 100644 --- a/interface/src/ui/overlays/Planar3DOverlay.cpp +++ b/interface/src/ui/overlays/Planar3DOverlay.cpp @@ -93,7 +93,6 @@ QScriptValue Planar3DOverlay::getProperty(const QString& property) { bool Planar3DOverlay::findRayIntersection(const glm::vec3& origin, const glm::vec3& direction, float& distance, BoxFace& face) { - RayIntersectionInfo rayInfo; rayInfo._rayStart = origin; rayInfo._rayDirection = direction; @@ -110,9 +109,13 @@ bool Planar3DOverlay::findRayIntersection(const glm::vec3& origin, const glm::ve if (intersects) { distance = rayInfo._hitDistance; - // TODO: if it intersects, we want to check to see if the intersection point is within our dimensions - // glm::vec3 hitAt = origin + direction * distance; - // _dimensions + + glm::vec3 hitPosition = origin + (distance * direction); + glm::vec3 localHitPosition = glm::inverse(_rotation) * (hitPosition - _position); + glm::vec2 halfDimensions = _dimensions / 2.0f; + + intersects = -halfDimensions.x <= localHitPosition.x && localHitPosition.x <= halfDimensions.x + && -halfDimensions.y <= localHitPosition.y && localHitPosition.y <= halfDimensions.y; } return intersects; } From 3ceb1123b357c5d218f30a6d439a04dd1a892173 Mon Sep 17 00:00:00 2001 From: David Rowe Date: Thu, 5 Feb 2015 09:39:16 -0800 Subject: [PATCH 3/3] Cater for ellipses in circle3d overlay intersection --- interface/src/ui/overlays/Circle3DOverlay.cpp | 22 +++++++++---------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/interface/src/ui/overlays/Circle3DOverlay.cpp b/interface/src/ui/overlays/Circle3DOverlay.cpp index 463e63a187..e68f1bfb37 100644 --- a/interface/src/ui/overlays/Circle3DOverlay.cpp +++ b/interface/src/ui/overlays/Circle3DOverlay.cpp @@ -417,19 +417,19 @@ bool Circle3DOverlay::findRayIntersection(const glm::vec3& origin, const glm::vec3& direction, float& distance, BoxFace& face) { bool intersects = Planar3DOverlay::findRayIntersection(origin, direction, distance, face); - if (intersects) { - glm::vec3 hitAt = origin + (direction * distance); - float distanceToHit = glm::distance(hitAt, _position); - float maxDimension = glm::max(_dimensions.x, _dimensions.y); - float innerRadius = maxDimension * getInnerRadius(); - float outerRadius = maxDimension * getOuterRadius(); - - // TODO: this really only works for circles, we should be handling the ellipse case as well... - if (distanceToHit < innerRadius || distanceToHit > outerRadius) { - intersects = false; - } + if (intersects) { + glm::vec3 hitPosition = origin + (distance * direction); + glm::vec3 localHitPosition = glm::inverse(_rotation) * (hitPosition - _position); + localHitPosition.y = localHitPosition.y * _dimensions.x / _dimensions.y; // Scale to make circular + + float distanceToHit = glm::length(localHitPosition); + float innerRadius = _dimensions.x / 2.0f * _innerRadius; + float outerRadius = _dimensions.x / 2.0f * _outerRadius; + + intersects = innerRadius <= distanceToHit && distanceToHit <= outerRadius; } + return intersects; }