EPhysics: use inlist for world's bodies list

SVN revision: 75139
This commit is contained in:
Bruno Dilly 2012-08-10 21:03:06 +00:00
parent 595e8c8195
commit 4d800075e7
5 changed files with 42 additions and 26 deletions

View File

@ -14,7 +14,7 @@ struct _Ball_Props {
static void
_jump(void *data, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__)
{
const Eina_List *l, *bodies;
Eina_List *l, *bodies;
EPhysics_Body *body;
Test_Data *test_data = data;
EPhysics_World *world = test_data->world;
@ -24,6 +24,7 @@ _jump(void *data, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__)
bodies = ephysics_world_bodies_get(world);
EINA_LIST_FOREACH(bodies, l, body)
ephysics_body_central_impulse_apply(body, 0, 10);
eina_list_free(bodies);
}
static void

View File

@ -684,13 +684,15 @@ EAPI double ephysics_world_rate_get(const EPhysics_World *world);
* @param world The world object.
* @return The list of bodies that belongs to this @p world.
*
* @note The list should be freed after usage.
*
* @see ephysics_body_circle_add().
* @see ephysics_body_box_add().
* @see ephysics_body_del().
*
* @ingroup EPhysics_World
*/
EAPI const Eina_List *ephysics_world_bodies_get(const EPhysics_World *world);
EAPI Eina_List *ephysics_world_bodies_get(const EPhysics_World *world);
/**
* @brief

View File

@ -19,18 +19,6 @@ struct _EPhysics_Body_Callback {
EPhysics_Callback_Body_Type type;
};
struct _EPhysics_Body {
btCollisionShape *collision_shape;
btRigidBody *rigid_body;
Evas_Object *evas_obj;
EPhysics_World *world;
void *data;
Eina_Inlist *callbacks;
double mass;
Eina_Bool active:1;
Eina_List *collision_groups;
};
struct _EPhysics_Body_Collision {
EPhysics_Body *contact_body;
Evas_Coord x;

View File

@ -53,12 +53,25 @@ typedef enum _EPhysics_World_Boundary
EPHYSICS_WORLD_BOUNDARY_LAST
} EPhysics_World_Boundary;
struct _EPhysics_Body {
EINA_INLIST;
btCollisionShape *collision_shape;
btRigidBody *rigid_body;
Evas_Object *evas_obj;
EPhysics_World *world;
void *data;
Eina_Inlist *callbacks;
double mass;
Eina_Bool active:1;
Eina_List *collision_groups;
};
extern int _ephysics_log_dom;
int ephysics_world_init(void);
int ephysics_world_shutdown(void);
Eina_Bool ephysics_world_body_add(EPhysics_World *world, const EPhysics_Body *body, btRigidBody *rigid_body);
void ephysics_world_body_del(EPhysics_World *world, const EPhysics_Body *body, btRigidBody *rigid_body);
Eina_Bool ephysics_world_body_add(EPhysics_World *world, EPhysics_Body *body, btRigidBody *rigid_body);
void ephysics_world_body_del(EPhysics_World *world, EPhysics_Body *body, btRigidBody *rigid_body);
void ephysics_world_constraint_add(EPhysics_World *world, btTypedConstraint *bt_constraint);
void ephysics_world_constraint_del(EPhysics_World *world, btTypedConstraint *bt_constraint);
void ephysics_body_world_boundaries_resize(EPhysics_World *world);

View File

@ -31,7 +31,7 @@ struct _EPhysics_World {
EPhysics_Camera *camera;
Evas_Coord x, y, w, h;
Eina_Inlist *callbacks;
Eina_List *bodies;
Eina_Inlist *bodies;
int max_sub_steps;
double last_update;
double rate;
@ -185,9 +185,10 @@ _ephysics_world_boundary_del_cb(void *data, EPhysics_Body *body, void *event_inf
}
Eina_Bool
ephysics_world_body_add(EPhysics_World *world, const EPhysics_Body *body, btRigidBody *rigid_body)
ephysics_world_body_add(EPhysics_World *world, EPhysics_Body *body, btRigidBody *rigid_body)
{
world->bodies = eina_list_append(world->bodies, body);
world->bodies = eina_inlist_append(world->bodies,
EINA_INLIST_GET(body));
if (eina_error_get())
{
ERR("Couldn't add body to bodies list.");
@ -198,10 +199,11 @@ ephysics_world_body_add(EPhysics_World *world, const EPhysics_Body *body, btRigi
}
void
ephysics_world_body_del(EPhysics_World *world, const EPhysics_Body *body, btRigidBody *rigid_body)
ephysics_world_body_del(EPhysics_World *world, EPhysics_Body *body, btRigidBody *rigid_body)
{
world->dynamics_world->removeRigidBody(rigid_body);
world->bodies = eina_list_remove(world->bodies, body);
world->bodies = eina_inlist_remove(world->bodies,
EINA_INLIST_GET(body));
}
void
@ -420,7 +422,7 @@ EAPI void
ephysics_world_del(EPhysics_World *world)
{
EPhysics_World_Callback *cb;
void *data;
EPhysics_Body *body;
if (!world)
{
@ -446,8 +448,12 @@ ephysics_world_del(EPhysics_World *world)
free(cb);
}
EINA_LIST_FREE(world->bodies, data)
ephysics_orphan_body_del((EPhysics_Body *) data);
while (world->bodies)
{
body = EINA_INLIST_CONTAINER_GET(world->bodies, EPhysics_Body);
world->bodies = eina_inlist_remove(world->bodies, world->bodies);
ephysics_orphan_body_del(body);
}
ephysics_camera_del(world->camera);
delete world->dynamics_world;
@ -753,16 +759,22 @@ ephysics_world_event_callback_del_full(EPhysics_World *world, EPhysics_Callback_
return NULL;
}
EAPI const Eina_List *
EAPI Eina_List *
ephysics_world_bodies_get(const EPhysics_World *world)
{
Eina_List *list = NULL;
EPhysics_Body *body;
if (!world)
{
ERR("Couldn't get the bodies list, no world provided.");
return NULL;
}
return world->bodies;
EINA_INLIST_FOREACH(world->bodies, body)
list = eina_list_append(list, body);
return list;
}
EAPI void