ephysics: add autodel functions for front and back of

the scene




SVN revision: 78016
This commit is contained in:
Bruno Dilly 2012-10-15 21:54:35 +00:00
parent c2b0c76b74
commit bb90530f7b
3 changed files with 151 additions and 9 deletions

View File

@ -1033,6 +1033,8 @@ EAPI double ephysics_world_linear_slop_get(const EPhysics_World *world);
* @see ephysics_world_bodies_outside_bottom_autodel_set().
* @see ephysics_world_bodies_outside_left_autodel_set().
* @see ephysics_world_bodies_outside_right_autodel_set().
* @see ephysics_world_bodies_outside_front_autodel_set().
* @see ephysics_world_bodies_outside_back_autodel_set().
*
* @ingroup EPhysics_World
*/
@ -1066,6 +1068,8 @@ EAPI Eina_Bool ephysics_world_bodies_outside_top_autodel_get(const EPhysics_Worl
* @see ephysics_world_bodies_outside_bottom_autodel_get().
* @see ephysics_world_bodies_outside_left_autodel_set().
* @see ephysics_world_bodies_outside_right_autodel_set().
* @see ephysics_world_bodies_outside_front_autodel_set().
* @see ephysics_world_bodies_outside_back_autodel_set().
*
* @ingroup EPhysics_World
*/
@ -1099,6 +1103,8 @@ EAPI Eina_Bool ephysics_world_bodies_outside_bottom_autodel_get(const EPhysics_W
* @see ephysics_world_bodies_outside_right_autodel_get().
* @see ephysics_world_bodies_outside_bottom_autodel_set().
* @see ephysics_world_bodies_outside_left_autodel_set().
* @see ephysics_world_bodies_outside_front_autodel_set().
* @see ephysics_world_bodies_outside_back_autodel_set().
*
* @ingroup EPhysics_World
*/
@ -1132,6 +1138,8 @@ EAPI Eina_Bool ephysics_world_bodies_outside_right_autodel_get(const EPhysics_Wo
* @see ephysics_world_bodies_outside_left_autodel_get().
* @see ephysics_world_bodies_outside_bottom_autodel_set().
* @see ephysics_world_bodies_outside_right_autodel_set().
* @see ephysics_world_bodies_outside_front_autodel_set().
* @see ephysics_world_bodies_outside_back_autodel_set().
*
* @ingroup EPhysics_World
*/
@ -1152,6 +1160,76 @@ EAPI void ephysics_world_bodies_outside_left_autodel_set(EPhysics_World *world,
*/
EAPI Eina_Bool ephysics_world_bodies_outside_left_autodel_get(const EPhysics_World *world);
/**
* @brief
* Set world autodeleting bodies mode when they're outside of render area
* by the front.
*
* @param world The physics world.
* @param autodel If @c EINA_TRUE delete bodies when they are outside render
* area, otherwise, don't delete.
*
* @see ephysics_world_bodies_outside_top_autodel_set() for more details.
* @see ephysics_world_bodies_outside_left_autodel_get().
* @see ephysics_world_bodies_outside_bottom_autodel_set().
* @see ephysics_world_bodies_outside_right_autodel_set().
* @see ephysics_world_bodies_outside_front_autodel_set().
* @see ephysics_world_bodies_outside_back_autodel_set().
*
* @ingroup EPhysics_World
*/
EAPI void ephysics_world_bodies_outside_front_autodel_set(EPhysics_World *world, Eina_Bool autodel);
/**
* @brief
* Get world autodeleting bodies mode when they're outside of render area by
* the front.
*
* @param world The physics world.
* @return @c EINA_TRUE if bodies will be deleted or @c EINA_FALSE if they
* won't, or on error.
*
* @see ephysics_world_bodies_outside_front_autodel_set() for details.
*
* @ingroup EPhysics_World
*/
EAPI Eina_Bool ephysics_world_bodies_outside_front_autodel_get(const EPhysics_World *world);
/**
* @brief
* Set world autodeleting bodies mode when they're outside of render area
* by the back.
*
* @param world The physics world.
* @param autodel If @c EINA_TRUE delete bodies when they are outside render
* area, otherwise, don't delete.
*
* @see ephysics_world_bodies_outside_top_autodel_set() for more details.
* @see ephysics_world_bodies_outside_left_autodel_get().
* @see ephysics_world_bodies_outside_bottom_autodel_set().
* @see ephysics_world_bodies_outside_right_autodel_set().
* @see ephysics_world_bodies_outside_front_autodel_set().
* @see ephysics_world_bodies_outside_back_autodel_set().
*
* @ingroup EPhysics_World
*/
EAPI void ephysics_world_bodies_outside_back_autodel_set(EPhysics_World *world, Eina_Bool autodel);
/**
* @brief
* Get world autodeleting bodies mode when they're outside of render area by
* the back.
*
* @param world The physics world.
* @return @c EINA_TRUE if bodies will be deleted or @c EINA_FALSE if they
* won't, or on error.
*
* @see ephysics_world_bodies_outside_back_autodel_set() for details.
*
* @ingroup EPhysics_World
*/
EAPI Eina_Bool ephysics_world_bodies_outside_back_autodel_get(const EPhysics_World *world);
/**
* @brief
* Set world simulation's fixed time step and max number of sub steps

View File

@ -1071,11 +1071,11 @@ _ephysics_body_evas_object_default_update(EPhysics_Body *body)
static void
_ephysics_body_outside_render_area_check(EPhysics_Body *body)
{
int wx, wy, ww, wh, bx, by, bw, bh;
int wx, wy, wz, ww, wh, wd, bx, by, bz, bw, bh, bd;
ephysics_world_render_geometry_get(body->world, &wx, &wy, NULL,
&ww, &wh, NULL);
ephysics_body_geometry_get(body, &bx, &by, NULL, &bw, &bh, NULL);
ephysics_world_render_geometry_get(body->world, &wx, &wy, &wz,
&ww, &wh, &wd);
ephysics_body_geometry_get(body, &bx, &by, &bz, &bw, &bh, &bd);
// FIXME: check what should be done regarding rotated bodies
if (((ephysics_world_bodies_outside_top_autodel_get(body->world)) &&
@ -1085,7 +1085,11 @@ _ephysics_body_outside_render_area_check(EPhysics_Body *body)
((ephysics_world_bodies_outside_left_autodel_get(body->world)) &&
(bx + bh < wx)) ||
((ephysics_world_bodies_outside_right_autodel_get(body->world)) &&
(bx > wx + ww)))
(bx > wx + ww)) ||
((ephysics_world_bodies_outside_front_autodel_get(body->world)) &&
(bz + bd < wz)) ||
((ephysics_world_bodies_outside_back_autodel_get(body->world)) &&
(bz > wz + wd)))
{
DBG("Body %p out of render area", body);
ephysics_body_del(body);

View File

@ -97,6 +97,8 @@ struct _EPhysics_World {
Eina_Bool outside_bottom:1;
Eina_Bool outside_left:1;
Eina_Bool outside_right:1;
Eina_Bool outside_front:1;
Eina_Bool outside_back:1;
Eina_Bool pending_simulation:1;
};
@ -1284,7 +1286,8 @@ ephysics_world_bodies_outside_top_autodel_set(EPhysics_World *world, Eina_Bool a
world->outside_top = !!autodel;
world->outside_autodel = world->outside_top || world->outside_bottom ||
world->outside_left || world->outside_right;
world->outside_left || world->outside_right ||
world->outside_front || world->outside_back;
}
EAPI Eina_Bool
@ -1310,7 +1313,8 @@ ephysics_world_bodies_outside_bottom_autodel_set(EPhysics_World *world, Eina_Boo
world->outside_bottom = !!autodel;
world->outside_autodel = world->outside_top || world->outside_bottom ||
world->outside_left || world->outside_right;
world->outside_left || world->outside_right ||
world->outside_front || world->outside_back;
}
EAPI Eina_Bool
@ -1336,7 +1340,8 @@ ephysics_world_bodies_outside_left_autodel_set(EPhysics_World *world, Eina_Bool
world->outside_left = !!autodel;
world->outside_autodel = world->outside_top || world->outside_bottom ||
world->outside_left || world->outside_right;
world->outside_left || world->outside_right ||
world->outside_front || world->outside_back;
}
EAPI Eina_Bool
@ -1362,7 +1367,8 @@ ephysics_world_bodies_outside_right_autodel_set(EPhysics_World *world, Eina_Bool
world->outside_right = !!autodel;
world->outside_autodel = world->outside_top || world->outside_bottom ||
world->outside_left || world->outside_right;
world->outside_left || world->outside_right ||
world->outside_front || world->outside_back;
}
EAPI Eina_Bool
@ -1377,6 +1383,60 @@ ephysics_world_bodies_outside_right_autodel_get(const EPhysics_World *world)
return world->outside_right;
}
EAPI void
ephysics_world_bodies_outside_front_autodel_set(EPhysics_World *world, Eina_Bool autodel)
{
if (!world)
{
ERR("Can't set autodelete mode, world is null.");
return;
}
world->outside_front = !!autodel;
world->outside_autodel = world->outside_top || world->outside_bottom ||
world->outside_left || world->outside_right ||
world->outside_front || world->outside_back;
}
EAPI Eina_Bool
ephysics_world_bodies_outside_front_autodel_get(const EPhysics_World *world)
{
if (!world)
{
ERR("Can't get autodelete mode, world is null.");
return EINA_FALSE;
}
return world->outside_front;
}
EAPI void
ephysics_world_bodies_outside_back_autodel_set(EPhysics_World *world, Eina_Bool autodel)
{
if (!world)
{
ERR("Can't set autodelete mode, world is null.");
return;
}
world->outside_back = !!autodel;
world->outside_autodel = world->outside_top || world->outside_bottom ||
world->outside_left || world->outside_right ||
world->outside_front || world->outside_back;
}
EAPI Eina_Bool
ephysics_world_bodies_outside_back_autodel_get(const EPhysics_World *world)
{
if (!world)
{
ERR("Can't get autodelete mode, world is null.");
return EINA_FALSE;
}
return world->outside_back;
}
EAPI Eina_Bool
ephysics_world_bodies_outside_autodel_get(const EPhysics_World *world)
{