X-Git-Url: http://gitweb.pgornicz.com/gitweb.cgi?a=blobdiff_plain;f=src%2FentityManager.cpp;h=7290373d101dd48ee12105c013c833f67139ef7f;hb=b85b89ba9a2cb0373209e8117046fd308faf0202;hp=b646c1ac50b71fe8bcb994a2f43d5498dee79065;hpb=617dcc71d9a71663f63fb56ffac2505b45bf91b9;p=physics.git diff --git a/src/entityManager.cpp b/src/entityManager.cpp index b646c1a..7290373 100644 --- a/src/entityManager.cpp +++ b/src/entityManager.cpp @@ -1,71 +1,110 @@ +/* + * Copyright (C) 2008 Patrik Gornicz, Gornicz_P (at) hotmail (dot) com. + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + #include "entityManager.h" -#include "debug.h" + +#include +#include +#include +using namespace pg; #include -#include +#include #include "Entities/Entity.h" #include "Entities/Particle.h" #include "Entities/PhysicsEntity.h" +#include "collisionManager.h" +#include "effectManager.h" + /// ***** 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; + +static Mutex muSetPart; +static Mutex muSetPhys; /// ***** Initializers/Cleaners ***** void manager::init() { + muSetPart.init(); + muSetPhys.init(); + collision::init(); } void manager::clean() { + collision::clean(); + 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; } } - std::cerr << "ENTITY TYPE NOT SUPPORTED BY addEntity()!!"; - std::cerr << std::endl; + 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; @@ -73,50 +112,93 @@ 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; } } - std::cerr << "ENTITY TYPE NOT SUPPORTED BY deleteEntity()!!"; - std::cerr << std::endl; + DPF(0, "ENTITY TYPE NOT SUPPORTED BY deleteEntity()!!"); } void manager::handleInput() { - // TODO + effect::handleInput(); } void manager::update(float time_step) { + effect::update(time_step); + updateParticles(time_step); updatePhysics(time_step); } void manager::draw() { + { + Autolock lock( muSetPart ); + + addOrRemoveParticles(); + + // draw active Particle*s + for( setPart::iterator it = active_Particles.begin(); + it != active_Particles.end(); + it++ ) + { + (*it)->draw(); + } + } + + { + Autolock lock( muSetPhys ); + + addOrRemovePhysics(); + + // draw active PhysicsEntity*s + for( setPhys::iterator it = active_Physics.begin(); + it != active_Physics.end(); + it++ ) + { + (*it)->draw(); + } + } +} + +/// ***** Private Methods ***** + +void updateParticles(float time_step) +{ + addOrRemoveParticles(); + // 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) +{ + addOrRemovePhysics(); + + // 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 addOrRemoveParticles() { + Autolock lock( muSetPart ); + // add new Particle*s to Active for( setPart::iterator it = particles_To_Add.begin(); it != particles_To_Add.end(); @@ -134,17 +216,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 addOrRemovePhysics() { + Autolock lock( muSetPhys ); + // add new PhysicsEntity*s to Active for( setPhys::iterator it = physics_To_Add.begin(); it != physics_To_Add.end(); @@ -162,12 +238,4 @@ void updatePhysics(float time_step) active_Physics.erase(*it); } physics_To_Remove.clear(); - - // update active PhysicsEntity*s - for( setPhys::iterator it = active_Physics.begin(); - it != active_Physics.end(); - it++ ) - { - (*it)->update(time_step); - } }