refactored entityCreator
[physics.git] / src / entityManager.cpp
CommitLineData
e68f847b
PG
1/*
2 * Copyright (C) 2008 Patrik Gornicz, Gornicz_P (at) hotmail (dot) com.
3 *
4 * This program is free software: you can redistribute it and/or modify
5 * it under the terms of the GNU General Public License as published by
6 * the Free Software Foundation, either version 3 of the License, or
7 * (at your option) any later version.
8 *
9 * This program is distributed in the hope that it will be useful,
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 * GNU General Public License for more details.
13 *
14 * You should have received a copy of the GNU General Public License
15 * along with this program. If not, see <http://www.gnu.org/licenses/>.
16 */
17
054d658f 18#include "entityManager.h"
a483ed75
PG
19#include "debug.h"
20
33b8c69b 21#include <set>
5829cb66 22#include <SDL/SDL.h>
33b8c69b 23
3bccd1d7
PG
24#include "locks/Mutex.h"
25#include "locks/Autolock.h"
26
054d658f
PG
27#include "Entities/Entity.h"
28#include "Entities/Particle.h"
29#include "Entities/PhysicsEntity.h"
30
0ac1dc80 31#include "collisionManager.h"
a823a800 32#include "effectManager.h"
54fe85c5 33
ad9f1fb6 34/// ***** Private Method Headers *****
617dcc71 35
ad9f1fb6
PG
36void updateParticles(float);
37void updatePhysics(float);
f342ff31
PG
38void clearUpParticles();
39void clearUpPhysics();
ad9f1fb6
PG
40
41/// ***** Private Variables *****
617dcc71 42
f72f4a59 43typedef std::set<Particle*> setPart;
ad9f1fb6
PG
44setPart particles_To_Add;
45setPart active_Particles;
46setPart particles_To_Remove;
ad9f1fb6 47
f72f4a59 48typedef std::set<PhysicsEntity*> setPhys;
ad9f1fb6
PG
49setPhys physics_To_Add;
50setPhys active_Physics;
51setPhys physics_To_Remove;
ad9f1fb6 52
3bccd1d7
PG
53Mutex particleSetLock;
54Mutex physicsEntitySetLock;
5829cb66 55
617dcc71 56/// ***** Initializers/Cleaners *****
ad9f1fb6 57
d388f0ec 58void manager::init()
ad9f1fb6 59{
3bccd1d7
PG
60 particleSetLock.init();
61 physicsEntitySetLock.init();
5829cb66 62
54fe85c5 63 collision::init();
ad9f1fb6 64}
d388f0ec 65void manager::clean()
ad9f1fb6 66{
54fe85c5 67 collision::clean();
5829cb66 68
3bccd1d7
PG
69 physicsEntitySetLock.clean();
70 particleSetLock.clean();
ad9f1fb6
PG
71}
72
617dcc71
PG
73/// ***** Public Methods *****
74
d388f0ec 75void manager::add(Entity* e)
ad9f1fb6
PG
76{
77 {
d388f0ec
PG
78 Particle* p = dynamic_cast<Particle*>(e);
79 if( p != 0 )
80 {
81 particles_To_Add.insert(p);
82 return;
83 }
ad9f1fb6
PG
84 }
85
86 {
d388f0ec
PG
87 PhysicsEntity* p = dynamic_cast<PhysicsEntity*>(e);
88 if( p != 0 )
89 {
90 physics_To_Add.insert(p);
91 return;
92 }
ad9f1fb6
PG
93 }
94
ca2d526e 95 DPF(0, "ENTITY TYPE NOT SUPPORTED BY addEntity()!!");
ad9f1fb6 96}
d388f0ec 97void manager::remove(Entity* e)
ad9f1fb6
PG
98{
99 {
f342ff31 100 Autolock lock( particleSetLock );
d388f0ec
PG
101 Particle* p = dynamic_cast<Particle*>(e);
102 if( p != 0 )
103 {
104 particles_To_Remove.insert(p);
105 return;
106 }
ad9f1fb6
PG
107 }
108
109 {
f342ff31 110 Autolock lock( physicsEntitySetLock );
d388f0ec
PG
111 PhysicsEntity* p = dynamic_cast<PhysicsEntity*>(e);
112 if( p != 0 )
113 {
114 physics_To_Remove.insert(p);
115 return;
116 }
ad9f1fb6
PG
117 }
118
ca2d526e 119 DPF(0, "ENTITY TYPE NOT SUPPORTED BY deleteEntity()!!");
ad9f1fb6
PG
120}
121
d388f0ec 122void manager::handleInput()
ad9f1fb6 123{
a823a800 124 effect::handleInput();
ad9f1fb6 125}
d388f0ec 126void manager::update(float time_step)
ad9f1fb6 127{
a823a800
PG
128 effect::update(time_step);
129
ad9f1fb6
PG
130 updateParticles(time_step);
131 updatePhysics(time_step);
132}
d388f0ec 133void manager::draw()
ad9f1fb6 134{
f342ff31 135 clearUpParticles();
3bccd1d7
PG
136 {
137 Autolock lock( particleSetLock );
3bccd1d7 138
5829cb66
PG
139 // update active Particle*s
140 for( setPart::iterator it = active_Particles.begin();
141 it != active_Particles.end();
142 it++ )
143 {
144 (*it)->draw();
145 }
3bccd1d7
PG
146 }
147
f342ff31 148 clearUpPhysics();
3bccd1d7
PG
149 {
150 Autolock lock( physicsEntitySetLock );
3bccd1d7 151
5829cb66
PG
152 // update active PhysicsEntity*s
153 for( setPhys::iterator it = active_Physics.begin();
154 it != active_Physics.end();
155 it++ )
156 {
157 (*it)->draw();
158 }
3bccd1d7 159 }
ad9f1fb6
PG
160}
161
162/// ***** Private Methods *****
617dcc71 163
ad9f1fb6
PG
164void updateParticles(float time_step)
165{
f342ff31 166 clearUpParticles();
ad9f1fb6
PG
167
168 // update active Particle*s
169 for( setPart::iterator it = active_Particles.begin();
170 it != active_Particles.end();
171 it++ )
172 {
173 (*it)->update(time_step);
174 }
175}
176void updatePhysics(float time_step)
177{
f342ff31 178 clearUpPhysics();
ad9f1fb6 179
54fe85c5 180 // apply collision math
2869e2e8 181 collision::update(active_Physics);
54fe85c5 182
ad9f1fb6
PG
183 // update active PhysicsEntity*s
184 for( setPhys::iterator it = active_Physics.begin();
185 it != active_Physics.end();
186 it++ )
187 {
188 (*it)->update(time_step);
189 }
190}
f342ff31
PG
191void clearUpParticles()
192{
193 Autolock lock( particleSetLock );
194
195 // add new Particle*s to Active
196 for( setPart::iterator it = particles_To_Add.begin();
197 it != particles_To_Add.end();
198 it++ )
199 {
f342ff31
PG
200 active_Particles.insert(*it);
201 }
202 particles_To_Add.clear();
203
204 // remove dead Particle*s from Active
205 for( setPart::iterator it = particles_To_Remove.begin();
206 it != particles_To_Remove.end();
207 it++ )
208 {
f342ff31
PG
209 active_Particles.erase(*it);
210 }
211 particles_To_Remove.clear();
212}
213void clearUpPhysics()
214{
215 Autolock lock( physicsEntitySetLock );
216
217 // add new PhysicsEntity*s to Active
218 for( setPhys::iterator it = physics_To_Add.begin();
219 it != physics_To_Add.end();
220 it++ )
221 {
f342ff31
PG
222 active_Physics.insert(*it);
223 }
224 physics_To_Add.clear();
225
226 // remove dead PhysicsEntity*s from Active
227 for( setPhys::iterator it = physics_To_Remove.begin();
228 it != physics_To_Remove.end();
229 it++ )
230 {
f342ff31
PG
231 active_Physics.erase(*it);
232 }
233 physics_To_Remove.clear();
234}