efl

Форк
0
/
test_rotating_forever.c 
206 строк · 6.5 Кб
1
#ifdef HAVE_CONFIG_H
2
# include <config.h>
3
#endif
4

5
#include "ephysics_test.h"
6

7
static Eina_Bool
8
_rotate_cb(void *data)
9
{
10
   EPhysics_Quaternion *quat_prev, quat_delta, quat;
11
   EPhysics_Body *body = data;
12

13
   quat_prev = ephysics_body_rotation_get(body, NULL);
14
   ephysics_quaternion_set(&quat_delta, 0, 0, -0.15, 0.98);
15
   ephysics_quaternion_normalize(&quat_delta);
16
   ephysics_body_rotation_set(
17
      body, ephysics_quaternion_multiply(&quat_delta, quat_prev, &quat));
18
   free(quat_prev);
19

20
   return EINA_TRUE;
21
}
22

23
static Eina_Bool
24
_increase_torque_cb(void *data)
25
{
26
   EPhysics_Body *body = data;
27
   Evas_Object *obj;
28

29
   ephysics_body_torque_apply(body, 0, 0, 2);
30
   obj = ephysics_body_evas_object_get(body);
31
   evas_object_data_set(obj, "increase_timer", NULL);
32

33
   return EINA_FALSE;
34
}
35

36
static Eina_Bool
37
_stop_torque_cb(void *data)
38
{
39
   EPhysics_Body *body = data;
40
   Evas_Object *obj;
41

42
   ephysics_body_forces_clear(body);
43
   obj = ephysics_body_evas_object_get(body);
44
   evas_object_data_set(obj, "stop_timer", NULL);
45

46
   return EINA_FALSE;
47
}
48

49
static void
50
_del_cb(void *data, EPhysics_Body *body __UNUSED__, void *event_info __UNUSED__)
51
{
52
   ecore_timer_del(data);
53
}
54

55
static void
56
_del_torque_cb(void *data __UNUSED__, Evas *e __UNUSED__, Evas_Object *obj, void *event_info __UNUSED__)
57
{
58
   Ecore_Timer *timer;
59

60
   timer = evas_object_data_get(obj, "increase_timer");
61
   if (timer)
62
     ecore_timer_del(timer);
63

64
   timer = evas_object_data_get(obj, "stop_timer");
65
   if (timer)
66
     ecore_timer_del(timer);
67
}
68

69
static void
70
_update_object_cb(void *data __UNUSED__, EPhysics_Body *body, void *event_info __UNUSED__)
71
{
72
   double rx, ry, rz, rw, vrot, torque;
73
   EPhysics_Quaternion quat;
74

75
   ephysics_body_angular_velocity_get(body, NULL, NULL, &vrot);
76
   ephysics_body_torques_get(body, NULL, NULL, &torque);
77

78
   ephysics_body_rotation_get(body, &quat);
79
   ephysics_quaternion_get(&quat, &rx, &ry, &rz, &rw);
80

81
   ephysics_body_evas_object_update(body);
82

83
   DBG("body: %p, rot: (%lf, %lf, %lf, %lf), vrot: %lf, torque: %lf", body,
84
       rx, ry, rz, rw, vrot, torque);
85
}
86

87
static void
88
_world_populate(Test_Data *test_data)
89
{
90
   EPhysics_Body *body;
91
   Ecore_Timer *timer;
92
   Evas_Object *cube;
93

94
   cube = elm_image_add(test_data->win);
95
   elm_image_file_set(
96
      cube, PACKAGE_DATA_DIR "/" EPHYSICS_TEST_THEME ".edj", "blue-cube");
97
   evas_object_move(cube, WIDTH / 3, HEIGHT / 2 - 30);
98
   evas_object_resize(cube, 70, 70);
99
   evas_object_show(cube);
100
   test_data->evas_objs = eina_list_append(test_data->evas_objs, cube);
101

102
   body = ephysics_body_box_add(test_data->world);
103
   ephysics_body_evas_object_set(body, cube, EINA_TRUE);
104
   test_data->bodies = eina_list_append(test_data->bodies, body);
105
   ephysics_body_event_callback_add(body,
106
                                    EPHYSICS_CALLBACK_BODY_UPDATE,
107
                                    _update_object_cb, NULL);
108

109
   ephysics_body_torque_impulse_apply(body, 0, 0, 1);
110

111
   cube = elm_image_add(test_data->win);
112
   elm_image_file_set(
113
      cube, PACKAGE_DATA_DIR "/" EPHYSICS_TEST_THEME ".edj", "purple-cube");
114
   evas_object_move(cube, WIDTH / 3, FLOOR_Y - 70);
115
   evas_object_resize(cube, 70, 70);
116
   evas_object_show(cube);
117
   test_data->evas_objs = eina_list_append(test_data->evas_objs, cube);
118

119
   body = ephysics_body_box_add(test_data->world);
120
   ephysics_body_evas_object_set(body, cube, EINA_TRUE);
121
   test_data->bodies = eina_list_append(test_data->bodies, body);
122
   ephysics_body_event_callback_add(body,
123
                                    EPHYSICS_CALLBACK_BODY_UPDATE,
124
                                    _update_object_cb, NULL);
125

126
   ephysics_body_impulse_apply(body, 30, 0, 0, 0, -10, 0);
127

128
   cube = elm_image_add(test_data->win);
129
   elm_image_file_set(
130
      cube, PACKAGE_DATA_DIR "/" EPHYSICS_TEST_THEME ".edj", "purple-cube");
131
   evas_object_move(cube, WIDTH / 3, 60);
132
   evas_object_resize(cube, 70, 70);
133
   evas_object_show(cube);
134
   test_data->evas_objs = eina_list_append(test_data->evas_objs, cube);
135

136
   body = ephysics_body_box_add(test_data->world);
137
   ephysics_body_evas_object_set(body, cube, EINA_TRUE);
138
   test_data->bodies = eina_list_append(test_data->bodies, body);
139
   ephysics_body_event_callback_add(body,
140
                                    EPHYSICS_CALLBACK_BODY_UPDATE,
141
                                    _update_object_cb, NULL);
142

143
   timer = ecore_timer_add(1, _rotate_cb, body);
144

145
   ephysics_body_event_callback_add(body,
146
                                    EPHYSICS_CALLBACK_BODY_DEL,
147
                                    _del_cb, timer);
148

149
   cube = elm_image_add(test_data->win);
150
   elm_image_file_set(
151
      cube, PACKAGE_DATA_DIR "/" EPHYSICS_TEST_THEME ".edj", "blue-cube");
152
   evas_object_move(cube, WIDTH * 2 / 3, 60);
153
   evas_object_resize(cube, 70, 70);
154
   evas_object_show(cube);
155
   test_data->evas_objs = eina_list_append(test_data->evas_objs, cube);
156

157
   body = ephysics_body_box_add(test_data->world);
158
   ephysics_body_evas_object_set(body, cube, EINA_TRUE);
159
   test_data->bodies = eina_list_append(test_data->bodies, body);
160
   ephysics_body_event_callback_add(body,
161
                                    EPHYSICS_CALLBACK_BODY_UPDATE,
162
                                    _update_object_cb, NULL);
163

164
   ephysics_body_torque_apply(body, 0, 0, 2);
165
   evas_object_event_callback_add(cube, EVAS_CALLBACK_DEL,
166
                                  _del_torque_cb, NULL);
167

168
   timer = ecore_timer_add(3, _increase_torque_cb, body);
169
   evas_object_data_set(cube, "increase_timer", timer);
170
   timer = ecore_timer_add(5, _stop_torque_cb, body);
171
   evas_object_data_set(cube, "stop_timer", timer);
172
}
173

174
static void
175
_restart(void *data, Evas_Object *obj __UNUSED__, const char *emission __UNUSED__, const char *source __UNUSED__)
176
{
177
   Test_Data *test_data = data;
178

179
   DBG("Restart pressed");
180
   test_clean(test_data);
181
   _world_populate(test_data);
182
}
183

184
void
185
test_rotating_forever(void *data __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__)
186
{
187
   EPhysics_World *world;
188
   Test_Data *test_data;
189

190
   if (!ephysics_init())
191
     return;
192

193
   test_data = test_data_new();
194
   test_win_add(test_data, "Rotating Forever", EINA_TRUE);
195
   elm_object_signal_emit(test_data->layout, "borders,show", "ephysics_test");
196
   elm_layout_signal_callback_add(test_data->layout, "restart", "test-theme",
197
                                  _restart, test_data);
198

199
   world = ephysics_world_new();
200
   ephysics_world_render_geometry_set(world, 50, 40, -50,
201
                                      WIDTH - 100, FLOOR_Y - 40, DEPTH);
202
   test_data->world = world;
203
   ephysics_world_gravity_set(world, 0, 0, 0);
204

205
   _world_populate(test_data);
206
}
207

Использование cookies

Мы используем файлы cookie в соответствии с Политикой конфиденциальности и Политикой использования cookies.

Нажимая кнопку «Принимаю», Вы даете АО «СберТех» согласие на обработку Ваших персональных данных в целях совершенствования нашего веб-сайта и Сервиса GitVerse, а также повышения удобства их использования.

Запретить использование cookies Вы можете самостоятельно в настройках Вашего браузера.