reflexion 0.4.1 → 0.5.0
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.
- checksums.yaml +4 -4
- data/.doc/ext/reflex/application.cpp +2 -0
- data/.doc/ext/reflex/device.cpp +2 -1
- data/.doc/ext/reflex/ellipse_shape.cpp +2 -0
- data/.doc/ext/reflex/filter.cpp +2 -0
- data/.doc/ext/reflex/image_view.cpp +2 -0
- data/.doc/ext/reflex/line_shape.cpp +2 -0
- data/.doc/ext/reflex/midi.cpp +2 -1
- data/.doc/ext/reflex/polygon_shape.cpp +2 -0
- data/.doc/ext/reflex/rect_shape.cpp +2 -0
- data/.doc/ext/reflex/shape.cpp +1 -0
- data/.doc/ext/reflex/timer.cpp +1 -0
- data/.doc/ext/reflex/view.cpp +1 -0
- data/.doc/ext/reflex/window.cpp +2 -0
- data/CLAUDE.md +1 -1
- data/ChangeLog.md +23 -0
- data/Rakefile +3 -2
- data/Reflex.podspec +105 -0
- data/VERSION +1 -1
- data/ext/reflex/application.cpp +2 -0
- data/ext/reflex/device.cpp +2 -1
- data/ext/reflex/ellipse_shape.cpp +2 -0
- data/ext/reflex/filter.cpp +2 -0
- data/ext/reflex/image_view.cpp +2 -0
- data/ext/reflex/line_shape.cpp +2 -0
- data/ext/reflex/midi.cpp +2 -1
- data/ext/reflex/polygon_shape.cpp +2 -0
- data/ext/reflex/rect_shape.cpp +2 -0
- data/ext/reflex/shape.cpp +1 -0
- data/ext/reflex/timer.cpp +1 -0
- data/ext/reflex/view.cpp +1 -0
- data/ext/reflex/window.cpp +2 -0
- data/pod.rake +41 -0
- data/reflex.gemspec +3 -3
- data/samples/multi_window.rb +80 -0
- data/src/body.cpp +93 -90
- data/src/body.h +7 -7
- data/src/fixture.cpp +301 -49
- data/src/fixture.h +55 -10
- data/src/osx/app_delegate.mm +6 -4
- data/src/osx/native_window.mm +2 -2
- data/src/osx/opengl_view.mm +27 -50
- data/src/sdl/opengl.cpp +16 -14
- data/src/sdl/opengl.h +2 -2
- data/src/sdl/window.cpp +34 -5
- data/src/shape.cpp +58 -51
- data/src/shape.h +0 -3
- data/src/timer.cpp +8 -10
- data/src/view.cpp +4 -5
- data/src/win32/opengl.cpp +17 -40
- data/src/win32/opengl.h +0 -2
- data/src/win32/window.cpp +32 -15
- data/src/window.cpp +0 -1
- data/src/world.cpp +301 -128
- data/src/world.h +12 -21
- data/test/test_midi_event.rb +2 -2
- metadata +11 -8
data/src/body.cpp
CHANGED
|
@@ -2,8 +2,7 @@
|
|
|
2
2
|
|
|
3
3
|
|
|
4
4
|
#include <assert.h>
|
|
5
|
-
#include <box2d/
|
|
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
|
-
|
|
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
|
|
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 (
|
|
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
|
-
|
|
59
|
-
|
|
60
|
-
assert(b2world && ppm > 0);
|
|
51
|
+
if (World_is_stepping(world))
|
|
52
|
+
physics_error(__FILE__, __LINE__);
|
|
61
53
|
|
|
62
|
-
|
|
63
|
-
|
|
54
|
+
float ppm = world->meter2pixel();
|
|
55
|
+
assert(ppm > 0);
|
|
64
56
|
|
|
65
|
-
b2BodyDef def;
|
|
66
|
-
def.position
|
|
67
|
-
def.
|
|
57
|
+
b2BodyDef def = b2DefaultBodyDef();
|
|
58
|
+
def.position = to_b2vec2(position, ppm);
|
|
59
|
+
def.rotation = b2MakeRot(Xot::deg2rad(angle));
|
|
68
60
|
|
|
69
|
-
|
|
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
|
-
|
|
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
|
|
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
|
|
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
|
-
|
|
118
|
-
to_b2vec2(impulse, self->ppm),
|
|
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
|
|
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
|
|
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
|
-
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
205
|
-
body->self->b2body
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
259
|
+
if (scale == b2Body_GetGravityScale(self->b2body))
|
|
270
260
|
return;
|
|
271
261
|
|
|
272
|
-
|
|
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
|
|
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
|
-
|
|
290
|
-
|
|
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
|
|
294
|
-
b2to
|
|
295
|
-
b2to
|
|
296
|
-
b2to
|
|
297
|
-
b2to
|
|
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
|
|
304
|
-
|
|
305
|
-
b2to
|
|
306
|
-
b2to
|
|
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
|
|
312
|
-
auto vel = b2from
|
|
313
|
-
auto damp = b2from
|
|
314
|
-
pos
|
|
315
|
-
|
|
316
|
-
|
|
317
|
-
|
|
318
|
-
|
|
319
|
-
b2to
|
|
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
|
-
|
|
333
|
-
if (
|
|
345
|
+
b2BodyId b2body = Body_get_id(&body);
|
|
346
|
+
if (B2_IS_NULL(b2body)) return false;
|
|
334
347
|
|
|
335
|
-
|
|
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
|
|