diff --git a/legacy/edje/data/include/edje.inc b/legacy/edje/data/include/edje.inc index 91215cee34..2eead3bc87 100644 --- a/legacy/edje/data/include/edje.inc +++ b/legacy/edje/data/include/edje.inc @@ -245,6 +245,8 @@ native play_tone (tone_name[], Float:duration); * physics_set_velocity(PART:"logo", 40.5, 0, 0); * physics_set_ang_velocity(PART:"logo", 0, 0, -3); * physics_stop(PART:"logo"); + * + * physics_set_rotation(PART:"logo", 0.707, 0, 0, 0.707); */ native physics_impulse (part_id, Float:x, Float:y, Float:z); native physics_torque_impulse (part_id, Float:x, Float:y, Float:z); @@ -260,3 +262,6 @@ native physics_get_velocity (part_id, &Float:x, &Float:y, &Float:z); native physics_set_ang_velocity (part_id, Float:x, Float:y, Float:z); native physics_get_ang_velocity (part_id, &Float:x, &Float:y, &Float:z); native physics_stop (part_id); + +native physics_set_rotation (part_id, Float:w, Float:x, Float:y, Float:z); +native physics_get_rotation (part_id, &Float:w, &Float:x, &Float:y, &Float:z); diff --git a/legacy/edje/src/bin/edje_cc_handlers.c b/legacy/edje/src/bin/edje_cc_handlers.c index e96b52584a..85b6ce0bec 100644 --- a/legacy/edje/src/bin/edje_cc_handlers.c +++ b/legacy/edje/src/bin/edje_cc_handlers.c @@ -8230,7 +8230,7 @@ st_collections_group_programs_program_in(void) FOCUS_SET, PARAM_COPY, PARAM_SET, PLAY_SAMPLE, PLAY_TONE, PHYSICS_IMPULSE, PHYSICS_TORQUE_IMPULSE, PHYSICS_FORCE, PHYSICS_TORQUE, PHYSICS_FORCES_CLEAR, PHYSICS_VEL_SET, PHYSICS_ANG_VEL_SET, - PHYSICS_STOP + PHYSICS_STOP, PHYSICS_ROT_SET Only one action can be specified per program. Examples:\n action: STATE_SET "statename" 0.5;\n action: ACTION_STOP;\n @@ -8252,6 +8252,7 @@ st_collections_group_programs_program_in(void) action: PHYSICS_VEL_SET 40.9 0 0;\n action: PHYSICS_ANG_VEL_SET 12.4 0 0.66;\n action: PHYSICS_STOP;\n + action: PHYSICS_ROT_SET 0.707 0 0 0.707;\n @endproperty */ static void @@ -8288,6 +8289,7 @@ st_collections_group_programs_program_action(void) "PHYSICS_ANG_VEL_SET", EDJE_ACTION_TYPE_PHYSICS_ANG_VEL_SET, "PHYSICS_STOP", EDJE_ACTION_TYPE_PHYSICS_STOP, + "PHYSICS_ROT_SET", EDJE_ACTION_TYPE_PHYSICS_ROT_SET, NULL); if (ep->action == EDJE_ACTION_TYPE_STATE_SET) { @@ -8385,6 +8387,13 @@ st_collections_group_programs_program_action(void) ep->physics.y = parse_float(2); ep->physics.z = parse_float(3); } + else if (ep->action == EDJE_ACTION_TYPE_PHYSICS_ROT_SET) + { + ep->physics.w = parse_float(1); + ep->physics.x = parse_float(2); + ep->physics.y = parse_float(3); + ep->physics.z = parse_float(4); + } #endif switch (ep->action) @@ -8410,6 +8419,7 @@ st_collections_group_programs_program_action(void) check_arg_count(4); break; case EDJE_ACTION_TYPE_PARAM_COPY: + case EDJE_ACTION_TYPE_PHYSICS_ROT_SET: check_arg_count(5); break; default: @@ -8612,6 +8622,7 @@ st_collections_group_programs_program_target(void) case EDJE_ACTION_TYPE_PHYSICS_VEL_SET: case EDJE_ACTION_TYPE_PHYSICS_ANG_VEL_SET: case EDJE_ACTION_TYPE_PHYSICS_STOP: + case EDJE_ACTION_TYPE_PHYSICS_ROT_SET: #endif data_queue_part_lookup(pc, name, &(et->id)); break; diff --git a/legacy/edje/src/examples/physics_actions.edc b/legacy/edje/src/examples/physics_actions.edc index ea2d6b05d1..7ff18942dd 100644 --- a/legacy/edje/src/examples/physics_actions.edc +++ b/legacy/edje/src/examples/physics_actions.edc @@ -23,6 +23,9 @@ * signal counterclockwise velocity -> will set a counterclockwise velocity * in blue ball * signal stop velocity -> will stop the blue ball + * signal clockwise rotation -> will rotate blue ball 90o degrees clockwise + * signal counterclockwise rotation -> will rotate blue ball 90o degrees + * counterclockwise * * message 1 FLOAT_SET 3 50 -100 0 -> apply an impulse on blue ball with * x = 50, y = -100, z = 0, for example @@ -48,6 +51,9 @@ * message 11 STRING "blue_circle" -> return a message with part's angular * velocity. * message 12 STRING "blue_circle" -> stop the part. + * message 13 FLOAT_SET 4 0.707 0 0 0.707 -> set blue ball rotation with + * quaternion w = 0.707, x = 0, y = 0, z = 0.707 + * message 14 STRING "blue_circle" -> return a message with part's rotation */ #define ID_IMPULSE (1) @@ -62,6 +68,8 @@ #define ID_ANG_VEL_SET (10) #define ID_ANG_VEL_GET (11) #define ID_STOP (12) +#define ID_ROT_SET (13) +#define ID_ROT_GET (14) collections { @@ -178,6 +186,25 @@ collections { if (!pid) return; physics_stop(pid); } + else if ((id == ID_ROT_SET) && (type == MSG_FLOAT_SET)) { + new Float:w, Float:x, Float:y, Float:z; + new n = numargs(); + if (n < 6) return; + w = getfarg(2); + x = getfarg(3); + y = getfarg(4); + z = getfarg(5); + physics_set_rotation(PART:"blue_circle", w, x, y, z); + } + else if ((id == ID_ROT_GET) && (type == MSG_STRING)) { + new Float:w, Float:x, Float:y, Float:z; + new pid, name[1024]; + getsarg(2, name, sizeof(name)); + pid = get_part_id(name); + if (!pid) return; + physics_get_rotation(pid, w, x, y, z); + send_message(MSG_FLOAT_SET, id, w, x, y, z); + } } } @@ -451,6 +478,22 @@ collections { target: "blue_circle"; } + program { + name: "rotation_clockwise"; + signal: "clockwise"; + source: "rotation"; + action: PHYSICS_ROT_SET 0.707 0 0 0.707; + target: "blue_circle"; + } + + program { + name: "rotation_counterclockwise"; + signal: "counterclockwise"; + source: "rotation"; + action: PHYSICS_ROT_SET 0.707 0 0 -0.707; + target: "blue_circle"; + } + program { name: "customize"; signal: "custom"; diff --git a/legacy/edje/src/lib/Edje.h b/legacy/edje/src/lib/Edje.h index 4854b0413f..bcc2b947ef 100644 --- a/legacy/edje/src/lib/Edje.h +++ b/legacy/edje/src/lib/Edje.h @@ -4155,7 +4155,8 @@ typedef enum _Edje_Action_Type EDJE_ACTION_TYPE_PHYSICS_VEL_SET = 20, /**< @since 1.8 */ EDJE_ACTION_TYPE_PHYSICS_ANG_VEL_SET = 21, /**< @since 1.8 */ EDJE_ACTION_TYPE_PHYSICS_STOP = 22, /**< @since 1.8 */ - EDJE_ACTION_TYPE_LAST = 23 + EDJE_ACTION_TYPE_PHYSICS_ROT_SET = 23, /**< @since 1.8 */ + EDJE_ACTION_TYPE_LAST = 24 } Edje_Action_Type; /** diff --git a/legacy/edje/src/lib/edje_data.c b/legacy/edje/src/lib/edje_data.c index 78d5e1fbfa..37ad445f69 100644 --- a/legacy/edje/src/lib/edje_data.c +++ b/legacy/edje/src/lib/edje_data.c @@ -437,6 +437,7 @@ _edje_edd_init(void) EET_DATA_DESCRIPTOR_ADD_BASIC(_edje_edd_edje_program, Edje_Program, "param.dst", param.dst, EET_T_INT); #ifdef HAVE_EPHYSICS + EET_DATA_DESCRIPTOR_ADD_BASIC(_edje_edd_edje_program, Edje_Program, "physics.w", physics.w, EET_T_DOUBLE); EET_DATA_DESCRIPTOR_ADD_BASIC(_edje_edd_edje_program, Edje_Program, "physics.x", physics.x, EET_T_DOUBLE); EET_DATA_DESCRIPTOR_ADD_BASIC(_edje_edd_edje_program, Edje_Program, "physics.y", physics.y, EET_T_DOUBLE); EET_DATA_DESCRIPTOR_ADD_BASIC(_edje_edd_edje_program, Edje_Program, "physics.z", physics.z, EET_T_DOUBLE); diff --git a/legacy/edje/src/lib/edje_embryo.c b/legacy/edje/src/lib/edje_embryo.c index bb64480220..0050c673e8 100644 --- a/legacy/edje/src/lib/edje_embryo.c +++ b/legacy/edje/src/lib/edje_embryo.c @@ -212,6 +212,8 @@ * physics_set_ang_velocity(part_id, Float:x, Float:y, Float:z) * physics_get_ang_velocity(part_id, &Float:x, &Float:y, &Float:z) * physics_stop(part_id) + * physics_set_rotation(part_id, Float:w, Float:x, Float:y, Float:z) + * physics_get_rotation(part_id, &Float:w, &Float:x, &Float:y, &Float:z) * * ADD/DEL CUSTOM OBJECTS UNDER SOLE EMBRYO SCRIPT CONTROL * @@ -3410,6 +3412,71 @@ _edje_embryo_fn_physics_stop(Embryo_Program *ep, Embryo_Cell *params) return 0; } + +/* physics_set_rotation(part_id, Float:w, Float:x, Float:y, Float:z) */ +static Embryo_Cell +_edje_embryo_fn_physics_set_rotation(Embryo_Program *ep, Embryo_Cell *params) +{ + Edje_Real_Part *rp; + int part_id = 0; + Edje *ed; + + CHKPARAM(5); + + ed = embryo_program_data_get(ep); + part_id = params[1]; + if (part_id < 0) return 0; + + rp = ed->table_parts[part_id % ed->table_parts_size]; + if ((rp) && (rp->body)) + { + EPhysics_Quaternion quat; + double w, x, y, z; + + w = (double) EMBRYO_CELL_TO_FLOAT(params[2]); + x = (double) EMBRYO_CELL_TO_FLOAT(params[3]); + y = (double) EMBRYO_CELL_TO_FLOAT(params[4]); + z = (double) EMBRYO_CELL_TO_FLOAT(params[5]); + + ephysics_quaternion_set(&quat, x, y, z, w); + ephysics_quaternion_normalize(&quat); + ephysics_body_rotation_set(rp->body, &quat); + } + + return 0; +} + +/* physics_get_rotation(part_id, &Float:w, &Float:x, &Float:y, &Float:z) */ +static Embryo_Cell +_edje_embryo_fn_physics_get_rotation(Embryo_Program *ep, Embryo_Cell *params) +{ + Edje_Real_Part *rp; + int part_id = 0; + Edje *ed; + + CHKPARAM(5); + + ed = embryo_program_data_get(ep); + part_id = params[1]; + if (part_id < 0) return 0; + + rp = ed->table_parts[part_id % ed->table_parts_size]; + if ((rp) && (rp->body)) + { + EPhysics_Quaternion quat; + double w, x, y, z; + + ephysics_body_rotation_get(rp->body, &quat); + ephysics_quaternion_get(&quat, &x, &y, &z, &w); + + SETFLOAT(w, params[2]); + SETFLOAT(x, params[3]); + SETFLOAT(y, params[4]); + SETFLOAT(z, params[5]); + } + + return 0; +} #endif void @@ -3520,6 +3587,8 @@ _edje_embryo_script_init(Edje_Part_Collection *edc) embryo_program_native_call_add(ep, "physics_set_ang_velocity", _edje_embryo_fn_physics_set_ang_velocity); embryo_program_native_call_add(ep, "physics_get_ang_velocity", _edje_embryo_fn_physics_get_ang_velocity); embryo_program_native_call_add(ep, "physics_stop", _edje_embryo_fn_physics_stop); + embryo_program_native_call_add(ep, "physics_set_rotation", _edje_embryo_fn_physics_set_rotation); + embryo_program_native_call_add(ep, "physics_get_rotation", _edje_embryo_fn_physics_get_rotation); #endif } diff --git a/legacy/edje/src/lib/edje_private.h b/legacy/edje/src/lib/edje_private.h index be5b587b4c..27172f84b9 100644 --- a/legacy/edje/src/lib/edje_private.h +++ b/legacy/edje/src/lib/edje_private.h @@ -659,6 +659,7 @@ struct _Edje_Program /* a conditional program to be run */ #ifdef HAVE_EPHYSICS /* used for actions related to physics, as physics impulses and forces */ struct { + double w; double x; double y; double z; diff --git a/legacy/edje/src/lib/edje_program.c b/legacy/edje/src/lib/edje_program.c index f6013af163..f1e8a772d2 100644 --- a/legacy/edje/src/lib/edje_program.c +++ b/legacy/edje/src/lib/edje_program.c @@ -1014,6 +1014,26 @@ _edje_program_run(Edje *ed, Edje_Program *pr, Eina_Bool force, const char *ssig, } } break; + case EDJE_ACTION_TYPE_PHYSICS_ROT_SET: + if (_edje_block_break(ed)) + goto break_prog; + EINA_LIST_FOREACH(pr->targets, l, pt) + { + if (pt->id >= 0) + { + rp = ed->table_parts[pt->id % ed->table_parts_size]; + if ((rp) && (rp->body)) + { + EPhysics_Quaternion quat; + ephysics_quaternion_set(&quat, pr->physics.x, + pr->physics.y, pr->physics.z, + pr->physics.w); + ephysics_quaternion_normalize(&quat); + ephysics_body_rotation_set(rp->body, &quat); + } + } + } + break; #endif default: // _edje_emit(ed, "program,start", pr->name);