X-Git-Url: http://gitweb.pgornicz.com/gitweb.cgi?a=blobdiff_plain;f=src%2FentityManager.cpp;h=65b82730954e99989a061174c6eafb11b0a53aa2;hb=3bccd1d78b605dc5b2898877601ad1a6374e0e44;hp=b646c1ac50b71fe8bcb994a2f43d5498dee79065;hpb=617dcc71d9a71663f63fb56ffac2505b45bf91b9;p=physics.git diff --git a/src/entityManager.cpp b/src/entityManager.cpp index b646c1a..65b8273 100644 --- a/src/entityManager.cpp +++ b/src/entityManager.cpp @@ -1,13 +1,36 @@ +/* + * 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 + +#include "locks/Mutex.h" +#include "locks/Autolock.h" #include "Entities/Entity.h" #include "Entities/Particle.h" #include "Entities/PhysicsEntity.h" +#include "collisionManager.h" +#include "effectManager.h" + /// ***** Private Method Headers ***** void updateParticles(float); @@ -25,15 +48,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 ***** @@ -58,8 +90,7 @@ void manager::add(Entity* e) } } - 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) { @@ -81,35 +112,50 @@ void manager::remove(Entity* e) } } - 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() { - // update active Particle*s - for( setPart::iterator it = active_Particles.begin(); - it != active_Particles.end(); - it++ ) { - (*it)->draw(); + Autolock lock( particleSetLock ); + DPF(0, "Particle Draw Start"); + + // update active Particle*s + for( setPart::iterator it = active_Particles.begin(); + it != active_Particles.end(); + it++ ) + { + (*it)->draw(); + } + + DPF(0, "Particle Draw End"); } - // update active PhysicsEntity*s - for( setPhys::iterator it = active_Physics.begin(); - it != active_Physics.end(); - it++ ) { - (*it)->draw(); + Autolock lock( physicsEntitySetLock ); + DPF(0, "Physics Draw Start"); + + // update active PhysicsEntity*s + for( setPhys::iterator it = active_Physics.begin(); + it != active_Physics.end(); + it++ ) + { + (*it)->draw(); + } + + DPF(0, "Physics Draw End"); } } @@ -117,22 +163,29 @@ void manager::draw() 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(); + Autolock lock( particleSetLock ); - // remove dead Particle*s from Active - for( setPart::iterator it = particles_To_Remove.begin(); - it != particles_To_Remove.end(); - it++ ) - { - active_Particles.erase(*it); + // add new Particle*s to Active + for( setPart::iterator it = particles_To_Add.begin(); + it != particles_To_Add.end(); + it++ ) + { + DPF(0, "Particle Insert"); + active_Particles.insert(*it); + } + + // remove dead Particle*s from Active + for( setPart::iterator it = particles_To_Remove.begin(); + it != particles_To_Remove.end(); + it++ ) + { + DPF(0, "Particle Delete"); + active_Particles.erase(*it); + } } + + particles_To_Add.clear(); particles_To_Remove.clear(); // update active Particle*s @@ -145,23 +198,33 @@ 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(); + Autolock lock( physicsEntitySetLock ); - // remove dead PhysicsEntity*s from Active - for( setPhys::iterator it = physics_To_Remove.begin(); - it != physics_To_Remove.end(); - it++ ) - { - active_Physics.erase(*it); + // add new PhysicsEntity*s to Active + for( setPhys::iterator it = physics_To_Add.begin(); + it != physics_To_Add.end(); + it++ ) + { + DPF(0, "Physics Insert"); + active_Physics.insert(*it); + } + + // remove dead PhysicsEntity*s from Active + for( setPhys::iterator it = physics_To_Remove.begin(); + it != physics_To_Remove.end(); + it++ ) + { + DPF(0, "Physics Delete"); + active_Physics.erase(*it); + } } + physics_To_Remove.clear(); + physics_To_Add.clear(); + + // apply collision math + collision::update(active_Physics); // update active PhysicsEntity*s for( setPhys::iterator it = active_Physics.begin();