History

swith to using shape collider instead of spheres

ZappoMan committed 12 years ago

Commit 9cd76981 parent eda168a10 files · +224 −24Browse files

Showing the changes to libraries/entities/src/EntityCollisionSystem.cpp (1 of 10 files). Show all

Unified · Split

libraries/entities/src/EntityCollisionSystem.cpp+22−2
@@ -13,8 +13,10 @@ · 12 unmodified lines
1313 #include <AbstractAudioInterface.h>
1414 #include <VoxelTree.h>
1515 #include <AvatarData.h>
16+#include <CollisionInfo.h>
1617 #include <HeadData.h>
1718 #include <HandData.h>
19+#include <SphereShape.h>
1820
1921 #include "EntityItem.h"
2022 #include "EntityCollisionSystem.h"
@@ -106,8 +108,26 @@ void EntityCollisionSystem::updateCollisionWithEntities(EntityItem* entityA) { · 85 unmodified lines
106108 glm::vec3 center = entityA->getPosition() * (float)(TREE_SCALE);
107109 float radius = entityA->getRadius() * (float)(TREE_SCALE);
108110 glm::vec3 penetration;
109− EntityItem* entityB;
110− if (_entities->findSpherePenetration(center, radius, penetration, (void**)&entityB, Octree::NoLock)) {
111+ EntityItem* entityB = NULL;
112+
113+ const float MAX_COLLISIONS_PER_ENTITY = 32;
114+ CollisionList collisions(MAX_COLLISIONS_PER_ENTITY);
115+ bool shapeCollisionsAccurate = false;
116+ bool shapeCollisions = _entities->findShapeCollisions(&entityA->getCollisionShapeInMeters(),
117+ collisions, Octree::NoLock, &shapeCollisionsAccurate);
118+
119+ if (shapeCollisions) {
120+ for(int i = 0; i < collisions.size(); i++) {
121+ CollisionInfo* collision = collisions[i];
122+ penetration = collision->_penetration;
123+ entityB = static_cast<EntityItem*>(collision->_extraData);
124+
125+ // TODO: how to handle multiple collisions?
126+ break;
127+ }
128+ }
129+
130+ if (shapeCollisions) {
111131 // NOTE: 'penetration' is the depth that 'entityA' overlaps 'entityB'. It points from A into B.
112132 glm::vec3 penetrationInTreeUnits = penetration / (float)(TREE_SCALE);
113133