X-Git-Url: http://gitweb.pgornicz.com/gitweb.cgi?a=blobdiff_plain;f=src%2FentityManager.cpp;h=7d75d3c7fb6471eb346ea73d36a27122170621ac;hb=9dd68d8e6816befe1dd56164cde7e42880875b9a;hp=cbe9e030db63f0cd5f02ee728e497c41e730c221;hpb=2869e2e8412cd7fd600ad1566f18ffb39aa38ab0;p=physics.git diff --git a/src/entityManager.cpp b/src/entityManager.cpp index cbe9e03..7d75d3c 100644 --- a/src/entityManager.cpp +++ b/src/entityManager.cpp @@ -19,18 +19,24 @@ #include "debug.h" #include +#include + +#include "locks/Mutex.h" +#include "locks/Autolock.h" #include "Entities/Entity.h" #include "Entities/Particle.h" #include "Entities/PhysicsEntity.h" -#include "collisionHandler.h" +#include "collisionManager.h" #include "effectManager.h" /// ***** Private Method Headers ***** void updateParticles(float); void updatePhysics(float); +void clearUpParticles(); +void clearUpPhysics(); /// ***** Private Variables ***** @@ -44,15 +50,24 @@ setPhys physics_To_Add; setPhys active_Physics; setPhys physics_To_Remove; +Mutex particleSetLock; +Mutex physicsEntitySetLock; + /// ***** Initializers/Cleaners ***** void manager::init() { + particleSetLock.init(); + physicsEntitySetLock.init(); + collision::init(); } void manager::clean() { collision::clean(); + + physicsEntitySetLock.clean(); + particleSetLock.clean(); } /// ***** Public Methods ***** @@ -77,13 +92,12 @@ void manager::add(Entity* e) } } -#ifdef WARNINGS - cerr << "ENTITY TYPE NOT SUPPORTED BY addEntity()!!" << endl; -#endif + DPF(0, "ENTITY TYPE NOT SUPPORTED BY addEntity()!!"); } void manager::remove(Entity* e) { { + Autolock lock( particleSetLock ); Particle* p = dynamic_cast(e); if( p != 0 ) { @@ -93,6 +107,7 @@ void manager::remove(Entity* e) } { + Autolock lock( physicsEntitySetLock ); PhysicsEntity* p = dynamic_cast(e); if( p != 0 ) { @@ -101,9 +116,7 @@ void manager::remove(Entity* e) } } -#ifdef WARNINGS - cerr << "ENTITY TYPE NOT SUPPORTED BY deleteEntity()!!" << endl; -#endif + DPF(0, "ENTITY TYPE NOT SUPPORTED BY deleteEntity()!!"); } void manager::handleInput() @@ -119,27 +132,66 @@ void manager::update(float time_step) } void manager::draw() { + clearUpParticles(); + { + Autolock lock( particleSetLock ); + + // update active Particle*s + for( setPart::iterator it = active_Particles.begin(); + it != active_Particles.end(); + it++ ) + { + (*it)->draw(); + } + } + + clearUpPhysics(); + { + Autolock lock( physicsEntitySetLock ); + + // update active PhysicsEntity*s + for( setPhys::iterator it = active_Physics.begin(); + it != active_Physics.end(); + it++ ) + { + (*it)->draw(); + } + } +} + +/// ***** Private Methods ***** + +void updateParticles(float time_step) +{ + clearUpParticles(); + // update active Particle*s for( setPart::iterator it = active_Particles.begin(); it != active_Particles.end(); it++ ) { - (*it)->draw(); + (*it)->update(time_step); } +} +void updatePhysics(float time_step) +{ + clearUpPhysics(); + + // apply collision math + collision::update(active_Physics); // update active PhysicsEntity*s for( setPhys::iterator it = active_Physics.begin(); it != active_Physics.end(); it++ ) { - (*it)->draw(); + (*it)->update(time_step); } } - -/// ***** Private Methods ***** - -void updateParticles(float time_step) +void clearUpParticles() { + Autolock lock( particleSetLock ); + // add new Particle*s to Active for( setPart::iterator it = particles_To_Add.begin(); it != particles_To_Add.end(); @@ -157,17 +209,11 @@ void updateParticles(float time_step) active_Particles.erase(*it); } particles_To_Remove.clear(); - - // update active Particle*s - for( setPart::iterator it = active_Particles.begin(); - it != active_Particles.end(); - it++ ) - { - (*it)->update(time_step); - } } -void updatePhysics(float time_step) +void clearUpPhysics() { + Autolock lock( physicsEntitySetLock ); + // add new PhysicsEntity*s to Active for( setPhys::iterator it = physics_To_Add.begin(); it != physics_To_Add.end(); @@ -185,15 +231,4 @@ void updatePhysics(float time_step) active_Physics.erase(*it); } physics_To_Remove.clear(); - - // apply collision math - collision::update(active_Physics); - - // update active PhysicsEntity*s - for( setPhys::iterator it = active_Physics.begin(); - it != active_Physics.end(); - it++ ) - { - (*it)->update(time_step); - } }