reflexion 0.1.8 → 0.1.9
Sign up to get free protection for your applications and to get access to all the features.
- 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;
|