diff --git a/legacy/ephysics/data/themes/Makefile.am b/legacy/ephysics/data/themes/Makefile.am index 87fd0499be..c9075a5c2d 100644 --- a/legacy/ephysics/data/themes/Makefile.am +++ b/legacy/ephysics/data/themes/Makefile.am @@ -20,6 +20,7 @@ EXTRA_DIST = \ frame.edc \ list.edc \ loading_bar.edc \ + sandbox.edc \ shadows.edc \ shapes.edc \ spinner.edc \ @@ -60,7 +61,14 @@ EXTRA_DIST = \ images/spinner_bt_right_pressed.png \ images/star.png \ images/green-flag.png \ - images/brown-pole.png + images/brown-pole.png \ + images/ball-custom.png \ + images/ball-concrete.png \ + images/ball-iron.png \ + images/ball-plastic.png \ + images/ball-polystyrene.png \ + images/ball-rubber.png \ + images/ball-wood.png ephysics_test.edj: Makefile $(EXTRA_DIST) $(EDJE_CC) $(EDJE_FLAGS) \ diff --git a/legacy/ephysics/data/themes/ephysics_test.edc b/legacy/ephysics/data/themes/ephysics_test.edc index f0bec3e4ac..87594cd64b 100644 --- a/legacy/ephysics/data/themes/ephysics_test.edc +++ b/legacy/ephysics/data/themes/ephysics_test.edc @@ -10,6 +10,7 @@ collections { #include "frame.edc" #include "list.edc" #include "loading_bar.edc" +#include "sandbox.edc" #include "shadows.edc" #include "shapes.edc" #include "spinner.edc" diff --git a/legacy/ephysics/data/themes/images/ball-concrete.png b/legacy/ephysics/data/themes/images/ball-concrete.png new file mode 100644 index 0000000000..d2d18831c9 Binary files /dev/null and b/legacy/ephysics/data/themes/images/ball-concrete.png differ diff --git a/legacy/ephysics/data/themes/images/ball-custom.png b/legacy/ephysics/data/themes/images/ball-custom.png new file mode 100644 index 0000000000..3a4af0adf6 Binary files /dev/null and b/legacy/ephysics/data/themes/images/ball-custom.png differ diff --git a/legacy/ephysics/data/themes/images/ball-iron.png b/legacy/ephysics/data/themes/images/ball-iron.png new file mode 100644 index 0000000000..f26b5ea3d1 Binary files /dev/null and b/legacy/ephysics/data/themes/images/ball-iron.png differ diff --git a/legacy/ephysics/data/themes/images/ball-plastic.png b/legacy/ephysics/data/themes/images/ball-plastic.png new file mode 100644 index 0000000000..fb08b23b22 Binary files /dev/null and b/legacy/ephysics/data/themes/images/ball-plastic.png differ diff --git a/legacy/ephysics/data/themes/images/ball-polystyrene.png b/legacy/ephysics/data/themes/images/ball-polystyrene.png new file mode 100644 index 0000000000..14f00bef7f Binary files /dev/null and b/legacy/ephysics/data/themes/images/ball-polystyrene.png differ diff --git a/legacy/ephysics/data/themes/images/ball-rubber.png b/legacy/ephysics/data/themes/images/ball-rubber.png new file mode 100644 index 0000000000..7a1bd734d7 Binary files /dev/null and b/legacy/ephysics/data/themes/images/ball-rubber.png differ diff --git a/legacy/ephysics/data/themes/images/ball-wood.png b/legacy/ephysics/data/themes/images/ball-wood.png new file mode 100644 index 0000000000..acb4599880 Binary files /dev/null and b/legacy/ephysics/data/themes/images/ball-wood.png differ diff --git a/legacy/ephysics/data/themes/sandbox.edc b/legacy/ephysics/data/themes/sandbox.edc new file mode 100644 index 0000000000..b4795dd087 --- /dev/null +++ b/legacy/ephysics/data/themes/sandbox.edc @@ -0,0 +1,165 @@ + images { + image: "ball-custom.png" COMP; + image: "ball-concrete.png" COMP; + image: "ball-iron.png" COMP; + image: "ball-plastic.png" COMP; + image: "ball-polystyrene.png" COMP; + image: "ball-rubber.png" COMP; + image: "ball-wood.png" COMP; + } + + group { + name: "sandbox"; + min: 1280 720; + max: 1280 720; + + externals { + external: "elm"; + } + + images{ + image: "background.jpg" COMP; + } + + parts { + part { + name: "bg"; + type: EXTERNAL; + source: "elm/bg"; + mouse_events: 0; + description { + state: "default" 0.0; + rel1.relative: 0.7 0; + rel2.relative: 1 1; + fixed: 1 1; + align: 1 0.5; + } + } + part { + name: "bg_world"; + type: IMAGE; + description { + state: "default" 0.0; + rel1.relative: 0.0 0.0; + rel2.relative: 0.7 1.0; + fixed: 1 1; + image.normal: "background.jpg"; + } + } + part { + name: "swallow"; + type: SWALLOW; + description { + state: "default" 0; + rel1.relative: 0.7 0; + rel2.relative: 1 1; + fixed: 1 1; + } + } + } + } + + group { + name: "0"; + parts { + part { + name: "ball"; + mouse_events: 0; + type: IMAGE; + description { + state: "default" 0.0; + image.normal: "ball-custom.png"; + } + } + } + } + + group { + name: "1"; + parts { + part { + name: "ball"; + mouse_events: 0; + type: IMAGE; + description { + state: "default" 0.0; + image.normal: "ball-concrete.png"; + } + } + } + } + + group { + name: "2"; + parts { + part { + name: "ball"; + mouse_events: 0; + type: IMAGE; + description { + state: "default" 0.0; + image.normal: "ball-iron.png"; + } + } + } + } + + group { + name: "3"; + parts { + part { + name: "ball"; + mouse_events: 0; + type: IMAGE; + description { + state: "default" 0.0; + image.normal: "ball-plastic.png"; + } + } + } + } + + group { + name: "4"; + parts { + part { + name: "ball"; + mouse_events: 0; + type: IMAGE; + description { + state: "default" 0.0; + image.normal: "ball-polystyrene.png"; + } + } + } + } + + group { + name: "5"; + parts { + part { + name: "ball"; + mouse_events: 0; + type: IMAGE; + description { + state: "default" 0.0; + image.normal: "ball-rubber.png"; + } + } + } + } + + group { + name: "6"; + parts { + part { + name: "ball"; + mouse_events: 0; + type: IMAGE; + description { + state: "default" 0.0; + image.normal: "ball-wood.png"; + } + } + } + } diff --git a/legacy/ephysics/src/bin/Makefile.am b/legacy/ephysics/src/bin/Makefile.am index e16755a05b..e3196e566e 100644 --- a/legacy/ephysics/src/bin/Makefile.am +++ b/legacy/ephysics/src/bin/Makefile.am @@ -10,9 +10,9 @@ AM_CPPFLAGS = \ -DPACKAGE_DATA_DIR=\"$(datadir)/$(PACKAGE)\" \ @EPHYSICS_TEST_CFLAGS@ -bin_PROGRAMS = ephysics_test ephysics_logo +bin_PROGRAMS = ephysics_test ephysics_logo ephysics_sandbox -EXTRA_PROGRAMS = ephysics_test ephysics_logo +EXTRA_PROGRAMS = ephysics_test ephysics_logo ephysics_sandbox ephysics_test_SOURCES = \ test.c \ @@ -47,6 +47,9 @@ test_flag.c ephysics_logo_SOURCES = \ ephysics_logo.c +ephysics_sandbox_SOURCES = \ +ephysics_sandbox.c + ephysics_test_LDADD = \ $(top_builddir)/src/lib/libephysics.la \ @EPHYSICS_TEST_LIBS@ @@ -55,9 +58,15 @@ ephysics_logo_LDADD = \ $(top_builddir)/src/lib/libephysics.la \ @EPHYSICS_TEST_LIBS@ +ephysics_sandbox_LDADD = \ + $(top_builddir)/src/lib/libephysics.la \ + @EPHYSICS_TEST_LIBS@ + ephysics_logo_LDFLAGS = ephysics_test_LDFLAGS = +ephysics_sandbox_LDFLAGS = + EXTRA_DIST = ephysics_test.h endif diff --git a/legacy/ephysics/src/bin/ephysics_sandbox.c b/legacy/ephysics/src/bin/ephysics_sandbox.c new file mode 100644 index 0000000000..a47232f735 --- /dev/null +++ b/legacy/ephysics/src/bin/ephysics_sandbox.c @@ -0,0 +1,876 @@ +#ifdef HAVE_CONFIG_H +# include +#endif + +#include +#include +#include +#include +#include + +#define EPHYSICS_TEST_THEME "ephysics_test" +#define WIDTH (1280) +#define HEIGHT (720) + +typedef struct _Sandie_Data { + Evas_Object *win; + EPhysics_World *world; + EPhysics_Body *body1, *body2; +} Sandie_Data; + +static void +_body_del(void *data __UNUSED__, EPhysics_Body *body __UNUSED__, + void *event_info) +{ + if (event_info) evas_object_del(event_info); +} + +static void +_world_gravity_x_cb(void *data, Evas_Object *obj, void *event_info __UNUSED__) +{ + EPhysics_World *world = data; + double gravity_y; + + ephysics_world_gravity_get(world, NULL, &gravity_y); + ephysics_world_gravity_set(world, elm_spinner_value_get(obj), gravity_y); +} + +static void +_world_gravity_y_cb(void *data, Evas_Object *obj, void *event_info __UNUSED__) +{ + EPhysics_World *world = data; + double gravity_x; + + ephysics_world_gravity_get(world, &gravity_x, NULL); + ephysics_world_gravity_set(world, gravity_x, elm_spinner_value_get(obj)); +} + +static void +_world_rate_cb(void *data, Evas_Object *obj, void *event_info __UNUSED__) +{ + EPhysics_World *world = data; + + ephysics_world_rate_set(world, elm_spinner_value_get(obj)); +} + +static void +_world_max_sleeping_time_cb(void *data, Evas_Object *obj, + void *event_info __UNUSED__) +{ + EPhysics_World *world = data; + + ephysics_world_max_sleeping_time_set(world, elm_spinner_value_get(obj)); +} + +static void +_world_friction_cb(void *data, Evas_Object *obj, void *event_info __UNUSED__) +{ + Evas_Object *win = data; + + ephysics_body_friction_set(evas_object_data_get(win, "top"), + elm_spinner_value_get(obj)); + ephysics_body_friction_set(evas_object_data_get(win, "bottom"), + elm_spinner_value_get(obj)); + ephysics_body_friction_set(evas_object_data_get(win, "left"), + elm_spinner_value_get(obj)); + ephysics_body_friction_set(evas_object_data_get(win, "right"), + elm_spinner_value_get(obj)); +} + +static void +_world_restitution_cb(void *data, Evas_Object *obj, void *event_info __UNUSED__) +{ + Evas_Object *win = data; + + ephysics_body_restitution_set(evas_object_data_get(win, "top"), + elm_spinner_value_get(obj)); + ephysics_body_restitution_set(evas_object_data_get(win, "bottom"), + elm_spinner_value_get(obj)); + ephysics_body_restitution_set(evas_object_data_get(win, "left"), + elm_spinner_value_get(obj)); + ephysics_body_restitution_set(evas_object_data_get(win, "right"), + elm_spinner_value_get(obj)); +} +/* +static void +_body_type_cb(void *data, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__) +{ + EPhysics_Body *body = data; + EPhysics_World *world; + Evas_Object *body_image; + double mass, rotation, friction, restitution, lin_damping, ang_damping; + double lin_sleeping, ang_sleeping; + + mass = ephysics_body_mass_get(body); + rotation = ephysics_body_rotation_get(body); + friction = ephysics_body_friction_get(body); + restitution = ephysics_body_restitution_get(body); + ephysics_body_damping_get(body, &lin_damping, &ang_damping); + ephysics_body_sleeping_threshold_get(body, &lin_sleeping, &ang_sleeping); + body_image = ephysics_body_evas_object_unset(body); + world = ephysics_body_world_get(body); + + ephysics_body_del(body); + + if (elm_check_state_get(obj)) + { + body = ephysics_body_soft_circle_add(world); + ephysics_body_soft_body_hardness_set(body, 10); + elm_object_disabled_set(evas_object_data_get(obj, "hardness"), EINA_FALSE); + } + else + { + body = ephysics_body_circle_add(world); + elm_object_disabled_set(evas_object_data_get(obj, "hardness"), EINA_TRUE); + } + + body_image = ephysics_body_evas_object_set(body, body_image, EINA_TRUE); + ephysics_body_mass_set(body, mass); + ephysics_body_rotation_set(body, rotation); + ephysics_body_friction_set(body, friction); +} +*/ +static void +_body_material_cb(void *data, Evas_Object *obj, void *event_info __UNUSED__) +{ + EPhysics_Body *body = data; + //Evas_Object *body_image; + + ephysics_body_material_set(body, elm_spinner_value_get(obj)); + + elm_spinner_value_set(evas_object_data_get(obj, "density"), + ephysics_body_density_get(body)); + elm_spinner_value_set(evas_object_data_get(obj, "friction"), + ephysics_body_friction_get(body)); + elm_spinner_value_set(evas_object_data_get(obj, "restitution"), + ephysics_body_restitution_get(body)); +/* + + img_name = elm_spinner_value_get(obj); //name if its possible + evas_object_del(ephysics_body_evas_object_unset(body)); + + body_image = elm_image_add(evas_object_data_get(obj, "win")); + elm_image_file_set( + body_image, PACKAGE_DATA_DIR "/" EPHYSICS_TEST_THEME ".edj", img_name); + evas_object_resize(body_image, 70, 70); + evas_object_move(body_image, 150, 150);//FIX! + evas_object_show(body_image); + ephysics_body_evas_object_set(body, body_image, EINA_TRUE); +*/ +} + +static void +_body_mass_cb(void *data, Evas_Object *obj, void *event_info __UNUSED__) +{ + EPhysics_Body *body = data; + + ephysics_body_mass_set(body, elm_spinner_value_get(obj)); + + elm_spinner_value_set(evas_object_data_get(obj, "density"), 0); +} + +static void +_body_density_cb(void *data, Evas_Object *obj, void *event_info __UNUSED__) +{ + EPhysics_Body *body = data; + + ephysics_body_density_set(body, elm_spinner_value_get(obj)); + + elm_spinner_value_set(evas_object_data_get(obj, "mass"), + ephysics_body_mass_get(body)); +} + +static void +_body_rotation_cb(void *data, Evas_Object *obj, void *event_info __UNUSED__) +{ + EPhysics_Body *body = data; + + ephysics_body_rotation_set(body, elm_spinner_value_get(obj)); +} + +static void +_body_friction_cb(void *data, Evas_Object *obj, void *event_info __UNUSED__) +{ + EPhysics_Body *body = data; + + ephysics_body_friction_set(body, elm_spinner_value_get(obj)); +} + +static void +_body_restitution_cb(void *data, Evas_Object *obj, void *event_info __UNUSED__) +{ + EPhysics_Body *body = data; + + ephysics_body_restitution_set(body, elm_spinner_value_get(obj)); +} + +static void +_body_damping_linear_cb(void *data, Evas_Object *obj, void *event_info __UNUSED__) +{ + EPhysics_Body *body = data; + double angular_damping; + + ephysics_body_damping_get(body, NULL, &angular_damping); + ephysics_body_damping_set(body, elm_spinner_value_get(obj), angular_damping); +} + +static void +_body_damping_angular_cb(void *data, Evas_Object *obj, void *event_info __UNUSED__) +{ + EPhysics_Body *body = data; + double linear_damping; + + ephysics_body_damping_get(body, &linear_damping, NULL); + ephysics_body_damping_set(body, linear_damping, elm_spinner_value_get(obj)); +} + +static void +_body_sleeping_threshold_linear_cb(void *data, Evas_Object *obj, void *event_info __UNUSED__) +{ + EPhysics_Body *body = data; + double angular_sleeping; + + ephysics_body_sleeping_threshold_get(body, NULL, &angular_sleeping); + ephysics_body_sleeping_threshold_set(body, elm_spinner_value_get(obj), + angular_sleeping); +} + +static void +_body_sleeping_threshold_angular_cb(void *data, Evas_Object *obj, void *event_info __UNUSED__) +{ + EPhysics_Body *body = data; + double linear_sleeping; + + ephysics_body_sleeping_threshold_get(body, &linear_sleeping, NULL); + ephysics_body_sleeping_threshold_set(body, linear_sleeping, + elm_spinner_value_get(obj)); +} + +static void +_body_torque_cb(void *data, Evas_Object *obj, void *event_info __UNUSED__) +{ + EPhysics_Body *body = data; + + ephysics_body_torque_apply(body, elm_spinner_value_get(obj)); +} + +static void +_body_impulse_x_x_cb(void *data, Evas_Object *obj, void *event_info __UNUSED__) +{ + EPhysics_Body *body = data; + Evas_Coord rel_x, rel_y; + double y; + + y = elm_spinner_value_get(evas_object_data_get(obj, "y")); + rel_x = elm_spinner_value_get(evas_object_data_get(obj, "relx")); + rel_y = elm_spinner_value_get(evas_object_data_get(obj, "rely")); + + ephysics_body_impulse_apply(body, elm_spinner_value_get(obj), y, rel_x, + rel_y); +} + +static void +_body_impulse_x_rel_cb(void *data, Evas_Object *obj, void *event_info __UNUSED__) +{ + EPhysics_Body *body = data; + Evas_Object *aux; + Evas_Coord rel_y; + double x, y; + + aux = evas_object_data_get(obj, "x"); + + x = elm_spinner_value_get(aux); + y = elm_spinner_value_get(evas_object_data_get(aux, "y")); + rel_y = elm_spinner_value_get(evas_object_data_get(aux, "rely")); + + ephysics_body_impulse_apply(body, x, y, elm_spinner_value_get(obj), rel_y); +} + +static void +_body_impulse_y_y_cb(void *data, Evas_Object *obj, void *event_info __UNUSED__) +{ + EPhysics_Body *body = data; + Evas_Object *aux; + Evas_Coord rel_x, rel_y; + double x; + + aux = evas_object_data_get(obj, "x"); + + x = elm_spinner_value_get(aux); + rel_x = elm_spinner_value_get(evas_object_data_get(aux, "relx")); + rel_y = elm_spinner_value_get(evas_object_data_get(aux, "rely")); + + ephysics_body_impulse_apply(body, x, elm_spinner_value_get(obj), rel_x, + rel_y); +} + +static void +_body_impulse_y_rel_cb(void *data, Evas_Object *obj, void *event_info __UNUSED__) +{ + EPhysics_Body *body = data; + Evas_Object *aux; + Evas_Coord rel_x; + double x, y; + + aux = evas_object_data_get(obj, "x"); + + x = elm_spinner_value_get(aux); + y = elm_spinner_value_get(evas_object_data_get(aux, "y")); + rel_x = elm_spinner_value_get(evas_object_data_get(aux, "relx")); + + ephysics_body_impulse_apply(body, x, y, rel_x, elm_spinner_value_get(obj)); +} + +static void +_body_force_x_x_cb(void *data, Evas_Object *obj, void *event_info __UNUSED__) +{ + EPhysics_Body *body = data; + Evas_Coord rel_x, rel_y; + double y; + + y = elm_spinner_value_get(evas_object_data_get(obj, "y")); + rel_x = elm_spinner_value_get(evas_object_data_get(obj, "relx")); + rel_y = elm_spinner_value_get(evas_object_data_get(obj, "rely")); + + ephysics_body_force_apply(body, elm_spinner_value_get(obj), y, rel_x, rel_y); +} + +static void +_body_force_x_rel_cb(void *data, Evas_Object *obj, void *event_info __UNUSED__) +{ + EPhysics_Body *body = data; + Evas_Object *aux; + Evas_Coord rel_y; + double x, y; + + aux = evas_object_data_get(obj, "x"); + + x = elm_spinner_value_get(aux); + y = elm_spinner_value_get(evas_object_data_get(aux, "y")); + rel_y = elm_spinner_value_get(evas_object_data_get(aux, "rely")); + + ephysics_body_force_apply(body, x, y, elm_spinner_value_get(obj), rel_y); +} + +static void +_body_force_y_y_cb(void *data, Evas_Object *obj, void *event_info __UNUSED__) +{ + EPhysics_Body *body = data; + Evas_Object *aux; + Evas_Coord rel_x, rel_y; + double x; + + aux = evas_object_data_get(obj, "x"); + + x = elm_spinner_value_get(aux); + rel_x = elm_spinner_value_get(evas_object_data_get(aux, "relx")); + rel_y = elm_spinner_value_get(evas_object_data_get(aux, "rely")); + + ephysics_body_force_apply(body, x, elm_spinner_value_get(obj), rel_x, rel_y); +} + +static void +_body_force_y_rel_cb(void *data, Evas_Object *obj, void *event_info __UNUSED__) +{ + EPhysics_Body *body = data; + Evas_Object *aux; + Evas_Coord rel_x; + double x, y; + + aux = evas_object_data_get(obj, "x"); + + x = elm_spinner_value_get(aux); + y = elm_spinner_value_get(evas_object_data_get(aux, "y")); + rel_x = elm_spinner_value_get(evas_object_data_get(aux, "relx")); + + ephysics_body_force_apply(body, x, y, rel_x, elm_spinner_value_get(obj)); +} + +static void +_body_linear_velocity_x_cb(void *data, Evas_Object *obj, void *event_info __UNUSED__) +{ + EPhysics_Body *body = data; + double ylinear; + + ylinear = elm_spinner_value_get(evas_object_data_get(obj, "y")); + ephysics_body_linear_velocity_set(body, elm_spinner_value_get(obj), ylinear); +} + +static void +_body_linear_velocity_y_cb(void *data, Evas_Object *obj, void *event_info __UNUSED__) +{ + EPhysics_Body *body = data; + double xlinear; + + xlinear = elm_spinner_value_get(evas_object_data_get(obj, "x")); + ephysics_body_linear_velocity_set(body, xlinear, elm_spinner_value_get(obj)); +} + +static void +_body_angular_velocity_cb(void *data, Evas_Object *obj, void *event_info __UNUSED__) +{ + EPhysics_Body *body = data; + + ephysics_body_angular_velocity_set(body, elm_spinner_value_get(obj)); +} +/* +static void +_body_hardness_cb(void *data, Evas_Object *obj, void *event_info __UNUSED__) +{ + EPhysics_Body *body = data; + + ephysics_body_soft_body_hardness_set(body, elm_spinner_value_get(obj)); +} +*/ +static void +_sandie_label_add(Evas_Object *win, Evas_Object *bxparent, + const char *subcategory) +{ + Evas_Object *label; + + label = elm_label_add(win); + elm_object_text_set(label, subcategory); + elm_box_pack_end(bxparent, label); + evas_object_show(label); +} + +static Evas_Object * +_sandie_enum_add(Evas_Object *win, Evas_Object *bxparent, + const char *subcategory) +{ + Evas_Object *sp; + + _sandie_label_add(win, bxparent, subcategory); + + sp = elm_spinner_add(win); + elm_spinner_wrap_set(sp, EINA_TRUE); + elm_spinner_min_max_set(sp, 0, 6); + elm_spinner_value_set(sp, 0); + elm_spinner_step_set(sp, 1); + elm_spinner_label_format_set(sp, "%.0f"); + elm_spinner_editable_set(sp, EINA_FALSE); + + elm_spinner_special_value_add(sp, EPHYSICS_BODY_MATERIAL_CUSTOM, "Custom"); + elm_spinner_special_value_add(sp, EPHYSICS_BODY_MATERIAL_CONCRETE, "Concrete"); + elm_spinner_special_value_add(sp, EPHYSICS_BODY_MATERIAL_IRON, "Iron"); + elm_spinner_special_value_add(sp, EPHYSICS_BODY_MATERIAL_PLASTIC, "Plastic"); + elm_spinner_special_value_add(sp, EPHYSICS_BODY_MATERIAL_POLYSTYRENE, "Polystyrene"); + elm_spinner_special_value_add(sp, EPHYSICS_BODY_MATERIAL_RUBBER, "Rubber"); + elm_spinner_special_value_add(sp, EPHYSICS_BODY_MATERIAL_WOOD, "Wood"); + + evas_object_size_hint_align_set(sp, EVAS_HINT_FILL, 0.5); + evas_object_size_hint_weight_set(sp, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + elm_box_pack_end(bxparent, sp); + evas_object_show(sp); + + evas_object_data_set(sp, "win", win); + + return sp; +} + +static Evas_Object * +_sandie_toggle_add(Evas_Object *win, Evas_Object *bxparent, + const char *subcategory, const char *labeloff, + const char *labelon) +{ + Evas_Object *tg; + + _sandie_label_add(win, bxparent, subcategory); + + tg = elm_check_add(win); + elm_object_style_set(tg, "toggle"); + elm_object_part_text_set(tg, "off", labeloff); + elm_object_part_text_set(tg, "on", labelon); + evas_object_size_hint_align_set(tg, 0.5, 0.5); + evas_object_size_hint_weight_set(tg, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + elm_box_pack_end(bxparent, tg); + evas_object_show(tg); + + return tg; +} + +static Evas_Object * +_sandie_spinner_add(Evas_Object *win, Evas_Object *bxparent, + const char *subcategory, const char *itemlb, float min, + float max, float initial, float step) +{ + Evas_Object *sp; + + _sandie_label_add(win, bxparent, subcategory); + + sp = elm_spinner_add(win); + elm_spinner_label_format_set(sp, itemlb); + elm_spinner_step_set(sp, step); + elm_spinner_wrap_set(sp, ELM_WRAP_CHAR); + elm_spinner_value_set(sp, initial); + elm_spinner_min_max_set(sp, min, max); + evas_object_size_hint_align_set(sp, EVAS_HINT_FILL, 0.5); + evas_object_size_hint_weight_set(sp, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + elm_box_pack_end(bxparent, sp); + evas_object_show(sp); + + return sp; +} + +static Evas_Object * +_sandie_double_spinner_box_add(Evas_Object *win, Evas_Object *bxparent, + const char *subcategory) +{ + Evas_Object *dbx; + + _sandie_label_add(win, bxparent, subcategory); + + dbx = elm_box_add(win); + elm_box_horizontal_set(dbx, EINA_TRUE); + evas_object_size_hint_weight_set(dbx, EVAS_HINT_EXPAND, 0.0); + evas_object_size_hint_align_set(dbx, EVAS_HINT_FILL, 0.0); + elm_box_align_set(dbx, 0.0, 0.5); + elm_box_pack_end(bxparent, dbx); + evas_object_show(dbx); + + return dbx; +} + +static Evas_Object * +_category_add(Evas_Object *win, Evas_Object *bxparent, const char *label) +{ + Evas_Object *cfr, *cbx; + + cfr = elm_frame_add(win); + elm_frame_autocollapse_set(cfr, EINA_TRUE); + elm_object_text_set(cfr, label); + evas_object_size_hint_weight_set(cfr, EVAS_HINT_EXPAND, 0.0); + evas_object_size_hint_fill_set(cfr, EVAS_HINT_FILL, 0.0); + elm_box_pack_end(bxparent, cfr); + evas_object_show(cfr); + + cbx = elm_box_add(win); + elm_box_horizontal_set(cbx, EINA_FALSE); + evas_object_size_hint_weight_set(cbx, EVAS_HINT_EXPAND, 0.0); + evas_object_size_hint_align_set(cbx, EVAS_HINT_FILL, 0.0); + elm_box_align_set(cbx, 0.0, 0.5); + elm_object_content_set(cfr, cbx); + evas_object_show(cbx); + + return cbx; +} + +static void +_menu_body_items_create(Evas_Object *win, Evas_Object *bxparent, + const char *category, EPhysics_Body *body) +{ + Evas_Object *bx, *dbx, *widget, *aux_widget, *material_widget, *type_widget; + + bx = _category_add(win, bxparent, category); + type_widget = _sandie_toggle_add(win, bx, "Body Type", "Solid", "Soft"); + material_widget = _sandie_enum_add(win, bx, "Body Material"); + aux_widget = _sandie_spinner_add(win, bx, "Mass", "%1.3f kg", + 0, 100, 15, 2); + widget = _sandie_spinner_add(win, bx, "Density", "%1.3f kg/m³", + 0, 9999, 0, 2); + evas_object_data_set(aux_widget, "density", widget); + evas_object_data_set(material_widget, "density", widget); + evas_object_smart_callback_add(aux_widget, "delay,changed", _body_mass_cb, body); + evas_object_data_set(widget, "mass", aux_widget); + evas_object_smart_callback_add(widget, "delay,changed", _body_density_cb, body); + widget = _sandie_spinner_add(win, bx, "Rotation", "%1.0fº", + -360, 360, 0, 2); + evas_object_smart_callback_add(widget, "delay,changed", _body_rotation_cb, body); + widget = _sandie_spinner_add(win, bx, "Friction", "%1.3f", + 0, 1, 0.5, 0.05); + evas_object_data_set(material_widget, "friction", widget); + evas_object_smart_callback_add(widget, "delay,changed", _body_friction_cb, body); + widget = _sandie_spinner_add(win, bx, "Restitution", "%1.3f", + 0, 1, 0, 0.05); + evas_object_data_set(material_widget, "restitution", widget); + evas_object_smart_callback_add(material_widget, "delay,changed", _body_material_cb, body); + evas_object_smart_callback_add(widget, "delay,changed", _body_restitution_cb, body); + dbx = _sandie_double_spinner_box_add(win, bx, "Damping"); + widget = _sandie_spinner_add(win, dbx, "Linear:", "%1.3f", + 0, 1, 0, 0.05); + evas_object_smart_callback_add(widget, "delay,changed", _body_damping_linear_cb, body); + widget = _sandie_spinner_add(win, dbx, "Angular:", "%1.3f", + 0, 1, 0, 0.05); + evas_object_smart_callback_add(widget, "delay,changed", _body_damping_angular_cb, body); + dbx = _sandie_double_spinner_box_add(win, bx, "Sleeping Threshold"); + widget = _sandie_spinner_add(win, dbx, "Linear:", "%1.2f p/s", + 0, 100, 0, 2); + evas_object_smart_callback_add(widget, "delay,changed", _body_sleeping_threshold_linear_cb, body); + widget = _sandie_spinner_add(win, dbx, "Angular:", "%1.2f º/s", + 0, 360, 0, 2); + evas_object_smart_callback_add(widget, "delay,changed", _body_sleeping_threshold_angular_cb, body); + widget = _sandie_spinner_add(win, bx, "Torque", "%1.3f", + 0, 1, 0.5, 0.05); + evas_object_smart_callback_add(widget, "delay,changed", _body_torque_cb, body); + + //Impulse needs four values + dbx = _sandie_double_spinner_box_add(win, bx, "Impulse X"); + aux_widget = _sandie_spinner_add(win, dbx, "X:", "%1.3f kg * p/s", + -360, 360, 0, 2); + widget = _sandie_spinner_add(win, dbx, "Rel Position X:", "%1.2f", + 0, 360, 0, 2); + evas_object_data_set(aux_widget, "relx", widget); + dbx = _sandie_double_spinner_box_add(win, bx, "Impulse Y"); + widget = _sandie_spinner_add(win, dbx, "Y:", "%1.3f kg * p/s", + -360, 360, 0, 2); + evas_object_data_set(aux_widget, "y", widget); + widget = _sandie_spinner_add(win, dbx, "Rel Position Y:", "%1.2f", + 0, 360, 0, 2); + evas_object_data_set(aux_widget, "rely", widget); + evas_object_smart_callback_add(aux_widget, "delay,changed", _body_impulse_x_x_cb, body); + evas_object_data_set(widget, "x", aux_widget); + evas_object_smart_callback_add(widget, "delay,changed", _body_impulse_x_rel_cb, body); + widget = evas_object_data_get(aux_widget, "y"); + evas_object_data_set(widget, "x", aux_widget); + evas_object_smart_callback_add(widget, "delay,changed", _body_impulse_y_y_cb, body); + widget = evas_object_data_get(aux_widget, "relx"); + evas_object_data_set(widget, "x", aux_widget); + evas_object_smart_callback_add(widget, "delay,changed", _body_impulse_y_rel_cb, body); + + //Force needs four values + dbx = _sandie_double_spinner_box_add(win, bx, "Force X"); + aux_widget = _sandie_spinner_add(win, dbx, "X:", "%1.3f kg * p/s/s", + -360, 360, 0, 2); + widget = _sandie_spinner_add(win, dbx, "Rel Position X:", "%1.2f", + 0, 360, 0, 2); + evas_object_data_set(aux_widget, "relx", widget); + dbx = _sandie_double_spinner_box_add(win, bx, "Force Y"); + widget = _sandie_spinner_add(win, dbx, "Y:", "%1.3f kg * p/s/s", + -360, 360, 0, 2); + evas_object_data_set(aux_widget, "y", widget); + widget = _sandie_spinner_add(win, dbx, "Rel Position Y:", "%1.2f", + 0, 360, 0, 2); + evas_object_data_set(aux_widget, "rely", widget); + evas_object_smart_callback_add(aux_widget, "delay,changed", _body_force_x_x_cb, body); + evas_object_data_set(widget, "x", aux_widget); + evas_object_smart_callback_add(widget, "delay,changed", _body_force_x_rel_cb, body); + widget = evas_object_data_get(aux_widget, "y"); + evas_object_data_set(widget, "x", aux_widget); + evas_object_smart_callback_add(widget, "delay,changed", _body_force_y_y_cb, body); + widget = evas_object_data_get(aux_widget, "relx"); + evas_object_data_set(widget, "x", aux_widget); + evas_object_smart_callback_add(widget, "delay,changed", _body_force_y_rel_cb, body); + + dbx = _sandie_double_spinner_box_add(win, bx, "Linear Velocity"); + aux_widget = _sandie_spinner_add(win, dbx, "X:", "%1.2f p/s", + -800, 800, 0, 2); + widget = _sandie_spinner_add(win, dbx, "Y:", "%1.2f p/s", + -800, 800, 0, 2); + evas_object_data_set(aux_widget, "y", widget); + evas_object_smart_callback_add(aux_widget, "delay,changed", _body_linear_velocity_x_cb, body); + evas_object_data_set(widget, "x", aux_widget); + evas_object_smart_callback_add(widget, "delay,changed", _body_linear_velocity_y_cb, body); + + widget = _sandie_spinner_add(win, bx, "Angular Velocity", "%1.2f º/s", + 0, 360, 0, 2); + evas_object_smart_callback_add(widget, "delay,changed", _body_angular_velocity_cb, body); +/* widget = _sandie_spinner_add(win, bx, "Soft Body Hardness", "%1.2f%%", + 0, 100, 100, 2); + elm_object_disabled_set(widget, EINA_TRUE); + evas_object_smart_callback_add(widget, "delay,changed", _body_hardness_cb, body); + evas_object_data_set(type_widget, "hardness", widget); + evas_object_smart_callback_add(type_widget, "changed", _body_type_cb, body);//FIX CB +*/ +} + +static EPhysics_Body * +_sandie_body_add(Evas_Object *win, EPhysics_World *world, int x, int y) +{ + Evas_Object *body_image; + EPhysics_Body *body; + + body_image = elm_image_add(win); + elm_image_file_set( + body_image, PACKAGE_DATA_DIR "/" EPHYSICS_TEST_THEME ".edj", "big-blue-ball"); + evas_object_resize(body_image, 70, 70); + evas_object_move(body_image, x, y); + evas_object_show(body_image); + + body = ephysics_body_circle_add(world); + ephysics_body_evas_object_set(body, body_image, EINA_TRUE); + ephysics_body_mass_set(body, 20); + ephysics_body_central_impulse_apply(body, 8201, 2110); + ephysics_body_event_callback_add(body, EPHYSICS_CALLBACK_BODY_DEL, + _body_del, NULL); + + return body; +} +static void +_menu_items_create(Evas_Object *win, Evas_Object *bxparent, + EPhysics_World *world) +{ + Evas_Object *bx, *dbx, *widget; + + bx = _category_add(win, bxparent, "EPhysics World"); + dbx = _sandie_double_spinner_box_add(win, bx, "Gravity"); + widget = _sandie_spinner_add(win, dbx, "X:", "%1.2f m/s²", + 0, 100, 0, 2); + evas_object_smart_callback_add(widget, "delay,changed", _world_gravity_x_cb, world); + widget = _sandie_spinner_add(win, dbx, "Y:", "%1.2f m/s²", + 0, 100, 9.81, 2); + evas_object_smart_callback_add(widget, "delay,changed", _world_gravity_y_cb, world); + widget = _sandie_spinner_add(win, bx, "Rate", "%1.0f pixel/meter", + 0, 100, 20, 2); + evas_object_smart_callback_add(widget, "delay,changed", _world_rate_cb, world); + widget = _sandie_spinner_add(win, bx, "Max Sleeping Time", "%1.0f s", + 0, 100, 2, 2); + evas_object_smart_callback_add(widget, "delay,changed", _world_max_sleeping_time_cb, world); + + bx = _category_add(win, bxparent, "EPhysics Boundaries"); + widget = _sandie_spinner_add(win, bx, "Friction", "%1.3f", + 0, 1, 0.5, 0.05); + evas_object_data_set(widget, "win", win); + evas_object_smart_callback_add(widget, "delay,changed", _world_friction_cb, win); + widget = _sandie_spinner_add(win, bx, "Restitution", "%1.3f", + 0, 1, 0, 0.05); + evas_object_smart_callback_add(widget, "delay,changed", _world_restitution_cb, win); +} + +static void +_world_populate(Sandie_Data *sandie, Evas_Object *bxparent) +{ + sandie->body1 = _sandie_body_add(sandie->win, sandie->world, (int) WIDTH / 4, + (int) HEIGHT / 5); + sandie->body2 = _sandie_body_add(sandie->win, sandie->world, (int) WIDTH / 4, + (int) HEIGHT / 2); + + _menu_body_items_create(sandie->win, bxparent, "EPhysics Body 1", + sandie->body1); + _menu_body_items_create(sandie->win, bxparent, "EPhysics Body 2", + sandie->body2); + +} + +static void +_restart(void *data, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__) +{ + Sandie_Data *sandie = data; + + ephysics_body_del(sandie->body1); + ephysics_body_del(sandie->body2); +} + +static Evas_Object * +_menu_create(Sandie_Data *sandie) +{ + Evas_Object *bx0, *fr, *lb, *bt, *sc, *bxparent, *layout; + + layout = evas_object_data_get(sandie->win, "layout"); + + bx0 = elm_box_add(sandie->win); + evas_object_size_hint_weight_set(bx0, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + elm_object_part_content_set(layout, "swallow", bx0); + evas_object_show(bx0); + + fr = elm_frame_add(sandie->win); + elm_frame_autocollapse_set(fr, EINA_TRUE); + elm_object_text_set(fr, "Information"); + elm_box_pack_end(bx0, fr); + evas_object_show(fr); + + lb = elm_label_add(sandie->win); + elm_object_text_set(lb, + "Please modify physical parameters below
" + "the test button to show the test window."); + elm_object_content_set(fr, lb); + evas_object_show(lb); + + bt = elm_button_add(sandie->win); + elm_object_text_set(bt, " Try "); + elm_box_pack_end(bx0, bt); + evas_object_show(bt); + evas_object_smart_callback_add(bt, "clicked", _restart, sandie); + + sc = elm_scroller_add(sandie->win); + elm_scroller_bounce_set(sc, EINA_FALSE, EINA_TRUE); + elm_scroller_policy_set(sc, ELM_SCROLLER_POLICY_OFF, ELM_SCROLLER_POLICY_ON); + evas_object_size_hint_weight_set(sc, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_fill_set(sc, EVAS_HINT_FILL, EVAS_HINT_FILL); + elm_box_pack_end(bx0, sc); + evas_object_show(sc); + + bxparent = elm_box_add(sandie->win); + evas_object_size_hint_weight_set(bxparent, EVAS_HINT_EXPAND, 0.0); + evas_object_size_hint_align_set(bxparent, EVAS_HINT_FILL, 0.0); + elm_object_content_set(sc, bxparent); + evas_object_show(bxparent); + + _menu_items_create(sandie->win, bxparent, sandie->world); + + return bxparent; +} + +static EPhysics_World * +_sandie_world_add(Evas_Object *win) +{ + EPhysics_World *world; + + world = ephysics_world_new(); + ephysics_world_render_geometry_set(world, 80, 80, (int) WIDTH * 0.7 - 160, + HEIGHT - 160); + evas_object_data_set(win, "top", ephysics_body_top_boundary_add(world)); + evas_object_data_set(win, "bottom", ephysics_body_bottom_boundary_add(world)); + evas_object_data_set(win, "left", ephysics_body_left_boundary_add(world)); + evas_object_data_set(win, "right", ephysics_body_right_boundary_add(world)); + + return world; +} + +EAPI int +elm_main() +{ + Sandie_Data *sandie; + Evas_Object *layout, *bxparent; + short int r = 0; + + if (!ephysics_init()) + { + printf("\nFailed to init ephysics");//ERR + r = -1; + goto shutdown; + } + + sandie = calloc(1, sizeof(Sandie_Data)); + if (!sandie) + { + printf("Failed to alloc sandie data");//ERR + r = -1; + return r; + } + + elm_theme_extension_add(NULL, PACKAGE_DATA_DIR "/" EPHYSICS_TEST_THEME ".edj"); + + sandie->win = elm_win_add(NULL, "Sandbox", ELM_WIN_BASIC); + + elm_win_title_set(sandie->win, "EPhysics Sandbox"); + evas_object_resize(sandie->win, WIDTH, HEIGHT); + elm_win_screen_constrain_set(sandie->win, EINA_TRUE); + elm_win_autodel_set(sandie->win, EINA_TRUE); + elm_policy_set(ELM_POLICY_QUIT, ELM_POLICY_QUIT_LAST_WINDOW_CLOSED); + + layout = elm_layout_add(sandie->win); + evas_object_size_hint_weight_set(layout, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + elm_win_resize_object_add(sandie->win, layout); + elm_layout_file_set(layout, PACKAGE_DATA_DIR "/" EPHYSICS_TEST_THEME ".edj", + "sandbox"); + evas_object_show(layout); + evas_object_data_set(sandie->win, "layout", layout); + + evas_object_show(sandie->win); + + sandie->world = _sandie_world_add(sandie->win); + + bxparent = _menu_create(sandie); + + _world_populate(sandie, bxparent); + + elm_run(); + +shutdown: + ephysics_shutdown(); + + elm_shutdown(); + + return r; +} +ELM_MAIN()