diff --git a/legacy/ephysics/src/lib/EPhysics.h b/legacy/ephysics/src/lib/EPhysics.h index 6ac6477e2f..722255fd30 100644 --- a/legacy/ephysics/src/lib/EPhysics.h +++ b/legacy/ephysics/src/lib/EPhysics.h @@ -1334,6 +1334,28 @@ EAPI EPhysics_Body *ephysics_body_circle_add(EPhysics_World *world); */ EAPI EPhysics_Body *ephysics_body_box_add(EPhysics_World *world); +/** + * @brief + * Create a new physics body using a custom shape. + * + * Its collision shape will be a convex shape that has all the points + * added to this @p shape. A shape can be created with + * @ref ephysics_shape_new(). + * + * To change it's size @ref ephysics_body_geometry_set() should be used, + * so it can be deformed on x and y axises. + * + * @param world The world this body will belongs to. + * @param shape The custom shape to be used. + * @return a new body or @c NULL, on errors. + * + * @see ephysics_body_del(). + * @see ephysics_body_evas_object_set(). + * + * @ingroup EPhysics_Body + */ +EAPI EPhysics_Body *ephysics_body_shape_add(EPhysics_World *world, EPhysics_Shape *shape); + /** * @brief * Create a physic top boundary. diff --git a/legacy/ephysics/src/lib/ephysics_body.cpp b/legacy/ephysics/src/lib/ephysics_body.cpp index d039f5689d..3eb358eb02 100644 --- a/legacy/ephysics/src/lib/ephysics_body.cpp +++ b/legacy/ephysics/src/lib/ephysics_body.cpp @@ -491,6 +491,47 @@ ephysics_body_box_add(EPhysics_World *world) return _ephysics_body_add(world, collision_shape, "box"); } +EAPI EPhysics_Body * +ephysics_body_shape_add(EPhysics_World *world, EPhysics_Shape *shape) +{ + btConvexHullShape* collision_shape; + const Eina_Inlist *points; + EPhysics_Point *point; + btVector3 point3d; + + if (!world) + { + ERR("Can't add shape, world is null."); + return NULL; + } + + if (!shape) + { + ERR("Can't add shape, shape is null."); + return NULL; + } + + collision_shape = new btConvexHullShape(); + if (!collision_shape) + { + ERR("Couldn't create a generic convex shape."); + return NULL; + } + + points = ephysics_shape_points_get(shape); + + EINA_INLIST_FOREACH(points, point) + { + point3d = btVector3(point->x, point->y, 0); + collision_shape->addPoint(point3d); + point3d = btVector3(point->x, point->y, 0.5); + collision_shape->addPoint(point3d); + } + + return _ephysics_body_add(world, (btCollisionShape *)collision_shape, + "generic"); +} + void ephysics_body_world_boundaries_resize(EPhysics_World *world) {