X-Git-Url: http://gitweb.pgornicz.com/gitweb.cgi?a=blobdiff_plain;f=src%2FentityManager.cpp;h=ecf7955c5598e10d1a4bf1d9e1e5fcd2b53822d5;hb=5829cb660da640894c1de518353b175fbb1a12e0;hp=351808adce25407b6a6fb315eca5775924c5221f;hpb=379cc454ab369431b3bdd2fe97cb2e6a1d68c26d;p=physics.git diff --git a/src/entityManager.cpp b/src/entityManager.cpp index 351808a..ecf7955 100644 --- a/src/entityManager.cpp +++ b/src/entityManager.cpp @@ -1,140 +1,177 @@ +/* + * 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 "Entities/Entity.h" #include "Entities/Particle.h" #include "Entities/PhysicsEntity.h" -#include -using std::set; - -#include +#include "collisionManager.h" +#include "effectManager.h" /// ***** Private Method Headers ***** + void updateParticles(float); void updatePhysics(float); /// ***** Private Variables ***** -typedef set setPart; + +typedef std::set setPart; setPart particles_To_Add; setPart active_Particles; setPart particles_To_Remove; -bool clearParticles; -typedef set setPhys; +typedef std::set setPhys; setPhys physics_To_Add; setPhys active_Physics; setPhys physics_To_Remove; -bool clearPhysics; -/// ***** Public Methods ***** +SDL_mutex* particleSetLock = NULL; +SDL_mutex* physicsEntitySetLock = NULL; -void entityManager::init() +/// ***** Initializers/Cleaners ***** + +void manager::init() { + particleSetLock = SDL_CreateMutex(); + physicsEntitySetLock = SDL_CreateMutex(); + + collision::init(); } -void entityManager::clean() +void manager::clean() { + collision::clean(); + + SDL_DestroyMutex(particleSetLock); + particleSetLock = NULL; + + SDL_DestroyMutex(physicsEntitySetLock); + physicsEntitySetLock = NULL; } -void entityManager::add(Entity* e) +/// ***** Public Methods ***** + +void manager::add(Entity* e) { { - Particle* p = dynamic_cast(e); - if( p != 0 ) - { - particles_To_Add.insert(p); - return; - } + Particle* p = dynamic_cast(e); + if( p != 0 ) + { + particles_To_Add.insert(p); + return; + } } { - PhysicsEntity* p = dynamic_cast(e); - if( p != 0 ) - { - physics_To_Add.insert(p); - return; - } + PhysicsEntity* p = dynamic_cast(e); + if( p != 0 ) + { + physics_To_Add.insert(p); + return; + } } - std::cerr << "ENTITY TYPE NOT SUPPORTED BY addEntity()!!"; - std::cerr << std::endl; + DPF(0, "ENTITY TYPE NOT SUPPORTED BY addEntity()!!"); } -void entityManager::remove(Entity* e) +void manager::remove(Entity* e) { { - Particle* p = dynamic_cast(e); - if( p != 0 ) - { - particles_To_Remove.insert(p); - return; - } + Particle* p = dynamic_cast(e); + if( p != 0 ) + { + particles_To_Remove.insert(p); + return; + } } { - PhysicsEntity* p = dynamic_cast(e); - if( p != 0 ) - { - physics_To_Remove.insert(p); - return; - } + PhysicsEntity* p = dynamic_cast(e); + if( p != 0 ) + { + physics_To_Remove.insert(p); + return; + } } - std::cerr << "ENTITY TYPE NOT SUPPORTED BY deleteEntity()!!"; - std::cerr << std::endl; + DPF(0, "ENTITY TYPE NOT SUPPORTED BY deleteEntity()!!"); } -void entityManager::clear() +void manager::handleInput() { - clearParticles = true; - clearPhysics = true; + effect::handleInput(); } - -void entityManager::handleInput() -{ - // TODO -} -void entityManager::update(float time_step) +void manager::update(float time_step) { + effect::update(time_step); + updateParticles(time_step); updatePhysics(time_step); } -void entityManager::draw() +void manager::draw() { - // update active Particle*s - for( setPart::iterator it = active_Particles.begin(); - it != active_Particles.end(); - it++ ) - { - (*it)->draw(); - } - - // update active PhysicsEntity*s - for( setPhys::iterator it = active_Physics.begin(); - it != active_Physics.end(); - it++ ) - { - (*it)->draw(); - } + SDL_mutexP( particleSetLock ); + // update active Particle*s + for( setPart::iterator it = active_Particles.begin(); + it != active_Particles.end(); + it++ ) + { + (*it)->draw(); + } + SDL_mutexV( particleSetLock ); + + SDL_mutexP( physicsEntitySetLock ); + // update 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) { - // 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_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 ); // update active Particle*s for( setPart::iterator it = active_Particles.begin(); @@ -146,23 +183,28 @@ void updateParticles(float time_step) } void updatePhysics(float time_step) { - // 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_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 ); + + // apply collision math + collision::update(active_Physics); // update active PhysicsEntity*s for( setPhys::iterator it = active_Physics.begin();