edje: support torque impulse (action and embryo script)

SVN revision: 80372
This commit is contained in:
Bruno Dilly 2012-12-06 16:58:58 +00:00
parent d82e901802
commit 9f3c938c9c
6 changed files with 113 additions and 18 deletions

View File

@ -226,5 +226,7 @@ native play_tone (tone_name[], Float:duration);
/* Example: /* Example:
* *
* physics_impulse(PART:"logo", 0, 50.8, 0); * physics_impulse(PART:"logo", 0, 50.8, 0);
* physics_torque_impulse(PART:"logo", 0, 0, 3.4);
*/ */
native physics_impulse (part_id, Float:x, Float:y, Float:z); native physics_impulse (part_id, Float:x, Float:y, Float:z);
native physics_torque_impulse (part_id, Float:x, Float:y, Float:z);

View File

@ -8031,7 +8031,7 @@ st_collections_group_programs_program_in(void)
Action to be performed by the program. Valid actions are: STATE_SET, Action to be performed by the program. Valid actions are: STATE_SET,
ACTION_STOP, SIGNAL_EMIT, DRAG_VAL_SET, DRAG_VAL_STEP, DRAG_VAL_PAGE, ACTION_STOP, SIGNAL_EMIT, DRAG_VAL_SET, DRAG_VAL_STEP, DRAG_VAL_PAGE,
FOCUS_SET, PARAM_COPY, PARAM_SET, PLAY_SAMPLE, PLAY_TONE, FOCUS_SET, PARAM_COPY, PARAM_SET, PLAY_SAMPLE, PLAY_TONE,
PHYSICS_IMPULSE PHYSICS_IMPULSE, PHYSICS_TORQUE_IMPULSE
Only one action can be specified per program. Examples:\n Only one action can be specified per program. Examples:\n
action: STATE_SET "statename" 0.5;\n action: STATE_SET "statename" 0.5;\n
action: ACTION_STOP;\n action: ACTION_STOP;\n
@ -8046,6 +8046,7 @@ st_collections_group_programs_program_in(void)
action: PLAY_SAMPLE "sample name";\n action: PLAY_SAMPLE "sample name";\n
action: PLAY_TONE "tone name" duration in seconds ( Range 0.1 to 10.0 );\n action: PLAY_TONE "tone name" duration in seconds ( Range 0.1 to 10.0 );\n
action: PHYSICS_IMPULSE 10 -23.4 0;\n action: PHYSICS_IMPULSE 10 -23.4 0;\n
action: PHYSICS_TORQUE_IMPULSE 0 2.1 0.95;\n
@endproperty @endproperty
*/ */
static void static void
@ -8072,6 +8073,8 @@ st_collections_group_programs_program_action(void)
"PLAY_SAMPLE", EDJE_ACTION_TYPE_SOUND_SAMPLE, "PLAY_SAMPLE", EDJE_ACTION_TYPE_SOUND_SAMPLE,
"PLAY_TONE", EDJE_ACTION_TYPE_SOUND_TONE, "PLAY_TONE", EDJE_ACTION_TYPE_SOUND_TONE,
"PHYSICS_IMPULSE", EDJE_ACTION_TYPE_PHYSICS_IMPULSE, "PHYSICS_IMPULSE", EDJE_ACTION_TYPE_PHYSICS_IMPULSE,
"PHYSICS_TORQUE_IMPULSE",
EDJE_ACTION_TYPE_PHYSICS_TORQUE_IMPULSE,
NULL); NULL);
if (ep->action == EDJE_ACTION_TYPE_STATE_SET) if (ep->action == EDJE_ACTION_TYPE_STATE_SET)
{ {
@ -8164,6 +8167,12 @@ st_collections_group_programs_program_action(void)
ep->physics.impulse.y = parse_float(2); ep->physics.impulse.y = parse_float(2);
ep->physics.impulse.z = parse_float(3); ep->physics.impulse.z = parse_float(3);
} }
else if (ep->action == EDJE_ACTION_TYPE_PHYSICS_TORQUE_IMPULSE)
{
ep->physics.impulse.x = parse_float(1);
ep->physics.impulse.y = parse_float(2);
ep->physics.impulse.z = parse_float(3);
}
#endif #endif
switch (ep->action) switch (ep->action)
@ -8192,6 +8201,7 @@ st_collections_group_programs_program_action(void)
check_arg_count(3); check_arg_count(3);
break; break;
case EDJE_ACTION_TYPE_PHYSICS_IMPULSE: case EDJE_ACTION_TYPE_PHYSICS_IMPULSE:
case EDJE_ACTION_TYPE_PHYSICS_TORQUE_IMPULSE:
check_arg_count(4); check_arg_count(4);
break; break;
default: default:
@ -8393,6 +8403,8 @@ st_collections_group_programs_program_target(void)
#ifdef HAVE_EPHYSICS #ifdef HAVE_EPHYSICS
else if (ep->action == EDJE_ACTION_TYPE_PHYSICS_IMPULSE) else if (ep->action == EDJE_ACTION_TYPE_PHYSICS_IMPULSE)
data_queue_part_lookup(pc, name, &(et->id)); data_queue_part_lookup(pc, name, &(et->id));
else if (ep->action == EDJE_ACTION_TYPE_PHYSICS_TORQUE_IMPULSE)
data_queue_part_lookup(pc, name, &(et->id));
#endif #endif
else else
{ {

View File

@ -1,12 +1,19 @@
/* It can be tested with edje_player slave mode /* It can be tested with edje_player slave mode
* $ edje_player -S physics_actions.edj * $ edje_player -S physics_actions.edj
*
* signal up impulse -> will throw both balls up * signal up impulse -> will throw both balls up
* signal left impulse -> will throw blue ball to the left * signal left impulse -> will throw blue ball to the left
* signal clockwise impulse -> will roll blue ball in clockwise
* signal counterclockwise impulse -> will roll blue ball in counterclockwise
*
* message 1 FLOAT_SET 3 50 -100 0 -> apply an impulse on blue ball with * message 1 FLOAT_SET 3 50 -100 0 -> apply an impulse on blue ball with
* x = 50, y = -100, z = 0, for example * x = 50, y = -100, z = 0, for example
* message 2 FLOAT_SET 3 0 0 8.2 -> apply a torque impulse on blue ball with
* x = 4, y = 0, z = 0.8, for example
*/ */
#define ID_IMPULSE (1) #define ID_IMPULSE (1)
#define ID_TORQUE_IMPULSE (2)
collections { collections {
@ -28,6 +35,15 @@ collections {
z = getfarg(4); z = getfarg(4);
physics_impulse(PART:"blue_circle", x, y, z); physics_impulse(PART:"blue_circle", x, y, z);
} }
else if ((id == ID_TORQUE_IMPULSE) && (type == MSG_FLOAT_SET)) {
new Float:x, Float:y, Float:z;
new n = numargs();
if (n < 5) return;
x = getfarg(2);
y = getfarg(3);
z = getfarg(4);
physics_torque_impulse(PART:"blue_circle", x, y, z);
}
} }
} }
@ -173,6 +189,22 @@ collections {
target: "red_circle"; target: "red_circle";
} }
program {
name: "impulse_clockwise";
signal: "clockwise";
source: "impulse";
action: PHYSICS_TORQUE_IMPULSE 0 0 4;
target: "blue_circle";
}
program {
name: "impulse_counterclockwise";
signal: "counterclockwise";
source: "impulse";
action: PHYSICS_TORQUE_IMPULSE 0 0 -4;
target: "blue_circle";
}
} }
} }

View File

@ -4140,23 +4140,24 @@ typedef enum _Edje_Tween_Mode
typedef enum _Edje_Action_Type typedef enum _Edje_Action_Type
{ {
EDJE_ACTION_TYPE_NONE = 0, EDJE_ACTION_TYPE_NONE = 0,
EDJE_ACTION_TYPE_STATE_SET = 1, EDJE_ACTION_TYPE_STATE_SET = 1,
EDJE_ACTION_TYPE_ACTION_STOP = 2, EDJE_ACTION_TYPE_ACTION_STOP = 2,
EDJE_ACTION_TYPE_SIGNAL_EMIT = 3, EDJE_ACTION_TYPE_SIGNAL_EMIT = 3,
EDJE_ACTION_TYPE_DRAG_VAL_SET = 4, EDJE_ACTION_TYPE_DRAG_VAL_SET = 4,
EDJE_ACTION_TYPE_DRAG_VAL_STEP = 5, EDJE_ACTION_TYPE_DRAG_VAL_STEP = 5,
EDJE_ACTION_TYPE_DRAG_VAL_PAGE = 6, EDJE_ACTION_TYPE_DRAG_VAL_PAGE = 6,
EDJE_ACTION_TYPE_SCRIPT = 7, EDJE_ACTION_TYPE_SCRIPT = 7,
EDJE_ACTION_TYPE_FOCUS_SET = 8, EDJE_ACTION_TYPE_FOCUS_SET = 8,
EDJE_ACTION_TYPE_RESERVED00 = 9, EDJE_ACTION_TYPE_RESERVED00 = 9,
EDJE_ACTION_TYPE_FOCUS_OBJECT = 10, EDJE_ACTION_TYPE_FOCUS_OBJECT = 10,
EDJE_ACTION_TYPE_PARAM_COPY = 11, EDJE_ACTION_TYPE_PARAM_COPY = 11,
EDJE_ACTION_TYPE_PARAM_SET = 12, EDJE_ACTION_TYPE_PARAM_SET = 12,
EDJE_ACTION_TYPE_SOUND_SAMPLE = 13, /**< @since 1.1 */ EDJE_ACTION_TYPE_SOUND_SAMPLE = 13, /**< @since 1.1 */
EDJE_ACTION_TYPE_SOUND_TONE = 14, /**< @since 1.1 */ EDJE_ACTION_TYPE_SOUND_TONE = 14, /**< @since 1.1 */
EDJE_ACTION_TYPE_PHYSICS_IMPULSE = 15, /**< @since 1.8 */ EDJE_ACTION_TYPE_PHYSICS_IMPULSE = 15, /**< @since 1.8 */
EDJE_ACTION_TYPE_LAST = 16 EDJE_ACTION_TYPE_PHYSICS_TORQUE_IMPULSE = 16, /**< @since 1.8 */
EDJE_ACTION_TYPE_LAST = 17
} Edje_Action_Type; } Edje_Action_Type;
/** /**

View File

@ -201,6 +201,7 @@
* external_param_set_bool(id, param_name[], value) * external_param_set_bool(id, param_name[], value)
* *
* physics_impulse(part_id, Float:x, Float:y, Float:z) * physics_impulse(part_id, Float:x, Float:y, Float:z)
* physics_torque_impulse(part_id, Float:x, Float:y, Float:z)
* *
* ADD/DEL CUSTOM OBJECTS UNDER SOLE EMBRYO SCRIPT CONTROL * ADD/DEL CUSTOM OBJECTS UNDER SOLE EMBRYO SCRIPT CONTROL
* *
@ -3062,6 +3063,37 @@ _edje_embryo_fn_physics_impulse(Embryo_Program *ep, Embryo_Cell *params)
} }
return 0; return 0;
} }
/* physics_torque_impulse(part_id, Float:x, Float:y, Float:z) */
static Embryo_Cell
_edje_embryo_fn_physics_torque_impulse(Embryo_Program *ep, Embryo_Cell *params)
{
Edje_Real_Part *rp;
int part_id = 0;
Edje *ed;
CHKPARAM(4);
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)
{
if (rp->body)
{
double x, y, z;
x = (double) EMBRYO_CELL_TO_FLOAT(params[2]);
y = (double) EMBRYO_CELL_TO_FLOAT(params[3]);
z = (double) EMBRYO_CELL_TO_FLOAT(params[4]);
ephysics_body_torque_impulse_apply(rp->body, x, y, z);
}
}
return 0;
}
#endif #endif
void void
@ -3161,6 +3193,7 @@ _edje_embryo_script_init(Edje_Part_Collection *edc)
#ifdef HAVE_EPHYSICS #ifdef HAVE_EPHYSICS
embryo_program_native_call_add(ep, "physics_impulse", _edje_embryo_fn_physics_impulse); embryo_program_native_call_add(ep, "physics_impulse", _edje_embryo_fn_physics_impulse);
embryo_program_native_call_add(ep, "physics_torque_impulse", _edje_embryo_fn_physics_torque_impulse);
#endif #endif
} }

View File

@ -949,6 +949,21 @@ _edje_program_run(Edje *ed, Edje_Program *pr, Eina_Bool force, const char *ssig,
} }
} }
break; break;
case EDJE_ACTION_TYPE_PHYSICS_TORQUE_IMPULSE:
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_body_torque_impulse_apply(
rp->body, pr->physics.impulse.x, pr->physics.impulse.y,
pr->physics.impulse.z);
}
}
break;
#endif #endif
default: default:
// _edje_emit(ed, "program,start", pr->name); // _edje_emit(ed, "program,start", pr->name);