EPhysics: support bodies with generic shapes

Using EPhysics Shape.



SVN revision: 75152
This commit is contained in:
Bruno Dilly 2012-08-10 21:05:19 +00:00
parent 6c53875522
commit 031d47d1a9
2 changed files with 63 additions and 0 deletions

View File

@ -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.

View File

@ -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)
{