edje: support applying impulse via script

SVN revision: 80279
This commit is contained in:
Bruno Dilly 2012-12-05 21:09:18 +00:00
parent ebf6290be7
commit 8783eb70bb
3 changed files with 66 additions and 0 deletions

View File

@ -219,3 +219,12 @@ native get_state_val(part_id, State_Param:p, ...);
/* Multisense */
native play_sample (sample_name[], Float:speed);
native play_tone (tone_name[], Float:duration);
/***********************************************************/
/* Edje physics calls. */
/***********************************************************/
/* Example:
*
* physics_impulse(PART:"logo", 0, 50.8, 0);
*/
native physics_impulse (part_id, Float:x, Float:y, Float:z);

View File

@ -2,8 +2,12 @@
* $ edje_player -S physics_actions.edj
* signal up impulse -> will throw both balls up
* signal left impulse -> will throw blue ball to the left
* message 1 FLOAT_SET 3 50 -100 0 -> apply an impulse on blue ball with
* x = 50, y = -100, z = 0, for example
*/
#define ID_IMPULSE (1)
collections {
images {
@ -13,6 +17,20 @@ collections {
group {
name: "example_group";
script {
public message(Msg_Type:type, id, ...) {
if ((id == ID_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_impulse(PART:"blue_circle", x, y, z);
}
}
}
parts {
part {
name: "background";

View File

@ -200,6 +200,8 @@
* external_param_get_bool(id, param_name[])
* external_param_set_bool(id, param_name[], value)
*
* physics_impulse(part_id, Float:x, Float:y, Float:z)
*
* ADD/DEL CUSTOM OBJECTS UNDER SOLE EMBRYO SCRIPT CONTROL
*
*/
@ -3029,6 +3031,39 @@ _edje_embryo_fn_external_param_set_bool(Embryo_Program *ep, Embryo_Cell *params)
return _edje_external_param_set(NULL, rp, &eep);
}
#ifdef HAVE_EPHYSICS
/* physics_impulse(part_id, Float:x, Float:y, Float:z) */
static Embryo_Cell
_edje_embryo_fn_physics_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_central_impulse_apply(rp->body, x, y, z);
}
}
return 0;
}
#endif
void
_edje_embryo_script_init(Edje_Part_Collection *edc)
{
@ -3123,6 +3158,10 @@ _edje_embryo_script_init(Edje_Part_Collection *edc)
embryo_program_native_call_add(ep, "external_param_set_choice", _edje_embryo_fn_external_param_set_choice);
embryo_program_native_call_add(ep, "external_param_get_bool", _edje_embryo_fn_external_param_get_bool);
embryo_program_native_call_add(ep, "external_param_set_bool", _edje_embryo_fn_external_param_set_bool);
#ifdef HAVE_EPHYSICS
embryo_program_native_call_add(ep, "physics_impulse", _edje_embryo_fn_physics_impulse);
#endif
}
void