reflexion 0.4.2 → 0.5.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
data/src/body.cpp CHANGED
@@ -2,8 +2,7 @@
2
2
 
3
3
 
4
4
  #include <assert.h>
5
- #include <box2d/b2_body.h>
6
- #include <box2d/b2_world.h>
5
+ #include <box2d/box2d.h>
7
6
  #include <xot/util.h>
8
7
  #include "reflex/exception.h"
9
8
  #include "world.h"
@@ -16,38 +15,32 @@ namespace Reflex
16
15
  struct Body::Data
17
16
  {
18
17
 
19
- b2Body* b2body;
18
+ b2BodyId b2body = b2_nullBodyId;
20
19
 
21
- float ppm;
20
+ float ppm = 0;
22
21
 
23
- Data ()
24
- : b2body(NULL), ppm(0)
22
+ ~Data ()
25
23
  {
24
+ if (b2Body_IsValid(b2body))
25
+ b2DestroyBody(b2body);
26
26
  }
27
27
 
28
28
  bool is_valid () const
29
29
  {
30
- return b2body && ppm > 0;
30
+ return B2_IS_NON_NULL(b2body) && ppm > 0;
31
31
  }
32
32
 
33
33
  };// Body::Data
34
34
 
35
35
 
36
- static void
37
- validate (const Body* body, bool check_world_lock = false)
36
+ static inline void
37
+ validate (const Body* body, bool check_stepping = false)
38
38
  {
39
- assert(body);
40
-
41
39
  if (!body->self->is_valid())
42
40
  invalid_state_error(__FILE__, __LINE__);
43
41
 
44
- if (check_world_lock)
45
- {
46
- assert(body->self->b2body->GetWorld());
47
-
48
- if (body->self->b2body->GetWorld()->IsLocked())
49
- physics_error(__FILE__, __LINE__);
50
- }
42
+ if (check_stepping && World_is_stepping(Body_get_world(body)))
43
+ physics_error(__FILE__, __LINE__);
51
44
  }
52
45
 
53
46
 
@@ -55,19 +48,18 @@ namespace Reflex
55
48
  {
56
49
  assert(world);
57
50
 
58
- b2World* b2world = World_get_b2ptr(world);
59
- float ppm = world->meter2pixel();
60
- assert(b2world && ppm > 0);
51
+ if (World_is_stepping(world))
52
+ physics_error(__FILE__, __LINE__);
61
53
 
62
- if (b2world->IsLocked())
63
- invalid_state_error(__FILE__, __LINE__);
54
+ float ppm = world->meter2pixel();
55
+ assert(ppm > 0);
64
56
 
65
- b2BodyDef def;
66
- def.position = to_b2vec2(position, ppm);
67
- def.angle = Xot::deg2rad(angle);
57
+ b2BodyDef def = b2DefaultBodyDef();
58
+ def.position = to_b2vec2(position, ppm);
59
+ def.rotation = b2MakeRot(Xot::deg2rad(angle));
68
60
 
69
- b2Body* b2body = b2world->CreateBody(&def);
70
- if (!b2body)
61
+ b2BodyId b2body = b2CreateBody(World_get_id(world), &def);
62
+ if (!b2Body_IsValid(b2body))
71
63
  physics_error(__FILE__, __LINE__);
72
64
 
73
65
  self->b2body = b2body;
@@ -76,9 +68,7 @@ namespace Reflex
76
68
 
77
69
  Body::~Body ()
78
70
  {
79
- validate(this, true);
80
-
81
- self->b2body->GetWorld()->DestroyBody(self->b2body);
71
+ assert(!World_is_stepping(Body_get_world(this)));
82
72
  }
83
73
 
84
74
  void
@@ -92,7 +82,7 @@ namespace Reflex
92
82
  {
93
83
  validate(this);
94
84
 
95
- self->b2body->ApplyForceToCenter(to_b2vec2(force, self->ppm), true);
85
+ b2Body_ApplyForceToCenter(self->b2body, to_b2vec2(force, self->ppm), true);
96
86
  }
97
87
 
98
88
  void
@@ -100,7 +90,7 @@ namespace Reflex
100
90
  {
101
91
  validate(this);
102
92
 
103
- self->b2body->ApplyTorque(torque, true);
93
+ b2Body_ApplyTorque(self->b2body, torque, true);
104
94
  }
105
95
 
106
96
  void
@@ -114,8 +104,8 @@ namespace Reflex
114
104
  {
115
105
  validate(this);
116
106
 
117
- self->b2body->ApplyLinearImpulse(
118
- to_b2vec2(impulse, self->ppm), self->b2body->GetWorldCenter(), true);
107
+ b2Body_ApplyLinearImpulseToCenter(
108
+ self->b2body, to_b2vec2(impulse, self->ppm), true);
119
109
  }
120
110
 
121
111
  void
@@ -123,7 +113,7 @@ namespace Reflex
123
113
  {
124
114
  validate(this);
125
115
 
126
- self->b2body->ApplyAngularImpulse(impulse, true);
116
+ b2Body_ApplyAngularImpulse(self->b2body, impulse, true);
127
117
  }
128
118
 
129
119
  void
@@ -131,7 +121,7 @@ namespace Reflex
131
121
  {
132
122
  validate(this);
133
123
 
134
- self->b2body->SetAwake(true);
124
+ b2Body_SetAwake(self->b2body, true);
135
125
  }
136
126
 
137
127
  float
@@ -145,8 +135,8 @@ namespace Reflex
145
135
  {
146
136
  validate(this, true);
147
137
 
148
- self->b2body->SetTransform(
149
- to_b2vec2(x, y, self->ppm), Xot::deg2rad(degree));
138
+ b2Body_SetTransform(
139
+ self->b2body, to_b2vec2(x, y, self->ppm), b2MakeRot(Xot::deg2rad(degree)));
150
140
  }
151
141
 
152
142
  void
@@ -160,7 +150,7 @@ namespace Reflex
160
150
  {
161
151
  validate(this);
162
152
 
163
- return to_point(self->b2body->GetPosition(), self->ppm);
153
+ return to_point(b2Body_GetPosition(self->b2body), self->ppm);
164
154
  }
165
155
 
166
156
  float
@@ -168,7 +158,7 @@ namespace Reflex
168
158
  {
169
159
  validate(this);
170
160
 
171
- return Xot::rad2deg(self->b2body->GetAngle());
161
+ return Xot::rad2deg(b2Rot_GetAngle(b2Body_GetRotation(self->b2body)));
172
162
  }
173
163
 
174
164
  static bool
@@ -176,7 +166,7 @@ namespace Reflex
176
166
  {
177
167
  assert(body);
178
168
 
179
- return body->self->b2body->GetType() == b2_dynamicBody;
169
+ return b2Body_GetType(body->self->b2body) == b2_dynamicBody;
180
170
  }
181
171
 
182
172
  void
@@ -187,7 +177,7 @@ namespace Reflex
187
177
 
188
178
  validate(this, true);
189
179
 
190
- self->b2body->SetType(dynamic ? b2_dynamicBody : b2_staticBody);
180
+ b2Body_SetType(self->b2body, dynamic ? b2_dynamicBody : b2_staticBody);
191
181
  }
192
182
 
193
183
  bool
@@ -201,8 +191,8 @@ namespace Reflex
201
191
  static void
202
192
  make_body_kinematic (Body* body)
203
193
  {
204
- if (body->self->b2body->GetType() == b2_staticBody)
205
- body->self->b2body->SetType(b2_kinematicBody);
194
+ if (b2Body_GetType(body->self->b2body) == b2_staticBody)
195
+ b2Body_SetType(body->self->b2body, b2_kinematicBody);
206
196
  }
207
197
 
208
198
  void
@@ -218,7 +208,7 @@ namespace Reflex
218
208
 
219
209
  make_body_kinematic(this);
220
210
 
221
- self->b2body->SetLinearVelocity(to_b2vec2(velocity, self->ppm));
211
+ b2Body_SetLinearVelocity(self->b2body, to_b2vec2(velocity, self->ppm));
222
212
  }
223
213
 
224
214
  Point
@@ -226,7 +216,7 @@ namespace Reflex
226
216
  {
227
217
  validate(this);
228
218
 
229
- return to_point(self->b2body->GetLinearVelocity(), self->ppm);
219
+ return to_point(b2Body_GetLinearVelocity(self->b2body), self->ppm);
230
220
  }
231
221
 
232
222
  void
@@ -236,7 +226,7 @@ namespace Reflex
236
226
 
237
227
  make_body_kinematic(this);
238
228
 
239
- self->b2body->SetAngularVelocity(Xot::deg2rad(velocity));
229
+ b2Body_SetAngularVelocity(self->b2body, Xot::deg2rad(velocity));
240
230
  }
241
231
 
242
232
  float
@@ -244,7 +234,7 @@ namespace Reflex
244
234
  {
245
235
  validate(this);
246
236
 
247
- return Xot::rad2deg(self->b2body->GetAngularVelocity());
237
+ return Xot::rad2deg(b2Body_GetAngularVelocity(self->b2body));
248
238
  }
249
239
 
250
240
  void
@@ -252,13 +242,13 @@ namespace Reflex
252
242
  {
253
243
  validate(this);
254
244
 
255
- self->b2body->SetFixedRotation(state);
245
+ b2Body_SetFixedRotation(self->b2body, state);
256
246
  }
257
247
 
258
248
  bool
259
249
  Body::is_rotation_fixed () const
260
250
  {
261
- return self->b2body->IsFixedRotation();
251
+ return b2Body_IsFixedRotation(self->b2body);
262
252
  }
263
253
 
264
254
  void
@@ -266,10 +256,10 @@ namespace Reflex
266
256
  {
267
257
  validate(this);
268
258
 
269
- if (scale == self->b2body->GetGravityScale())
259
+ if (scale == b2Body_GetGravityScale(self->b2body))
270
260
  return;
271
261
 
272
- return self->b2body->SetGravityScale(scale);
262
+ b2Body_SetGravityScale(self->b2body, scale);
273
263
  }
274
264
 
275
265
  float
@@ -277,46 +267,69 @@ namespace Reflex
277
267
  {
278
268
  validate(this);
279
269
 
280
- return self->b2body->GetGravityScale();
270
+ return b2Body_GetGravityScale(self->b2body);
281
271
  }
282
272
 
283
273
 
274
+ b2BodyId
275
+ Body_get_id (const Body* body)
276
+ {
277
+ return body ? body->self->b2body : b2_nullBodyId;
278
+ }
279
+
280
+ World*
281
+ Body_get_world (Body* body)
282
+ {
283
+ b2BodyId b2body = Body_get_id(body);
284
+ if (B2_IS_NULL(b2body)) return NULL;
285
+
286
+ return (World*) b2World_GetUserData(b2Body_GetWorld(b2body));
287
+ }
288
+
289
+ const World*
290
+ Body_get_world (const Body* body)
291
+ {
292
+ return Body_get_world(const_cast<Body*>(body));
293
+ }
294
+
284
295
  void
285
296
  Body_copy_attributes (Body* to, const Body& from)
286
297
  {
287
298
  if (!to) return;
288
299
 
289
- b2Body* b2to = Body_get_b2ptr(to);
290
- const b2Body* b2from = Body_get_b2ptr(&from);
291
- assert(b2to && b2from);
300
+ b2BodyId b2to = Body_get_id(to);
301
+ b2BodyId b2from = Body_get_id(&from);
302
+ assert(b2Body_IsValid(b2to) && b2Body_IsValid(b2from));
292
303
 
293
- b2to->SetType( b2from->GetType());
294
- b2to->SetAngularVelocity(b2from->GetAngularVelocity());
295
- b2to->SetAngularDamping( b2from->GetAngularDamping());
296
- b2to->SetGravityScale( b2from->GetGravityScale());
297
- b2to->SetBullet( b2from->IsBullet());
304
+ b2Body_SetType( b2to, b2Body_GetType(b2from));
305
+ b2Body_SetAngularVelocity(b2to, b2Body_GetAngularVelocity(b2from));
306
+ b2Body_SetAngularDamping( b2to, b2Body_GetAngularDamping(b2from));
307
+ b2Body_SetGravityScale( b2to, b2Body_GetGravityScale(b2from));
308
+ b2Body_SetBullet( b2to, b2Body_IsBullet(b2from));
298
309
 
299
310
  float ppm_to = to->self->ppm;
300
311
  float ppm_from = from.self->ppm;
301
312
  if (ppm_to == ppm_from)
302
313
  {
303
- b2to->SetTransform( b2from->GetPosition(),
304
- b2from->GetAngle());
305
- b2to->SetLinearVelocity(b2from->GetLinearVelocity());
306
- b2to->SetLinearDamping( b2from->GetLinearDamping());
314
+ b2Body_SetTransform( b2to, b2Body_GetPosition( b2from),
315
+ b2Body_GetRotation( b2from));
316
+ b2Body_SetLinearVelocity(b2to, b2Body_GetLinearVelocity(b2from));
317
+ b2Body_SetLinearDamping( b2to, b2Body_GetLinearDamping( b2from));
307
318
  }
308
319
  else
309
320
  {
310
321
  float scale = ppm_from / ppm_to;
311
- auto pos = b2from->GetPosition();
312
- auto vel = b2from->GetLinearVelocity();
313
- auto damp = b2from->GetLinearDamping();
314
- pos *= scale;
315
- vel *= scale;
316
- damp *= scale;
317
- b2to->SetTransform(pos, b2from->GetAngle());
318
- b2to->SetLinearVelocity(vel);
319
- b2to->SetLinearDamping(damp);
322
+ auto pos = b2Body_GetPosition( b2from);
323
+ auto vel = b2Body_GetLinearVelocity(b2from);
324
+ auto damp = b2Body_GetLinearDamping( b2from);
325
+ pos.x *= scale;
326
+ pos.y *= scale;
327
+ vel.x *= scale;
328
+ vel.y *= scale;
329
+ damp *= scale;
330
+ b2Body_SetTransform( b2to, pos, b2Body_GetRotation(b2from));
331
+ b2Body_SetLinearVelocity(b2to, vel);
332
+ b2Body_SetLinearDamping( b2to, damp);
320
333
  }
321
334
  }
322
335
 
@@ -329,22 +342,12 @@ namespace Reflex
329
342
  bool
330
343
  Body_is_temporary (const Body& body)
331
344
  {
332
- const b2Body* b2body = Body_get_b2ptr(&body);
333
- if (!b2body) return false;
345
+ b2BodyId b2body = Body_get_id(&body);
346
+ if (B2_IS_NULL(b2body)) return false;
334
347
 
335
- return b2body->GetWorld() == World_get_b2ptr(World_get_temporary());
336
- }
337
-
338
- b2Body*
339
- Body_get_b2ptr (Body* body)
340
- {
341
- return body ? body->self->b2body : NULL;
342
- }
343
-
344
- const b2Body*
345
- Body_get_b2ptr (const Body* body)
346
- {
347
- return Body_get_b2ptr(const_cast<Body*>(body));
348
+ b2WorldId world = b2Body_GetWorld(b2body);
349
+ b2WorldId tmp = World_get_id(World_get_temporary());
350
+ return b2StoreWorldId(world) == b2StoreWorldId(tmp);
348
351
  }
349
352
 
350
353
 
data/src/body.h CHANGED
@@ -4,15 +4,13 @@
4
4
  #define __REFLEX_SRC_BODY_H__
5
5
 
6
6
 
7
+ #include <box2d/id.h>
7
8
  #include <xot/noncopyable.h>
8
9
  #include <xot/pimpl.h>
9
10
  #include <rays/point.h>
10
11
  #include "reflex/defs.h"
11
12
 
12
13
 
13
- class b2Body;
14
-
15
-
16
14
  namespace Reflex
17
15
  {
18
16
 
@@ -82,16 +80,18 @@ namespace Reflex
82
80
  };// Body
83
81
 
84
82
 
83
+ b2BodyId Body_get_id (const Body* body);
84
+
85
+ World* Body_get_world (Body* body);
86
+
87
+ const World* Body_get_world (const Body* body);
88
+
85
89
  void Body_copy_attributes (Body* to, const Body& from);
86
90
 
87
91
  Body* Body_create_temporary ();
88
92
 
89
93
  bool Body_is_temporary (const Body& body);
90
94
 
91
- b2Body* Body_get_b2ptr ( Body* body);
92
-
93
- const b2Body* Body_get_b2ptr (const Body* body);
94
-
95
95
 
96
96
  }// Reflex
97
97