diff --git a/legacy/ephysics/data/themes/frame.edc b/legacy/ephysics/data/themes/frame.edc index f4b072c728..18a0b51a2e 100644 --- a/legacy/ephysics/data/themes/frame.edc +++ b/legacy/ephysics/data/themes/frame.edc @@ -61,6 +61,48 @@ } } + part { + name: "linear_vel"; + type: TEXT; + mouse_events: 0; + description { + state: "default" 0.0; + color: 232 224 215 0; + rel1.relative: 0.08 0.0; + rel2.relative: 0.92 0.04; + text { + font: "Sans"; + size: 12; + } + } + description { + state: "visible" 0.0; + inherit: "default" 0.0; + color: 95 56 19 255; + } + } + + part { + name: "angular_vel"; + type: TEXT; + mouse_events: 0; + description { + state: "default" 0.0; + color: 232 224 215 0; + rel1.relative: 0.08 0.04; + rel2.relative: 0.92 0.08; + text { + font: "Sans"; + size: 12; + } + } + description { + state: "visible" 0.0; + inherit: "default" 0.0; + color: 95 56 19 255; + } + } + part { name: "restart_button"; type: EXTERNAL; @@ -111,6 +153,15 @@ target: "arrows_msg"; } + program { + name: "velocity,show"; + source: "ephysics_test"; + signal: "velocity,show"; + action: STATE_SET "visible" 0.0; + target: "linear_vel"; + target: "angular_vel"; + } + } } diff --git a/legacy/ephysics/src/bin/Makefile.am b/legacy/ephysics/src/bin/Makefile.am index 59a34b0ae6..c374067d65 100644 --- a/legacy/ephysics/src/bin/Makefile.am +++ b/legacy/ephysics/src/bin/Makefile.am @@ -23,7 +23,8 @@ test_collision_detection.c \ test_constraint.c \ test_falling_letters.c \ test_jumping_balls.c \ -test_rotate.c +test_rotate.c \ +test_velocity.c ephysics_logo_SOURCES = \ ephysics_logo.c diff --git a/legacy/ephysics/src/bin/test.c b/legacy/ephysics/src/bin/test.c index c523bad9d6..94e9f88140 100644 --- a/legacy/ephysics/src/bin/test.c +++ b/legacy/ephysics/src/bin/test.c @@ -17,6 +17,7 @@ void test_constraint(void *data, Evas_Object *obj, void *event_info); void test_falling_letters(void *data, Evas_Object *obj, void *event_info); void test_jumping_balls(void *data, Evas_Object *obj, void *event_info); void test_rotate(void *data, Evas_Object *obj, void *event_info); +void test_velocity(void *data, Evas_Object *obj, void *event_info); static void _win_del(void *data __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__) @@ -153,6 +154,7 @@ _main_win_add(char *autorun __UNUSED__, Eina_Bool test_win_only __UNUSED__) ADD_TEST("FALLING LETTERS", test_falling_letters); ADD_TEST("JUMPING BALLS", test_jumping_balls); ADD_TEST("ROTATE", test_rotate); + ADD_TEST("VELOCITY", test_velocity); elm_list_go(list); } diff --git a/legacy/ephysics/src/bin/test_velocity.c b/legacy/ephysics/src/bin/test_velocity.c new file mode 100644 index 0000000000..2e77bf91c9 --- /dev/null +++ b/legacy/ephysics/src/bin/test_velocity.c @@ -0,0 +1,140 @@ +#ifdef HAVE_CONFIG_H +# include +#endif + +#include "ephysics_test.h" + +static Eina_Bool +_on_keydown(void *data, Evas_Object *obj __UNUSED__, Evas_Object *src __UNUSED__, Evas_Callback_Type type, void *event_info) +{ + Evas_Event_Key_Down *ev = event_info; + EPhysics_Body *body = data; + + if (type != EVAS_CALLBACK_KEY_UP) + return EINA_FALSE; + + if (strcmp(ev->keyname, "Up") == 0) + ephysics_body_central_impulse_apply(body, 0, 10); + else if (strcmp(ev->keyname, "Down") == 0) + ephysics_body_central_impulse_apply(body, 0, -10); + else if (strcmp(ev->keyname, "Right") == 0) + ephysics_body_central_impulse_apply(body, 10, 0); + else if (strcmp(ev->keyname, "Left") == 0) + ephysics_body_central_impulse_apply(body, -10, 0); + + return EINA_TRUE; +} + +static void +_update_vel_cb(void *data, EPhysics_Body *body, void *event_info __UNUSED__) +{ + char linear_vel[64], angular_vel[64]; + Test_Data *test_data = data; + double vx, vy, vaz; + + ephysics_body_linear_velocity_get(body, &vx, &vy); + ephysics_body_angular_velocity_get(body, &vaz); + + snprintf(linear_vel, sizeof(linear_vel), + "Linear velocity: x = %.2f, y = %.2f", vx, vy); + snprintf(angular_vel, sizeof(angular_vel), + "Angular velocity: z = %.2f", vaz); + + elm_layout_text_set(test_data->layout, "linear_vel", linear_vel); + elm_layout_text_set(test_data->layout, "angular_vel", angular_vel); +} + +static void +_world_populate(Test_Data *test_data) +{ + Evas_Object *sphere, *shadow; + EPhysics_Body *fall_body; + + shadow = elm_layout_add(test_data->win); + elm_layout_file_set( + shadow, PACKAGE_DATA_DIR "/" EPHYSICS_TEST_THEME ".edj", "shadow-ball"); + evas_object_move(shadow, WIDTH / 3, FLOOR_Y); + evas_object_resize(shadow, 54, 3); + evas_object_show(shadow); + test_data->evas_objs = eina_list_append(test_data->evas_objs, shadow); + + sphere = elm_image_add(test_data->win); + elm_image_file_set( + sphere, PACKAGE_DATA_DIR "/" EPHYSICS_TEST_THEME ".edj", "red-ball"); + evas_object_move(sphere, WIDTH / 3, FLOOR_Y - 54); + evas_object_resize(sphere, 54, 54); + evas_object_show(sphere); + test_data->evas_objs = eina_list_append(test_data->evas_objs, sphere); + + fall_body = ephysics_body_circle_add(test_data->world); + ephysics_body_evas_object_set(fall_body, sphere, EINA_TRUE); + ephysics_body_restitution_set(fall_body, 0.8); + ephysics_body_friction_set(fall_body, 0.2); + ephysics_body_event_callback_add(fall_body, EPHYSICS_CALLBACK_BODY_UPDATE, + update_object_cb, shadow); + ephysics_body_event_callback_add(fall_body, EPHYSICS_CALLBACK_BODY_UPDATE, + _update_vel_cb, test_data); + ephysics_body_event_callback_add(fall_body, EPHYSICS_CALLBACK_BODY_STOPPED, + _update_vel_cb, test_data); + test_data->bodies = eina_list_append(test_data->bodies, fall_body); + test_data->data = fall_body; +} + +static void +_restart(void *data, Evas_Object *obj __UNUSED__, const char *emission __UNUSED__, const char *source __UNUSED__) +{ + Test_Data *test_data = data; + + DBG("Restart pressed"); + elm_object_event_callback_del(test_data->win, _on_keydown, test_data->data); + test_clean(test_data); + _world_populate(test_data); + elm_object_event_callback_add(test_data->win, _on_keydown, test_data->data); +} + +void +test_velocity(void *data __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__) +{ + EPhysics_Body *boundary; + EPhysics_World *world; + Test_Data *test_data; + Evas_Object *edje; + + if (!ephysics_init()) + return; + + test_data = test_data_new(); + test_win_add(test_data, "Bouncing Ball", EINA_TRUE); + + edje = elm_layout_edje_get(test_data->layout); + edje_object_signal_callback_add(edje, "restart", "test-theme", _restart, + test_data); + + elm_layout_text_set(test_data->layout, "linear_vel", + "Linear velocity: 0, 0"); + elm_layout_text_set(test_data->layout, "angular_vel", "Angular velocity: 0"); + + elm_object_signal_emit(test_data->layout, "arrows,show", "ephysics_test"); + elm_object_signal_emit(test_data->layout, "velocity,show", "ephysics_test"); + + world = ephysics_world_new(); + ephysics_world_render_geometry_set(world, 50, 40, WIDTH - 100, FLOOR_Y - 40); + test_data->world = world; + + boundary = ephysics_body_bottom_boundary_add(test_data->world); + ephysics_body_restitution_set(boundary, 0.65); + ephysics_body_friction_set(boundary, 4); + + boundary = ephysics_body_right_boundary_add(test_data->world); + ephysics_body_restitution_set(boundary, 0.4); + ephysics_body_friction_set(boundary, 3); + + boundary = ephysics_body_left_boundary_add(test_data->world); + ephysics_body_restitution_set(boundary, 0.4); + ephysics_body_friction_set(boundary, 3); + + ephysics_body_top_boundary_add(test_data->world); + + _world_populate(test_data); + elm_object_event_callback_add(test_data->win, _on_keydown, test_data->data); +}