Commit: d7dc751a9426a5bce0c4f50b62bed47bd1da85c5 Author: soumya pochiraju Date: Sat Sep 11 11:57:40 2021 +0530 Branches: soc-2021-simulation-display https://developer.blender.org/rBd7dc751a9426a5bce0c4f50b62bed47bd1da85c5
Fix memory leak in non primitive collision shape - The previous commit didn't fix the leak as the mesh data was not being freed every draw call - Now the mesh is generated during evaluation along with the physics shape. - The collisions shape draw data mesh is stored in the shared struct, along with the physics references =================================================================== M source/blender/blenkernel/intern/rigidbody.c M source/blender/draw/engines/overlay/overlay_extra.c M source/blender/draw/intern/draw_cache.c M source/blender/makesdna/DNA_rigidbody_types.h =================================================================== diff --git a/source/blender/blenkernel/intern/rigidbody.c b/source/blender/blenkernel/intern/rigidbody.c index d0e86c193dc..56caf7e1ec2 100644 --- a/source/blender/blenkernel/intern/rigidbody.c +++ b/source/blender/blenkernel/intern/rigidbody.c @@ -201,11 +201,10 @@ void BKE_rigidbody_free_object(Object *ob, RigidBodyWorld *rbw) rbo->shared->physics_shape = NULL; } - if (rbo->col_shape_draw_data) { - BKE_mesh_free(rbo->col_shape_draw_data); - BKE_id_free(NULL, rbo->col_shape_draw_data); - // MEM_freeN(rbo->col_shape_draw_data); - rbo->col_shape_draw_data = NULL; + if (rbo->shared->col_shape_draw_data) { + BKE_mesh_free(rbo->shared->col_shape_draw_data); + BKE_id_free(NULL, rbo->shared->col_shape_draw_data); + rbo->shared->col_shape_draw_data = NULL; } MEM_freeN(rbo->shared); @@ -639,13 +638,19 @@ static void rigidbody_validate_sim_shape(RigidBodyWorld *rbw, Object *ob, bool r RB_shape_delete(rbo->shared->physics_shape); } /* Delete old debug drawing mesh data if it exists. */ - if (rbo->col_shape_draw_data) { - BKE_mesh_free(rbo->col_shape_draw_data); - BKE_id_free(NULL, rbo->col_shape_draw_data); - // MEM_freeN(rbo->col_shape_draw_data); - rbo->col_shape_draw_data = NULL; + if (rbo->shared->col_shape_draw_data) { + BKE_mesh_free(rbo->shared->col_shape_draw_data); + BKE_id_free(NULL, rbo->shared->col_shape_draw_data); + rbo->shared->col_shape_draw_data = NULL; } rbo->shared->physics_shape = new_shape; + + if(rbo->shape == RB_SHAPE_CONVEXH) { + BKE_rigidbody_store_convex_hull_draw_data(ob); + } + if(rbo->shape == RB_SHAPE_TRIMESH) { + BKE_rigidbody_store_trimesh_draw_data(ob); + } } } @@ -1320,7 +1325,7 @@ RigidBodyOb *BKE_rigidbody_create_object(Scene *scene, Object *ob, short type) zero_v3(rbo->pvel); zero_v3(rbo->vel); - rbo->col_shape_draw_data = NULL; + rbo->shared->col_shape_draw_data = NULL; /* use triangle meshes for passive objects * use convex hulls for active objects since dynamic triangle meshes are very unstable @@ -2620,7 +2625,7 @@ void BKE_rigidbody_store_convex_hull_draw_data(Object *ob) { } MEM_freeN(mloop_src); plConvexHullDelete(hull); - ob->rigidbody_object->col_shape_draw_data = hull_draw_data; + ob->rigidbody_object->shared->col_shape_draw_data = hull_draw_data; } @@ -2665,7 +2670,7 @@ void BKE_rigidbody_store_trimesh_draw_data(Object *ob) { BKE_mesh_convert_mfaces_to_mpolys(trimesh_draw_data); BKE_mesh_calc_edges(trimesh_draw_data, false, false); - ob->rigidbody_object->col_shape_draw_data = trimesh_draw_data; + ob->rigidbody_object->shared->col_shape_draw_data = trimesh_draw_data; } diff --git a/source/blender/draw/engines/overlay/overlay_extra.c b/source/blender/draw/engines/overlay/overlay_extra.c index 9a48ac3a39f..cad9247ef17 100644 --- a/source/blender/draw/engines/overlay/overlay_extra.c +++ b/source/blender/draw/engines/overlay/overlay_extra.c @@ -373,20 +373,14 @@ static void OVERLAY_non_primitive_collision_shape(OVERLAY_ExtraCallBuffers *cb, { if(ob->rigidbody_object){ - if(ob->rigidbody_object->col_shape_draw_data == NULL) { - switch(ob->rigidbody_object->shape) { - case RB_SHAPE_CONVEXH: - BKE_rigidbody_store_convex_hull_draw_data(ob); - break; - case RB_SHAPE_TRIMESH: - BKE_rigidbody_store_trimesh_draw_data(ob); - break; - } - DRW_cache_non_primitive_col_shape_store_ob(ob); + if(ob->rigidbody_object->shared->col_shape_draw_data == NULL) { + } - GPUBatch *geom = DRW_cache_non_primitive_col_shape_get(ob); - if(geom){ - OVERLAY_extra_wire(cb, geom, ob->obmat, color); + else { + GPUBatch *geom = DRW_cache_non_primitive_col_shape_get(ob); + if(geom){ + OVERLAY_extra_wire(cb, geom, ob->obmat, color); + } } } diff --git a/source/blender/draw/intern/draw_cache.c b/source/blender/draw/intern/draw_cache.c index 761935a187b..4d249f47a6c 100644 --- a/source/blender/draw/intern/draw_cache.c +++ b/source/blender/draw/intern/draw_cache.c @@ -157,19 +157,16 @@ static struct DRWShapeCache { GPUBatch *drw_particle_axis; GPUBatch *drw_gpencil_dummy_quad; GPUBatch *drw_sphere_lod[DRW_LOD_MAX]; - struct GSet *non_primitive_col_shapes; } SHC = {NULL}; void DRW_shape_cache_free(void) { - uint i = (sizeof(SHC) - sizeof(GSet*)) / sizeof(GPUBatch *); + uint i = sizeof(SHC) / sizeof(GPUBatch *); GPUBatch **batch = (GPUBatch **)&SHC; while (i--) { GPU_BATCH_DISCARD_SAFE(*batch); batch++; } - BLI_gset_free(SHC.non_primitive_col_shapes, (void (*)(void *key))DRW_cache_non_primitive_col_shape_free); - SHC.non_primitive_col_shapes = NULL; } @@ -3613,42 +3610,24 @@ GPUBatch *DRW_cache_cursor_get(bool crosshair_lines) return *drw_cursor; } -/* Store the object so it can be freed later. */ -void DRW_cache_non_primitive_col_shape_store_ob(Object *ob) -{ - if(!SHC.non_primitive_col_shapes) { - SHC.non_primitive_col_shapes = BLI_gset_ptr_new(__func__); - } - BLI_gset_add(SHC.non_primitive_col_shapes, ob); -} - GPUBatch *DRW_cache_non_primitive_col_shape_get(Object *ob) { GPUBatch *geom = NULL; - if(ob->rigidbody_object->col_shape_draw_data != NULL){ + if(ob->rigidbody_object->shared->col_shape_draw_data != NULL){ const DRWContextState *draw_ctx = DRW_context_state_get(); - DRW_mesh_batch_cache_validate(ob->rigidbody_object->col_shape_draw_data); + DRW_mesh_batch_cache_validate(ob->rigidbody_object->shared->col_shape_draw_data); - geom = DRW_mesh_batch_cache_get_all_edges(ob->rigidbody_object->col_shape_draw_data); + geom = DRW_mesh_batch_cache_get_all_edges(ob->rigidbody_object->shared->col_shape_draw_data); struct TaskGraph *task_graph = BLI_task_graph_create(); - DRW_mesh_batch_cache_create_requested(task_graph, ob, ob->rigidbody_object->col_shape_draw_data, draw_ctx->scene, false, false); + DRW_mesh_batch_cache_create_requested(task_graph, ob, ob->rigidbody_object->shared->col_shape_draw_data, draw_ctx->scene, false, false); BLI_task_graph_work_and_wait(task_graph); BLI_task_graph_free(task_graph); } return geom; } -void DRW_cache_non_primitive_col_shape_free(Object *ob) -{ - if (ob->rigidbody_object->col_shape_draw_data != NULL) { - BKE_mesh_free(ob->rigidbody_object->col_shape_draw_data); - BKE_id_free(NULL, ob->rigidbody_object->col_shape_draw_data); - ob->rigidbody_object->col_shape_draw_data = NULL; - } -} - /** \} */ /* -------------------------------------------------------------------- */ diff --git a/source/blender/makesdna/DNA_rigidbody_types.h b/source/blender/makesdna/DNA_rigidbody_types.h index 76a7962ec8e..2315ffd4b7c 100644 --- a/source/blender/makesdna/DNA_rigidbody_types.h +++ b/source/blender/makesdna/DNA_rigidbody_types.h @@ -120,6 +120,8 @@ typedef struct RigidBodyOb_Shared { void *physics_object; /** Collision shape used by physics sim (i.e. btCollisionShape). */ void *physics_shape; + /** Mesh used to store non pprimitive collision shapes for debug drawing. */ + Mesh *col_shape_draw_data; } RigidBodyOb_Shared; /* RigidBodyObject (rbo) @@ -193,8 +195,6 @@ typedef struct RigidBodyOb { /** Previous velocity, to calculate acceleration. */ float pvel[3]; - Mesh *col_shape_draw_data; - } RigidBodyOb; /* Participation types for RigidBodyOb */ _______________________________________________ Bf-blender-cvs mailing list Bf-blender-cvs@blender.org List details, subscription details or unsubscribe: https://lists.blender.org/mailman/listinfo/bf-blender-cvs