From 2f0a9b517fb7ba9eecabeb50634f08ad2b642bf1 Mon Sep 17 00:00:00 2001 From: ZappoMan Date: Thu, 25 Sep 2014 14:49:52 -0700 Subject: [PATCH] make sphere entities use sphere shape for better collisions --- libraries/entities/src/EntityCollisionSystem.cpp | 3 +-- libraries/entities/src/SphereEntityItem.cpp | 9 ++++++++- libraries/entities/src/SphereEntityItem.h | 8 +++++++- 3 files changed, 16 insertions(+), 4 deletions(-) diff --git a/libraries/entities/src/EntityCollisionSystem.cpp b/libraries/entities/src/EntityCollisionSystem.cpp index 1bba7c4764..2a5450e91f 100644 --- a/libraries/entities/src/EntityCollisionSystem.cpp +++ b/libraries/entities/src/EntityCollisionSystem.cpp @@ -105,14 +105,13 @@ void EntityCollisionSystem::updateCollisionWithVoxels(EntityItem* entity) { } void EntityCollisionSystem::updateCollisionWithEntities(EntityItem* entityA) { - glm::vec3 center = entityA->getPosition() * (float)(TREE_SCALE); - float radius = entityA->getRadius() * (float)(TREE_SCALE); glm::vec3 penetration; EntityItem* entityB = NULL; const float MAX_COLLISIONS_PER_ENTITY = 32; CollisionList collisions(MAX_COLLISIONS_PER_ENTITY); bool shapeCollisionsAccurate = false; + bool shapeCollisions = _entities->findShapeCollisions(&entityA->getCollisionShapeInMeters(), collisions, Octree::NoLock, &shapeCollisionsAccurate); diff --git a/libraries/entities/src/SphereEntityItem.cpp b/libraries/entities/src/SphereEntityItem.cpp index 09364ddbfe..5da218c11a 100644 --- a/libraries/entities/src/SphereEntityItem.cpp +++ b/libraries/entities/src/SphereEntityItem.cpp @@ -88,4 +88,11 @@ void SphereEntityItem::appendSubclassData(OctreePacketData* packetData, EncodeBi bool successPropertyFits = true; APPEND_ENTITY_PROPERTY(PROP_COLOR, appendColor, getColor()); -} \ No newline at end of file +} + +void SphereEntityItem::recalculateCollisionShape() { + _sphereShape.setTranslation(getCenterInMeters()); + glm::vec3 dimensionsInMeters = getDimensionsInMeters(); + float largestDiameter = glm::max(dimensionsInMeters.x, dimensionsInMeters.y, dimensionsInMeters.z); + _sphereShape.setRadius(largestDiameter / 2.0f); +} diff --git a/libraries/entities/src/SphereEntityItem.h b/libraries/entities/src/SphereEntityItem.h index 337f229a69..d57ada760b 100644 --- a/libraries/entities/src/SphereEntityItem.h +++ b/libraries/entities/src/SphereEntityItem.h @@ -12,7 +12,8 @@ #ifndef hifi_SphereEntityItem_h #define hifi_SphereEntityItem_h -#include "EntityItem.h" +#include +#include "EntityItem.h" class SphereEntityItem : public EntityItem { public: @@ -49,9 +50,14 @@ public: _color[GREEN_INDEX] = value.green; _color[BLUE_INDEX] = value.blue; } + + virtual const Shape& getCollisionShapeInMeters() const { return _sphereShape; } protected: + virtual void recalculateCollisionShape(); + rgbColor _color; + SphereShape _sphereShape; }; #endif // hifi_SphereEntityItem_h