[Bf-blender-cvs] [8c70dd8] fracture_modifier: a bit clean up and attempt to reduce dynamic fracture memory leaks
Martin Felke
noreply at git.blender.org
Wed Mar 30 23:10:16 CEST 2016
Commit: 8c70dd87c62c8b970136b32e828ce7a18609bb84
Author: Martin Felke
Date: Wed Mar 30 23:09:52 2016 +0200
Branches: fracture_modifier
https://developer.blender.org/rB8c70dd87c62c8b970136b32e828ce7a18609bb84
a bit clean up and attempt to reduce dynamic fracture memory leaks
===================================================================
M source/blender/blenkernel/intern/rigidbody.c
M source/blender/modifiers/intern/MOD_fracture.c
===================================================================
diff --git a/source/blender/blenkernel/intern/rigidbody.c b/source/blender/blenkernel/intern/rigidbody.c
index ad3dabc..dad0d08 100644
--- a/source/blender/blenkernel/intern/rigidbody.c
+++ b/source/blender/blenkernel/intern/rigidbody.c
@@ -1211,8 +1211,6 @@ void BKE_rigidbody_validate_sim_shard(RigidBodyWorld *rbw, MeshIsland *mi, Objec
// mi->start_frame = rbw->pointcache->startframe;
// mi->frame_count = 0;
-
-
fmd = (FractureModifierData*) modifiers_findByType(ob, eModifierType_Fracture);
/* make sure collision shape exists */
@@ -1245,7 +1243,15 @@ void BKE_rigidbody_validate_sim_shard(RigidBodyWorld *rbw, MeshIsland *mi, Objec
}
#endif
- DM_mesh_boundbox(ob->derivedFinal, locbb, size);
+ if (ob->derivedFinal)
+ {
+ DM_mesh_boundbox(ob->derivedFinal, locbb, size);
+ }
+ else
+ {
+ BKE_mesh_boundbox_calc((Mesh*)ob->data, locbb, size);
+ }
+
mul_v3_v3(size, ob->size);
rbo->physics_object = RB_body_new(rbo->physics_shape, loc, rot, fmd->use_compounds, fmd->impulse_dampening,
fmd->directional_factor, fmd->minimum_impulse, fmd->mass_threshold_factor, size);
@@ -1983,7 +1989,7 @@ static int filterCallback(void* world, void* island1, void* island2, void *blend
ob_index2 = -1;
}
- if (!ob1 || !ob2)
+ if ((!ob1 && ob_index1 == -1) || (!ob2 && ob_index2 == -1))
return false;
if ((mi1 != NULL) && (mi2 != NULL) && ob_index1 != -1 && ob_index2 != -1) {
diff --git a/source/blender/modifiers/intern/MOD_fracture.c b/source/blender/modifiers/intern/MOD_fracture.c
index 122308b..7292d33 100644
--- a/source/blender/modifiers/intern/MOD_fracture.c
+++ b/source/blender/modifiers/intern/MOD_fracture.c
@@ -281,60 +281,11 @@ static void free_simulation(FractureModifierData *fmd, bool do_free_seq, bool do
msq = fmd->meshIsland_sequence.first;
if (msq)
{
- //MeshIsland *mi;
- //RigidBodyWorld *rbw = fmd->modifier.scene->rigidbody_world;
msq->is_new = true;
fmd->current_mi_entry = msq;
fmd->meshIslands = msq->meshIslands;
fmd->visible_mesh_cached = msq->visible_dm;
-#if 0
- //re-init mi->verts, to be sure
- for (mi = fmd->meshIslands.first; mi; mi = mi->next)
- {
- int i, start = 1, end = 250;
- MVert *mv = fmd->visible_mesh_cached->getVertArray(fmd->visible_mesh_cached);
- for (i = 0; i < mi->vertex_count; i++)
- {
- float loc[3];
- short no[3];
-
- loc[0] = mi->vertco[3*i];
- loc[1] = mi->vertco[3*i+1];
- loc[2] = mi->vertco[3*i+2];
-
- no[0] = mi->vertno[3*i];
- no[1] = mi->vertno[3*i+1];
- no[2] = mi->vertno[3*i+2];
-
- mi->vertices_cached[i] = mv + mi->vertex_indices[i];
- copy_v3_v3(mi->vertices_cached[i]->co, loc);
- copy_v3_v3_short(mi->vertices_cached[i]->no, no);
-
- }
- zero_v3(mi->rigidbody->lin_vel);
- zero_v3(mi->rigidbody->ang_vel);
-
- MEM_freeN(mi->locs);
- MEM_freeN(mi->rots);
-
- if (rbw && rbw->pointcache)
- {
- start = rbw->pointcache->startframe;
- end = rbw->pointcache->endframe;
- }
-
- fmd->current_mi_entry->frame = end;
-
- mi->frame_count = end - start + 1;
- mi->start_frame = start;
- mi->locs = MEM_mallocN(sizeof(float)*3* mi->frame_count, "mi->locs");
- mi->rots = MEM_mallocN(sizeof(float)*4* mi->frame_count, "mi->rots");
- BKE_rigidbody_remove_shard(fmd->modifier.scene, mi);
- }
-#endif
-
- //BKE_rigidbody_update_ob_array(rbw);
}
else
{
@@ -393,7 +344,7 @@ static void free_simulation(FractureModifierData *fmd, bool do_free_seq, bool do
while (fmd->meshIsland_sequence.first) {
msq = fmd->meshIsland_sequence.first;
BLI_remlink(&fmd->meshIsland_sequence, msq);
- free_meshislands(fmd, &msq->meshIslands, do_free_rigidbody);
+ free_meshislands(fmd, &msq->meshIslands, do_free_rigidbody && (msq == fmd->current_mi_entry));
MEM_freeN(msq);
msq = NULL;
}
@@ -461,14 +412,16 @@ static void free_shards(FractureModifierData *fmd)
static void free_modifier(FractureModifierData *fmd, bool do_free_seq)
{
- if (fmd->fracture_mode != MOD_FRACTURE_DYNAMIC)
+ /*if (fmd->fracture_mode != MOD_FRACTURE_DYNAMIC)
{
free_simulation(fmd, false, false);
}
else if (!do_free_seq)
{
free_simulation(fmd, true, true);
- }
+ }*/
+
+ free_simulation(fmd, do_free_seq, fmd->fracture_mode == MOD_FRACTURE_DYNAMIC);
if (fmd->material_index_map)
{
@@ -518,12 +471,6 @@ static void free_modifier(FractureModifierData *fmd, bool do_free_seq)
if (fmd->fracture_mode == MOD_FRACTURE_EXTERNAL)
free_shards(fmd);
}
-#if 0
- else
- {
- free_shards(fmd);
- }
-#endif
if (fmd->vert_index_map != NULL) {
BLI_ghash_free(fmd->vert_index_map, NULL, NULL);
@@ -2081,6 +2028,7 @@ static void handle_vert(FractureModifierData *fmd, DerivedMesh *dm, BMVert* vert
*startno = MEM_reallocN(*startno, ((*tag_counter) + 1) * 3 * sizeof(short));
normal_float_to_short_v3(vno, vert->no);
+ normal_float_to_short_v3(no, vert->no);
if (fmd->fix_normals)
find_normal(dm, fmd->nor_tree, vert->co, vno, no, fmd->nor_range);
(*startno)[3 * (*tag_counter)] = no[0];
@@ -3612,7 +3560,7 @@ static void do_refresh(FractureModifierData *fmd, Object *ob, DerivedMesh* dm, D
copy_m4_m4(fmd->origmat, ob->obmat);
- //if (fmd->fracture_mode == MOD_FRACTURE_PREFRACTURED)
+ //if (fmd->fracture_mode != MOD_FRACTURE_DYNAMIC)
{
/* refracture, convert the fracture shards to new meshislands here *
* shards = fracture datastructure
@@ -3633,7 +3581,7 @@ static void do_refresh(FractureModifierData *fmd, Object *ob, DerivedMesh* dm, D
fill_vgroup(fmd, fmd->visible_mesh_cached, ivert, ob);
}
- else {
+ else if (fmd->fracture_mode != MOD_FRACTURE_DYNAMIC){
if (fmd->visible_mesh != NULL) {
BM_mesh_free(fmd->visible_mesh);
fmd->visible_mesh = NULL;
@@ -3803,8 +3751,7 @@ static void updateDepgraph(ModifierData *md, DagForest *forest,
static void foreachObjectLink(
ModifierData *md, Object *ob,
- void (*walk)(void *userData, Object *ob, Object **obpoin),
- void *userData)
+ ObjectWalkFunc walk, void *userData)
{
FractureModifierData *fmd = (FractureModifierData *) md;
@@ -3812,7 +3759,7 @@ static void foreachObjectLink(
GroupObject *go;
for (go = fmd->extra_group->gobject.first; go; go = go->next) {
if (go->ob) {
- walk(userData, ob, &go->ob);
+ walk(userData, ob, &go->ob, IDWALK_NOP);
}
}
}
@@ -3821,18 +3768,16 @@ static void foreachObjectLink(
GroupObject *go;
for (go = fmd->cutter_group->gobject.first; go; go = go->next) {
if (go->ob) {
- walk(userData, ob, &go->ob);
+ walk(userData, ob, &go->ob, IDWALK_NOP);
}
}
}
- //TODO, walking over fracture settings, too ?
-
if (fmd->autohide_filter_group) {
GroupObject *go;
for (go = fmd->autohide_filter_group->gobject.first; go; go = go->next) {
if (go->ob) {
- walk(userData, ob, &go->ob);
+ walk(userData, ob, &go->ob, IDWALK_NOP);
}
}
}
@@ -3860,7 +3805,6 @@ static ShardSequence* shard_sequence_add(FractureModifierData* fmd, float frame,
fmd->shards_to_islands = false;
BKE_fracture_create_dm(fmd, true);
fmd->shards_to_islands = temp;
- //ssq->is_new = true;
ssq->frac_mesh = fmd->frac_mesh;
}
@@ -3879,7 +3823,6 @@ static MeshIslandSequence* meshisland_sequence_add(FractureModifierData* fmd, fl
{
MeshIslandSequence *msq = MEM_mallocN(sizeof(MeshIslandSequence), "meshisland_sequence_add");
msq->frame = frame;
- //msq->is_new = true;
if (BLI_listbase_is_empty(&fmd->meshIslands)) {
msq->meshIslands.first = NULL;
@@ -3906,7 +3849,7 @@ static MeshIslandSequence* meshisland_sequence_add(FractureModifierData* fmd, fl
static void add_new_entries(FractureModifierData* fmd, DerivedMesh *dm, Object* ob)
{
int frame = (int)BKE_scene_frame_get(fmd->modifier.scene);
- int end = 250;
+ int end = 250; //TODO might be problematic with longer sequences, take proper end value ?
if (fmd->modifier.scene->rigidbody_world)
{
@@ -3929,171 +3872,6 @@ static void add_new_entries(FractureModifierData* fmd, DerivedMesh *dm, Object*
fmd->meshIslands = fmd->current_mi_entry->meshIslands;
}
-#if 0
-static void check_shard_vertexgroup(ListBase *lb, Shard*s, int index)
-{
- //check first vertex's group...
- MDeformVert *dvert = CustomData_get(&s->vertData, 0, CD_MDEFORMVERT);
- if (dvert)
- {
- if (defvert_find_index(dvert, index))
- {
- FractureID* fid = MEM_mallocN(sizeof(FractureID), "setting_fracture_id");
- fid->shardID = s->shard_id;
- BLI_addtail(lb, fid);
- }
- }
-}
-
-static void fracture_per_setting(FractureModifierData* fmd, Object* ob, DerivedMesh* dm, int index)
-{
- //make an shard ID list per setting
- ListBase lb;
- Shard *s;
- FractureID *fid;
-
- lb.first = NULL;
- lb.last = NULL;
-
- for (s = fmd->frac_mesh->shard_map.first; s; s = s->next)
- {
- check_shard_vertexgroup(&lb, s, index);
- }
-
-/* for (s = fmd->islandShards.first; s; s = s->next)
- {
- check_shard_vertexgroup(&lb, s, index);
- }*/
-
- //now fracture all found shards
- while (lb.first)
- {
- fid = lb.first;
- do_fracture(fmd, fid->shardID, ob, dm);
- BLI_remlink(&lb, fid);
- MEM_freeN(fid);
- }
-}
-
-static FractureSetting* create_default_setting(bDeformGroup *vgroup)
-{
- FractureSetting *fs = MEM_callocN(sizeof(FractureSetting), "default_fracture_setting");
-
- strncpy(fs->name, vgroup->name, strlen(vgroup->name));
-
- fs->cluster_count = 0;
- fs->extra_group = NULL;
- fs->frac_algorithm = MOD_FRACTURE_BOOLEAN;
- fs->point_source = MOD_FRACTURE_UNIFORM;
- fs->shard_count = 10;
- fs->percentage = 100;
-
- fs->breaking_threshold = 10.0f;
- fs->use_constraints = false;
- fs->contact_dist = 1.0f;
- fs->use_mass_dependent_thresholds = false;
-
- fs->constraint_limit = 50;
- fs->breaking_distance = 0;
- fs->breaking_angle = 0;
- fs->breaking_percentage = 0; /* disable by default*/
-
- fs->cluster_breaking_threshold = 1000.0f;
- fs->solver_iterations_override = 0;
- fs->cluster_solver_iterations_override = 0;
- fs->shards_to_islands = false;
- fs->fix_normals = false;
-
- fs->breaking_percentage_weighted = false;
- fs->breaking_angle_weighted = false;
- fs->breaking_distance_weighted = false;
@@ Diff output truncated at 10240 characters. @@
More information about the Bf-blender-cvs
mailing list