edje: refactor usage of ephysics functions

Most of the actions will be applied to a body using 3 components
(x, y, z). Refactor code around it to avoid duplication, since
basically what changes is the ephysics function to be called.

Also, it will make next actions implementations less error prone.



SVN revision: 80388
This commit is contained in:
Bruno Dilly 2012-12-06 20:29:50 +00:00
parent e66a1e907d
commit 10ed77919c
2 changed files with 90 additions and 176 deletions

View File

@ -3038,9 +3038,11 @@ _edje_embryo_fn_external_param_set_bool(Embryo_Program *ep, Embryo_Cell *params)
} }
#ifdef HAVE_EPHYSICS #ifdef HAVE_EPHYSICS
/* physics_impulse(part_id, Float:x, Float:y, Float:z) */ /* Generic function to call ephysics functions that apply an action to
* a body using 3 double values.
* To be used by the other functions only avoiding code duplication. */
static Embryo_Cell static Embryo_Cell
_edje_embryo_fn_physics_impulse(Embryo_Program *ep, Embryo_Cell *params) _edje_embryo_fn_physics_components_set(Embryo_Program *ep, Embryo_Cell *params, void (*func)(EPhysics_Body *body, double x, double y, double z))
{ {
Edje_Real_Part *rp; Edje_Real_Part *rp;
int part_id = 0; int part_id = 0;
@ -3053,113 +3055,79 @@ _edje_embryo_fn_physics_impulse(Embryo_Program *ep, Embryo_Cell *params)
if (part_id < 0) return 0; if (part_id < 0) return 0;
rp = ed->table_parts[part_id % ed->table_parts_size]; rp = ed->table_parts[part_id % ed->table_parts_size];
if (rp) if ((rp) && (rp->body))
{ {
if (rp->body) double x, y, z;
{
double x, y, z;
x = (double) EMBRYO_CELL_TO_FLOAT(params[2]); x = (double) EMBRYO_CELL_TO_FLOAT(params[2]);
y = (double) EMBRYO_CELL_TO_FLOAT(params[3]); y = (double) EMBRYO_CELL_TO_FLOAT(params[3]);
z = (double) EMBRYO_CELL_TO_FLOAT(params[4]); z = (double) EMBRYO_CELL_TO_FLOAT(params[4]);
ephysics_body_central_impulse_apply(rp->body, x, y, z); func(rp->body, x, y, z);
}
} }
return 0; return 0;
} }
/* Generic function to call ephysics functions that get components related
* to actions from a body using 3 double values.
* To be used by the other functions only avoiding code duplication. */
static Embryo_Cell
_edje_embryo_fn_physics_components_get(Embryo_Program *ep, Embryo_Cell *params, void (*func)(const EPhysics_Body *body, double *x, double *y, double *z))
{
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) && (rp->body))
{
double x, y, z;
func(rp->body, &x, &y, &z);
SETFLOAT(x, params[2]);
SETFLOAT(y, params[3]);
SETFLOAT(z, params[4]);
}
return 0;
}
/* physics_impulse(part_id, Float:x, Float:y, Float:z) */
static Embryo_Cell
_edje_embryo_fn_physics_impulse(Embryo_Program *ep, Embryo_Cell *params)
{
return _edje_embryo_fn_physics_components_set(
ep, params, ephysics_body_central_impulse_apply);
}
/* physics_torque_impulse(part_id, Float:x, Float:y, Float:z) */ /* physics_torque_impulse(part_id, Float:x, Float:y, Float:z) */
static Embryo_Cell static Embryo_Cell
_edje_embryo_fn_physics_torque_impulse(Embryo_Program *ep, Embryo_Cell *params) _edje_embryo_fn_physics_torque_impulse(Embryo_Program *ep, Embryo_Cell *params)
{ {
Edje_Real_Part *rp; return _edje_embryo_fn_physics_components_set(
int part_id = 0; ep, params, ephysics_body_torque_impulse_apply);
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;
} }
/* physics_force(part_id, Float:x, Float:y, Float:z) */ /* physics_force(part_id, Float:x, Float:y, Float:z) */
static Embryo_Cell static Embryo_Cell
_edje_embryo_fn_physics_force(Embryo_Program *ep, Embryo_Cell *params) _edje_embryo_fn_physics_force(Embryo_Program *ep, Embryo_Cell *params)
{ {
Edje_Real_Part *rp; return _edje_embryo_fn_physics_components_set(
int part_id = 0; ep, params, ephysics_body_central_force_apply);
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_force_apply(rp->body, x, y, z);
}
}
return 0;
} }
/* physics_torque(part_id, Float:x, Float:y, Float:z) */ /* physics_torque(part_id, Float:x, Float:y, Float:z) */
static Embryo_Cell static Embryo_Cell
_edje_embryo_fn_physics_torque(Embryo_Program *ep, Embryo_Cell *params) _edje_embryo_fn_physics_torque(Embryo_Program *ep, Embryo_Cell *params)
{ {
Edje_Real_Part *rp; return _edje_embryo_fn_physics_components_set(
int part_id = 0; ep, params, ephysics_body_torque_apply);
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_apply(rp->body, x, y, z);
}
}
return 0;
} }
/* physics_forces_clear(part_id) */ /* physics_forces_clear(part_id) */
@ -3187,58 +3155,16 @@ _edje_embryo_fn_physics_forces_clear(Embryo_Program *ep, Embryo_Cell *params)
static Embryo_Cell static Embryo_Cell
_edje_embryo_fn_physics_forces_get(Embryo_Program *ep, Embryo_Cell *params) _edje_embryo_fn_physics_forces_get(Embryo_Program *ep, Embryo_Cell *params)
{ {
Edje_Real_Part *rp; return _edje_embryo_fn_physics_components_get(
int part_id = 0; ep, params, ephysics_body_forces_get);
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;
ephysics_body_forces_get(rp->body, &x, &y, &z);
SETFLOAT(x, params[2]);
SETFLOAT(y, params[3]);
SETFLOAT(z, params[4]);
}
}
return 0;
} }
/* physics_torques_get(part_id, &Float:x, &Float:y, &Float:z) */ /* physics_torques_get(part_id, &Float:x, &Float:y, &Float:z) */
static Embryo_Cell static Embryo_Cell
_edje_embryo_fn_physics_torques_get(Embryo_Program *ep, Embryo_Cell *params) _edje_embryo_fn_physics_torques_get(Embryo_Program *ep, Embryo_Cell *params)
{ {
Edje_Real_Part *rp; return _edje_embryo_fn_physics_components_get(
int part_id = 0; ep, params, ephysics_body_torques_get);
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;
ephysics_body_torques_get(rp->body, &x, &y, &z);
SETFLOAT(x, params[2]);
SETFLOAT(y, params[3]);
SETFLOAT(z, params[4]);
}
}
return 0;
} }
#endif #endif

View File

@ -538,6 +538,30 @@ _edje_program_end(Edje *ed, Edje_Running_Program *runp)
if (free_runp) free(runp); if (free_runp) free(runp);
} }
#ifdef HAVE_EPHYSICS
static Eina_Bool
_edje_physics_action_set(Edje *ed, Edje_Program *pr, void (*func)(EPhysics_Body *body, double x, double y, double z))
{
Edje_Program_Target *pt;
Edje_Real_Part *rp;
Eina_List *l;
if (_edje_block_break(ed)) return EINA_FALSE;
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))
func(rp->body, pr->physics.x, pr->physics.y, pr->physics.z);
}
}
return EINA_TRUE;
}
#endif
void void
_edje_program_run(Edje *ed, Edje_Program *pr, Eina_Bool force, const char *ssig, const char *ssrc) _edje_program_run(Edje *ed, Edje_Program *pr, Eina_Bool force, const char *ssig, const char *ssrc)
{ {
@ -935,60 +959,24 @@ _edje_program_run(Edje *ed, Edje_Program *pr, Eina_Bool force, const char *ssig,
break; break;
#ifdef HAVE_EPHYSICS #ifdef HAVE_EPHYSICS
case EDJE_ACTION_TYPE_PHYSICS_IMPULSE: case EDJE_ACTION_TYPE_PHYSICS_IMPULSE:
if (_edje_block_break(ed)) if (!_edje_physics_action_set(
ed, pr, ephysics_body_central_impulse_apply))
goto break_prog; 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.x, pr->physics.y, pr->physics.z);
}
}
break; break;
case EDJE_ACTION_TYPE_PHYSICS_TORQUE_IMPULSE: case EDJE_ACTION_TYPE_PHYSICS_TORQUE_IMPULSE:
if (_edje_block_break(ed)) if (!_edje_physics_action_set(
ed, pr, ephysics_body_torque_impulse_apply))
goto break_prog; 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.x, pr->physics.y, pr->physics.z);
}
}
break; break;
case EDJE_ACTION_TYPE_PHYSICS_FORCE: case EDJE_ACTION_TYPE_PHYSICS_FORCE:
if (_edje_block_break(ed)) if (!_edje_physics_action_set(
ed, pr, ephysics_body_central_force_apply))
goto break_prog; 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_force_apply(
rp->body, pr->physics.x, pr->physics.y, pr->physics.z);
}
}
break; break;
case EDJE_ACTION_TYPE_PHYSICS_TORQUE: case EDJE_ACTION_TYPE_PHYSICS_TORQUE:
if (_edje_block_break(ed)) if (!_edje_physics_action_set(
ed, pr, ephysics_body_torque_apply))
goto break_prog; 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_apply(
rp->body, pr->physics.x, pr->physics.y, pr->physics.z);
}
}
break; break;
case EDJE_ACTION_TYPE_PHYSICS_FORCES_CLEAR: case EDJE_ACTION_TYPE_PHYSICS_FORCES_CLEAR:
if (_edje_block_break(ed)) if (_edje_block_break(ed))