Cater for ellipses in circle3d overlay intersection

This commit is contained in:
David Rowe 2015-02-05 09:39:16 -08:00
parent 2f6749ff69
commit 3ceb1123b3

View file

@ -417,19 +417,19 @@ bool Circle3DOverlay::findRayIntersection(const glm::vec3& origin,
const glm::vec3& direction, float& distance, BoxFace& face) { const glm::vec3& direction, float& distance, BoxFace& face) {
bool intersects = Planar3DOverlay::findRayIntersection(origin, direction, distance, 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); if (intersects) {
float innerRadius = maxDimension * getInnerRadius(); glm::vec3 hitPosition = origin + (distance * direction);
float outerRadius = maxDimension * getOuterRadius(); glm::vec3 localHitPosition = glm::inverse(_rotation) * (hitPosition - _position);
localHitPosition.y = localHitPosition.y * _dimensions.x / _dimensions.y; // Scale to make circular
// TODO: this really only works for circles, we should be handling the ellipse case as well...
if (distanceToHit < innerRadius || distanceToHit > outerRadius) { float distanceToHit = glm::length(localHitPosition);
intersects = false; float innerRadius = _dimensions.x / 2.0f * _innerRadius;
} float outerRadius = _dimensions.x / 2.0f * _outerRadius;
intersects = innerRadius <= distanceToHit && distanceToHit <= outerRadius;
} }
return intersects; return intersects;
} }