reflexion 0.1.8 → 0.1.9
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 +5 -1
- data/.doc/ext/reflex/arc_shape.cpp +89 -0
- data/.doc/ext/reflex/body.cpp +91 -12
- data/.doc/ext/reflex/contact_event.cpp +90 -0
- data/.doc/ext/reflex/ellipse_shape.cpp +89 -0
- data/.doc/ext/reflex/image_view.cpp +0 -16
- data/.doc/ext/reflex/native.cpp +18 -6
- data/.doc/ext/reflex/rect_shape.cpp +83 -0
- data/.doc/ext/reflex/shape_view.cpp +153 -0
- data/.doc/ext/reflex/view.cpp +63 -26
- data/.doc/ext/reflex/window.cpp +5 -1
- data/VERSION +1 -1
- data/ext/reflex/application.cpp +6 -2
- data/ext/reflex/arc_shape.cpp +94 -0
- data/ext/reflex/body.cpp +101 -13
- data/ext/reflex/contact_event.cpp +95 -0
- data/ext/reflex/ellipse_shape.cpp +94 -0
- data/ext/reflex/image_view.cpp +0 -18
- data/ext/reflex/native.cpp +18 -6
- data/ext/reflex/rect_shape.cpp +86 -0
- data/ext/reflex/shape_view.cpp +161 -0
- data/ext/reflex/view.cpp +71 -30
- data/ext/reflex/window.cpp +5 -1
- data/include/reflex/body.h +42 -12
- data/include/reflex/event.h +27 -1
- data/include/reflex/fixture.h +6 -5
- data/include/reflex/image_view.h +5 -5
- data/include/reflex/ruby/application.h +27 -6
- data/include/reflex/ruby/event.h +11 -0
- data/include/reflex/ruby/shape_view.h +96 -0
- data/include/reflex/ruby/view.h +60 -5
- data/include/reflex/ruby/window.h +12 -3
- data/include/reflex/shape_view.h +146 -0
- data/include/reflex/view.h +17 -5
- data/lib/reflex/application.rb +9 -9
- data/lib/reflex/body.rb +2 -0
- data/lib/reflex/contact_event.rb +38 -0
- data/lib/reflex/image_view.rb +1 -1
- data/lib/reflex/shape_view.rb +25 -0
- data/lib/reflex/view.rb +19 -9
- data/lib/reflex/window.rb +11 -10
- data/lib/reflex.rb +15 -13
- data/lib/reflexion.rb +25 -18
- data/samples/osx/hello/hello/main.cpp +6 -0
- data/samples/physics.rb +22 -12
- data/samples/reflexion/breakout.rb +52 -0
- data/samples/reflexion/hello.rb +5 -7
- data/samples/reflexion/paint.rb +10 -11
- data/samples/reflexion/physics.rb +28 -0
- data/samples/reflexion/pulse.rb +10 -8
- data/samples/shapes.rb +2 -2
- data/src/body.cpp +241 -40
- data/src/event.cpp +32 -2
- data/src/shape_view.cpp +306 -0
- data/src/view.cpp +232 -66
- data/src/world.cpp +110 -30
- data/src/world.h +61 -14
- metadata +24 -7
- data/lib/reflex/arc_shape.rb +0 -20
- data/lib/reflex/ellipse_shape.rb +0 -20
- data/lib/reflex/line_shape.rb +0 -20
- data/lib/reflex/rect_shape.rb +0 -20
- data/lib/reflex/shape.rb +0 -34
data/src/view.cpp
CHANGED
@@ -4,6 +4,7 @@
|
|
4
4
|
#include <assert.h>
|
5
5
|
#include <algorithm>
|
6
6
|
#include <boost/scoped_ptr.hpp>
|
7
|
+
#include "xot/util.h"
|
7
8
|
#include "reflex/window.h"
|
8
9
|
#include "reflex/body.h"
|
9
10
|
#include "reflex/exception.h"
|
@@ -30,6 +31,8 @@ namespace Reflex
|
|
30
31
|
|
31
32
|
Bounds frame;
|
32
33
|
|
34
|
+
float angle, scale;
|
35
|
+
|
33
36
|
boost::scoped_ptr<Selector> pselector;
|
34
37
|
|
35
38
|
boost::scoped_ptr<Point> pscroll;
|
@@ -51,7 +54,7 @@ namespace Reflex
|
|
51
54
|
uint flags;
|
52
55
|
|
53
56
|
Data ()
|
54
|
-
: window(NULL), parent(NULL),
|
57
|
+
: window(NULL), parent(NULL), angle(0), scale(1),
|
55
58
|
capture(CAPTURE_NONE), hide_count(0), flags(0)
|
56
59
|
{
|
57
60
|
}
|
@@ -84,16 +87,22 @@ namespace Reflex
|
|
84
87
|
return *pstyles;
|
85
88
|
}
|
86
89
|
|
87
|
-
World* world ()
|
90
|
+
World* world (View* this_)
|
88
91
|
{
|
89
|
-
|
92
|
+
assert(this_);
|
93
|
+
|
94
|
+
if (!pworld)
|
95
|
+
{
|
96
|
+
pworld.reset(new World(this_));
|
97
|
+
resize_world(this_);
|
98
|
+
}
|
90
99
|
return pworld.get();
|
91
100
|
}
|
92
101
|
|
93
102
|
World* parent_world ()
|
94
103
|
{
|
95
104
|
if (!parent) return NULL;
|
96
|
-
return parent->self->world();
|
105
|
+
return parent->self->world(parent);
|
97
106
|
}
|
98
107
|
|
99
108
|
Body* body (View* this_)
|
@@ -102,12 +111,34 @@ namespace Reflex
|
|
102
111
|
{
|
103
112
|
World* world = parent_world();
|
104
113
|
if (!world) return NULL;
|
105
|
-
pbody.reset(world->create_body(frame.position()));
|
114
|
+
pbody.reset(world->create_body(this_, frame.position()));
|
106
115
|
this_->make_body();
|
107
116
|
}
|
108
117
|
return pbody.get();
|
109
118
|
}
|
110
119
|
|
120
|
+
void resize_world (View* this_)
|
121
|
+
{
|
122
|
+
assert(this_);
|
123
|
+
|
124
|
+
World* w = pworld.get();
|
125
|
+
if (!w) return;
|
126
|
+
|
127
|
+
w->resize(frame.width, frame.height);
|
128
|
+
this_->redraw();
|
129
|
+
}
|
130
|
+
|
131
|
+
void update_body (View* this_)
|
132
|
+
{
|
133
|
+
assert(this_);
|
134
|
+
|
135
|
+
Body* b = pbody.get();
|
136
|
+
if (!b) return;
|
137
|
+
|
138
|
+
b->set_transform(frame.x, frame.y, angle);
|
139
|
+
this_->redraw();
|
140
|
+
}
|
141
|
+
|
111
142
|
};// View::Data
|
112
143
|
|
113
144
|
|
@@ -162,6 +193,43 @@ namespace Reflex
|
|
162
193
|
set_window(this_, parent_ ? parent_->window() : NULL);
|
163
194
|
}
|
164
195
|
|
196
|
+
static void reflow_children (View* parent, const FrameEvent* event = NULL);
|
197
|
+
|
198
|
+
static void
|
199
|
+
update_view_frame (View* view, const Bounds& frame, float angle, bool update_body)
|
200
|
+
{
|
201
|
+
if (!view)
|
202
|
+
argument_error(__FILE__, __LINE__);
|
203
|
+
|
204
|
+
if (!*view)
|
205
|
+
invalid_state_error(__FILE__, __LINE__);
|
206
|
+
|
207
|
+
View::Data* self = view->self.get();
|
208
|
+
if (frame == self->frame && angle == self->angle) return;
|
209
|
+
|
210
|
+
FrameEvent event(frame, self->frame, angle, self->angle);
|
211
|
+
self->frame = frame;
|
212
|
+
self->angle = angle;
|
213
|
+
|
214
|
+
bool move = event.is_move(), rotate = event.is_rotate();
|
215
|
+
|
216
|
+
if (move) view->on_move(&event);
|
217
|
+
if (rotate) view->on_rotate(&event);
|
218
|
+
|
219
|
+
if (update_body && (move || rotate))
|
220
|
+
self->update_body(view);
|
221
|
+
|
222
|
+
if (event.is_resize())
|
223
|
+
{
|
224
|
+
self->resize_world(view);
|
225
|
+
view->on_resize(&event);
|
226
|
+
|
227
|
+
reflow_children(view, &event);
|
228
|
+
}
|
229
|
+
|
230
|
+
view->redraw();
|
231
|
+
}
|
232
|
+
|
165
233
|
static void
|
166
234
|
update_world (View* view, float dt)
|
167
235
|
{
|
@@ -173,7 +241,7 @@ namespace Reflex
|
|
173
241
|
{
|
174
242
|
Bounds b = view->frame();
|
175
243
|
b.move_to(body->position());
|
176
|
-
view->
|
244
|
+
update_view_frame(view, b, body->angle(), false);
|
177
245
|
}
|
178
246
|
}
|
179
247
|
|
@@ -209,29 +277,41 @@ namespace Reflex
|
|
209
277
|
if (view->hidden()) return;
|
210
278
|
|
211
279
|
DrawEvent e = event;
|
212
|
-
e.painter
|
213
|
-
|
280
|
+
Painter* p = e.painter;
|
281
|
+
Body* b = view->self->pbody.get();
|
282
|
+
|
283
|
+
p->push_matrix();
|
284
|
+
p->push_attr();
|
285
|
+
|
286
|
+
Bounds frame = view->frame();
|
287
|
+
Point pos = frame.position() - view->scroll();
|
288
|
+
p->translate(pos);
|
214
289
|
|
215
|
-
|
216
|
-
|
217
|
-
e.painter->translate(p);
|
290
|
+
float angle = view->self->angle;
|
291
|
+
if (angle != 0) p->rotate(angle);
|
218
292
|
|
219
|
-
|
220
|
-
|
221
|
-
|
293
|
+
float scale = view->self->scale;
|
294
|
+
if (scale != 1) p->scale(scale);
|
295
|
+
|
296
|
+
pos += offset;
|
297
|
+
Bounds clip2 = clip & frame.move_to(pos);
|
298
|
+
if (b)
|
299
|
+
p->no_clip();
|
300
|
+
else
|
301
|
+
p->set_clip(clip2);
|
222
302
|
|
223
303
|
e.view = view;
|
224
|
-
e.bounds =
|
304
|
+
e.bounds = frame.move_to(0, 0, frame.z);
|
225
305
|
view->on_draw(&e);
|
226
306
|
|
227
307
|
View::child_iterator end = view->child_end();
|
228
308
|
for (View::child_iterator it = view->child_begin(); it != end; ++it)
|
229
|
-
draw_view_tree(it->get(), e,
|
309
|
+
draw_view_tree(it->get(), e, pos, clip2);
|
230
310
|
|
231
|
-
draw_world(view,
|
311
|
+
draw_world(view, p);
|
232
312
|
|
233
|
-
|
234
|
-
|
313
|
+
p->pop_attr();
|
314
|
+
p->pop_matrix();
|
235
315
|
}
|
236
316
|
#if 0
|
237
317
|
void
|
@@ -554,7 +634,7 @@ namespace Reflex
|
|
554
634
|
}
|
555
635
|
#endif
|
556
636
|
static void
|
557
|
-
reflow_children (View* parent, const FrameEvent* event
|
637
|
+
reflow_children (View* parent, const FrameEvent* event)
|
558
638
|
{
|
559
639
|
if (!parent)
|
560
640
|
argument_error(__FILE__, __LINE__);
|
@@ -797,6 +877,8 @@ namespace Reflex
|
|
797
877
|
if (child->parent() != this)
|
798
878
|
invalid_state_error(__FILE__, __LINE__);
|
799
879
|
|
880
|
+
child->clear_body();
|
881
|
+
|
800
882
|
set_parent(child, NULL);
|
801
883
|
self->pchildren->erase(it);
|
802
884
|
}
|
@@ -1199,33 +1281,34 @@ namespace Reflex
|
|
1199
1281
|
|
1200
1282
|
void
|
1201
1283
|
View::set_frame (const Bounds& frame)
|
1284
|
+
{
|
1285
|
+
update_view_frame(this, frame, self->angle, true);
|
1286
|
+
}
|
1287
|
+
|
1288
|
+
const Bounds&
|
1289
|
+
View::frame () const
|
1202
1290
|
{
|
1203
1291
|
if (!*this)
|
1204
1292
|
invalid_state_error(__FILE__, __LINE__);
|
1205
1293
|
|
1206
|
-
|
1207
|
-
|
1208
|
-
|
1209
|
-
self->frame = frame;
|
1210
|
-
|
1211
|
-
FrameEvent event(
|
1212
|
-
self->frame,
|
1213
|
-
frame.x - current.x, frame.y - current.y,
|
1214
|
-
frame.w - current.w, frame.h - current.h);
|
1215
|
-
if (event.is_move()) on_move(&event);
|
1216
|
-
if (event.is_resize()) on_resize(&event);
|
1294
|
+
return self->frame;
|
1295
|
+
}
|
1217
1296
|
|
1218
|
-
|
1219
|
-
|
1297
|
+
#if 0
|
1298
|
+
void
|
1299
|
+
View::set_angle (float degree)
|
1300
|
+
{
|
1301
|
+
update_view_frame(this, self->frame, degree, true);
|
1220
1302
|
}
|
1303
|
+
#endif
|
1221
1304
|
|
1222
|
-
|
1223
|
-
View::
|
1305
|
+
float
|
1306
|
+
View::angle () const
|
1224
1307
|
{
|
1225
1308
|
if (!*this)
|
1226
1309
|
invalid_state_error(__FILE__, __LINE__);
|
1227
1310
|
|
1228
|
-
return self->
|
1311
|
+
return self->angle;
|
1229
1312
|
}
|
1230
1313
|
|
1231
1314
|
static const Point ZERO_SCROLL;
|
@@ -1233,6 +1316,9 @@ namespace Reflex
|
|
1233
1316
|
void
|
1234
1317
|
View::scroll_to (coord x, coord y, coord z)
|
1235
1318
|
{
|
1319
|
+
if (!*this)
|
1320
|
+
invalid_state_error(__FILE__, __LINE__);
|
1321
|
+
|
1236
1322
|
Point old = self->scroll();
|
1237
1323
|
self->scroll().reset(x, y, z);
|
1238
1324
|
ScrollEvent e(x, y, z, x - old.x, y - old.y, z - old.z);
|
@@ -1262,6 +1348,9 @@ namespace Reflex
|
|
1262
1348
|
const Point&
|
1263
1349
|
View::scroll () const
|
1264
1350
|
{
|
1351
|
+
if (!*this)
|
1352
|
+
invalid_state_error(__FILE__, __LINE__);
|
1353
|
+
|
1265
1354
|
if (self->pscroll)
|
1266
1355
|
return self->scroll();
|
1267
1356
|
else
|
@@ -1271,6 +1360,9 @@ namespace Reflex
|
|
1271
1360
|
void
|
1272
1361
|
View::set_capture (uint types)
|
1273
1362
|
{
|
1363
|
+
if (!*this)
|
1364
|
+
invalid_state_error(__FILE__, __LINE__);
|
1365
|
+
|
1274
1366
|
if (types == self->capture) return;
|
1275
1367
|
|
1276
1368
|
uint old = self->capture;
|
@@ -1291,6 +1383,9 @@ namespace Reflex
|
|
1291
1383
|
uint
|
1292
1384
|
View::capture () const
|
1293
1385
|
{
|
1386
|
+
if (!*this)
|
1387
|
+
invalid_state_error(__FILE__, __LINE__);
|
1388
|
+
|
1294
1389
|
return self->capture;
|
1295
1390
|
}
|
1296
1391
|
|
@@ -1339,34 +1434,43 @@ namespace Reflex
|
|
1339
1434
|
return const_cast<View*>(this)->body();
|
1340
1435
|
}
|
1341
1436
|
|
1342
|
-
|
1343
|
-
View::
|
1437
|
+
float
|
1438
|
+
View::meter2pixel (float meter, bool create_world)
|
1344
1439
|
{
|
1345
|
-
|
1346
|
-
if (!b)
|
1440
|
+
if (!*this)
|
1347
1441
|
invalid_state_error(__FILE__, __LINE__);
|
1348
1442
|
|
1349
|
-
|
1350
|
-
|
1443
|
+
Body* body = self->pbody.get();
|
1444
|
+
if (body)
|
1445
|
+
return body->meter2pixel(meter);
|
1351
1446
|
|
1352
|
-
|
1353
|
-
|
1354
|
-
|
1355
|
-
|
1356
|
-
|
1447
|
+
World* world = self->pworld.get();
|
1448
|
+
if (world)
|
1449
|
+
return world->meter2pixel(meter);
|
1450
|
+
|
1451
|
+
View* parent_ = NULL;
|
1452
|
+
World* parent_world = NULL;
|
1453
|
+
if (
|
1454
|
+
(parent_ = parent()) &&
|
1455
|
+
(parent_world = parent_->self->pworld.get()))
|
1456
|
+
{
|
1457
|
+
return parent_world->meter2pixel(meter);
|
1458
|
+
}
|
1459
|
+
|
1460
|
+
if (!create_world)
|
1357
1461
|
invalid_state_error(__FILE__, __LINE__);
|
1358
1462
|
|
1359
|
-
|
1463
|
+
World* new_world = self->world(this);
|
1464
|
+
if (!new_world)
|
1465
|
+
invalid_state_error(__FILE__, __LINE__);
|
1466
|
+
|
1467
|
+
return new_world->meter2pixel(meter);
|
1360
1468
|
}
|
1361
1469
|
|
1362
|
-
|
1363
|
-
View::
|
1470
|
+
float
|
1471
|
+
View::meter2pixel (float meter) const
|
1364
1472
|
{
|
1365
|
-
|
1366
|
-
if (!b)
|
1367
|
-
invalid_state_error(__FILE__, __LINE__);
|
1368
|
-
|
1369
|
-
b->set_restitution(restitution);
|
1473
|
+
return const_cast<View*>(this)->meter2pixel(meter, false);
|
1370
1474
|
}
|
1371
1475
|
|
1372
1476
|
void
|
@@ -1378,35 +1482,62 @@ namespace Reflex
|
|
1378
1482
|
void
|
1379
1483
|
View::set_gravity (const Point& vector)
|
1380
1484
|
{
|
1381
|
-
|
1382
|
-
|
1485
|
+
if (!*this)
|
1486
|
+
invalid_state_error(__FILE__, __LINE__);
|
1487
|
+
|
1488
|
+
World* w = self->world(this);
|
1489
|
+
if (!w)
|
1383
1490
|
invalid_state_error(__FILE__, __LINE__);
|
1384
1491
|
|
1385
|
-
|
1492
|
+
w->set_gravity(vector);
|
1386
1493
|
}
|
1387
1494
|
|
1388
1495
|
Point
|
1389
1496
|
View::gravity () const
|
1390
1497
|
{
|
1391
|
-
|
1392
|
-
|
1498
|
+
if (!*this)
|
1499
|
+
invalid_state_error(__FILE__, __LINE__);
|
1500
|
+
|
1501
|
+
World* w = self->pworld.get();
|
1502
|
+
return w ? w->gravity() : 0;
|
1503
|
+
}
|
1504
|
+
|
1505
|
+
Body*
|
1506
|
+
View::wall ()
|
1507
|
+
{
|
1508
|
+
if (!*this)
|
1509
|
+
invalid_state_error(__FILE__, __LINE__);
|
1510
|
+
|
1511
|
+
return self->world(this)->wall();
|
1512
|
+
}
|
1513
|
+
|
1514
|
+
const Body*
|
1515
|
+
View::wall () const
|
1516
|
+
{
|
1517
|
+
return const_cast<View*>(this)->wall();
|
1393
1518
|
}
|
1394
1519
|
|
1395
1520
|
void
|
1396
1521
|
View::set_debug (bool state)
|
1397
1522
|
{
|
1398
|
-
|
1399
|
-
if (!world)
|
1523
|
+
if (!*this)
|
1400
1524
|
invalid_state_error(__FILE__, __LINE__);
|
1401
1525
|
|
1402
|
-
world
|
1526
|
+
World* w = self->world(this);
|
1527
|
+
if (!w)
|
1528
|
+
invalid_state_error(__FILE__, __LINE__);
|
1529
|
+
|
1530
|
+
w->set_debug(state);
|
1403
1531
|
}
|
1404
1532
|
|
1405
1533
|
bool
|
1406
|
-
View::
|
1534
|
+
View::debugging () const
|
1407
1535
|
{
|
1408
|
-
|
1409
|
-
|
1536
|
+
if (!*this)
|
1537
|
+
invalid_state_error(__FILE__, __LINE__);
|
1538
|
+
|
1539
|
+
World* w = self->pworld.get();
|
1540
|
+
return w ? w->debugging() : false;
|
1410
1541
|
}
|
1411
1542
|
|
1412
1543
|
Point
|
@@ -1509,6 +1640,13 @@ namespace Reflex
|
|
1509
1640
|
argument_error(__FILE__, __LINE__);
|
1510
1641
|
}
|
1511
1642
|
|
1643
|
+
void
|
1644
|
+
View::on_rotate (FrameEvent* e)
|
1645
|
+
{
|
1646
|
+
if (!e)
|
1647
|
+
argument_error(__FILE__, __LINE__);
|
1648
|
+
}
|
1649
|
+
|
1512
1650
|
void
|
1513
1651
|
View::on_scroll (ScrollEvent* e)
|
1514
1652
|
{
|
@@ -1610,6 +1748,34 @@ namespace Reflex
|
|
1610
1748
|
argument_error(__FILE__, __LINE__);
|
1611
1749
|
}
|
1612
1750
|
|
1751
|
+
void
|
1752
|
+
View::on_contact (ContactEvent* e)
|
1753
|
+
{
|
1754
|
+
if (!e)
|
1755
|
+
argument_error(__FILE__, __LINE__);
|
1756
|
+
|
1757
|
+
switch (e->type)
|
1758
|
+
{
|
1759
|
+
case ContactEvent::BEGIN: on_contact_begin(e); break;
|
1760
|
+
case ContactEvent::END: on_contact_end(e); break;
|
1761
|
+
case ContactEvent::NONE: break;
|
1762
|
+
}
|
1763
|
+
}
|
1764
|
+
|
1765
|
+
void
|
1766
|
+
View::on_contact_begin (ContactEvent* e)
|
1767
|
+
{
|
1768
|
+
if (!e)
|
1769
|
+
argument_error(__FILE__, __LINE__);
|
1770
|
+
}
|
1771
|
+
|
1772
|
+
void
|
1773
|
+
View::on_contact_end (ContactEvent* e)
|
1774
|
+
{
|
1775
|
+
if (!e)
|
1776
|
+
argument_error(__FILE__, __LINE__);
|
1777
|
+
}
|
1778
|
+
|
1613
1779
|
View::operator bool () const
|
1614
1780
|
{
|
1615
1781
|
return true;
|