summaryrefslogtreecommitdiff
path: root/doc/ephysics_examples.dox
blob: ba509b05f796c2471c1b3193ded09e8deee3ef33 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
1001
1002
1003
1004
1005
1006
1007
1008
1009
1010
1011
1012
1013
1014
1015
1016
1017
1018
1019
1020
1021
1022
1023
1024
1025
1026
1027
1028
1029
1030
1031
1032
1033
1034
1035
1036
1037
1038
1039
1040
1041
1042
1043
1044
1045
1046
1047
1048
1049
1050
1051
1052
1053
1054
1055
1056
1057
1058
1059
1060
1061
1062
1063
1064
1065
1066
1067
1068
1069
1070
1071
1072
1073
1074
1075
1076
1077
1078
1079
1080
1081
1082
1083
1084
1085
1086
1087
1088
1089
1090
1091
1092
1093
1094
1095
1096
1097
1098
1099
1100
1101
1102
1103
1104
1105
1106
1107
1108
1109
1110
1111
1112
1113
1114
1115
1116
1117
1118
1119
1120
1121
1122
1123
1124
1125
1126
1127
1128
1129
1130
1131
1132
1133
1134
1135
1136
1137
1138
1139
1140
1141
1142
1143
1144
1145
1146
1147
1148
1149
1150
1151
1152
1153
1154
1155
1156
1157
1158
1159
1160
1161
1162
1163
1164
1165
1166
1167
1168
1169
1170
1171
1172
1173
1174
1175
1176
1177
1178
1179
1180
1181
1182
1183
1184
1185
1186
1187
1188
1189
1190
1191
1192
1193
1194
1195
1196
1197
1198
1199
1200
1201
1202
1203
1204
1205
1206
1207
1208
1209
1210
1211
1212
1213
1214
1215
1216
1217
1218
1219
1220
1221
1222
1223
1224
1225
1226
1227
1228
1229
1230
1231
1232
1233
1234
1235
1236
1237
1238
1239
1240
1241
1242
1243
1244
1245
1246
1247
1248
1249
1250
1251
1252
1253
1254
1255
1256
1257
1258
1259
1260
1261
1262
1263
1264
1265
1266
1267
1268
1269
1270
1271
1272
1273
1274
1275
1276
1277
1278
1279
1280
1281
1282
1283
1284
1285
1286
1287
1288
1289
1290
1291
1292
1293
1294
1295
1296
1297
1298
1299
1300
1301
1302
1303
1304
1305
1306
1307
1308
1309
1310
1311
1312
1313
1314
1315
1316
1317
1318
1319
1320
1321
1322
1323
1324
1325
1326
1327
1328
1329
1330
1331
1332
1333
1334
1335
1336
1337
1338
1339
1340
1341
1342
1343
1344
1345
1346
1347
1348
1349
1350
1351
1352
1353
1354
1355
1356
1357
1358
1359
1360
1361
1362
1363
1364
1365
1366
1367
1368
1369
1370
1371
1372
1373
1374
1375
1376
1377
1378
1379
1380
1381
1382
1383
1384
1385
1386
1387
1388
1389
1390
1391
1392
1393
1394
1395
1396
1397
1398
1399
1400
1401
1402
1403
1404
1405
1406
1407
1408
1409
1410
1411
1412
1413
1414
1415
1416
1417
1418
1419
1420
1421
1422
1423
1424
1425
1426
1427
1428
1429
1430
1431
1432
1433
1434
1435
1436
1437
1438
1439
1440
1441
1442
1443
1444
1445
1446
1447
1448
1449
1450
1451
1452
1453
1454
1455
1456
1457
1458
1459
1460
1461
1462
1463
1464
1465
1466
1467
1468
1469
1470
1471
1472
1473
1474
1475
1476
1477
1478
1479
1480
1481
1482
1483
1484
1485
1486
1487
1488
1489
1490
1491
1492
1493
1494
1495
1496
1497
1498
1499
1500
1501
1502
1503
1504
1505
1506
1507
1508
1509
1510
1511
1512
1513
1514
1515
1516
1517
1518
1519
1520
1521
1522
1523
1524
1525
1526
1527
1528
1529
1530
1531
1532
1533
1534
1535
1536
1537
1538
1539
1540
1541
1542
1543
1544
1545
1546
1547
1548
1549
1550
1551
1552
1553
1554
1555
1556
1557
1558
1559
1560
1561
1562
1563
1564
1565
1566
1567
1568
1569
1570
1571
1572
1573
1574
1575
1576
1577
1578
1579
1580
1581
1582
1583
1584
1585
1586
1587
1588
1589
1590
1591
1592
1593
1594
1595
1596
1597
1598
1599
1600
1601
1602
1603
1604
1605
1606
1607
1608
1609
1610
1611
1612
1613
1614
1615
1616
1617
1618
1619
1620
1621
1622
1623
1624
1625
1626
1627
1628
1629
1630
1631
1632
1633
1634
1635
1636
1637
1638
1639
1640
1641
1642
1643
1644
1645
1646
1647
1648
1649
1650
1651
1652
1653
1654
1655
1656
1657
1658
1659
1660
1661
1662
1663
1664
1665
1666
1667
1668
1669
1670
1671
1672
1673
1674
1675
1676
1677
1678
1679
1680
1681
1682
1683
1684
1685
1686
1687
1688
1689
1690
1691
1692
1693
1694
1695
1696
1697
1698
1699
1700
1701
1702
1703
1704
1705
1706
1707
1708
1709
1710
1711
1712
1713
1714
1715
1716
1717
1718
1719
1720
1721
1722
1723
1724
1725
1726
1727
1728
1729
1730
1731
1732
1733
1734
1735
1736
1737
1738
1739
1740
1741
1742
1743
1744
1745
1746
1747
1748
1749
1750
1751
1752
1753
1754
1755
1756
1757
1758
1759
1760
1761
1762
1763
1764
1765
1766
1767
1768
1769
1770
1771
1772
1773
1774
1775
1776
1777
1778
1779
1780
1781
1782
1783
1784
1785
1786
1787
1788
1789
1790
/**
 * @page ephysics_examples EPhysics Examples
 *
 * Examples:
 * @li @ref tutorial_ephysics_bouncing_ball
 * @li @ref tutorial_ephysics_bouncing_text
 * @li @ref tutorial_ephysics_camera
 * @li @ref tutorial_ephysics_camera_track
 * @li @ref tutorial_ephysics_collision_detection
 * @li @ref tutorial_ephysics_collision_filter
 * @li @ref tutorial_ephysics_delete_body
 * @li @ref tutorial_ephysics_constraint
 * @li @ref tutorial_ephysics_forces
 * @li @ref tutorial_ephysics_growing_balls
 * @li @ref tutorial_ephysics_gravity
 * @li @ref tutorial_ephysics_logo
 * @li @ref tutorial_ephysics_rotating_forever
 * @li @ref tutorial_ephysics_velocity
 * @li @ref tutorial_ephysics_shapes
 * @li @ref tutorial_ephysics_sleeping_threshold
 * @li @ref tutorial_ephysics_slider
 */

/**
 * @page tutorial_ephysics_bouncing_ball EPhysics - Bouncing Ball
 *
 * The purpose of this example is to show how to write an simple application -
 * as the name suggests - with a small ball bouncing on the ground and
 * responding to users events by making it jump - applying a central impulse on
 * it.
 *
 * @image html bouncing_ball.png
 * @image latex bouncing_ball.eps
 *
 * We'll guide you on defining a EPhysics world, defining its render geometry
 * and the physics limiting boundaries, you'll learn how to add EPhysics bodies
 * and how to associate it to evas objects.  We also explain how to change
 * restitution and friction properties. We see how to apply central impulse on
 * a EPhysics_Body by implementing an elementary input event callback and
 * calling the proper function.
 *
 * @section test-structure A test struct
 * @dontinclude ephysics_test.h
 *
 * While in this example we'll be working with a struct to hold some objects in
 * our code. For clarity sake we present you the struct declaration in the
 * following block.
 *
 *
 * @skip struct _Test_Data
 * @until };
 *
 * @section world-new World Initialization
 * @dontinclude test_bouncing_ball.c
 *
 * Calling ephysics_world_new()
 * will create a new physics world with its collision configuration, constraint
 * solver, broadphase interface and dispatcher.
 *
 * The default gravity is set to -9.81. It's possible to stop a running world
 * but its default status is running. Take a look at
 * ephysics_world_running_set() for further informations about world running
 * status.
 *
 * @skipline ephysics_world_new
 *
 * @section render-geometry Render geometry
 *
 * By setting the render geometry you tell ephysics the dimensions of rendered
 * area to be take on account by default updates.
 *
 * By default it starts with null x, y, z, width, height and depth. Initially 
 * there's no physics limits but - as we'll see later in this example -
 * boundaries can be added by issuing either ephysics_body_top_boundary_add(),
 * ephysics_body_bottom_boundary_add(), ephysics_body_left_boundary_add() and
 * ephysics_body_right_boundary_add().
 *
 * While setting the worlds render geometry the first parameter is our just
 * created world, the following parameters indicate the x, y, z, width, height
 * and depth of our area of interest.
 *
 * @skip ephysics_world_render_geometry_set
 * @until DEPTH);
 *
 * @section boundaries Adding boundaries
 *
 * Boundaries are physics limits added by EPhysics which you can use to limit
 * the area where your objects can move around. Bear in mind that those
 * boundaries are created by EPhysics taking in account the render geometry you
 * have previously defined by calling ephysics_world_render_geometry_set().
 *
 * In our example we start by adding a bottom boundary. This EPhysics_Body
 * represents a physics limit under the world render geometry.
 *
 * The second line states the restitution factor for that bottom boundary, and
 * the third line its friction. These changes will make our ball to bounce
 * whenever it hits the ground.
 *
 * @skip ephysics_body_bottom_boundary_add
 * @until ephysics_body_friction_set
 *
 * Then we add a right boundary limiting the physics world on the left side, we
 * also change its restitution and friction factors but with a smaller value,
 * we don't want to make it bounce as much as it is when hits the ground.
 *
 * @skip ephysics_body_right_boundary_add
 * @until ephysics_body_friction_set
 *
 * We also add a left boundary taking the same considerations for right
 * boundary.
 *
 * @skip ephysics_body_left_boundary_add
 * @until ephysics_body_friction_set
 *
 * One of this examples requirements is to make the ball jump after a specific
 * user event, so the ball can suffer an impulse for any direction.
 *
 * With an upper impulse we don't want our ball to fly all over there, we want
 * to limit its upper movements, it's intended to limit the ball movement
 * within a box, it should not leave the render geometry area, for that purpose
 * we must define a top boundary.
 *
 * @skipline ephysics_body_top_boundary_add
 * @dontinclude test_bouncing_ball.c
 *
 * @section world-populate Adding a ball
 *
 * Since we have defined the physics limits with our boundaries it's time to
 * add some fun. Here we add a ball as an elementary image widget and tell
 * ephysics about it.
 *
 * After setting the file that will be used as the image's source of our elm
 * image we move it to the center of render geometry and resize it to 70x70
 * pixels and show it.
 *
 * @skip elm_image_add
 * @until evas_object_show
 *
 * The evas object is just set and we must tell EPhysics about it, creating the
 * EPhysics_Body representing our ball and associating it to the just created
 * evas object.
 *
 * Once the ball has been moved to the center of render geometry it should
 * start falling after associating it to the EPhysics_Body. By default its mass
 * is initially set to 1 kilo, but it can be changed by calling
 * ephysics_body_mass_set(). Bear in mind that if you change its mass to 0
 * kilos it becomes a static body and will not move at all, the body will
 * remain fixed in the initial position.
 *
 * In the following code the first line adds a circle body, then we associate
 * the evas object to EPhysics_Body, EPhysics will map every changes on physics
 * object simulation to its evas object. Some restitution and friction factors
 * are added as well.
 *
 * @skip ephysics_body_cylinder_add
 * @until ephysics_body_friction_set
 *
 * @section jumping-ball Making it jump
 *
 * The next step is to give us the ability to make our ball to jump - actually
 * apply some impulse whenever a key has been pressed. Then we add a elementary
 * input callback to the window widget.
 *
 * @skipline elm_object_event_callback_add
 *
 * @dontinclude test_bouncing_ball.c
 *
 * The jumping callback implementation consists on handling only key up events
 * and discarding any other input event we get. We're interested on keyboard
 * events only. All the operations done in the following lines are done on
 * sphere EPhysics_Body previously created.
 *
 * We mainly use the ephysics_body_central_impulse_apply() function. This
 * function applies an impulse on the center of a body.
 *
 * Once pressed \<Up> key it applies a central impulse of 0 kilos on X axis,
 * 10 kilos on Y and 0 kilos on Z - so the ball is forced up.
 *
 * If \<Down> key has been pressed we apply an impulse of 0 kilos on X axis,
 * -10 kilos on Y and 0 kilos on Z - here the ball is forced down.
 *
 * In the case of \<Right> key pressing it's applied an impulse of 10 kilos on X
 * axis, 0 kilos on Y and 0 kilos on Z - which applies a force to the right side.
 * But if the key being pressed is \<Left> the opposite is done, and an impulse
 * of -10 kilos is applied on X, 0 kilos on Y and 0 kilos on Z - and the ball is
 * forced to the left.
 *
 * @skip _on_keydown
 * @until }
 *
 * Here we finish the very simple bouncing ball example. The full source code
 * can be found at @ref test_bouncing_ball_c.
 *
 */

/**
 * @page test_bouncing_ball_c test_bouncing_ball.c
 *
 * # ephysics_test.h
 * @include ephysics_test.h
 *
 * @section test-bouncing-ball-c test_bouncing_ball.c
 * @dontinclude test.c
 * @skip test_clean
 * @until }
 *
 * @skip test_data_new
 * @until }
 *
 * @skip test_win_add
 * @until }
 *
 * @include test_bouncing_ball.c
 *
 *
 * @example test_bouncing_ball.c
 */

/**
 * @page tutorial_ephysics_bouncing_text EPhysics - Bouncing Text
 *
 * The purpose of this example is to demonstrate the EPhysics_Body binding to
 * a text (Evas_Object)
 *
 * @image html bouncing_text.png
 * @image latex bouncing_text.eps
 *
 * For this example we'll have an EPhysics_World and one basic EPhysics_Body.
 *
 * The basic concepts like - initializing an EPhysics_World, render geometry,
 * physics limiting boundaries, were already covered in
 * @ref tutorial_ephysics_bouncing_ball
 *
 * @section add-text Creating the text
 * @dontinclude test_bouncing_text.c
 *
 * Create a basic evas_object_text.
 *
 * @skipline Evas_Object *text;
 *
 * @skip text =
 * @until text);
 *
 * @section add-textbody Creating the body
 *
 * Create a simple EPhysics_Body.
 *
 * Note that we use ephysics_body_geometry_set() to define its size because
 * the evas_object has a different size that we want to represent physically.
 * The text may have accent or letters like j and g.
 *
 * @skipline text_body =
 * @skip ephysics_body_geometry_set(text_body
 * @until 0.1);
 *
 * @section text-binding Binding
 * @dontinclude test_bouncing_text.c
 *
 * After creating the body and the text, now we need to bind them.
 *
 * We set the last parameter as EINA_FALSE because in this example we don't
 * want to set the physics body position to match evas object position.
 *
 * @skipline ephysics_body_evas_object_set
 *
 * Here we finish the example. The full source code can be found at
 * @ref test_bouncing_text_c.
 *
 */

 /**
 * @page test_bouncing_text_c test_bouncing_text.c
 *
 * # ephysics_test.h
 * @include ephysics_test.h
 *
 * @section test-bouncing_text-c test_bouncing_text.c
 * @dontinclude test.c
 *
 * @skip test_clean
 * @until }
 *
 * @skip test_data_new
 * @until }
 *
 * @skip test_win_add
 * @until }
 *
 * @include test_bouncing_text.c
 *
 * @example test_bouncing_text.c
 */

/**
 * @page tutorial_ephysics_camera EPhysics - Camera
 *
 * The purpose of this example is to demonstrate the EPhysics_Camera usage.
 *
 * The EPhysics_Camera facilitates the usage of scenarios bigger than the
 * viewport, that's because the EPhysics handles the position of objects
 * which has control.
 *
 * @image html camera.png
 * @image latex camera.eps
 *
 * For this example we'll have an EPhysics_World, two distant EPhysics_Bodys,
 * one with an impulse to collide each other and an EPhysics_Camera that
 * follows the moving body using an animator.
 *
 * The basic concepts like - initializing an EPhysics_World, render geometry,
 * physics limiting boundaries, add an Ephysics_Body, associate it to evas
 * objects, change restitution, friction and impulse properties, were
 * already covered in
 * @ref tutorial_ephysics_bouncing_ball
 *
 * @section add-camstruct Camera Data Struct
 * @dontinclude test_camera.c
 *
 * While in this example we'll be working with a struct to hold some objects
 * in our code. For clarity sake we present you the struct declaration in the
 * following block.
 *
 * @skip struct _Camera_Data {
 * @until };
 *
 * # Adding a Camera
 *
 * To move the camera in this example, we'll use an animator.
 *
 * @skipline camera_data->animator = ecore_animator_add
 *
 * In the animators function, we'll have to create a specific type of variable:
 * @ref EPhysics_Camera
 * And also get the worlds rendered area width to define a limit to the camera.
 *
 * @dontinclude test_camera.c
 *
 * @skip _camera_move_cb(void *data
 * @until &w, NULL, NULL);
 *
 * Every world has a camera, so here we get this camera used by our
 * EPhysics_World.
 *
 * @skipline camera = ephysics_world_camera_get
 *
 * Here we get the cameras position to after set the position based on previous.
 *
 * @skipline ephysics_camera_position_get(camera
 *
 * Here we check if the camera reached the end of scenario (define the limit
 * to the camera) then we stop the animator, else we move the camera + 2
 * pixel positions to the right.
 *
 * @skip if (x + w > WIDTH * 2)
 * @until ephysics_camera_position_set(camera, x, y
 * @skipline }
 *
 * # Updating the floor
 *
 * Here we'll use 2 floor images to give the impression of an infinite ground.
 *
 * Calling ephysics_world_event_callback_add()
 * will register a callback to a type of physics world event.
 *
 * @ref EPHYSICS_CALLBACK_WORLD_CAMERA_MOVED : called if the camera position
 * changed on physics simulation tick.
 *
 * @skip ephysics_world_event_callback_add(world,
 * @until _camera_moved_cb, camera_data);
 *
 * In the function, we just get the cameras position to know how much
 * the camera moved and move the same value to the floor passing it as
 * delta_x to the function, note that we use an old_x variable to do this
 * calculation.
 * @dontinclude test_camera.c
 *
 * @skip _camera_moved_cb(void *data
 * @until }
 *
 * Here we get the floors position and plus the delta_x value to move the
 * floor in the same "velocity".
 *
 * @dontinclude test_camera.c
 *
 * @skip _update_floor
 * @until fx = x + delta
 *
 * We use 2 floor images because whenever one exits the screen by the left
 * side, another is being shown, when it happens the one which exit the screen
 * is sent to the right side, entering into an infinite loop, giving the
 * impression of an infinite ground image. Its important to note that we need
 * to use the fx to don't gap the images.
 *
 * @skip if (fx < -FLOOR_WIDTH
 * @until }
 *
 * Here we finish the example. The full source code can be found at
 * @ref test_camera_c.
 *
 */

 /**
 * @page test_camera_c test_camera.c
 *
 * # ephysics_test.h
 * @include ephysics_test.h
 *
 * @section test-camera-c test_camera.c
 * @dontinclude test.c
 *
 * @skip test_clean
 * @until }
 *
 * @skip test_win_add
 * @until }
 *
 * @include test_camera.c
 *
 * @example test_camera.c
 */

/**
 * @page tutorial_ephysics_camera_track EPhysics - Camera Track
 *
 * The purpose of this example is to demonstrate the EPhysics_Camera Track
 * usage.
 *
 * The EPhysics_Camera facilitates the usage of scenarios bigger than the
 * viewport, that's because the EPhysics handles the position of objects
 * which has control.
 *
 * @image html camera_track.png
 * @image latex camera_track.eps
 *
 * For this example we'll have an EPhysics_World, one main EPhysics_Body that
 * will be tracked by an EPhysics_Camera on three ways, horizontal, vertical
 * and full tracking. Also nine EPhysics_Bodys with mass 0, that will be used
 * as scenario in order to our main body change its position on x and y axes
 * when passes through this scenario.
 *
 * The basic concepts like - initializing an EPhysics_World, render geometry,
 * physics limiting boundaries, add an Ephysics_Body, associate it to evas
 * objects, change restitution, friction and impulse properties, were
 * already covered in
 * @ref tutorial_ephysics_bouncing_ball
 *
 * @section add-trkstruct Track Data Struct
 * @dontinclude test_camera_track.c
 *
 * While in this example we'll be working with a struct to hold some objects
 * in our code. For clarity sake we present you the struct declaration in the
 * following block.
 *
 * @skip struct _Track_Data {
 * @until };
 *
 * # Adding a Camera
 *
 * In this example we'll use 3 kinds of tracking, to change this values we'll
 * have an Elementary spinner widget and handle it on this function.
 *
 * Every world has a camera, so here we get this camera used by our
 * EPhysics_World.
 *
 * @skip _track_apply(Track_Data *track
 * @until camera = ephysics_world_camera_get(track_data->base.world
 *
 * Here we'll get the elm_spinner value to the tracking base on this
 * value
 *
 * @skip mode =
 * @until }
 *
 * Here we'll set the camera to track the body, when a body is tracked,
 * the camera will move automatically, following this body. It will keeps the
 * body centralized on rendered area. If it will be centralized horizontally
 * and / or vertically depends if parameters horizontal and vertical are set
 * to EINA_TRUE, in this case we based these values on elm_spinner.
 *
 * @skip ephysics_camera_body_track(camera, body
 * @until }
 *
 * # Updating the floor
 *
 * Here we'll use 2 floor images to give the impression of an infinite ground.
 *
 * Calling ephysics_world_event_callback_add()
 * will register a callback to a type of physics world event.
 *
 * @ref EPHYSICS_CALLBACK_WORLD_CAMERA_MOVED : called if the camera position
 * changed on physics simulation tick.
 *
 * @skip ephysics_world_event_callback_add(world,
 * @until _camera_moved_cb, track_data);
 *
 * In the function, we'll get the cameras position to know how much the camera
 * moved and move the same value to the floor passing it as delta_x to the
 * function, note that we use an old_x variable to do this calculation.
 *
 * We'll get also if the body is being tracked on x and y axes. If the body
 * isn't being tracked on x axis the floors x position won't change, delta_x
 * will be zero.
 *
 * @dontinclude test_camera_track.c
 *
 * @skip _camera_moved_cb(void *data
 * @until }
 *
 * Here we get the floors position and plus the delta_x value to move the
 * floor in the same "velocity".
 *
 * @dontinclude test_camera_track.c
 *
 * @skip _update_floor
 * @until fx = x + delta
 *
 * We use 2 floor images because whenever one exits the screen by the left
 * side, another is being shown, when it happens the one which exit the screen
 * is sent to the right side, entering into an infinite loop, giving the
 * impression of an infinite ground image. Its important to note that we need
 * to use the fx to don't gap the images.
 *
 * Note that the fy is being defined considering its offsets, -20 is to the
 * floor image be above the floor, thus having an border above the collision
 * point, +40 is the render area height, to offset the cameras y, basically
 * to draw in the correct position in the canvas.
 *
 * @skip if (fx < -FLOOR_WIDTH
 * @until }
 *
 * Here we finish the example. The full source code can be found at
 * @ref test_camera_track_c.
 *
 */

 /**
 * @page test_camera_track_c test_camera_track.c
 *
 * # ephysics_test.h
 * @include ephysics_test.h
 *
 * @section test-camera-track-c test_camera_track.c
 * @dontinclude test.c
 *
 * @skip test_clean
 * @until }
 *
 * @skip test_win_add
 * @until }
 *
 * @include test_camera_track.c
 *
 * @example test_camera_track.c
 */

/**
 * @page tutorial_ephysics_collision_detection EPhysics - Collision Detection
 *
 * The purpose of this example is to demonstrate the EPhysics Collision
 * Detection usage - The code adds two balls, one with impulse and the second
 * with a collision detection callback, to show an effect.
 *
 * @image html collision_detection.png
 * @image latex collision_detection.eps
 *
 * For this example we'll have an EPhysics_World, and two basic EPhysics_Bodys,
 * we'll apply an impulse in one of then and the other will be stopped
 * "waiting" for a collision.
 *
 * The basic concepts like - initializing an EPhysics_World, render geometry,
 * physics limiting boundaries, add an Ephysics_Body, associate it to evas
 * objects, change restitution, friction and impulse properties, were
 * already covered in
 * @ref tutorial_ephysics_bouncing_ball
 *
 * @section add-collstruct Collision Data Struct
 * @dontinclude test_collision_detection.c
 *
 * While in this example we'll be working with a struct to hold some objects
 * in our code. For clarity sake we present you the struct declaration in the
 * following block.
 *
 * @skip struct _Collision_Data {
 * @until };
 *
 * # Adding the Callback
 *
 * Calling ephysics_body_event_callback_add()
 * will register a callback to a type of physics body event.
 *
 * @ref EPHYSICS_CALLBACK_BODY_COLLISION : called just after the collision has
 * been actually processed by the physics engine. In other words, to be
 * notified about a collision between two physical bodies.
 *
 * @skip ephysics_body_event_callback_add(collision_data->sphere
 * @until );
 *
 * See
 * @ref _EPhysics_Callback_Body_Type
 * for more event types.
 *
 * @section add-collcb Collision Function
 *
 * The callback function will filter the collision to be sure if that body is
 * which we want and then show the effect.
 *
 * First we need to create a specific variable type to get collision infos:
 * @ref EPhysics_Body_Collision
 *
 * @dontinclude test_collision_detection.c
 *
 * @skip _collision_cb
 * @until int x, y, z;
 *
 * Now we want to know which body collides with and filter it.
 *
 * @skip contact_body =
 * @until return;
 *
 * We just get the collision position, move the impact effect to this
 * coordinate and send a signal to edje to show it.
 *
 * @skip ephysics_body_collision_position_get
 * @until "ephysics_test");
 * @skipline }
 *
 * Here we finish the example. The full source code can be found at
 * @ref test_collision_detection_c.
 *
 */

 /**
 * @page test_collision_detection_c test_collision_detection.c
 *
 * # ephysics_test.h
 * @include ephysics_test.h
 *
 * @section test-collision_detection-c test_collision_detection.c
 * @dontinclude test.c
 *
 * @skip test_clean
 * @until }
 *
 * @skip test_win_add
 * @until }
 *
 * @include test_collision_detection.c
 *
 * @example test_collision_detection.c
 */

/**
 * @page tutorial_ephysics_collision_filter EPhysics - Collision Filter
 *
 * The purpose of this example is to demonstrate the EPhysics Collision Filter
 * usage - The code adds four balls in 2 rows and 2 columns, two on each
 * collision group, the collision only happens when the balls are in the
 * same group (row),to make it easier, balls in the same group has the same
 * color and size.
 *
 * @image html collision_filter.png
 * @image latex collision_filter.eps
 *
 * For this example we'll have an EPhysics_World and four basic EPhysics_Bodys,
 * we'll apply an impulse on then and see what happens when they're in other
 * collision group.
 *
 * The basic concepts like - initializing an EPhysics_World, render geometry,
 * physics limiting boundaries, add an Ephysics_Body, associate it to evas
 * objects, change restitution, friction and impulse properties, were
 * already covered in
 * @ref tutorial_ephysics_bouncing_ball
 *
 * # Adding the balls
 * @dontinclude test_collision_filter.c
 *
 * We'll use two arrays (color and size) to distinguish the groups.
 *
 * @skip _world_populate
 * @until row;
 *
 * The balls declaration was placed into a For loop, just to simplify the
 * coding and divide them in two groups.
 *
 * @skip for (i = 0; i < 4
 * @until 0.1);
 *
 * Note in this part we divide the balls in two groups by color (row).
 *
 * @skipline ephysics_body_collision_group_add(fall_body
 *
 * The impulse will be applied in only 1 ball per group, in this case:
 *
 * The 1st row 2nd column ball will be applied an impulse to the
 * left (-300kg * p/s).
 *
 * The 2nd row 1st column ball will be applied an impulse to the
 * right (300kg * p/s).
 *
 * And then saving the body into a list.
 *
 * @skip if (column + row == 1
 * @until }
 * @skipline }
 *
 * Here we finish the example. The full source code can be found at
 * @ref test_collision_filter_c.
 *
 */

 /**
 * @page test_collision_filter_c test_collision_filter.c
 *
 * # ephysics_test.h
 * @include ephysics_test.h
 *
 * @section test-collision_filter-c test_collision_filter.c
 * @dontinclude test.c
 *
 * @skip test_clean
 * @until }
 *
 * @skip test_data_new
 * @until }
 *
 * @skip test_win_add
 * @until }
 *
 * @include test_collision_filter.c
 *
 * @example test_collision_filter.c
 */

/**
 * @page tutorial_ephysics_delete_body EPhysics - Delete Body
 *
 * The purpose of this example is to demonstrate the EPhysics Callbacks usage -
 * The code adds two balls, one with impulse and the second with a collision
 * detection callback, to delete the body.
 *
 * For this example we'll have an EPhysics_World and two basic EPhysics_Bodys,
 * we'll apply an impulse in one of then and the other will be stopped
 * "waiting" for a collision.
 *
 * The basic concepts like - initializing an EPhysics_World, render geometry,
 * physics limiting boundaries, add an EPhysics_Body, associate it to evas
 * objects, change restitution, friction and impulse properties, were already
 * covered in
 * @ref tutorial_ephysics_bouncing_ball
 *
 * # Adding Callbacks
 * @dontinclude test_delete.c
 *
 * Calling ephysics_body_event_callback_add()
 * registers a callback to a given EPhysics_Body event type.
 *
 * We'll use two types:
 *
 * @ref EPHYSICS_CALLBACK_BODY_DEL : called when a body deletion has been issued
 * and just before the deletion actually happens. In other words, to know that
 * body has been marked for
 * deletion. Typically to free some data associated with the body.
 *
 * @skipline ephysics_body_event_callback_add(sphere_body1,
 * @skip EPHYSICS_CALLBACK_BODY_DEL
 * @until );
 *
 * The callback function will receive the collision_data and free some data
 * associated with the body.
 *
 * @dontinclude test_delete.c
 *
 * @skip _del_cb(void *data,
 * @until }
 *
 * @ref EPHYSICS_CALLBACK_BODY_COLLISION : called just after the collision has
 * been actually processed by the physics engine. In other words, to be notified
 * about a collision between two physical bodies.
 *
 * @skip ephysics_body_event_callback_add(collision_data->sphere,
 * @until );
 *
 * The callback function will get the collision body and check if its body is
 * equal to which we want to delete.
 *
 * @dontinclude test_delete.c
 *
 * @skip _collision_cb(void *data,
 * @until }
 *
 * See
 * @ref _EPhysics_Callback_Body_Type
 * for more event types.
 *
 * Here we finish the example. The full source code can be found at
 * @ref test_delete_c.
 *
 */

 /**
 * @page test_delete_c test_delete.c
 *
 * # ephysics_test.h
 * @include ephysics_test.h
 *
 * @section test-delete-c test_delete.c
 * @dontinclude test.c
 * @skip test_clean
 * @until }
 *
 * @skip test_win_add
 * @until }
 *
 * @include test_delete.c
 *
 * @example test_delete.c
 */

 /**
 * @page tutorial_ephysics_constraint EPhysics - Constraint
 *
 * The purpose of this example is to demonstrate the EPhysics Constraint usage -
 * The code apply a constraint between two cubes.
 *
 * For this example we'll have an EPhysics_World, and two basic EPhysics_Bodys.
 *
 * The basic concepts like - defining an EPhysics_World, render geometry,
 * physics limiting boundaries, add an EPhysics_Body, associate it to evas
 * objects, change restitution, friction and impulse properties, were
 * already covered in
 * @ref tutorial_ephysics_bouncing_ball
 *
 * You can use also a slider constraint:
 * @ref tutorial_ephysics_slider
 *
 * @section add-constraint Adding a constraint
 * @dontinclude test_constraint.c
 *
 * Constraint is a specific type of variable in EPhysics.
 *
 * @skipline EPhysics_Constraint
 *
 * Here we're working with a point-to-point constraint, its purpose is to join
 * two bodies limiting their movements based on specified anchors.
 *
 * After we create our 2 EPhysics_Bodys, now we'll add a constraint between
 * them and setting an anchor to first body's Y using a p2p constraint
 * (point to point).
 *
 * @skip constraint = ephysics_constraint_p2p
 * @until );
 *
 * Here we finish the example. The full source code can be found at
 * @ref test_constraint_c.
 *
 */

 /**
 * @page test_constraint_c test_constraint.c
 *
 * # ephysics_test.h
 * @include ephysics_test.h
 *
 * @section test-constraint-c test_constraint.c
 * @dontinclude test.c
 *
 * @skip test_clean
 * @until }
 *
 * @skip test_data_new
 * @until }
 *
 * @skip test_win_add
 * @until }
 *
 * @include test_constraint.c
 *
 * @example test_constraint.c
 */

 /**
 * @page tutorial_ephysics_forces EPhysics - Forces
 *
 * The purpose of this example is to demonstrate the EPhysics Force usage -
 * The code applies force over two cubes.
 *
 * @image html forces.png
 * @image latex forces.eps
 *
 * For this example we'll have an EPhysics_World with gravity setted to zero,
 * and two basic EPhysics_Bodys.
 *
 * The basic concepts like - defining an EPhysics_World, render geometry,
 * physics limiting boundaries, add an EPhysics_Body, associate it to evas
 * objects, change restitution, friction and impulse properties, were
 * already covered in
 * @ref tutorial_ephysics_bouncing_ball
 *
 * @section add-force Adding a Force
 * @dontinclude test_forces.c
 *
 * We apply a force over the first body to change its linear and angular
 * accelerations. Applying a force to a body will lead it to change its
 * velocity gradually.
 *
 * Note that in this blue cube we use an offset to apply the force, the two
 * last parameters are responsible to set a relative position to apply the
 * force.In other words, the force applied with an offset will make the body
 * rotates. Otherwise (0, 0, 0) the force would be applied on the center of the
 * body, in this case its recommended use the
 * ephysics_body_central_force_apply();
 *
 * @skipline ephysics_body_force_apply(box_body1
 *
 * Here we apply a central force over the second body avoiding affect the
 * angular acceleration (rotate).
 *
 * @skipline ephysics_body_central_force_apply(box_body2
 *
 * We can also get all the forces applied over a body, including gravity, but
 * in this case we setted to zero.
 *
 * @dontinclude test_forces.c
 *
 * @skipline ephysics_body_forces_get(
 *
 * Here we finish the example. The full source code can be found at
 * @ref test_forces_c.
 *
 */

 /**
 * @page test_forces_c test_forces.c
 *
 * # ephysics_test.h
 * @include ephysics_test.h
 *
 * @section test-forces-c test_forces.c
 * @dontinclude test.c
 *
 * @skip test_clean
 * @until }
 *
 * @skip test_data_new
 * @until }
 *
 * @skip test_win_add
 * @until }
 *
 * @include test_forces.c
 *
 * @example test_forces.c
 */

 /**
 * @page tutorial_ephysics_growing_balls EPhysics - Growing Balls
 *
 * The purpose of this example is to demonstrate the dynamically growing
 * and shrinking of an EPhysics_Body - The code applies the growth of a ball
 * and the shrink of another.
 *
 * @image html growing_balls.png
 * @image latex growing_balls.eps
 *
 * For this example we'll have an EPhysics_World and three EPhysics_Bodys
 * with different sizes associated with an evas_object.
 *
 * The basic concepts like - defining an EPhysics_World, render geometry,
 * physics limiting boundaries, add an EPhysics_Body, associate it to evas
 * objects, change restitution, friction and impulse properties, were
 * already covered in
 * @ref tutorial_ephysics_bouncing_ball
 *
 * @section add-growshrink Adding the growing/shrinking
 * @dontinclude test_growing_balls.c
 *
 * In this example we'll use a timer to handle the callback function.
 *
 * @skipline test_data->data = ecore_timer_add
 *
 * In this callback, we'll pass through a list with 3 balls and apply the
 * growth and the shrink between the limit we'll set. Note that the variable
 * i receives different values on each iteration (-1, 0, 1). For the first
 * iteration it will decrease the size variable, the second will keep the
 * same value, and the last one will increase the size variable.
 *
 * @dontinclude test_growing_balls.c
 *
 * @skip _grow_cb(void *data
 * @until return EINA_TRUE;
 * @skipline }
 *
 * Here we finish the example. The full source code can be found at
 * @ref test_growing_balls_c.
 *
 */

 /**
 * @page test_growing_balls_c test_growing_balls.c
 *
 * # ephysics_test.h
 * @include ephysics_test.h
 *
 * @section test-growing-balls-c test_growing_balls.c
 * @dontinclude test.c
 *
 * @skip test_clean
 * @until }
 *
 * @skip test_data_new
 * @until }
 *
 * @skip test_win_add
 * @until }
 *
 * @include test_growing_balls.c
 *
 * @example test_growing_balls.c
 */

 /**
 * @page tutorial_ephysics_gravity EPhysics - Gravity
 *
 * The purpose of this example is to demonstrate the EPhysics Gravity usage -
 * The code apply gravity in an EPhysics_World with two cubes in movement.
 *
 * @image html no_gravity.png
 * @image latex no_gravity.eps
 *
 * For this example we'll have an EPhysics_World, and two basic EPhysics_Bodys.
 *
 * The basic concepts like - defining an EPhysics_World, render geometry,
 * physics limiting boundaries, add an EPhysics_Body, associate it to evas
 * objects, change restitution, friction and impulse properties, were
 * already covered in
 * @ref tutorial_ephysics_bouncing_ball
 *
 * Concepts like velocity and sleeping threshold were already
 * covered in:
 * @li @ref tutorial_ephysics_velocity
 * @li @ref tutorial_ephysics_sleeping_threshold
 *
 * @section add-gravity Setting Gravity
 * @dontinclude test_no_gravity.c
 *
 * Here we set gravity on 3 axes (x, y, z) to (0, 0, 0). Gravity will act
 * over bodies with mass over all the time.
 *
 * @skipline ephysics_world_gravity_set
 *
 * @section add-stopbody Stopping a Body
 * @dontinclude test_no_gravity.c
 *
 * We're using a button to call this function that receives test_data to stop
 * the chosen body.
 *
 * Stop angular and linear body movement, its equivalent to set linear velocity
 * to 0 on both axis and angular velocity to 0 as well.
 *
 * @skip _stop(void *data
 * @until body);
 * @skipline }
 *
 * Here we finish the example. The full source code can be found at
 * @ref test_no_gravity_c.
 *
 */

 /**
 * @page test_no_gravity_c test_no_gravity.c
 *
 * # ephysics_test.h
 * @include ephysics_test.h
 *
 * @section test-no-gravity-c test_no_gravity.c
 * @dontinclude test.c
 *
 * @skip test_clean
 * @until }
 *
 * @skip test_data_new
 * @until }
 *
 * @skip test_win_add
 * @until }
 *
 * @include test_no_gravity.c
 *
 * @example test_no_gravity.c
 */

/**
 * @page tutorial_ephysics_logo EPhysics - Logo
 *
 * The purpose of this example is to demonstrate the EPhysics_Logo.
 *
 * For this example we'll have an EPhysics_World.
 *
 * The basic concepts like - initializing an EPhysics_World, render geometry,
 * physics limiting boundaries, were already covered in
 * @ref tutorial_ephysics_bouncing_ball
 *
 * @section add-logostruct Logo Data Struct
 * @dontinclude ephysics_logo.c
 *
 * While in this example we'll be working with a struct to hold some objects
 * in our code. For clarity sake we present you the struct declaration in the
 * following block.
 *
 * @skip struct letter_desc {
 * @until };
 *
 * @section add-lett Adding the letters
 * @dontinclude ephysics_logo.c
 *
 * To add the letters we'll use this function that creates the shadow, light
 * and letter images.
 *
 * @skip _letter_add(Evas *evas
 * @until }
 *
 * In this loop we'll use the function letter_add using the falling_letters
 * declared in logo data struct.
 *
 * @skip for (i = 0; i < EINA_C_ARRAY
 * @until (image, &w, &h);
 *
 * Place image and light on top, above what the viewport can show, to fall
 * later on.
 *
 * @skip evas_object_move(image, x,
 * @until evas_object_move(light, x, -h * (i + 1) - 50);
 *
 * Place shadow below the hit-line: FLOOR_Y, centered at image.
 *
 * @skipline evas_object_move(shadow, x + CENTER(w, sh_w
 *
 * Here we set the letters padding and add letter body using the function
 * below and setting its friction.
 *
 * @skip x += falling_letters[i].padd
 * @until }
 *
 * Here we call another function that will be common to the circle body as
 * well, note that we add a callback that will be explained later.
 * @dontinclude ephysics_logo.c
 *
 * @skip _letter_body_box_add(EPhysics_World *world
 * @until }
 *
 * This function is used to create the body setting its properties. Note that
 * we disable its angular movement (rotation) on Z axis to this letters don't
 * tilt or recline.
 * @dontinclude ephysics_logo.c
 *
 * @skip _letter_body_setup_common(EPhysics_Body *body
 * @until }
 *
 * In this callback function that we added to our letter body we'll update its
 * light and shadow.
 *
 * First we'll update the body, get its image geometry and set the floor
 * distance based on images height.
 *
 * @dontinclude ephysics_logo.c
 *
 * @skip _update_box_cb(void *data
 * @until floor_distance = FLOOR_Y - h;
 *
 * As long as the letter approaches the floor, its shadow is darker, with bigger y.
 *
 * @skip if (y > SH_THRESHOLD)
 * @until &sh_h);
 * @skipline alpha = 255 * (y - SH_THRESHOLD)
 *
 * And with bigger x -- its proportional to x / WIDTH, but varies from 100 to
 * 255
 *
 * @skip pos_x = (double) x /
 * @until PROP_GET(pos_x, 100, 255);
 *
 * Note that the box shadow is not resized, just moved. And here set also the
 * colors.
 *
 * @skip evas_object_move(shadow, x +
 * @until alpha, alpha);
 *
 * As long as the letter approaches the floor, its lighter, with bigger x and y.
 *
 * @skipline evas_object_move(light, x
 * @skipline alpha = (y <= 0) ? 0 : y * 255
 * @skip alpha = alpha * (x - OFFSET_X + 80)
 * @until }
 *
 * @section add-lettere Adding the letter E
 *
 * Here we'll add the last letter, "E" is a circle that comes rolling on
 * the floor.
 *
 * First we use the letter_add function, set its shadow color and get
 * its sizes.
 *
 * @skip _letter_add(evas, "E", &image
 * @until evas_object_image_size_get(image, &w, &h);
 *
 * Place image and light above the floor and to the left of viewport, to comes
 * rolling later on.
 *
 * @skip evas_object_move(image, -w - 1, FLOOR_Y
 * @until evas_object_move(light, -w - 1, FLOOR_Y - h + 1);
 *
 * Place the shadow below the hit-line: FLOOR_Y centered at image.
 *
 * @skipline evas_object_move(shadow, -w - 1 + CENTER(w, sh_w)
 *
 * Here we create the body using body_circle function and enable its rotation
 * on Z axis.
 *
 * @skip letter_body = _letter_body_circle_add
 * @until letter_body, EINA_TRUE);
 *
 * Make the "E" logo get into the viewport by applying a horizontal force.
 *
 * @skipline ephysics_body_central_impulse_apply(letter_body
 *
 * Here we use the letter_body_setup_common to create the body and set its
 * properties, note that we add a callback that will be explained below.
 * @dontinclude ephysics_logo.c
 *
 * @skip _letter_body_circle_add(EPhysics_World *world
 * @until }
 *
 * In this callback function that we added to our "E" letter body we'll update
 * its light and shadow.
 *
 * First we'll update the body and get its image geometry.
 *
 * @dontinclude ephysics_logo.c
 *
 * @skip _update_circle_cb(void *data
 * @until geometry_get(image, &x, &y, &w, &h);
 *
 * As long as the letter approaches the floor, its lighter, with bigger x.
 *
 * @skip evas_object_move(light, x
 * @until alpha, alpha);
 *
 * Use the same map from image to the light (rotate it).
 *
 * @skip map = evas_object_map_get(image
 * @until light, EINA_TRUE);
 *
 * As long as the letter approaches the floor, its shadow is darker, with
 * bigger y.
 *
 * @skip evas_object_image_size_get(shadow,
 * @until alpha, alpha);
 *
 * When the letter "E" passes the viewport, we send it to the begin again to
 * collide with the other letters.
 *
 * @skip if (x > E_THRESHOLD)
 * @until }
 *
 * Here we finish the example. The full source code can be found at
 * @ref ephysics_logo_c.
 *
 */

 /**
 * @page ephysics_logo_c ephysics_logo.c
 *
 * @section ephysics-logo-c ephysics_logo.c
 * @include ephysics_logo.c
 *
 * @example ephysics_logo.c
 */

 /**
 * @page tutorial_ephysics_rotating_forever EPhysics - Rotating Forever
 *
 * The purpose of this example is to demonstrate the EPhysics Rotate usage -
 * The code applies different ways to rotate an EPhysics_Body, such as torque,
 * torque impulse and rotation set.
 *
 * For this example we'll have an EPhysics_World with gravity setted to zero,
 * and four basic EPhysics_Bodys.
 *
 * The basic concepts like - defining an EPhysics_World, render geometry,
 * physics limiting boundaries, add an EPhysics_Body, associate it to evas
 * objects, change restitution, friction and impulse properties, were
 * already covered in
 * @ref tutorial_ephysics_bouncing_ball
 *
 * @section add-rotate Rotating
 * @dontinclude test_rotating_forever.c
 *
 * For the first body we'll apply a torque impulse to make it rotate around Z
 * axis (rotate on x-y plane). Will make the body rolls on clockwise rotation,
 * if the value is negative, the impulse will be on counter clockwise.
 *
 * @skipline ephysics_body_torque_impulse_apply(body, 0, 0, 1);
 *
 * For the second body we'll use an offset to apply the force, the three
 * last parameters are responsible to set a relative position to apply the
 * force.In other words, the force applied with an offset will make the body
 * rotates and move around the other cubes.
 *
 * @skipline ephysics_body_impulse_apply(body, 30, 0
 *
 * For the third body we'll use a timer to rotate the body and a callback to
 * delete it.
 *
 * @skip timer = ecore_timer_add(1, _rotate_cb
 * @until _del_cb, timer);
 *
 * @dontinclude test_rotating_forever.c
 * @skip _del_cb(void *data
 * @until }
 *
 * In the function we'll get the body rotation on z axis in degrees and handle
 * it increasing 5 degrees on its position on z axis on each tick of the timer.
 *
 * @dontinclude test_rotating_forever.c
 * @skip _rotate_cb(void *data
 * @until }
 *
 * For the forth body we'll use 2 timers, but before that, we'll apply an
 * initial torque, changing the body angular acceleration and a callback to
 * delete the timers we'll add.
 *
 * @skipline ephysics_body_torque_apply(body, 0, 0, 2
 * @skipline ephysics_body_event_callback_add(body,
 * @skipline EPHYSICS_CALLBACK_BODY_DEL,
 * @skipline _del_torque_cb, cube);
 *
 * Just the callback function to delete the timers.
 *
 * @dontinclude test_rotating_forever.c
 * @skip _del_torque_cb(void *data
 * @until }
 *
 * As we commented we'll use 2 timers, one to increase the torque and
 * another to stop the torque, cleaning the forces related to the body.
 *
 * @skip timer = ecore_timer_add(3, _increase
 * @until "stop_timer", timer);
 *
 * In the increase function we'll apply a torque over the body, changing
 * its angular acceleration, it will leads to a change on angular velocity
 * over time. We're using a timer to increase the angular acceleration on
 * each tick of the timer.
 *
 * @dontinclude test_rotating_forever.c
 * @skip _increase_torque_cb(void *data
 * @until }
 *
 * In the stop function we'll clear all the forces applied to the body,
 * setting its linear and angular acceleration to zero. We're using this
 * timer to "control" the body velocity, since we are increasing it by
 * another timer. Note that we set the acceleration to zero not the
 * velocity.
 *
 * @skip _stop_torque_cb(void *data
 * @until }
 *
 * Here we finish the example. The full source code can be found at
 * @ref test_rotating_forever_c.
 *
 */

 /**
 * @page test_rotating_forever_c test_rotating_forever.c
 *
 * # ephysics_test.h
 * @include ephysics_test.h
 *
 * @section test-rotating-forever-c test_rotating_forever.c
 * @dontinclude test.c
 *
 * @skip test_clean
 * @until }
 *
 * @skip test_data_new
 * @until }
 *
 * @skip test_win_add
 * @until }
 *
 * @include test_rotating_forever.c
 *
 * @example test_rotating_forever.c
 */

/**
 * @page tutorial_ephysics_velocity EPhysics - Velocity
 *
 * The purpose of this example is to demonstrate the EPhysics Velocity usage -
 * The code adds a small bouncing ball on the ground and responding to users
 * events by making it jump - applying a central impulse on it and showing its
 * velocity and acceleration.
 *
 * We'll see in this example how to get EPhysics_Body Linear and Angular
 * velocity and acceleration.
 *
 * For this example we'll have an EPhysics_World and one basic EPhysics_Body,
 * we'll apply impulses that follows user events, it were already covered in
 * @ref tutorial_ephysics_bouncing_ball
 *
 * @section add-velstruct Velocity Data Struct
 * @dontinclude test_velocity.c
 *
 * While in this example we'll be working with a struct to hold some objects
 * in our code. For clarity sake we present you the struct declaration in the
 * following block.
 *
 * @skip struct _Velocity_Data {
 * @until };
 *
 * # Adding the Callbacks
 *
 * Calling ephysics_body_event_callback_add()
 * will register a callback to a type of physics body event.
 *
 * @ref EPHYSICS_CALLBACK_BODY_UPDATE : called after every physics iteration.
 * In other words, will be called after each world tick.
 *
 * @skipline ephysics_body_event_callback_add(sphere_body, EPHYSICS_CALLBACK_
 * @skipline _update_vel_cb
 *
 * @ref EPHYSICS_CALLBACK_BODY_STOPPED : called when a body is found to be
 * stopped. In other words, when the body is not moving anymore.
 *
 * @skip ephysics_body_event_callback_add(sphere_body, EPHYSICS_CALLBACK_BODY_ST
 * @until );
 *
 * See
 * @ref _EPhysics_Callback_Body_Type
 * for more event types.
 *
 * @section add-velcb Velocity Function
 *
 * The callback function will be called on every physics iteration to show the
 * linear and angular velocity and acceleration.
 *
 * Here we're declaring the necessary variables to calculate acelerations and
 * delta time. And checking if its the first time to return before shows
 * informations about the velocity.
 *
 * @dontinclude test_velocity.c
 *
 * @skip _update_vel_cb(void *data,
 * @until EINA_TRUE;
 *
 * Get the delta time to use it soon to calculate the acceleration on every
 * physics iteration.
 *
 * @skip time_now = ecore_time_get();
 * @until time_now;
 *
 * Note in this part we get the angular and linear velocities.
 *
 * @skip ephysics_body_angular_velocity_get
 * @until &vy, NULL);
 *
 * We need to handle the velocity using delta time to have the acceleration
 * on every tick. Check if its the first time to return before shows
 * informations about the velocity because we don't have the old aceletations
 * and then the calculation of this informations will be wrong.
 *
 * Here we calculate the aceletarions using this formula:
 *
 * (velocity - old_velocity) / delta_time;
 *
 * @skip aaz = (vaz -
 * @until return;
 *
 * Turning data into text, to pass it to edje shows on screen.
 *
 * @skip snprintf(buff,
 * @until "linear_acc", buff);
 * @skip snprintf(buff,
 * @until "angular_acc", buff);
 * @skipline }
 *
 * Here we finish the example. The full source code can be found at
 * @ref test_velocity_c.
 *
 */

 /**
 * @page test_velocity_c test_velocity.c
 *
 * # ephysics_test.h
 * @include ephysics_test.h
 *
 * @section test-velocity-c test_velocity.c
 * @dontinclude test.c
 *
 * @skip test_clean
 * @until }
 *
 * @skip test_win_add
 * @until }
 *
 * @include test_velocity.c
 *
 * @example test_velocity.c
 */

 /**
 * @page tutorial_ephysics_shapes EPhysics - Shapes
 *
 * The purpose of this example is to demonstrate the EPhysics Shapes
 * usage - The code creates two EPhysics_Bodys using a custom shape.
 *
 * @image html shapes.png
 * @image latex shapes.eps
 *
 * For this example we'll have an EPhysics_World, and two basic EPhysics_Bodys.
 *
 * The basic concepts like - defining an EPhysics_World, render geometry,
 * physics limiting boundaries, add an EPhysics_Body, associate it to evas
 * objects, change restitution, friction and impulse properties, were
 * already covered in
 * @ref tutorial_ephysics_bouncing_ball
 *
 * @section add-shape Adding a Shape
 * @dontinclude test_shapes.c
 *
 * Shapes are used to create bodies with shapes that differ from primitive
 * ones, like box and circle.
 *
 * A shape consists in a group of points, the vertices of the body to be
 * created later with ephysics_body_shape_add(). You can also save and load
 * it from a file.
 *
 * We'll have to create a specific type of variable:
 * @ref EPhysics_Shape
 *
 * @skip _world_populate(Test_Data
 * @until Evas_Object *pentagon,
 *
 * First we add an image we want to add an EPhysics_Body to have a reference
 * to after set the points (vertices).
 *
 * @skip pentagon = elm_image_add
 * @until evas_object_show(pentagon);
 *
 * Here we create a new shape, note that the returned shape initially
 * doesn't has points set, so its requiered to set vertices.
 *
 * @skipline pentagon_shape =
 *
 * Now we're setting the shape points (vertices) basing on the image that
 * we added, two vertices form a link between them, an edge, so with some
 * vertices is possible to create polygons, in this case a pentagon.
 *
 * @skip ephysics_shape_point_add(pentagon_shape
 * @until , 21/35., 1, 1);
 *
 * Here we create a new physics body using a custom shape. The center of mass
 * will be the center of the shape. Its collision shape will be the convex
 * shape that has all the points (and edges) we added to this shape before.
 *
 * @skip pentagon_body = ephysics_body_shape_add
 * @until ephysics_body_restitution_set(pentagon_body, 1);
 *
 * Here we just delete the custom shape (not the body) after used to create
 * the wanted bodies, it's required to delete it. It won't be deleted
 * automatically by ephysics at any point, even on shutdown.
 *
 * @skipline ephysics_shape_del(pentagon_shape
 *
 * In the example we add another shape with the same process we just used,
 * but with different image and points.
 *
 * @dontinclude test_shapes.c
 *
 * @skip ephysics_shape_point_add(hexagon_shape
 * @until 18, 60, 10);
 *
 * Here we finish the example. The full source code can be found at
 * @ref test_shapes_c.
 *
 */

 /**
 * @page test_shapes_c test_shapes.c
 *
 * # ephysics_test.h
 * @include ephysics_test.h
 *
 * @section test-shapes-c test_shapes.c
 * @dontinclude test.c
 *
 * @skip test_clean
 * @until }
 *
 * @skip test_data_new
 * @until }
 *
 * @skip test_win_add
 * @until }
 *
 * @include test_shapes.c
 *
 * @example test_shapes.c
 */

 /**
 * @page tutorial_ephysics_sleeping_threshold EPhysics - Sleeping Threshold
 *
 * The purpose of this example is to demonstrate the EPhysics Sleeping
 * Threshold usage - The code apply sleeping threshold in two cubes.
 *
 * For this example we'll have an EPhysics_World, and two basic EPhysics_Bodys.
 *
 * The basic concepts like - defining an EPhysics_World, render geometry,
 * physics limiting boundaries, add an EPhysics_Body, associate it to evas
 * objects, change restitution, friction and impulse properties, were
 * already covered in
 * @ref tutorial_ephysics_bouncing_ball
 *
 * Concept of velocity were already covered in
 * @ref tutorial_ephysics_velocity
 *
 * @section add-maxsleeping Adding Max Sleeping Time
 * @dontinclude test_sleeping_threshold.c
 *
 * Setting the max sleeping time determines how long(in seconds) a rigid body
 * under the linear and angular threshold is supposed to be marked as sleeping.
 *
 * @skipline ephysics_world_max_sleeping_time_set
 *
 * @section add-sleeping Adding a Sleeping Threshold
 * @dontinclude test_sleeping_threshold.c
 *
 * Here we set EPhysics_Bodys linear and angular sleeping threshold. These
 * factors are used to determine whenever a rigid body is supposed to
 * increment the sleeping time.
 *
 * After every tick the sleeping time is incremented. After reaching the max
 * sleeping time the body is market to sleep, that means the rigid body is to
 * be deactivated.
 *
 * @skipline ephysics_body_sleeping_threshold_set(sphere_body1
 *
 * @skipline ephysics_body_sleeping_threshold_set(sphere_body2
 *
 * We can get the EPhysics_Bodys linear and angular sleeping threshold as well.
 *
 * @skipline ephysics_body_sleeping_threshold_get(sphere_body1
 *
 * @skipline ephysics_body_sleeping_threshold_get(sphere_body2
 *
 * @section add-damping Adding a Damping
 * @dontinclude test_sleeping_threshold.c
 *
 * Here we set EPhysics_Bodys linear and angular damping values.The damping is
 * a force synchronous with the velocity of the object but in opposite
 * direction - like air resistance.
 *
 * @skipline ephysics_body_damping_set(sphere_body1
 *
 * @skipline ephysics_body_damping_set(sphere_body2
 *
 * Here we finish the example. The full source code can be found at
 * @ref test_sleeping_threshold_c.
 *
 */

 /**
 * @page test_sleeping_threshold_c test_sleeping_threshold.c
 *
 * # ephysics_test.h
 * @include ephysics_test.h
 *
 * @section test-sleeping-threshold-c test_sleeping_threshold.c
 * @dontinclude test.c
 *
 * @skip test_clean
 * @until }
 *
 * @skip test_data_new
 * @until }
 *
 * @skip test_win_add
 * @until }
 *
 * @include test_sleeping_threshold.c
 *
 * @example test_sleeping_threshold.c
 */

 /**
 * @page tutorial_ephysics_slider EPhysics - Slider
 *
 * The purpose of this example is to demonstrate the EPhysics Slider constraint
 * usage - The code applies slider on three cubes.
 *
 * @image html slider.png
 * @image latex slider.eps
 *
 * For this example we'll have an EPhysics_World, and four basic
 * EPhysics_Bodys.
 *
 * The basic concepts like - defining an EPhysics_World, render geometry,
 * physics limiting boundaries, add an EPhysics_Body, associate it to evas
 * objects, change restitution, friction and impulse properties, were
 * already covered in
 * @ref tutorial_ephysics_bouncing_ball
 *
 * You can use also a P2P (point to point) constraint:
 * @ref tutorial_ephysics_constraint
 *
 * @section add-slider Adding a Slider
 * @dontinclude test_slider.c
 *
 * Slider is a constraint that will limit the linear and angular moving of
 * a body.
 *
 * We'll add three sliders on the cubes, starting with the highest purple.
 *
 * First we need to create a specific variable type to get EPhysics_Body
 * constraint and create a new slider constraint passing the body which we
 * want as parameter.
 *
 * @skipline EPhysics_Constraint *constr
 *
 * @skipline constraint = ephysics_constraint_slider_add(box_body2
 *
 * Here we define the linear moving limits of the slider constraint, in this
 * case we just set moving limit down on Y axis (under), but if we wanted we
 * could set left, right and above also.
 *
 * @skip ephysics_constraint_slider_linear_limit_set(constraint, 0,
 * @until , 0, 0);
 *
 * Here we set the angular moving limits of the slider constraint. The angular
 * moving limits is defined in degrees and will limit the moving on Z axis, in
 * this case we just set the clockwise direction, but if we wanted we could
 * set the counter clockwise direction also.
 *
 *
 * @skipline ephysics_constraint_slider_angular_limit_set(constraint, 0, 45
 *
 * When this cube falls by the gravity, the slider constraint will act limiting
 * its linear and angular movings, giving the impression that its hanging.
 *
 * For the next two cubes is the same process.
 *
 * Now we set the slider constraint of the highest blue and lowest purple,
 * limiting moving limits to the left on X axis and applying an impulse
 * to the left where the two cubes will be limited by the slider constraint
 * and pushed back.
 *
 * @skip constraint = ephysics_constraint_slider_add(box_body3
 * @until box_body3, -240, 0, 0);
 *
 * @skip constraint = ephysics_constraint_slider_add(box_body4
 * @until box_body4, -600, 0, 0);
 *
 * Here we finish the example. The full source code can be found at
 * @ref test_slider_c.
 *
 */

 /**
 * @page test_slider_c test_slider.c
 *
 * # ephysics_test.h
 * @include ephysics_test.h
 *
 * @section test-slider-c test_slider.c
 * @dontinclude test.c
 *
 * @skip test_clean
 * @until }
 *
 * @skip test_data_new
 * @until }
 *
 * @skip test_win_add
 * @until }
 *
 * @include test_slider.c
 *
 * @example test_slider.c
 */