X-Git-Url: http://gitweb.pgornicz.com/gitweb.cgi?a=blobdiff_plain;f=src%2FentityManager.cpp;h=62bcb2ef639a48483e62e2e46906fff12d865487;hb=f32a9b7c8eab3536ad354f85ee65c41d5b5da006;hp=ecf7955c5598e10d1a4bf1d9e1e5fcd2b53822d5;hpb=5829cb660da640894c1de518353b175fbb1a12e0;p=physics.git diff --git a/src/entityManager.cpp b/src/entityManager.cpp index ecf7955..62bcb2e 100644 --- a/src/entityManager.cpp +++ b/src/entityManager.cpp @@ -16,7 +16,10 @@ */ #include "entityManager.h" -#include "debug.h" + +#include +#include +#include #include #include @@ -30,30 +33,32 @@ /// ***** Private Method Headers ***** -void updateParticles(float); -void updatePhysics(float); +static void updateParticles(float); +static void updatePhysics(float); +static void addOrRemoveParticles(); +static void addOrRemovePhysics(); /// ***** Private Variables ***** typedef std::set setPart; -setPart particles_To_Add; -setPart active_Particles; -setPart particles_To_Remove; +static setPart particles_To_Add; +static setPart active_Particles; +static setPart particles_To_Remove; typedef std::set setPhys; -setPhys physics_To_Add; -setPhys active_Physics; -setPhys physics_To_Remove; +static setPhys physics_To_Add; +static setPhys active_Physics; +static setPhys physics_To_Remove; -SDL_mutex* particleSetLock = NULL; -SDL_mutex* physicsEntitySetLock = NULL; +static Mutex muSetPart; +static Mutex muSetPhys; /// ***** Initializers/Cleaners ***** void manager::init() { - particleSetLock = SDL_CreateMutex(); - physicsEntitySetLock = SDL_CreateMutex(); + muSetPart.init(); + muSetPhys.init(); collision::init(); } @@ -61,42 +66,44 @@ void manager::clean() { collision::clean(); - SDL_DestroyMutex(particleSetLock); - particleSetLock = NULL; - - SDL_DestroyMutex(physicsEntitySetLock); - physicsEntitySetLock = NULL; + muSetPhys.clean(); + muSetPart.clean(); } /// ***** Public Methods ***** -void manager::add(Entity* e) +void manager::add(Entity* pe) { + DASSERT(pe != NULL); + { - Particle* p = dynamic_cast(e); - if( p != 0 ) + Particle* pp = dynamic_cast(pe); + if( pp != NULL ) { - particles_To_Add.insert(p); + particles_To_Add.insert(pp); return; } } { - PhysicsEntity* p = dynamic_cast(e); - if( p != 0 ) + PhysicsEntity* ppe = dynamic_cast(pe); + if( ppe != NULL ) { - physics_To_Add.insert(p); + physics_To_Add.insert(ppe); return; } } DPF(0, "ENTITY TYPE NOT SUPPORTED BY addEntity()!!"); } -void manager::remove(Entity* e) +void manager::remove(Entity* pe) { + DASSERT(pe != NULL); + { - Particle* p = dynamic_cast(e); - if( p != 0 ) + Autolock lock( muSetPart ); + Particle* p = dynamic_cast(pe); + if( p != NULL ) { particles_To_Remove.insert(p); return; @@ -104,10 +111,11 @@ void manager::remove(Entity* e) } { - PhysicsEntity* p = dynamic_cast(e); - if( p != 0 ) + Autolock lock( muSetPhys ); + PhysicsEntity* ppe = dynamic_cast(pe); + if( ppe != NULL ) { - physics_To_Remove.insert(p); + physics_To_Remove.insert(ppe); return; } } @@ -128,50 +136,40 @@ void manager::update(float time_step) } void manager::draw() { - SDL_mutexP( particleSetLock ); - // update active Particle*s + { + Autolock lock( muSetPart ); + + addOrRemoveParticles(); + + // draw active Particle*s for( setPart::iterator it = active_Particles.begin(); it != active_Particles.end(); it++ ) { (*it)->draw(); } - SDL_mutexV( particleSetLock ); + } + + { + Autolock lock( muSetPhys ); + + addOrRemovePhysics(); - SDL_mutexP( physicsEntitySetLock ); - // update active PhysicsEntity*s + // draw active PhysicsEntity*s for( setPhys::iterator it = active_Physics.begin(); it != active_Physics.end(); it++ ) { (*it)->draw(); } - SDL_mutexV( physicsEntitySetLock ); + } } /// ***** Private Methods ***** void updateParticles(float time_step) { - SDL_mutexP( particleSetLock ); - // add new Particle*s to Active - for( setPart::iterator it = particles_To_Add.begin(); - it != particles_To_Add.end(); - it++ ) - { - active_Particles.insert(*it); - } - particles_To_Add.clear(); - - // remove dead Particle*s from Active - for( setPart::iterator it = particles_To_Remove.begin(); - it != particles_To_Remove.end(); - it++ ) - { - active_Particles.erase(*it); - } - particles_To_Remove.clear(); - SDL_mutexV( particleSetLock ); + addOrRemoveParticles(); // update active Particle*s for( setPart::iterator it = active_Particles.begin(); @@ -183,25 +181,7 @@ void updateParticles(float time_step) } void updatePhysics(float time_step) { - SDL_mutexP( physicsEntitySetLock ); - // add new PhysicsEntity*s to Active - for( setPhys::iterator it = physics_To_Add.begin(); - it != physics_To_Add.end(); - it++ ) - { - active_Physics.insert(*it); - } - physics_To_Add.clear(); - - // remove dead PhysicsEntity*s from Active - for( setPhys::iterator it = physics_To_Remove.begin(); - it != physics_To_Remove.end(); - it++ ) - { - active_Physics.erase(*it); - } - physics_To_Remove.clear(); - SDL_mutexV( physicsEntitySetLock ); + addOrRemovePhysics(); // apply collision math collision::update(active_Physics); @@ -214,3 +194,47 @@ void updatePhysics(float time_step) (*it)->update(time_step); } } +void addOrRemoveParticles() +{ + Autolock lock( muSetPart ); + + // add new Particle*s to Active + for( setPart::iterator it = particles_To_Add.begin(); + it != particles_To_Add.end(); + it++ ) + { + active_Particles.insert(*it); + } + particles_To_Add.clear(); + + // remove dead Particle*s from Active + for( setPart::iterator it = particles_To_Remove.begin(); + it != particles_To_Remove.end(); + it++ ) + { + active_Particles.erase(*it); + } + particles_To_Remove.clear(); +} +void addOrRemovePhysics() +{ + Autolock lock( muSetPhys ); + + // add new PhysicsEntity*s to Active + for( setPhys::iterator it = physics_To_Add.begin(); + it != physics_To_Add.end(); + it++ ) + { + active_Physics.insert(*it); + } + physics_To_Add.clear(); + + // remove dead PhysicsEntity*s from Active + for( setPhys::iterator it = physics_To_Remove.begin(); + it != physics_To_Remove.end(); + it++ ) + { + active_Physics.erase(*it); + } + physics_To_Remove.clear(); +}