delete is now thread safe
[physics.git] / src / entityManager.cpp
... / ...
CommitLineData
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
18#include "entityManager.h"
19#include "debug.h"
20
21#include <set>
22#include <SDL/SDL.h>
23
24#include "locks/Mutex.h"
25#include "locks/Autolock.h"
26
27#include "Entities/Entity.h"
28#include "Entities/Particle.h"
29#include "Entities/PhysicsEntity.h"
30
31#include "collisionManager.h"
32#include "effectManager.h"
33
34/// ***** Private Method Headers *****
35
36void updateParticles(float);
37void updatePhysics(float);
38void clearUpParticles();
39void clearUpPhysics();
40
41/// ***** Private Variables *****
42
43typedef std::set<Particle*> setPart;
44setPart particles_To_Add;
45setPart active_Particles;
46setPart particles_To_Remove;
47
48typedef std::set<PhysicsEntity*> setPhys;
49setPhys physics_To_Add;
50setPhys active_Physics;
51setPhys physics_To_Remove;
52
53Mutex particleSetLock;
54Mutex physicsEntitySetLock;
55
56/// ***** Initializers/Cleaners *****
57
58void manager::init()
59{
60 particleSetLock.init();
61 physicsEntitySetLock.init();
62
63 collision::init();
64}
65void manager::clean()
66{
67 collision::clean();
68
69 physicsEntitySetLock.clean();
70 particleSetLock.clean();
71}
72
73/// ***** Public Methods *****
74
75void manager::add(Entity* e)
76{
77 {
78 Particle* p = dynamic_cast<Particle*>(e);
79 if( p != 0 )
80 {
81 particles_To_Add.insert(p);
82 return;
83 }
84 }
85
86 {
87 PhysicsEntity* p = dynamic_cast<PhysicsEntity*>(e);
88 if( p != 0 )
89 {
90 physics_To_Add.insert(p);
91 return;
92 }
93 }
94
95 DPF(0, "ENTITY TYPE NOT SUPPORTED BY addEntity()!!");
96}
97void manager::remove(Entity* e)
98{
99 {
100 Autolock lock( particleSetLock );
101 Particle* p = dynamic_cast<Particle*>(e);
102 if( p != 0 )
103 {
104 particles_To_Remove.insert(p);
105 return;
106 }
107 }
108
109 {
110 Autolock lock( physicsEntitySetLock );
111 PhysicsEntity* p = dynamic_cast<PhysicsEntity*>(e);
112 if( p != 0 )
113 {
114 physics_To_Remove.insert(p);
115 return;
116 }
117 }
118
119 DPF(0, "ENTITY TYPE NOT SUPPORTED BY deleteEntity()!!");
120}
121
122void manager::handleInput()
123{
124 effect::handleInput();
125}
126void manager::update(float time_step)
127{
128 effect::update(time_step);
129
130 updateParticles(time_step);
131 updatePhysics(time_step);
132}
133void manager::draw()
134{
135 clearUpParticles();
136 {
137 Autolock lock( particleSetLock );
138 DPF(0, "Particle Draw Start");
139
140 // update active Particle*s
141 for( setPart::iterator it = active_Particles.begin();
142 it != active_Particles.end();
143 it++ )
144 {
145 (*it)->draw();
146 }
147
148 DPF(0, "Particle Draw End");
149 }
150
151 clearUpPhysics();
152 {
153 Autolock lock( physicsEntitySetLock );
154 DPF(0, "Physics Draw Start");
155
156 // update active PhysicsEntity*s
157 for( setPhys::iterator it = active_Physics.begin();
158 it != active_Physics.end();
159 it++ )
160 {
161 (*it)->draw();
162 }
163
164 DPF(0, "Physics Draw End");
165 }
166}
167
168/// ***** Private Methods *****
169
170void updateParticles(float time_step)
171{
172 clearUpParticles();
173
174 // update active Particle*s
175 for( setPart::iterator it = active_Particles.begin();
176 it != active_Particles.end();
177 it++ )
178 {
179 (*it)->update(time_step);
180 }
181}
182void updatePhysics(float time_step)
183{
184 clearUpPhysics();
185
186 // apply collision math
187 collision::update(active_Physics);
188
189 // update active PhysicsEntity*s
190 for( setPhys::iterator it = active_Physics.begin();
191 it != active_Physics.end();
192 it++ )
193 {
194 (*it)->update(time_step);
195 }
196}
197void clearUpParticles()
198{
199 Autolock lock( particleSetLock );
200
201 // add new Particle*s to Active
202 for( setPart::iterator it = particles_To_Add.begin();
203 it != particles_To_Add.end();
204 it++ )
205 {
206 DPF(0, "Particle Insert");
207 active_Particles.insert(*it);
208 }
209 particles_To_Add.clear();
210
211 // remove dead Particle*s from Active
212 for( setPart::iterator it = particles_To_Remove.begin();
213 it != particles_To_Remove.end();
214 it++ )
215 {
216 DPF(0, "Particle Delete");
217 active_Particles.erase(*it);
218 }
219 particles_To_Remove.clear();
220}
221void clearUpPhysics()
222{
223 Autolock lock( physicsEntitySetLock );
224
225 // add new PhysicsEntity*s to Active
226 for( setPhys::iterator it = physics_To_Add.begin();
227 it != physics_To_Add.end();
228 it++ )
229 {
230 DPF(0, "Physics Insert");
231 active_Physics.insert(*it);
232 }
233 physics_To_Add.clear();
234
235 // remove dead PhysicsEntity*s from Active
236 for( setPhys::iterator it = physics_To_Remove.begin();
237 it != physics_To_Remove.end();
238 it++ )
239 {
240 DPF(0, "Physics Delete");
241 active_Physics.erase(*it);
242 }
243 physics_To_Remove.clear();
244}