From ebf3a282fbe01bd3cd8ff81aec7c2adc0696294a Mon Sep 17 00:00:00 2001 From: Bruno Dilly Date: Thu, 16 Aug 2012 21:34:44 +0000 Subject: [PATCH] EPhysics: delete constraints if world is deleted SVN revision: 75328 --- legacy/ephysics/src/lib/ephysics_constraints.cpp | 9 ++++++--- legacy/ephysics/src/lib/ephysics_private.h | 4 ++-- legacy/ephysics/src/lib/ephysics_world.cpp | 11 +++++++++-- 3 files changed, 17 insertions(+), 7 deletions(-) diff --git a/legacy/ephysics/src/lib/ephysics_constraints.cpp b/legacy/ephysics/src/lib/ephysics_constraints.cpp index 86a2e2d01c..546ceed539 100644 --- a/legacy/ephysics/src/lib/ephysics_constraints.cpp +++ b/legacy/ephysics/src/lib/ephysics_constraints.cpp @@ -52,7 +52,8 @@ ephysics_constraint_slider_add(EPhysics_Body *body) constraint->type = EPHYSICS_CONSTRAINT_SLIDER; constraint->world = ephysics_body_world_get(body); - ephysics_world_constraint_add(constraint->world, constraint->bt_constraint); + ephysics_world_constraint_add(constraint->world, constraint, + constraint->bt_constraint); INF("Constraint added."); return constraint; @@ -228,7 +229,8 @@ ephysics_constraint_p2p_add(EPhysics_Body *body1, EPhysics_Body *body2, Evas_Coo constraint->type = EPHYSICS_CONSTRAINT_P2P; constraint->world = ephysics_body_world_get(body1); - ephysics_world_constraint_add(constraint->world, constraint->bt_constraint); + ephysics_world_constraint_add(constraint->world, constraint, + constraint->bt_constraint); INF("Constraint added."); return constraint; @@ -243,7 +245,8 @@ ephysics_constraint_del(EPhysics_Constraint *constraint) return; } - ephysics_world_constraint_del(constraint->world, constraint->bt_constraint); + ephysics_world_constraint_del(constraint->world, constraint, + constraint->bt_constraint); delete constraint->bt_constraint; free(constraint); diff --git a/legacy/ephysics/src/lib/ephysics_private.h b/legacy/ephysics/src/lib/ephysics_private.h index 01d0a5e261..4c0b10ab5f 100644 --- a/legacy/ephysics/src/lib/ephysics_private.h +++ b/legacy/ephysics/src/lib/ephysics_private.h @@ -85,8 +85,8 @@ int ephysics_world_init(void); int ephysics_world_shutdown(void); Eina_Bool ephysics_world_body_add(EPhysics_World *world, EPhysics_Body *body); Eina_Bool ephysics_world_body_del(EPhysics_World *world, EPhysics_Body *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_world_constraint_add(EPhysics_World *world, EPhysics_Constraint *constraint, btTypedConstraint *bt_constraint); +void ephysics_world_constraint_del(EPhysics_World *world, EPhysics_Constraint *constraint, btTypedConstraint *bt_constraint); void ephysics_body_world_boundaries_resize(EPhysics_World *world); void ephysics_world_boundary_set(EPhysics_World *world, EPhysics_World_Boundary boundary, EPhysics_Body *body); EPhysics_Body *ephysics_world_boundary_get(const EPhysics_World *world, EPhysics_World_Boundary boundary); diff --git a/legacy/ephysics/src/lib/ephysics_world.cpp b/legacy/ephysics/src/lib/ephysics_world.cpp index e58c0e6348..5e89e2d5fc 100644 --- a/legacy/ephysics/src/lib/ephysics_world.cpp +++ b/legacy/ephysics/src/lib/ephysics_world.cpp @@ -35,6 +35,7 @@ struct _EPhysics_World { Eina_Inlist *bodies; Eina_List *to_delete; Eina_List *cb_to_delete; + Eina_List *constraints; int max_sub_steps; int walking; int cb_walking; @@ -187,6 +188,7 @@ _ephysics_world_free(EPhysics_World *world) { EPhysics_World_Callback *cb; EPhysics_Body *body; + void *constraint; _worlds = eina_inlist_remove(_worlds, EINA_INLIST_GET(world)); @@ -206,6 +208,9 @@ _ephysics_world_free(EPhysics_World *world) ephysics_orphan_body_del(body); } + EINA_LIST_FREE(world->constraints, constraint) + ephysics_constraint_del((EPhysics_Constraint *)constraint); + ephysics_camera_del(world->camera); /* FIXME uncomment lines above when dynamicsworld destructor is fixed on bullet. Right now looks like it will try to acess invalid memory.*/ @@ -339,15 +344,17 @@ ephysics_world_body_del(EPhysics_World *world, EPhysics_Body *body) } void -ephysics_world_constraint_add(EPhysics_World *world, btTypedConstraint *bt_constraint) +ephysics_world_constraint_add(EPhysics_World *world, EPhysics_Constraint *constraint, btTypedConstraint *bt_constraint) { world->dynamics_world->addConstraint(bt_constraint); + world->constraints = eina_list_append(world->constraints, constraint); } void -ephysics_world_constraint_del(EPhysics_World *world, btTypedConstraint *bt_constraint) +ephysics_world_constraint_del(EPhysics_World *world, EPhysics_Constraint *constraint, btTypedConstraint *bt_constraint) { world->dynamics_world->removeConstraint(bt_constraint); + world->constraints = eina_list_remove(world->constraints, constraint); } int