edje: support body's rotation
It's going as an action / script instead of an attribute because it wouldn't fit well as a description. Rotation can be modified by many circustancies, keeping as state wouldn't make sense. SVN revision: 80610
This commit is contained in:
parent
c4832ceda5
commit
6b40542d58
|
@ -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);
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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";
|
||||
|
|
|
@ -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;
|
||||
|
||||
/**
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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
|
||||
}
|
||||
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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);
|
||||
|
|
Loading…
Reference in New Issue