diff --git a/legacy/ephysics/src/lib/EPhysics.h b/legacy/ephysics/src/lib/EPhysics.h index 6884b5fe85..e2c34943a8 100644 --- a/legacy/ephysics/src/lib/EPhysics.h +++ b/legacy/ephysics/src/lib/EPhysics.h @@ -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 diff --git a/legacy/ephysics/src/lib/ephysics_body.cpp b/legacy/ephysics/src/lib/ephysics_body.cpp index 983704f506..e95d965610 100644 --- a/legacy/ephysics/src/lib/ephysics_body.cpp +++ b/legacy/ephysics/src/lib/ephysics_body.cpp @@ -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); diff --git a/legacy/ephysics/src/lib/ephysics_world.cpp b/legacy/ephysics/src/lib/ephysics_world.cpp index d4981458b2..0a70ccde38 100644 --- a/legacy/ephysics/src/lib/ephysics_world.cpp +++ b/legacy/ephysics/src/lib/ephysics_world.cpp @@ -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) {