forked from enlightenment/efl
edje - reduce memory footrpint by dlopening ephysics on demand
this saves about another 80Kb or so in dirty pages by only loading ephysics when needed. This removed ephysics and bullet library dirty pages from the process space. this is another patch to address T4227. @fix
This commit is contained in:
parent
d27f5fcab7
commit
1d0b500fa8
19
configure.ac
19
configure.ac
|
@ -4901,19 +4901,24 @@ EFL_INTERNAL_DEPEND_PKG([EDJE], [emile])
|
||||||
EFL_INTERNAL_DEPEND_PKG([EDJE], [efreet])
|
EFL_INTERNAL_DEPEND_PKG([EDJE], [efreet])
|
||||||
EFL_INTERNAL_DEPEND_PKG([EDJE], [eio])
|
EFL_INTERNAL_DEPEND_PKG([EDJE], [eio])
|
||||||
|
|
||||||
EFL_OPTIONAL_INTERNAL_DEPEND_PKG([EDJE], [${want_physics}], [ephysics])
|
if test "x${want_physics}" = "xyes" ; then
|
||||||
|
AC_DEFINE([HAVE_EPHYSICS], [1], [EPhysics Support])
|
||||||
|
EDJE_CFLAGS="-I\$(top_srcdir)/src/lib/ephysics ${EDJE_CFLAGS}"
|
||||||
|
fi
|
||||||
|
dnl EFL_OPTIONAL_INTERNAL_DEPEND_PKG([EDJE], [${want_physics}], [ephysics])
|
||||||
|
|
||||||
|
if test "x${want_lua_old}" = "xyes"; then
|
||||||
|
EFL_CHECK_LUA_OLD([EDJE_LUA])
|
||||||
|
else
|
||||||
|
PKG_CHECK_MODULES([EDJE_LUA], [luajit >= 2.0.0])
|
||||||
|
fi
|
||||||
|
|
||||||
EFL_OPTIONAL_INTERNAL_DEPEND_PKG([EDJE], [${want_multisense}], [ecore-audio])
|
EFL_OPTIONAL_INTERNAL_DEPEND_PKG([EDJE], [${want_multisense}], [ecore-audio])
|
||||||
|
|
||||||
EFL_ADD_FEATURE([EDJE], [physics])
|
EFL_ADD_FEATURE([EDJE], [physics])
|
||||||
EFL_ADD_FEATURE([EDJE], [multisense])
|
EFL_ADD_FEATURE([EDJE], [multisense])
|
||||||
EFL_ADD_FEATURE([EDJE], [lua-old])
|
EFL_ADD_FEATURE([EDJE], [lua-old])
|
||||||
|
|
||||||
if test "${want_lua_old}" = "yes"; then
|
|
||||||
EFL_CHECK_LUA_OLD([EDJE])
|
|
||||||
else
|
|
||||||
EFL_DEPEND_PKG([EDJE], [LUAJIT], [luajit >= 2.0.0])
|
|
||||||
fi
|
|
||||||
|
|
||||||
EFL_ADD_LIBS([EDJE], [-lm])
|
EFL_ADD_LIBS([EDJE], [-lm])
|
||||||
|
|
||||||
EFL_EVAL_PKGS([EDJE])
|
EFL_EVAL_PKGS([EDJE])
|
||||||
|
|
|
@ -51,6 +51,7 @@ EDJE_COMMON_CPPFLAGS = -I$(top_builddir)/src/lib/efl \
|
||||||
-DPACKAGE_DATA_DIR=\"$(datadir)/edje\" \
|
-DPACKAGE_DATA_DIR=\"$(datadir)/edje\" \
|
||||||
-DPACKAGE_BUILD_DIR=\"$(abs_top_builddir)\" \
|
-DPACKAGE_BUILD_DIR=\"$(abs_top_builddir)\" \
|
||||||
-DPACKAGE_SRC_DIR=\"$(abs_top_srcdir)\" \
|
-DPACKAGE_SRC_DIR=\"$(abs_top_srcdir)\" \
|
||||||
|
@EDJE_LUA_CFLAGS@ \
|
||||||
@EDJE_CFLAGS@
|
@EDJE_CFLAGS@
|
||||||
|
|
||||||
installed_edjemainheadersdir = $(includedir)/edje-@VMAJ@
|
installed_edjemainheadersdir = $(includedir)/edje-@VMAJ@
|
||||||
|
@ -97,7 +98,7 @@ lib/edje/edje_containers.c
|
||||||
|
|
||||||
|
|
||||||
lib_edje_libedje_la_CPPFLAGS = -I$(top_builddir)/src/lib/efl $(EDJE_COMMON_CPPFLAGS)
|
lib_edje_libedje_la_CPPFLAGS = -I$(top_builddir)/src/lib/efl $(EDJE_COMMON_CPPFLAGS)
|
||||||
lib_edje_libedje_la_LIBADD = @EDJE_LIBS@
|
lib_edje_libedje_la_LIBADD = @EDJE_LIBS@ @EDJE_LUA_LIBS@
|
||||||
lib_edje_libedje_la_DEPENDENCIES = @EDJE_INTERNAL_LIBS@
|
lib_edje_libedje_la_DEPENDENCIES = @EDJE_INTERNAL_LIBS@
|
||||||
lib_edje_libedje_la_LDFLAGS = @EFL_LTLIBRARY_FLAGS@
|
lib_edje_libedje_la_LDFLAGS = @EFL_LTLIBRARY_FLAGS@
|
||||||
|
|
||||||
|
|
|
@ -3357,7 +3357,8 @@ static Eina_Bool
|
||||||
_edje_physics_world_geometry_check(EPhysics_World *world)
|
_edje_physics_world_geometry_check(EPhysics_World *world)
|
||||||
{
|
{
|
||||||
Evas_Coord w, h, d;
|
Evas_Coord w, h, d;
|
||||||
ephysics_world_render_geometry_get(world, NULL, NULL, NULL, &w, &h, &d);
|
if (!EPH_LOAD()) return EINA_FALSE;
|
||||||
|
EPH_CALL(ephysics_world_render_geometry_get)(world, NULL, NULL, NULL, &w, &h, &d);
|
||||||
return w && h && d;
|
return w && h && d;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -3365,14 +3366,17 @@ static void
|
||||||
_edje_physics_body_props_update(Edje *ed, Edje_Real_Part *ep, Edje_Calc_Params *pf,
|
_edje_physics_body_props_update(Edje *ed, Edje_Real_Part *ep, Edje_Calc_Params *pf,
|
||||||
Eina_Bool pos_update)
|
Eina_Bool pos_update)
|
||||||
{
|
{
|
||||||
ephysics_body_linear_movement_enable_set(ep->body,
|
if (!EPH_LOAD()) return;
|
||||||
pf->physics->mov_freedom.lin.x,
|
EPH_CALL(ephysics_body_linear_movement_enable_set)
|
||||||
pf->physics->mov_freedom.lin.y,
|
(ep->body,
|
||||||
pf->physics->mov_freedom.lin.z);
|
pf->physics->mov_freedom.lin.x,
|
||||||
ephysics_body_angular_movement_enable_set(ep->body,
|
pf->physics->mov_freedom.lin.y,
|
||||||
pf->physics->mov_freedom.ang.x,
|
pf->physics->mov_freedom.lin.z);
|
||||||
pf->physics->mov_freedom.ang.y,
|
EPH_CALL(ephysics_body_angular_movement_enable_set)
|
||||||
pf->physics->mov_freedom.ang.z);
|
(ep->body,
|
||||||
|
pf->physics->mov_freedom.ang.x,
|
||||||
|
pf->physics->mov_freedom.ang.y,
|
||||||
|
pf->physics->mov_freedom.ang.z);
|
||||||
|
|
||||||
/* Boundaries geometry and mass shouldn't be changed */
|
/* Boundaries geometry and mass shouldn't be changed */
|
||||||
if (ep->part->physics_body < EDJE_PART_PHYSICS_BODY_BOUNDARY_TOP)
|
if (ep->part->physics_body < EDJE_PART_PHYSICS_BODY_BOUNDARY_TOP)
|
||||||
|
@ -3381,62 +3385,65 @@ _edje_physics_body_props_update(Edje *ed, Edje_Real_Part *ep, Edje_Calc_Params *
|
||||||
|
|
||||||
if (pos_update)
|
if (pos_update)
|
||||||
{
|
{
|
||||||
ephysics_body_move(ep->body,
|
EPH_CALL(ephysics_body_move)
|
||||||
ed->x + pf->final.x,
|
(ep->body,
|
||||||
ed->y + pf->final.y,
|
ed->x + pf->final.x,
|
||||||
pf->physics->z);
|
ed->y + pf->final.y,
|
||||||
|
pf->physics->z);
|
||||||
ep->x = pf->final.x;
|
ep->x = pf->final.x;
|
||||||
ep->y = pf->final.y;
|
ep->y = pf->final.y;
|
||||||
ep->w = pf->final.w;
|
ep->w = pf->final.w;
|
||||||
ep->h = pf->final.h;
|
ep->h = pf->final.h;
|
||||||
}
|
}
|
||||||
|
|
||||||
ephysics_body_geometry_get(ep->body, &x, &y, &z, &w, &h, &d);
|
EPH_CALL(ephysics_body_geometry_get)(ep->body, &x, &y, &z, &w, &h, &d);
|
||||||
if ((d) && (d != pf->physics->depth))
|
if ((d) && (d != pf->physics->depth))
|
||||||
ephysics_body_resize(ep->body, w, h, pf->physics->depth);
|
EPH_CALL(ephysics_body_resize)(ep->body, w, h, pf->physics->depth);
|
||||||
if (z != pf->physics->z)
|
if (z != pf->physics->z)
|
||||||
ephysics_body_move(ep->body, x, y, pf->physics->z);
|
EPH_CALL(ephysics_body_move)(ep->body, x, y, pf->physics->z);
|
||||||
|
|
||||||
ephysics_body_material_set(ep->body, pf->physics->material);
|
EPH_CALL(ephysics_body_material_set)(ep->body, pf->physics->material);
|
||||||
if (!pf->physics->material)
|
if (!pf->physics->material)
|
||||||
{
|
{
|
||||||
if (pf->physics->density)
|
if (pf->physics->density)
|
||||||
ephysics_body_density_set(ep->body, pf->physics->density);
|
EPH_CALL(ephysics_body_density_set)(ep->body, pf->physics->density);
|
||||||
else
|
else
|
||||||
ephysics_body_mass_set(ep->body, pf->physics->mass);
|
EPH_CALL(ephysics_body_mass_set)(ep->body, pf->physics->mass);
|
||||||
}
|
}
|
||||||
|
|
||||||
if ((ep->part->physics_body == EDJE_PART_PHYSICS_BODY_SOFT_BOX) ||
|
if ((ep->part->physics_body == EDJE_PART_PHYSICS_BODY_SOFT_BOX) ||
|
||||||
(ep->part->physics_body == EDJE_PART_PHYSICS_BODY_SOFT_SPHERE) ||
|
(ep->part->physics_body == EDJE_PART_PHYSICS_BODY_SOFT_SPHERE) ||
|
||||||
(ep->part->physics_body == EDJE_PART_PHYSICS_BODY_SOFT_CYLINDER) ||
|
(ep->part->physics_body == EDJE_PART_PHYSICS_BODY_SOFT_CYLINDER) ||
|
||||||
(ep->part->physics_body == EDJE_PART_PHYSICS_BODY_CLOTH))
|
(ep->part->physics_body == EDJE_PART_PHYSICS_BODY_CLOTH))
|
||||||
ephysics_body_soft_body_hardness_set(ep->body,
|
EPH_CALL(ephysics_body_soft_body_hardness_set)
|
||||||
pf->physics->hardness * 100);
|
(ep->body, pf->physics->hardness * 100);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!pf->physics->material)
|
if (!pf->physics->material)
|
||||||
{
|
{
|
||||||
ephysics_body_restitution_set(ep->body, pf->physics->restitution);
|
EPH_CALL(ephysics_body_restitution_set)(ep->body, pf->physics->restitution);
|
||||||
ephysics_body_friction_set(ep->body, pf->physics->friction);
|
EPH_CALL(ephysics_body_friction_set)(ep->body, pf->physics->friction);
|
||||||
}
|
}
|
||||||
|
|
||||||
ephysics_body_damping_set(ep->body, pf->physics->damping.linear,
|
EPH_CALL(ephysics_body_damping_set)(ep->body, pf->physics->damping.linear,
|
||||||
pf->physics->damping.angular);
|
pf->physics->damping.angular);
|
||||||
ephysics_body_sleeping_threshold_set(ep->body, pf->physics->sleep.linear,
|
EPH_CALL(ephysics_body_sleeping_threshold_set)(ep->body, pf->physics->sleep.linear,
|
||||||
pf->physics->sleep.angular);
|
pf->physics->sleep.angular);
|
||||||
ephysics_body_light_set(ep->body, pf->physics->light_on);
|
EPH_CALL(ephysics_body_light_set)(ep->body, pf->physics->light_on);
|
||||||
ephysics_body_back_face_culling_set(ep->body, pf->physics->backcull);
|
EPH_CALL(ephysics_body_back_face_culling_set)(ep->body, pf->physics->backcull);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
_edje_physics_body_update_cb(void *data, EPhysics_Body *body, void *event_info EINA_UNUSED)
|
_edje_physics_body_update_cb(void *data, EPhysics_Body *body, void *event_info EINA_UNUSED)
|
||||||
{
|
{
|
||||||
Edje_Real_Part *rp = data;
|
Edje_Real_Part *rp = data;
|
||||||
Edje *ed = ephysics_body_data_get(body);
|
Edje *ed;
|
||||||
|
|
||||||
ephysics_body_geometry_get(body, &(rp->x), &(rp->y), NULL,
|
if (!EPH_LOAD()) return;
|
||||||
&(rp->w), &(rp->h), NULL);
|
ed = EPH_CALL(ephysics_body_data_get(body));
|
||||||
ephysics_body_evas_object_update(body);
|
EPH_CALL(ephysics_body_geometry_get)(body, &(rp->x), &(rp->y), NULL,
|
||||||
|
&(rp->w), &(rp->h), NULL);
|
||||||
|
EPH_CALL(ephysics_body_evas_object_update)(body);
|
||||||
ed->dirty = EINA_TRUE;
|
ed->dirty = EINA_TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -3447,63 +3454,64 @@ _edje_physics_body_add(Edje *ed, Edje_Real_Part *rp, EPhysics_World *world)
|
||||||
Edje_Physics_Face *pface;
|
Edje_Physics_Face *pface;
|
||||||
Eina_List *l;
|
Eina_List *l;
|
||||||
|
|
||||||
|
if (!EPH_LOAD()) return;
|
||||||
switch (rp->part->physics_body)
|
switch (rp->part->physics_body)
|
||||||
{
|
{
|
||||||
case EDJE_PART_PHYSICS_BODY_RIGID_BOX:
|
case EDJE_PART_PHYSICS_BODY_RIGID_BOX:
|
||||||
rp->body = ephysics_body_box_add(world);
|
rp->body = EPH_CALL(ephysics_body_box_add)(world);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case EDJE_PART_PHYSICS_BODY_RIGID_SPHERE:
|
case EDJE_PART_PHYSICS_BODY_RIGID_SPHERE:
|
||||||
rp->body = ephysics_body_sphere_add(world);
|
rp->body = EPH_CALL(ephysics_body_sphere_add)(world);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case EDJE_PART_PHYSICS_BODY_RIGID_CYLINDER:
|
case EDJE_PART_PHYSICS_BODY_RIGID_CYLINDER:
|
||||||
rp->body = ephysics_body_cylinder_add(world);
|
rp->body = EPH_CALL(ephysics_body_cylinder_add)(world);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case EDJE_PART_PHYSICS_BODY_SOFT_BOX:
|
case EDJE_PART_PHYSICS_BODY_SOFT_BOX:
|
||||||
rp->body = ephysics_body_soft_box_add(world);
|
rp->body = EPH_CALL(ephysics_body_soft_box_add)(world);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case EDJE_PART_PHYSICS_BODY_SOFT_SPHERE:
|
case EDJE_PART_PHYSICS_BODY_SOFT_SPHERE:
|
||||||
rp->body = ephysics_body_soft_sphere_add(world, 0);
|
rp->body = EPH_CALL(ephysics_body_soft_sphere_add)(world, 0);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case EDJE_PART_PHYSICS_BODY_SOFT_CYLINDER:
|
case EDJE_PART_PHYSICS_BODY_SOFT_CYLINDER:
|
||||||
rp->body = ephysics_body_soft_cylinder_add(world);
|
rp->body = EPH_CALL(ephysics_body_soft_cylinder_add)(world);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case EDJE_PART_PHYSICS_BODY_CLOTH:
|
case EDJE_PART_PHYSICS_BODY_CLOTH:
|
||||||
rp->body = ephysics_body_cloth_add(world, 0, 0);
|
rp->body = EPH_CALL(ephysics_body_cloth_add)(world, 0, 0);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case EDJE_PART_PHYSICS_BODY_BOUNDARY_TOP:
|
case EDJE_PART_PHYSICS_BODY_BOUNDARY_TOP:
|
||||||
rp->body = ephysics_body_top_boundary_add(world);
|
rp->body = EPH_CALL(ephysics_body_top_boundary_add)(world);
|
||||||
resize = EINA_FALSE;
|
resize = EINA_FALSE;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case EDJE_PART_PHYSICS_BODY_BOUNDARY_BOTTOM:
|
case EDJE_PART_PHYSICS_BODY_BOUNDARY_BOTTOM:
|
||||||
rp->body = ephysics_body_bottom_boundary_add(world);
|
rp->body = EPH_CALL(ephysics_body_bottom_boundary_add)(world);
|
||||||
resize = EINA_FALSE;
|
resize = EINA_FALSE;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case EDJE_PART_PHYSICS_BODY_BOUNDARY_RIGHT:
|
case EDJE_PART_PHYSICS_BODY_BOUNDARY_RIGHT:
|
||||||
rp->body = ephysics_body_right_boundary_add(world);
|
rp->body = EPH_CALL(ephysics_body_right_boundary_add)(world);
|
||||||
resize = EINA_FALSE;
|
resize = EINA_FALSE;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case EDJE_PART_PHYSICS_BODY_BOUNDARY_LEFT:
|
case EDJE_PART_PHYSICS_BODY_BOUNDARY_LEFT:
|
||||||
rp->body = ephysics_body_left_boundary_add(world);
|
rp->body = EPH_CALL(ephysics_body_left_boundary_add)(world);
|
||||||
resize = EINA_FALSE;
|
resize = EINA_FALSE;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case EDJE_PART_PHYSICS_BODY_BOUNDARY_FRONT:
|
case EDJE_PART_PHYSICS_BODY_BOUNDARY_FRONT:
|
||||||
rp->body = ephysics_body_front_boundary_add(world);
|
rp->body = EPH_CALL(ephysics_body_front_boundary_add)(world);
|
||||||
resize = EINA_FALSE;
|
resize = EINA_FALSE;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case EDJE_PART_PHYSICS_BODY_BOUNDARY_BACK:
|
case EDJE_PART_PHYSICS_BODY_BOUNDARY_BACK:
|
||||||
rp->body = ephysics_body_back_boundary_add(world);
|
rp->body = EPH_CALL(ephysics_body_back_boundary_add)(world);
|
||||||
resize = EINA_FALSE;
|
resize = EINA_FALSE;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
@ -3525,15 +3533,15 @@ _edje_physics_body_add(Edje *ed, Edje_Real_Part *rp, EPhysics_World *world)
|
||||||
|
|
||||||
edje_object_file_set(edje_obj, ed->path, pface->source);
|
edje_object_file_set(edje_obj, ed->path, pface->source);
|
||||||
evas_object_resize(edje_obj, 1, 1);
|
evas_object_resize(edje_obj, 1, 1);
|
||||||
ephysics_body_face_evas_object_set(rp->body, pface->type,
|
EPH_CALL(ephysics_body_face_evas_object_set)(rp->body, pface->type,
|
||||||
edje_obj, EINA_FALSE);
|
edje_obj, EINA_FALSE);
|
||||||
rp->body_faces = eina_list_append(rp->body_faces, edje_obj);
|
rp->body_faces = eina_list_append(rp->body_faces, edje_obj);
|
||||||
}
|
}
|
||||||
|
|
||||||
ephysics_body_evas_object_set(rp->body, rp->object, resize);
|
EPH_CALL(ephysics_body_evas_object_set)(rp->body, rp->object, resize);
|
||||||
ephysics_body_event_callback_add(rp->body, EPHYSICS_CALLBACK_BODY_UPDATE,
|
EPH_CALL(ephysics_body_event_callback_add)(rp->body, EPHYSICS_CALLBACK_BODY_UPDATE,
|
||||||
_edje_physics_body_update_cb, rp);
|
_edje_physics_body_update_cb, rp);
|
||||||
ephysics_body_data_set(rp->body, ed);
|
EPH_CALL(ephysics_body_data_set)(rp->body, ed);
|
||||||
}
|
}
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -4197,32 +4197,36 @@ _edje_embryo_fn_physics_components_get(Embryo_Program *ep, Embryo_Cell *params,
|
||||||
static Embryo_Cell
|
static Embryo_Cell
|
||||||
_edje_embryo_fn_physics_impulse(Embryo_Program *ep, Embryo_Cell *params)
|
_edje_embryo_fn_physics_impulse(Embryo_Program *ep, Embryo_Cell *params)
|
||||||
{
|
{
|
||||||
|
if (!EPH_LOAD()) return 0;
|
||||||
return _edje_embryo_fn_physics_components_set(
|
return _edje_embryo_fn_physics_components_set(
|
||||||
ep, params, ephysics_body_central_impulse_apply);
|
ep, params, EPH_CALL(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)
|
||||||
{
|
{
|
||||||
|
if (!EPH_LOAD()) return 0;
|
||||||
return _edje_embryo_fn_physics_components_set(
|
return _edje_embryo_fn_physics_components_set(
|
||||||
ep, params, ephysics_body_torque_impulse_apply);
|
ep, params, EPH_CALL(ephysics_body_torque_impulse_apply));
|
||||||
}
|
}
|
||||||
|
|
||||||
/* 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)
|
||||||
{
|
{
|
||||||
|
if (!EPH_LOAD()) return 0;
|
||||||
return _edje_embryo_fn_physics_components_set(
|
return _edje_embryo_fn_physics_components_set(
|
||||||
ep, params, ephysics_body_central_force_apply);
|
ep, params, EPH_CALL(ephysics_body_central_force_apply));
|
||||||
}
|
}
|
||||||
|
|
||||||
/* 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)
|
||||||
{
|
{
|
||||||
|
if (!EPH_LOAD()) return 0;
|
||||||
return _edje_embryo_fn_physics_components_set(
|
return _edje_embryo_fn_physics_components_set(
|
||||||
ep, params, ephysics_body_torque_apply);
|
ep, params, EPH_CALL(ephysics_body_torque_apply));
|
||||||
}
|
}
|
||||||
|
|
||||||
/* physics_clear_forces(part_id) */
|
/* physics_clear_forces(part_id) */
|
||||||
|
@ -4235,13 +4239,14 @@ _edje_embryo_fn_physics_clear_forces(Embryo_Program *ep, Embryo_Cell *params)
|
||||||
|
|
||||||
CHKPARAM(1);
|
CHKPARAM(1);
|
||||||
|
|
||||||
|
if (!EPH_LOAD()) return 0;
|
||||||
ed = embryo_program_data_get(ep);
|
ed = embryo_program_data_get(ep);
|
||||||
part_id = params[1];
|
part_id = params[1];
|
||||||
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) && (rp->body))
|
if ((rp) && (rp->body))
|
||||||
ephysics_body_forces_clear(rp->body);
|
EPH_CALL(ephysics_body_forces_clear)(rp->body);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
@ -4250,48 +4255,54 @@ _edje_embryo_fn_physics_clear_forces(Embryo_Program *ep, Embryo_Cell *params)
|
||||||
static Embryo_Cell
|
static Embryo_Cell
|
||||||
_edje_embryo_fn_physics_get_forces(Embryo_Program *ep, Embryo_Cell *params)
|
_edje_embryo_fn_physics_get_forces(Embryo_Program *ep, Embryo_Cell *params)
|
||||||
{
|
{
|
||||||
|
if (!EPH_LOAD()) return 0;
|
||||||
return _edje_embryo_fn_physics_components_get(
|
return _edje_embryo_fn_physics_components_get(
|
||||||
ep, params, ephysics_body_forces_get);
|
ep, params, EPH_CALL(ephysics_body_forces_get));
|
||||||
}
|
}
|
||||||
|
|
||||||
/* physics_get_torques(part_id, &Float:x, &Float:y, &Float:z) */
|
/* physics_get_torques(part_id, &Float:x, &Float:y, &Float:z) */
|
||||||
static Embryo_Cell
|
static Embryo_Cell
|
||||||
_edje_embryo_fn_physics_get_torques(Embryo_Program *ep, Embryo_Cell *params)
|
_edje_embryo_fn_physics_get_torques(Embryo_Program *ep, Embryo_Cell *params)
|
||||||
{
|
{
|
||||||
|
if (!EPH_LOAD()) return 0;
|
||||||
return _edje_embryo_fn_physics_components_get(
|
return _edje_embryo_fn_physics_components_get(
|
||||||
ep, params, ephysics_body_torques_get);
|
ep, params, EPH_CALL(ephysics_body_torques_get));
|
||||||
}
|
}
|
||||||
|
|
||||||
/* physics_set_velocity(part_id, Float:x, Float:y, Float:z) */
|
/* physics_set_velocity(part_id, Float:x, Float:y, Float:z) */
|
||||||
static Embryo_Cell
|
static Embryo_Cell
|
||||||
_edje_embryo_fn_physics_set_velocity(Embryo_Program *ep, Embryo_Cell *params)
|
_edje_embryo_fn_physics_set_velocity(Embryo_Program *ep, Embryo_Cell *params)
|
||||||
{
|
{
|
||||||
|
if (!EPH_LOAD()) return 0;
|
||||||
return _edje_embryo_fn_physics_components_set(
|
return _edje_embryo_fn_physics_components_set(
|
||||||
ep, params, ephysics_body_linear_velocity_set);
|
ep, params, EPH_CALL(ephysics_body_linear_velocity_set));
|
||||||
}
|
}
|
||||||
|
|
||||||
/* physics_get_velocity(part_id, &Float:x, &Float:y, &Float:z) */
|
/* physics_get_velocity(part_id, &Float:x, &Float:y, &Float:z) */
|
||||||
static Embryo_Cell
|
static Embryo_Cell
|
||||||
_edje_embryo_fn_physics_get_velocity(Embryo_Program *ep, Embryo_Cell *params)
|
_edje_embryo_fn_physics_get_velocity(Embryo_Program *ep, Embryo_Cell *params)
|
||||||
{
|
{
|
||||||
|
if (!EPH_LOAD()) return 0;
|
||||||
return _edje_embryo_fn_physics_components_get(
|
return _edje_embryo_fn_physics_components_get(
|
||||||
ep, params, ephysics_body_linear_velocity_get);
|
ep, params, EPH_CALL(ephysics_body_linear_velocity_get));
|
||||||
}
|
}
|
||||||
|
|
||||||
/* physics_set_ang_velocity(part_id, Float:x, Float:y, Float:z) */
|
/* physics_set_ang_velocity(part_id, Float:x, Float:y, Float:z) */
|
||||||
static Embryo_Cell
|
static Embryo_Cell
|
||||||
_edje_embryo_fn_physics_set_ang_velocity(Embryo_Program *ep, Embryo_Cell *params)
|
_edje_embryo_fn_physics_set_ang_velocity(Embryo_Program *ep, Embryo_Cell *params)
|
||||||
{
|
{
|
||||||
|
if (!EPH_LOAD()) return 0;
|
||||||
return _edje_embryo_fn_physics_components_set(
|
return _edje_embryo_fn_physics_components_set(
|
||||||
ep, params, ephysics_body_angular_velocity_set);
|
ep, params, EPH_CALL(ephysics_body_angular_velocity_set));
|
||||||
}
|
}
|
||||||
|
|
||||||
/* physics_get_ang_velocity(part_id, &Float:x, &Float:y, &Float:z) */
|
/* physics_get_ang_velocity(part_id, &Float:x, &Float:y, &Float:z) */
|
||||||
static Embryo_Cell
|
static Embryo_Cell
|
||||||
_edje_embryo_fn_physics_get_ang_velocity(Embryo_Program *ep, Embryo_Cell *params)
|
_edje_embryo_fn_physics_get_ang_velocity(Embryo_Program *ep, Embryo_Cell *params)
|
||||||
{
|
{
|
||||||
|
if (!EPH_LOAD()) return 0;
|
||||||
return _edje_embryo_fn_physics_components_get(
|
return _edje_embryo_fn_physics_components_get(
|
||||||
ep, params, ephysics_body_angular_velocity_get);
|
ep, params, EPH_CALL(ephysics_body_angular_velocity_get));
|
||||||
}
|
}
|
||||||
|
|
||||||
/* physics_stop(part_id) */
|
/* physics_stop(part_id) */
|
||||||
|
@ -4304,13 +4315,14 @@ _edje_embryo_fn_physics_stop(Embryo_Program *ep, Embryo_Cell *params)
|
||||||
|
|
||||||
CHKPARAM(1);
|
CHKPARAM(1);
|
||||||
|
|
||||||
|
if (!EPH_LOAD()) return 0;
|
||||||
ed = embryo_program_data_get(ep);
|
ed = embryo_program_data_get(ep);
|
||||||
part_id = params[1];
|
part_id = params[1];
|
||||||
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) && (rp->body))
|
if ((rp) && (rp->body))
|
||||||
ephysics_body_stop(rp->body);
|
EPH_CALL(ephysics_body_stop)(rp->body);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
@ -4325,6 +4337,7 @@ _edje_embryo_fn_physics_set_rotation(Embryo_Program *ep, Embryo_Cell *params)
|
||||||
|
|
||||||
CHKPARAM(5);
|
CHKPARAM(5);
|
||||||
|
|
||||||
|
if (!EPH_LOAD()) return 0;
|
||||||
ed = embryo_program_data_get(ep);
|
ed = embryo_program_data_get(ep);
|
||||||
part_id = params[1];
|
part_id = params[1];
|
||||||
if (part_id < 0) return 0;
|
if (part_id < 0) return 0;
|
||||||
|
@ -4340,9 +4353,9 @@ _edje_embryo_fn_physics_set_rotation(Embryo_Program *ep, Embryo_Cell *params)
|
||||||
y = (double)EMBRYO_CELL_TO_FLOAT(params[4]);
|
y = (double)EMBRYO_CELL_TO_FLOAT(params[4]);
|
||||||
z = (double)EMBRYO_CELL_TO_FLOAT(params[5]);
|
z = (double)EMBRYO_CELL_TO_FLOAT(params[5]);
|
||||||
|
|
||||||
ephysics_quaternion_set(&quat, x, y, z, w);
|
EPH_CALL(ephysics_quaternion_set)(&quat, x, y, z, w);
|
||||||
ephysics_quaternion_normalize(&quat);
|
EPH_CALL(ephysics_quaternion_normalize)(&quat);
|
||||||
ephysics_body_rotation_set(rp->body, &quat);
|
EPH_CALL(ephysics_body_rotation_set)(rp->body, &quat);
|
||||||
}
|
}
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
|
@ -4358,6 +4371,7 @@ _edje_embryo_fn_physics_get_rotation(Embryo_Program *ep, Embryo_Cell *params)
|
||||||
|
|
||||||
CHKPARAM(5);
|
CHKPARAM(5);
|
||||||
|
|
||||||
|
if (!EPH_LOAD()) return 0;
|
||||||
ed = embryo_program_data_get(ep);
|
ed = embryo_program_data_get(ep);
|
||||||
part_id = params[1];
|
part_id = params[1];
|
||||||
if (part_id < 0) return 0;
|
if (part_id < 0) return 0;
|
||||||
|
@ -4368,8 +4382,8 @@ _edje_embryo_fn_physics_get_rotation(Embryo_Program *ep, Embryo_Cell *params)
|
||||||
EPhysics_Quaternion quat;
|
EPhysics_Quaternion quat;
|
||||||
double w, x, y, z;
|
double w, x, y, z;
|
||||||
|
|
||||||
ephysics_body_rotation_get(rp->body, &quat);
|
EPH_CALL(ephysics_body_rotation_get)(rp->body, &quat);
|
||||||
ephysics_quaternion_get(&quat, &x, &y, &z, &w);
|
EPH_CALL(ephysics_quaternion_get)(&quat, &x, &y, &z, &w);
|
||||||
|
|
||||||
SETFLOAT(w, params[2]);
|
SETFLOAT(w, params[2]);
|
||||||
SETFLOAT(x, params[3]);
|
SETFLOAT(x, params[3]);
|
||||||
|
|
|
@ -503,9 +503,8 @@ static void
|
||||||
_edje_physics_world_update_cb(void *data, EPhysics_World *world EINA_UNUSED, void *event_info EINA_UNUSED)
|
_edje_physics_world_update_cb(void *data, EPhysics_World *world EINA_UNUSED, void *event_info EINA_UNUSED)
|
||||||
{
|
{
|
||||||
Edje *edje = data;
|
Edje *edje = data;
|
||||||
_edje_recalc_do(edje);
|
if (EPH_LOAD()) _edje_recalc_do(edje);
|
||||||
}
|
}
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
int
|
int
|
||||||
|
@ -546,10 +545,13 @@ _edje_object_file_set_internal(Evas_Object *obj, const Eina_File *file, const ch
|
||||||
|
|
||||||
#ifdef HAVE_EPHYSICS
|
#ifdef HAVE_EPHYSICS
|
||||||
/* clear physics world / shutdown ephysics */
|
/* clear physics world / shutdown ephysics */
|
||||||
if ((ed->collection) && (ed->collection->physics_enabled))
|
if ((ed->collection) && (ed->collection->physics_enabled) && (ed->world))
|
||||||
{
|
{
|
||||||
ephysics_world_del(ed->world);
|
if (EPH_LOAD())
|
||||||
ephysics_shutdown();
|
{
|
||||||
|
EPH_CALL(ephysics_world_del)(ed->world);
|
||||||
|
EPH_CALL(ephysics_shutdown)();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
@ -606,17 +608,20 @@ _edje_object_file_set_internal(Evas_Object *obj, const Eina_File *file, const ch
|
||||||
if (ed->collection->physics_enabled)
|
if (ed->collection->physics_enabled)
|
||||||
#ifdef HAVE_EPHYSICS
|
#ifdef HAVE_EPHYSICS
|
||||||
{
|
{
|
||||||
ephysics_init();
|
if (EPH_LOAD())
|
||||||
ed->world = ephysics_world_new();
|
{
|
||||||
ephysics_world_event_callback_add(
|
EPH_CALL(ephysics_init)();
|
||||||
ed->world, EPHYSICS_CALLBACK_WORLD_UPDATE,
|
ed->world = EPH_CALL(ephysics_world_new)();
|
||||||
_edje_physics_world_update_cb, ed);
|
EPH_CALL(ephysics_world_event_callback_add)
|
||||||
ephysics_world_rate_set(ed->world,
|
(ed->world, EPHYSICS_CALLBACK_WORLD_UPDATE,
|
||||||
ed->collection->physics.world.rate);
|
_edje_physics_world_update_cb, ed);
|
||||||
ephysics_world_gravity_set(
|
EPH_CALL(ephysics_world_rate_set)
|
||||||
ed->world, ed->collection->physics.world.gravity.x,
|
(ed->world, ed->collection->physics.world.rate);
|
||||||
ed->collection->physics.world.gravity.y,
|
EPH_CALL(ephysics_world_gravity_set)
|
||||||
ed->collection->physics.world.gravity.z);
|
(ed->world, ed->collection->physics.world.gravity.x,
|
||||||
|
ed->collection->physics.world.gravity.y,
|
||||||
|
ed->collection->physics.world.gravity.z);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
#else
|
#else
|
||||||
ERR("Edje compiled without support to physics.");
|
ERR("Edje compiled without support to physics.");
|
||||||
|
|
|
@ -21,6 +21,11 @@ static const Edje_Calc_Params_Physics default_calc_physics = {
|
||||||
0.0, 0.0, 0.0, 0.0, 0.0, { 0.0, 0.0 }, { 0.0, 0.0 }, 0, 0, { { 0, 0, 0 }, { 0, 0, 0 } }, 0, 0, 0, 0
|
0.0, 0.0, 0.0, 0.0, 0.0, { 0.0, 0.0 }, { 0.0, 0.0 }, 0, 0, { { 0, 0, 0 }, { 0, 0, 0 } }, 0, 0, 0, 0
|
||||||
};
|
};
|
||||||
|
|
||||||
|
#ifdef HAVE_EPHYSICS
|
||||||
|
static void _edje_ephysics_clear(void);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
/*============================================================================*
|
/*============================================================================*
|
||||||
* API *
|
* API *
|
||||||
*============================================================================*/
|
*============================================================================*/
|
||||||
|
@ -199,6 +204,10 @@ _edje_shutdown_core(void)
|
||||||
ecore_imf_shutdown();
|
ecore_imf_shutdown();
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#ifdef HAVE_EPHYSICS
|
||||||
|
_edje_ephysics_clear();
|
||||||
|
#endif
|
||||||
|
|
||||||
efreet_shutdown();
|
efreet_shutdown();
|
||||||
evas_shutdown();
|
evas_shutdown();
|
||||||
eet_shutdown();
|
eet_shutdown();
|
||||||
|
@ -315,3 +324,131 @@ _edje_need_imf(void)
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#ifdef HAVE_EPHYSICS
|
||||||
|
Edje_Ephysics *_edje_ephysics = NULL;
|
||||||
|
|
||||||
|
Eina_Bool
|
||||||
|
_edje_ephysics_load(void)
|
||||||
|
{
|
||||||
|
if (_edje_ephysics)
|
||||||
|
{
|
||||||
|
if (!_edje_ephysics->mod)
|
||||||
|
{
|
||||||
|
ERR("Cannot find libpulse!");
|
||||||
|
return EINA_FALSE;
|
||||||
|
}
|
||||||
|
return EINA_TRUE;
|
||||||
|
}
|
||||||
|
ERR("PHYYYYYYYYYYYYYYZIKS");
|
||||||
|
_edje_ephysics = calloc(1, sizeof(Edje_Ephysics));
|
||||||
|
if (!_edje_ephysics) return EINA_FALSE;
|
||||||
|
# define LOAD(x) \
|
||||||
|
if (!_edje_ephysics->mod) { \
|
||||||
|
if ((_edje_ephysics->mod = eina_module_new(x))) { \
|
||||||
|
if (!eina_module_load(_edje_ephysics->mod)) { \
|
||||||
|
eina_module_free(_edje_ephysics->mod); \
|
||||||
|
_edje_ephysics->mod = NULL; \
|
||||||
|
} \
|
||||||
|
} \
|
||||||
|
}
|
||||||
|
# if defined(_WIN32) || defined(__CYGWIN__)
|
||||||
|
LOAD("libephysics-1.dll");
|
||||||
|
LOAD("libephysics.dll");
|
||||||
|
# elif defined(__APPLE__) && defined(__MACH__)
|
||||||
|
LOAD("libephysics.1.dylib");
|
||||||
|
LOAD("libephysics.1.so");
|
||||||
|
LOAD("libephysics.so.1");
|
||||||
|
# else
|
||||||
|
LOAD("libephysics.so.1");
|
||||||
|
# endif
|
||||||
|
# undef LOAD
|
||||||
|
if (!_edje_ephysics->mod) return EINA_FALSE;
|
||||||
|
# define SYM(x) \
|
||||||
|
if (!(_edje_ephysics->x = eina_module_symbol_get(_edje_ephysics->mod, #x))) { \
|
||||||
|
ERR("libpulse - cannot find %s", #x); \
|
||||||
|
goto err; \
|
||||||
|
}
|
||||||
|
SYM(ephysics_init);
|
||||||
|
SYM(ephysics_shutdown);
|
||||||
|
SYM(ephysics_world_new);
|
||||||
|
SYM(ephysics_world_del);
|
||||||
|
SYM(ephysics_world_event_callback_add)
|
||||||
|
SYM(ephysics_world_rate_set)
|
||||||
|
SYM(ephysics_world_gravity_set)
|
||||||
|
SYM(ephysics_world_render_geometry_set);
|
||||||
|
SYM(ephysics_world_render_geometry_get);
|
||||||
|
SYM(ephysics_quaternion_set)
|
||||||
|
SYM(ephysics_quaternion_get)
|
||||||
|
SYM(ephysics_quaternion_normalize)
|
||||||
|
SYM(ephysics_body_box_add)
|
||||||
|
SYM(ephysics_body_sphere_add)
|
||||||
|
SYM(ephysics_body_cylinder_add)
|
||||||
|
SYM(ephysics_body_soft_box_add)
|
||||||
|
SYM(ephysics_body_soft_sphere_add)
|
||||||
|
SYM(ephysics_body_soft_cylinder_add)
|
||||||
|
SYM(ephysics_body_cloth_add)
|
||||||
|
SYM(ephysics_body_top_boundary_add)
|
||||||
|
SYM(ephysics_body_bottom_boundary_add)
|
||||||
|
SYM(ephysics_body_right_boundary_add)
|
||||||
|
SYM(ephysics_body_left_boundary_add)
|
||||||
|
SYM(ephysics_body_front_boundary_add)
|
||||||
|
SYM(ephysics_body_back_boundary_add)
|
||||||
|
SYM(ephysics_body_central_impulse_apply)
|
||||||
|
SYM(ephysics_body_torque_impulse_apply)
|
||||||
|
SYM(ephysics_body_central_force_apply)
|
||||||
|
SYM(ephysics_body_torque_apply)
|
||||||
|
SYM(ephysics_body_forces_clear)
|
||||||
|
SYM(ephysics_body_linear_velocity_set)
|
||||||
|
SYM(ephysics_body_angular_velocity_set)
|
||||||
|
SYM(ephysics_body_stop)
|
||||||
|
SYM(ephysics_body_rotation_set)
|
||||||
|
SYM(ephysics_body_forces_get)
|
||||||
|
SYM(ephysics_body_torques_get)
|
||||||
|
SYM(ephysics_body_linear_velocity_get)
|
||||||
|
SYM(ephysics_body_angular_velocity_get)
|
||||||
|
SYM(ephysics_body_linear_movement_enable_set)
|
||||||
|
SYM(ephysics_body_angular_movement_enable_set)
|
||||||
|
SYM(ephysics_body_move)
|
||||||
|
SYM(ephysics_body_geometry_get)
|
||||||
|
SYM(ephysics_body_resize)
|
||||||
|
SYM(ephysics_body_material_set)
|
||||||
|
SYM(ephysics_body_density_set)
|
||||||
|
SYM(ephysics_body_mass_set)
|
||||||
|
SYM(ephysics_body_soft_body_hardness_set)
|
||||||
|
SYM(ephysics_body_restitution_set)
|
||||||
|
SYM(ephysics_body_friction_set)
|
||||||
|
SYM(ephysics_body_damping_set)
|
||||||
|
SYM(ephysics_body_sleeping_threshold_set)
|
||||||
|
SYM(ephysics_body_light_set)
|
||||||
|
SYM(ephysics_body_back_face_culling_set)
|
||||||
|
SYM(ephysics_body_evas_object_update)
|
||||||
|
SYM(ephysics_body_face_evas_object_set)
|
||||||
|
SYM(ephysics_body_evas_object_set)
|
||||||
|
SYM(ephysics_body_event_callback_add)
|
||||||
|
SYM(ephysics_body_data_set)
|
||||||
|
SYM(ephysics_body_data_get)
|
||||||
|
SYM(ephysics_body_rotation_get)
|
||||||
|
#undef SYM
|
||||||
|
return EINA_TRUE;
|
||||||
|
err:
|
||||||
|
if (_edje_ephysics->mod)
|
||||||
|
{
|
||||||
|
eina_module_free(_edje_ephysics->mod);
|
||||||
|
_edje_ephysics->mod = NULL;
|
||||||
|
}
|
||||||
|
return EINA_FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
_edje_ephysics_clear(void)
|
||||||
|
{
|
||||||
|
if (_edje_ephysics)
|
||||||
|
{
|
||||||
|
if (_edje_ephysics->mod)
|
||||||
|
eina_module_free(_edje_ephysics->mod);
|
||||||
|
free(_edje_ephysics);
|
||||||
|
_edje_ephysics = NULL;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
|
@ -3279,6 +3279,85 @@ Edje_Vector_Data * _edje_ref_vector_data(Edje *ed, int svg_id);
|
||||||
|
|
||||||
EAPI void _edje_svg_node_free(Svg_Node *node);
|
EAPI void _edje_svg_node_free(Svg_Node *node);
|
||||||
|
|
||||||
|
#ifdef HAVE_EPHYSICS
|
||||||
|
Eina_Bool _edje_ephysics_load(void);
|
||||||
|
|
||||||
|
typedef struct _Edje_Ephysics Edje_Ephysics;
|
||||||
|
|
||||||
|
struct _Edje_Ephysics
|
||||||
|
{
|
||||||
|
Eina_Module *mod;
|
||||||
|
|
||||||
|
int (*ephysics_init) (void);
|
||||||
|
int (*ephysics_shutdown) (void);
|
||||||
|
EPhysics_World *(*ephysics_world_new) (void);
|
||||||
|
void (*ephysics_world_del) (EPhysics_World *world);
|
||||||
|
void (*ephysics_world_event_callback_add) (EPhysics_World *world, EPhysics_Callback_World_Type type, EPhysics_World_Event_Cb func, const void *data);
|
||||||
|
void (*ephysics_world_rate_set) (EPhysics_World *world, double rate);
|
||||||
|
void (*ephysics_world_gravity_set) (EPhysics_World *world, double gx, double gy, double gz);
|
||||||
|
void (*ephysics_world_render_geometry_set) (EPhysics_World *world, Evas_Coord x, Evas_Coord y, Evas_Coord z, Evas_Coord w, Evas_Coord h, Evas_Coord d);
|
||||||
|
void (*ephysics_world_render_geometry_get) (const EPhysics_World *world, Evas_Coord *x, Evas_Coord *y, Evas_Coord *z, Evas_Coord *w, Evas_Coord *h, Evas_Coord *d);
|
||||||
|
void (*ephysics_quaternion_set) (EPhysics_Quaternion *quat, double x, double y, double z, double w);
|
||||||
|
void (*ephysics_quaternion_get) (const EPhysics_Quaternion *quat, double *x, double *y, double *z, double *w);
|
||||||
|
void (*ephysics_quaternion_normalize) (EPhysics_Quaternion *quat);
|
||||||
|
EPhysics_Body *(*ephysics_body_box_add) (EPhysics_World *world);
|
||||||
|
EPhysics_Body *(*ephysics_body_sphere_add) (EPhysics_World *world);
|
||||||
|
EPhysics_Body *(*ephysics_body_cylinder_add) (EPhysics_World *world);
|
||||||
|
EPhysics_Body *(*ephysics_body_soft_box_add) (EPhysics_World *world);
|
||||||
|
EPhysics_Body *(*ephysics_body_soft_sphere_add) (EPhysics_World *world, int granularity);
|
||||||
|
EPhysics_Body *(*ephysics_body_soft_cylinder_add) (EPhysics_World *world);
|
||||||
|
EPhysics_Body *(*ephysics_body_cloth_add) (EPhysics_World *world, unsigned short rows, unsigned short columns);
|
||||||
|
EPhysics_Body *(*ephysics_body_top_boundary_add) (EPhysics_World *world);
|
||||||
|
EPhysics_Body *(*ephysics_body_bottom_boundary_add) (EPhysics_World *world);
|
||||||
|
EPhysics_Body *(*ephysics_body_right_boundary_add) (EPhysics_World *world);
|
||||||
|
EPhysics_Body *(*ephysics_body_left_boundary_add) (EPhysics_World *world);
|
||||||
|
EPhysics_Body *(*ephysics_body_front_boundary_add) (EPhysics_World *world);
|
||||||
|
EPhysics_Body *(*ephysics_body_back_boundary_add) (EPhysics_World *world);
|
||||||
|
void (*ephysics_body_central_impulse_apply) (EPhysics_Body *body, double x, double y, double z);
|
||||||
|
void (*ephysics_body_torque_impulse_apply) (EPhysics_Body *body, double pitch, double yaw, double roll);
|
||||||
|
void (*ephysics_body_central_force_apply) (EPhysics_Body *body, double x, double y, double z);
|
||||||
|
void (*ephysics_body_torque_apply) (EPhysics_Body *body, double torque_x, double torque_y, double torque_z);
|
||||||
|
void (*ephysics_body_forces_clear) (EPhysics_Body *body);
|
||||||
|
void (*ephysics_body_linear_velocity_set) (EPhysics_Body *body, double x, double y, double z);
|
||||||
|
void (*ephysics_body_angular_velocity_set) (EPhysics_Body *body, double x, double y, double z);
|
||||||
|
void (*ephysics_body_stop) (EPhysics_Body *body);
|
||||||
|
void (*ephysics_body_rotation_set) (EPhysics_Body *body, EPhysics_Quaternion *quat);
|
||||||
|
void (*ephysics_body_forces_get) (const EPhysics_Body *body, double *x, double *y, double *z);
|
||||||
|
void (*ephysics_body_torques_get) (const EPhysics_Body *body, double *x, double *y, double *z);
|
||||||
|
void (*ephysics_body_linear_velocity_get) (const EPhysics_Body *body, double *x, double *y, double *z);
|
||||||
|
void (*ephysics_body_angular_velocity_get) (const EPhysics_Body *body, double *x, double *y, double *z);
|
||||||
|
void (*ephysics_body_linear_movement_enable_set) (EPhysics_Body *body, Eina_Bool enable_x, Eina_Bool enable_y, Eina_Bool enable_z);
|
||||||
|
void (*ephysics_body_angular_movement_enable_set) (EPhysics_Body *body, Eina_Bool enable_x, Eina_Bool enable_y, Eina_Bool enable_z);
|
||||||
|
void (*ephysics_body_move) (EPhysics_Body *body, Evas_Coord x, Evas_Coord y, Evas_Coord z);
|
||||||
|
void (*ephysics_body_geometry_get) (const EPhysics_Body *body, Evas_Coord *x, Evas_Coord *y, Evas_Coord *z, Evas_Coord *w, Evas_Coord *h, Evas_Coord *d);
|
||||||
|
void (*ephysics_body_resize) (EPhysics_Body *body, Evas_Coord w, Evas_Coord h, Evas_Coord d);
|
||||||
|
void (*ephysics_body_material_set) (EPhysics_Body *body, EPhysics_Body_Material material);
|
||||||
|
void (*ephysics_body_density_set) (EPhysics_Body *body, double density);
|
||||||
|
void (*ephysics_body_mass_set) (EPhysics_Body *body, double mass);
|
||||||
|
void (*ephysics_body_soft_body_hardness_set) (EPhysics_Body *body, double hardness);
|
||||||
|
void (*ephysics_body_restitution_set) (EPhysics_Body *body, double restitution);
|
||||||
|
void (*ephysics_body_friction_set) (EPhysics_Body *body, double friction);
|
||||||
|
void (*ephysics_body_damping_set) (EPhysics_Body *body, double linear_damping, double angular_damping);
|
||||||
|
void (*ephysics_body_sleeping_threshold_set) (EPhysics_Body *body, double linear_threshold, double angular_threshold);
|
||||||
|
void (*ephysics_body_light_set) (EPhysics_Body *body, Eina_Bool enable);
|
||||||
|
void (*ephysics_body_back_face_culling_set) (EPhysics_Body *body, Eina_Bool enable);
|
||||||
|
void (*ephysics_body_evas_object_update) (EPhysics_Body *body);
|
||||||
|
void (*ephysics_body_face_evas_object_set) (EPhysics_Body *body, EPhysics_Body_Face face, Evas_Object *evas_obj, Eina_Bool use_obj_pos);
|
||||||
|
void (*ephysics_body_evas_object_set) (EPhysics_Body *body, Evas_Object *evas_obj, Eina_Bool use_obj_pos);
|
||||||
|
void (*ephysics_body_event_callback_add) (EPhysics_Body *body, EPhysics_Callback_Body_Type type, EPhysics_Body_Event_Cb func, const void *data);
|
||||||
|
void (*ephysics_body_data_set) (EPhysics_Body *body, void *data);
|
||||||
|
void *(*ephysics_body_data_get) (const EPhysics_Body *body);
|
||||||
|
EPhysics_Quaternion *(*ephysics_body_rotation_get) (const EPhysics_Body *body, EPhysics_Quaternion *rotation);
|
||||||
|
};
|
||||||
|
|
||||||
|
extern Edje_Ephysics *_edje_ephysics;
|
||||||
|
#define EPH_LOAD() _edje_ephysics_load()
|
||||||
|
#define EPH_CALL(x) _edje_ephysics->x
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
#ifdef HAVE_LIBREMIX
|
#ifdef HAVE_LIBREMIX
|
||||||
#include <remix/remix.h>
|
#include <remix/remix.h>
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -1074,79 +1074,106 @@ low_mem_current:
|
||||||
|
|
||||||
#ifdef HAVE_EPHYSICS
|
#ifdef HAVE_EPHYSICS
|
||||||
case EDJE_ACTION_TYPE_PHYSICS_IMPULSE:
|
case EDJE_ACTION_TYPE_PHYSICS_IMPULSE:
|
||||||
if (!_edje_physics_action_set(ed, pr, ephysics_body_central_impulse_apply))
|
if (EPH_LOAD())
|
||||||
goto break_prog;
|
{
|
||||||
|
if (!_edje_physics_action_set(ed, pr, EPH_CALL(ephysics_body_central_impulse_apply)))
|
||||||
|
goto break_prog;
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case EDJE_ACTION_TYPE_PHYSICS_TORQUE_IMPULSE:
|
case EDJE_ACTION_TYPE_PHYSICS_TORQUE_IMPULSE:
|
||||||
if (!_edje_physics_action_set(ed, pr, ephysics_body_torque_impulse_apply))
|
if (EPH_LOAD())
|
||||||
goto break_prog;
|
{
|
||||||
|
if (!_edje_physics_action_set(ed, pr, EPH_CALL(ephysics_body_torque_impulse_apply)))
|
||||||
|
goto break_prog;
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case EDJE_ACTION_TYPE_PHYSICS_FORCE:
|
case EDJE_ACTION_TYPE_PHYSICS_FORCE:
|
||||||
if (!_edje_physics_action_set(ed, pr, ephysics_body_central_force_apply))
|
if (EPH_LOAD())
|
||||||
goto break_prog;
|
{
|
||||||
|
if (!_edje_physics_action_set(ed, pr, EPH_CALL(ephysics_body_central_force_apply)))
|
||||||
|
goto break_prog;
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case EDJE_ACTION_TYPE_PHYSICS_TORQUE:
|
case EDJE_ACTION_TYPE_PHYSICS_TORQUE:
|
||||||
if (!_edje_physics_action_set(ed, pr, ephysics_body_torque_apply))
|
if (EPH_LOAD())
|
||||||
goto break_prog;
|
{
|
||||||
|
if (!_edje_physics_action_set(ed, pr, EPH_CALL(ephysics_body_torque_apply)))
|
||||||
|
goto break_prog;
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case EDJE_ACTION_TYPE_PHYSICS_FORCES_CLEAR:
|
case EDJE_ACTION_TYPE_PHYSICS_FORCES_CLEAR:
|
||||||
if (_edje_block_break(ed))
|
if (EPH_LOAD())
|
||||||
goto break_prog;
|
|
||||||
EINA_LIST_FOREACH(pr->targets, l, pt)
|
|
||||||
{
|
{
|
||||||
if (pt->id >= 0)
|
if (_edje_block_break(ed))
|
||||||
|
goto break_prog;
|
||||||
|
EINA_LIST_FOREACH(pr->targets, l, pt)
|
||||||
{
|
{
|
||||||
rp = ed->table_parts[pt->id % ed->table_parts_size];
|
if (pt->id >= 0)
|
||||||
if ((rp) && (rp->body))
|
{
|
||||||
ephysics_body_forces_clear(rp->body);
|
rp = ed->table_parts[pt->id % ed->table_parts_size];
|
||||||
|
if ((rp) && (rp->body))
|
||||||
|
EPH_CALL(ephysics_body_forces_clear)(rp->body);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case EDJE_ACTION_TYPE_PHYSICS_VEL_SET:
|
case EDJE_ACTION_TYPE_PHYSICS_VEL_SET:
|
||||||
if (!_edje_physics_action_set(ed, pr, ephysics_body_linear_velocity_set))
|
if (EPH_LOAD())
|
||||||
goto break_prog;
|
{
|
||||||
|
if (!_edje_physics_action_set(ed, pr, EPH_CALL(ephysics_body_linear_velocity_set)))
|
||||||
|
goto break_prog;
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case EDJE_ACTION_TYPE_PHYSICS_ANG_VEL_SET:
|
case EDJE_ACTION_TYPE_PHYSICS_ANG_VEL_SET:
|
||||||
if (!_edje_physics_action_set(ed, pr, ephysics_body_angular_velocity_set))
|
if (EPH_LOAD())
|
||||||
goto break_prog;
|
{
|
||||||
|
if (!_edje_physics_action_set(ed, pr, EPH_CALL(ephysics_body_angular_velocity_set)))
|
||||||
|
goto break_prog;
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case EDJE_ACTION_TYPE_PHYSICS_STOP:
|
case EDJE_ACTION_TYPE_PHYSICS_STOP:
|
||||||
if (_edje_block_break(ed))
|
if (EPH_LOAD())
|
||||||
goto break_prog;
|
|
||||||
EINA_LIST_FOREACH(pr->targets, l, pt)
|
|
||||||
{
|
{
|
||||||
if (pt->id >= 0)
|
if (_edje_block_break(ed))
|
||||||
|
goto break_prog;
|
||||||
|
EINA_LIST_FOREACH(pr->targets, l, pt)
|
||||||
{
|
{
|
||||||
rp = ed->table_parts[pt->id % ed->table_parts_size];
|
if (pt->id >= 0)
|
||||||
if ((rp) && (rp->body))
|
{
|
||||||
ephysics_body_stop(rp->body);
|
rp = ed->table_parts[pt->id % ed->table_parts_size];
|
||||||
|
if ((rp) && (rp->body))
|
||||||
|
EPH_CALL(ephysics_body_stop)(rp->body);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case EDJE_ACTION_TYPE_PHYSICS_ROT_SET:
|
case EDJE_ACTION_TYPE_PHYSICS_ROT_SET:
|
||||||
if (_edje_block_break(ed))
|
if (EPH_LOAD())
|
||||||
goto break_prog;
|
|
||||||
EINA_LIST_FOREACH(pr->targets, l, pt)
|
|
||||||
{
|
{
|
||||||
if (pt->id >= 0)
|
if (_edje_block_break(ed))
|
||||||
|
goto break_prog;
|
||||||
|
EINA_LIST_FOREACH(pr->targets, l, pt)
|
||||||
{
|
{
|
||||||
rp = ed->table_parts[pt->id % ed->table_parts_size];
|
if (pt->id >= 0)
|
||||||
if ((rp) && (rp->body))
|
|
||||||
{
|
{
|
||||||
EPhysics_Quaternion quat;
|
rp = ed->table_parts[pt->id % ed->table_parts_size];
|
||||||
ephysics_quaternion_set(&quat, pr->physics.x,
|
if ((rp) && (rp->body))
|
||||||
pr->physics.y, pr->physics.z,
|
{
|
||||||
pr->physics.w);
|
EPhysics_Quaternion quat;
|
||||||
ephysics_quaternion_normalize(&quat);
|
EPH_CALL(ephysics_quaternion_set)(&quat, pr->physics.x,
|
||||||
ephysics_body_rotation_set(rp->body, &quat);
|
pr->physics.y, pr->physics.z,
|
||||||
|
pr->physics.w);
|
||||||
|
EPH_CALL(ephysics_quaternion_normalize)(&quat);
|
||||||
|
EPH_CALL(ephysics_body_rotation_set)(rp->body, &quat);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -156,10 +156,13 @@ _edje_object_efl_canvas_group_group_del(Eo *obj, Edje *ed)
|
||||||
if (_edje_lua_script_only(ed)) _edje_lua_script_only_shutdown(ed);
|
if (_edje_lua_script_only(ed)) _edje_lua_script_only_shutdown(ed);
|
||||||
#ifdef HAVE_EPHYSICS
|
#ifdef HAVE_EPHYSICS
|
||||||
/* clear physics world / shutdown ephysics */
|
/* clear physics world / shutdown ephysics */
|
||||||
if ((ed->collection) && (ed->collection->physics_enabled))
|
if ((ed->collection) && (ed->collection->physics_enabled) && (ed->world))
|
||||||
{
|
{
|
||||||
ephysics_world_del(ed->world);
|
if (EPH_LOAD())
|
||||||
ephysics_shutdown();
|
{
|
||||||
|
EPH_CALL(ephysics_world_del)(ed->world);
|
||||||
|
EPH_CALL(ephysics_shutdown)();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
if (ed->persp) edje_object_perspective_set(obj, NULL);
|
if (ed->persp) edje_object_perspective_set(obj, NULL);
|
||||||
|
@ -272,9 +275,12 @@ _edje_object_efl_canvas_group_group_resize(Eo *obj EINA_UNUSED, Edje *ed, Evas_C
|
||||||
ed->h = h;
|
ed->h = h;
|
||||||
#ifdef HAVE_EPHYSICS
|
#ifdef HAVE_EPHYSICS
|
||||||
if ((ed->collection) && (ed->world))
|
if ((ed->collection) && (ed->world))
|
||||||
ephysics_world_render_geometry_set(
|
{
|
||||||
ed->world, ed->x, ed->y, ed->collection->physics.world.z,
|
if (EPH_LOAD())
|
||||||
ed->w, ed->h, ed->collection->physics.world.depth);
|
EPH_CALL(ephysics_world_render_geometry_set)
|
||||||
|
(ed->world, ed->x, ed->y, ed->collection->physics.world.z,
|
||||||
|
ed->w, ed->h, ed->collection->physics.world.depth);
|
||||||
|
}
|
||||||
#endif
|
#endif
|
||||||
#ifdef EDJE_CALC_CACHE
|
#ifdef EDJE_CALC_CACHE
|
||||||
ed->all_part_change = EINA_TRUE;
|
ed->all_part_change = EINA_TRUE;
|
||||||
|
|
Loading…
Reference in New Issue