From 8db9f80779b73e5280548cfe1044327ee32ce5e9 Mon Sep 17 00:00:00 2001 From: Atlante45 Date: Mon, 20 Apr 2015 17:13:59 +0200 Subject: [PATCH] Reimplements "contains" for sphere and particles --- libraries/entities/src/ParticleEffectEntityItem.cpp | 8 ++++++++ libraries/entities/src/ParticleEffectEntityItem.h | 2 ++ libraries/entities/src/SphereEntityItem.cpp | 8 ++++++++ libraries/entities/src/SphereEntityItem.h | 3 +-- 4 files changed, 19 insertions(+), 2 deletions(-) diff --git a/libraries/entities/src/ParticleEffectEntityItem.cpp b/libraries/entities/src/ParticleEffectEntityItem.cpp index 45312f465b..f12259d057 100644 --- a/libraries/entities/src/ParticleEffectEntityItem.cpp +++ b/libraries/entities/src/ParticleEffectEntityItem.cpp @@ -236,6 +236,14 @@ void ParticleEffectEntityItem::appendSubclassData(OctreePacketData* packetData, APPEND_ENTITY_PROPERTY(PROP_PARTICLE_RADIUS, appendValue, getParticleRadius()); } +bool ParticleEffectEntityItem::contains(const glm::vec3& point) const { + // Transform point to be in a space where the elipsoide is a perfect sphere centered on the origin. + glm::vec3 transformedPoint = (point - getPosition()) / (getDimensions() / 2.0f); + + // Return whether said point is inside the sphere. + return glm::length(transformedPoint) <= 1.0f; +} + bool ParticleEffectEntityItem::isAnimatingSomething() const { return getAnimationIsPlaying() && getAnimationFPS() != 0.0f; diff --git a/libraries/entities/src/ParticleEffectEntityItem.h b/libraries/entities/src/ParticleEffectEntityItem.h index b00eb94685..b563274fa1 100644 --- a/libraries/entities/src/ParticleEffectEntityItem.h +++ b/libraries/entities/src/ParticleEffectEntityItem.h @@ -77,6 +77,8 @@ public: _color[GREEN_INDEX] = value.green; _color[BLUE_INDEX] = value.blue; } + + virtual bool contains(const glm::vec3& point) const; void updateShapeType(ShapeType type); virtual ShapeType getShapeType() const { return _shapeType; } diff --git a/libraries/entities/src/SphereEntityItem.cpp b/libraries/entities/src/SphereEntityItem.cpp index 132ad43336..4a756be618 100644 --- a/libraries/entities/src/SphereEntityItem.cpp +++ b/libraries/entities/src/SphereEntityItem.cpp @@ -92,6 +92,14 @@ void SphereEntityItem::appendSubclassData(OctreePacketData* packetData, EncodeBi APPEND_ENTITY_PROPERTY(PROP_COLOR, appendColor, getColor()); } +bool SphereEntityItem::contains(const glm::vec3& point) const { + // Transform point to be in a space where the elipsoide is a perfect sphere centered on the origin. + glm::vec3 transformedPoint = (point - getPosition()) / (getDimensions() / 2.0f); + + // Return whether said point is inside the sphere. + return glm::length(transformedPoint) <= 1.0f; +} + bool SphereEntityItem::findDetailedRayIntersection(const glm::vec3& origin, const glm::vec3& direction, bool& keepSearching, OctreeElement*& element, float& distance, BoxFace& face, void** intersectedObject, bool precisionPicking) const { diff --git a/libraries/entities/src/SphereEntityItem.h b/libraries/entities/src/SphereEntityItem.h index f79a2db7ff..98450121c5 100644 --- a/libraries/entities/src/SphereEntityItem.h +++ b/libraries/entities/src/SphereEntityItem.h @@ -50,8 +50,7 @@ public: _color[BLUE_INDEX] = value.blue; } - // TODO: implement proper contains for 3D ellipsoid - //virtual bool contains(const glm::vec3& point) const; + virtual bool contains(const glm::vec3& point) const; virtual ShapeType getShapeType() const { return SHAPE_TYPE_SPHERE; }