forked from enlightenment/efl
edje: support new action: PHYSICS_IMPULSE
It will apply a central impulse over a body's part. SVN revision: 80278
This commit is contained in:
parent
31d4de28f3
commit
ebf6290be7
|
@ -8030,7 +8030,8 @@ st_collections_group_programs_program_in(void)
|
||||||
@effect
|
@effect
|
||||||
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
|
||||||
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
|
||||||
|
@ -8044,6 +8045,7 @@ st_collections_group_programs_program_in(void)
|
||||||
action: PARAM_SET "part" "param" "value";\n
|
action: PARAM_SET "part" "param" "value";\n
|
||||||
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
|
||||||
@endproperty
|
@endproperty
|
||||||
*/
|
*/
|
||||||
static void
|
static void
|
||||||
|
@ -8069,6 +8071,7 @@ st_collections_group_programs_program_action(void)
|
||||||
"PARAM_SET", EDJE_ACTION_TYPE_PARAM_SET,
|
"PARAM_SET", EDJE_ACTION_TYPE_PARAM_SET,
|
||||||
"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,
|
||||||
NULL);
|
NULL);
|
||||||
if (ep->action == EDJE_ACTION_TYPE_STATE_SET)
|
if (ep->action == EDJE_ACTION_TYPE_STATE_SET)
|
||||||
{
|
{
|
||||||
|
@ -8154,7 +8157,15 @@ st_collections_group_programs_program_action(void)
|
||||||
data_queue_part_lookup(pc, part, &(ep->param.dst));
|
data_queue_part_lookup(pc, part, &(ep->param.dst));
|
||||||
free(part);
|
free(part);
|
||||||
}
|
}
|
||||||
|
#ifdef HAVE_EPHYSICS
|
||||||
|
else if (ep->action == EDJE_ACTION_TYPE_PHYSICS_IMPULSE)
|
||||||
|
{
|
||||||
|
ep->physics.impulse.x = parse_float(1);
|
||||||
|
ep->physics.impulse.y = parse_float(2);
|
||||||
|
ep->physics.impulse.z = parse_float(3);
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
switch (ep->action)
|
switch (ep->action)
|
||||||
{
|
{
|
||||||
case EDJE_ACTION_TYPE_ACTION_STOP:
|
case EDJE_ACTION_TYPE_ACTION_STOP:
|
||||||
|
@ -8180,6 +8191,9 @@ st_collections_group_programs_program_action(void)
|
||||||
case EDJE_ACTION_TYPE_SOUND_TONE:
|
case EDJE_ACTION_TYPE_SOUND_TONE:
|
||||||
check_arg_count(3);
|
check_arg_count(3);
|
||||||
break;
|
break;
|
||||||
|
case EDJE_ACTION_TYPE_PHYSICS_IMPULSE:
|
||||||
|
check_arg_count(4);
|
||||||
|
break;
|
||||||
default:
|
default:
|
||||||
check_arg_count(3);
|
check_arg_count(3);
|
||||||
}
|
}
|
||||||
|
@ -8376,6 +8390,10 @@ st_collections_group_programs_program_target(void)
|
||||||
data_queue_part_lookup(pc, name, &(et->id));
|
data_queue_part_lookup(pc, name, &(et->id));
|
||||||
else if (ep->action == EDJE_ACTION_TYPE_FOCUS_OBJECT)
|
else if (ep->action == EDJE_ACTION_TYPE_FOCUS_OBJECT)
|
||||||
data_queue_part_lookup(pc, name, &(et->id));
|
data_queue_part_lookup(pc, name, &(et->id));
|
||||||
|
#ifdef HAVE_EPHYSICS
|
||||||
|
else if (ep->action == EDJE_ACTION_TYPE_PHYSICS_IMPULSE)
|
||||||
|
data_queue_part_lookup(pc, name, &(et->id));
|
||||||
|
#endif
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
ERR("parse error %s:%i. target may only be used after action",
|
ERR("parse error %s:%i. target may only be used after action",
|
||||||
|
|
|
@ -54,6 +54,7 @@ endif
|
||||||
|
|
||||||
if ENABLE_EPHYSICS
|
if ENABLE_EPHYSICS
|
||||||
EDCS += \
|
EDCS += \
|
||||||
|
physics_actions.edc \
|
||||||
physics_basic.edc \
|
physics_basic.edc \
|
||||||
physics_complex.edc
|
physics_complex.edc
|
||||||
endif
|
endif
|
||||||
|
|
|
@ -0,0 +1,161 @@
|
||||||
|
/* It can be tested with edje_player slave mode
|
||||||
|
* $ edje_player -S physics_actions.edj
|
||||||
|
* signal up impulse -> will throw both balls up
|
||||||
|
* signal left impulse -> will throw blue ball to the left
|
||||||
|
*/
|
||||||
|
|
||||||
|
collections {
|
||||||
|
|
||||||
|
images {
|
||||||
|
image: "bubble-blue.png" COMP;
|
||||||
|
}
|
||||||
|
|
||||||
|
group {
|
||||||
|
name: "example_group";
|
||||||
|
|
||||||
|
parts {
|
||||||
|
part {
|
||||||
|
name: "background";
|
||||||
|
type: RECT;
|
||||||
|
physics_body: NONE;
|
||||||
|
description {
|
||||||
|
state: "default" 0.0;
|
||||||
|
color: 255 255 255 255; /* white */
|
||||||
|
rel1.relative: 0.0 0.0;
|
||||||
|
rel2.relative: 1.0 1.0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
part {
|
||||||
|
name: "blue_circle";
|
||||||
|
type: IMAGE;
|
||||||
|
physics_body: RIGID_CIRCLE;
|
||||||
|
description {
|
||||||
|
state: "default" 0.0;
|
||||||
|
rel1.relative: 0.35 0.1;
|
||||||
|
rel2.relative: 0.55 0.2;
|
||||||
|
aspect: 1 1;
|
||||||
|
image {
|
||||||
|
normal: "bubble-blue.png";
|
||||||
|
}
|
||||||
|
physics {
|
||||||
|
restitution: 0.85;
|
||||||
|
friction: 1.0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
part {
|
||||||
|
name: "red_circle";
|
||||||
|
type: IMAGE;
|
||||||
|
physics_body: RIGID_CIRCLE;
|
||||||
|
description {
|
||||||
|
state: "default" 0.0;
|
||||||
|
color: 255 0 0 255; /* light red */
|
||||||
|
rel1.relative: 0.65 0.1;
|
||||||
|
rel2.relative: 0.85 0.2;
|
||||||
|
aspect: 1 1;
|
||||||
|
image {
|
||||||
|
normal: "bubble-blue.png";
|
||||||
|
}
|
||||||
|
physics {
|
||||||
|
restitution: 0.85;
|
||||||
|
friction: 1.0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
part {
|
||||||
|
name: "floor";
|
||||||
|
type: RECT;
|
||||||
|
physics_body: BOUNDARY_BOTTOM;
|
||||||
|
description {
|
||||||
|
state: "default" 0.0;
|
||||||
|
visible: 0;
|
||||||
|
physics {
|
||||||
|
restitution: 0.6;
|
||||||
|
friction: 1.0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
part {
|
||||||
|
name: "right_wall";
|
||||||
|
type: RECT;
|
||||||
|
physics_body: BOUNDARY_RIGHT;
|
||||||
|
description {
|
||||||
|
state: "default" 0.0;
|
||||||
|
visible: 0;
|
||||||
|
physics {
|
||||||
|
restitution: 0.3;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
part {
|
||||||
|
name: "left_wall";
|
||||||
|
type: RECT;
|
||||||
|
physics_body: BOUNDARY_LEFT;
|
||||||
|
description {
|
||||||
|
state: "default" 0.0;
|
||||||
|
visible: 0;
|
||||||
|
physics {
|
||||||
|
restitution: 0.3;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
part {
|
||||||
|
name: "roof";
|
||||||
|
type: RECT;
|
||||||
|
physics_body: BOUNDARY_TOP;
|
||||||
|
description {
|
||||||
|
state: "default" 0.0;
|
||||||
|
visible: 0;
|
||||||
|
physics {
|
||||||
|
restitution: 0.2;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
programs {
|
||||||
|
|
||||||
|
program {
|
||||||
|
name: "impulse_up";
|
||||||
|
signal: "up";
|
||||||
|
source: "impulse";
|
||||||
|
action: PHYSICS_IMPULSE 0 -300 0;
|
||||||
|
target: "blue_circle";
|
||||||
|
target: "red_circle";
|
||||||
|
}
|
||||||
|
|
||||||
|
program {
|
||||||
|
name: "impulse_down";
|
||||||
|
signal: "down";
|
||||||
|
source: "impulse";
|
||||||
|
action: PHYSICS_IMPULSE 0 300 0;
|
||||||
|
target: "red_circle";
|
||||||
|
target: "blue_circle";
|
||||||
|
}
|
||||||
|
|
||||||
|
program {
|
||||||
|
name: "impulse_left";
|
||||||
|
signal: "left";
|
||||||
|
source: "impulse";
|
||||||
|
action: PHYSICS_IMPULSE -300 0 0;
|
||||||
|
target: "blue_circle";
|
||||||
|
}
|
||||||
|
|
||||||
|
program {
|
||||||
|
name: "impulse_right";
|
||||||
|
signal: "right";
|
||||||
|
source: "impulse";
|
||||||
|
action: PHYSICS_IMPULSE 300 0 0;
|
||||||
|
target: "red_circle";
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
|
@ -4155,7 +4155,8 @@ typedef enum _Edje_Action_Type
|
||||||
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_LAST = 15
|
EDJE_ACTION_TYPE_PHYSICS_IMPULSE = 15, /**< @since 1.8 */
|
||||||
|
EDJE_ACTION_TYPE_LAST = 16
|
||||||
} Edje_Action_Type;
|
} Edje_Action_Type;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
|
@ -436,6 +436,12 @@ _edje_edd_init(void)
|
||||||
EET_DATA_DESCRIPTOR_ADD_BASIC(_edje_edd_edje_program, Edje_Program, "param.src", param.src, EET_T_INT);
|
EET_DATA_DESCRIPTOR_ADD_BASIC(_edje_edd_edje_program, Edje_Program, "param.src", param.src, EET_T_INT);
|
||||||
EET_DATA_DESCRIPTOR_ADD_BASIC(_edje_edd_edje_program, Edje_Program, "param.dst", param.dst, EET_T_INT);
|
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.impulse.x", physics.impulse.x, EET_T_DOUBLE);
|
||||||
|
EET_DATA_DESCRIPTOR_ADD_BASIC(_edje_edd_edje_program, Edje_Program, "physics.impulse.y", physics.impulse.y, EET_T_DOUBLE);
|
||||||
|
EET_DATA_DESCRIPTOR_ADD_BASIC(_edje_edd_edje_program, Edje_Program, "physics.impulse.z", physics.impulse.z, EET_T_DOUBLE);
|
||||||
|
#endif
|
||||||
|
|
||||||
EET_EINA_FILE_DATA_DESCRIPTOR_CLASS_SET(&eddc, Edje_Part_Image_Id);
|
EET_EINA_FILE_DATA_DESCRIPTOR_CLASS_SET(&eddc, Edje_Part_Image_Id);
|
||||||
_edje_edd_edje_part_image_id =
|
_edje_edd_edje_part_image_id =
|
||||||
eet_data_descriptor_file_new(&eddc);
|
eet_data_descriptor_file_new(&eddc);
|
||||||
|
|
|
@ -646,6 +646,17 @@ struct _Edje_Program /* a conditional program to be run */
|
||||||
int dst; /* part where parameter is being stored */
|
int dst; /* part where parameter is being stored */
|
||||||
} param;
|
} param;
|
||||||
|
|
||||||
|
#ifdef HAVE_EPHYSICS
|
||||||
|
/* used for actions related to physics, as PHYSICS_IMPULSE */
|
||||||
|
struct {
|
||||||
|
struct {
|
||||||
|
double x;
|
||||||
|
double y;
|
||||||
|
double z;
|
||||||
|
} impulse;
|
||||||
|
} physics;
|
||||||
|
#endif
|
||||||
|
|
||||||
Eina_Bool exec : 1;
|
Eina_Bool exec : 1;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -933,6 +933,23 @@ _edje_program_run(Edje *ed, Edje_Program *pr, Eina_Bool force, const char *ssig,
|
||||||
if (_edje_block_break(ed)) goto break_prog;
|
if (_edje_block_break(ed)) goto break_prog;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
#ifdef HAVE_EPHYSICS
|
||||||
|
case EDJE_ACTION_TYPE_PHYSICS_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_central_impulse_apply(
|
||||||
|
rp->body, pr->physics.impulse.x, pr->physics.impulse.y,
|
||||||
|
pr->physics.impulse.z);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
#endif
|
||||||
default:
|
default:
|
||||||
// _edje_emit(ed, "program,start", pr->name);
|
// _edje_emit(ed, "program,start", pr->name);
|
||||||
// _edje_emit(ed, "program,stop", pr->name);
|
// _edje_emit(ed, "program,stop", pr->name);
|
||||||
|
|
Loading…
Reference in New Issue