[Bf-blender-cvs] [cfec1ee] fracture_modifier: reordered functions and made them static in MOD_fracture.c, leaving out some unnecessary info for writing to blend in writefile.c (still have that read_struct memoryleak sometimes)
Martin Felke
noreply at git.blender.org
Tue Oct 21 18:56:27 CEST 2014
Commit: cfec1eea63568bbd20e776be74d1adf0395bf4fd
Author: Martin Felke
Date: Tue Oct 21 18:55:18 2014 +0200
Branches: fracture_modifier
https://developer.blender.org/rBcfec1eea63568bbd20e776be74d1adf0395bf4fd
reordered functions and made them static in MOD_fracture.c, leaving out some unnecessary info for writing to blend in writefile.c (still have that read_struct memoryleak sometimes)
===================================================================
M source/blender/blenloader/intern/writefile.c
M source/blender/modifiers/intern/MOD_fracture.c
===================================================================
diff --git a/source/blender/blenloader/intern/writefile.c b/source/blender/blenloader/intern/writefile.c
index 54292a7..7b8abde 100644
--- a/source/blender/blenloader/intern/writefile.c
+++ b/source/blender/blenloader/intern/writefile.c
@@ -1497,8 +1497,6 @@ static void write_meshIsland(WriteData* wd, MeshIsland* mi)
mi->temp = BKE_custom_data_to_shard(mi->temp, dm);
writestruct(wd, DATA, "MeshIsland", 1, mi);
- writedata(wd, DATA, sizeof(struct BMVert*) * mi->vertex_count, mi->vertices);
- writedata(wd, DATA, sizeof(MVert*) * mi->vertex_count, mi->vertices_cached);
writedata(wd, DATA, sizeof(float) * 3 * mi->vertex_count, mi->vertco);
/* write derivedmesh as shard... */
mi->temp->next = NULL;
diff --git a/source/blender/modifiers/intern/MOD_fracture.c b/source/blender/modifiers/intern/MOD_fracture.c
index 7e3e74a..6111612 100644
--- a/source/blender/modifiers/intern/MOD_fracture.c
+++ b/source/blender/modifiers/intern/MOD_fracture.c
@@ -78,12 +78,6 @@
#include "../../bmesh/tools/bmesh_decimate.h" /* decimate_dissolve function */
#include "depsgraph_private.h" /* for depgraph updates */
-static void fill_vgroup(FractureModifierData *rmd, DerivedMesh *dm, MDeformVert *dvert, Object *ob);
-static int getGroupObjects(Group *gr, Object ***obs, int g_exist);
-static void do_fracture(FractureModifierData *fracmd, ShardID id, Object *obj, DerivedMesh *dm);
-void freeMeshIsland(FractureModifierData *rmd, MeshIsland *mi, bool remove_rigidbody);
-DerivedMesh *doSimulate(FractureModifierData *fmd, Object *ob, DerivedMesh *dm, DerivedMesh *orig_dm);
-void refresh_customdata_image(Mesh *me, CustomData *pdata, int totface);
static void initData(ModifierData *md)
{
@@ -132,7 +126,64 @@ static void initData(ModifierData *md)
fmd->use_particle_birth_coordinates = true;
}
-static void freeData(ModifierData *md)
+static void freeMeshIsland(FractureModifierData *rmd, MeshIsland *mi, bool remove_rigidbody)
+{
+
+ if (mi->physics_mesh) {
+ mi->physics_mesh->needsFree = 1;
+ mi->physics_mesh->release(mi->physics_mesh);
+ mi->physics_mesh = NULL;
+ }
+ if (mi->rigidbody) {
+ if (remove_rigidbody)
+ BKE_rigidbody_remove_shard(rmd->modifier.scene, mi);
+ MEM_freeN(mi->rigidbody);
+ mi->rigidbody = NULL;
+ }
+
+ {
+ if (mi->vertco) {
+ MEM_freeN(mi->vertco);
+ mi->vertco = NULL;
+ }
+
+ if (mi->vertno) {
+ MEM_freeN(mi->vertno);
+ mi->vertno = NULL;
+ }
+
+ if (mi->vertices) {
+ MEM_freeN(mi->vertices);
+ mi->vertices = NULL; /*borrowed only !!!*/
+ }
+ }
+
+ if (mi->vertices_cached) {
+ MEM_freeN(mi->vertices_cached);
+ mi->vertices_cached = NULL;
+ }
+
+ if (mi->bb != NULL) {
+ MEM_freeN(mi->bb);
+ mi->bb = NULL;
+ }
+
+ if (mi->participating_constraints != NULL) {
+ MEM_freeN(mi->participating_constraints);
+ mi->participating_constraints = NULL;
+ mi->participating_constraint_count = 0;
+ }
+
+ if (mi->vertex_indices) {
+ MEM_freeN(mi->vertex_indices);
+ mi->vertex_indices = NULL;
+ }
+
+ MEM_freeN(mi);
+ mi = NULL;
+}
+
+static void freeData_internal(ModifierData *md)
{
FractureModifierData *rmd = (FractureModifierData *) md;
MeshIsland *mi;
@@ -280,6 +331,33 @@ static void freeData(ModifierData *md)
}
}
+static void freeData(ModifierData *md)
+{
+ FractureModifierData *rmd = (FractureModifierData *) md;
+ MeshIsland *mi;
+
+ freeData_internal(md);
+
+ /*force deletion of meshshards here, it slips through improper state detection*/
+ /*here we know the modifier is about to be deleted completely*/
+ if (rmd->frac_mesh) {
+ BKE_fracmesh_free(rmd->frac_mesh, true);
+ MEM_freeN(rmd->frac_mesh);
+ rmd->frac_mesh = NULL;
+ }
+
+ while (rmd->meshIslands.first) {
+ mi = rmd->meshIslands.first;
+ BLI_remlink(&rmd->meshIslands, mi);
+ freeMeshIsland(rmd, mi, false);
+ mi = NULL;
+ }
+
+ rmd->meshIslands.first = NULL;
+ rmd->meshIslands.last = NULL;
+
+}
+
static void doClusters(FractureModifierData *fmd)
{
/*grow clusters from all shards */
@@ -383,6 +461,23 @@ static DerivedMesh *get_clean_dm(Object *ob, DerivedMesh *dm)
return dm;
}
+static int getGroupObjects(Group *gr, Object ***obs, int g_exist)
+{
+ int ctr = g_exist;
+ GroupObject *go;
+ if (gr == NULL) return ctr;
+
+ for (go = gr->gobject.first; go; go = go->next) {
+
+ *obs = MEM_reallocN(*obs, sizeof(Object *) * (ctr + 1));
+ (*obs)[ctr] = go->ob;
+ ctr++;
+ }
+
+ return ctr;
+}
+
+
static DerivedMesh *get_group_dm(FractureModifierData *fmd, DerivedMesh *dm)
{
/* combine derived meshes from group objects into 1, trigger submodifiers if ob->derivedFinal is empty */
@@ -487,194 +582,6 @@ static DerivedMesh *get_group_dm(FractureModifierData *fmd, DerivedMesh *dm)
return dm;
}
-
-static DerivedMesh *applyModifier(ModifierData *md, Object *ob,
- DerivedMesh *derivedData,
- ModifierApplyFlag UNUSED(flag))
-{
-
- FractureModifierData *fmd = (FractureModifierData *) md;
- DerivedMesh *final_dm = derivedData;
-
- DerivedMesh *group_dm = get_group_dm(fmd, derivedData);
- DerivedMesh *clean_dm = get_clean_dm(ob, group_dm);
-
- /* disable that automatically if sim is started, but must be re-enabled manually */
- if (BKE_rigidbody_check_sim_running(md->scene->rigidbody_world, BKE_scene_frame_get(md->scene))) {
- fmd->auto_execute = false;
- }
-
- if (fmd->auto_execute) {
- fmd->refresh = true;
- }
-
- if (fmd->frac_mesh != NULL && fmd->frac_mesh->running == 1 && fmd->execute_threaded) {
- /* skip modifier execution when fracture job is running */
- return final_dm;
- }
-
- if (fmd->refresh)
- {
- if (fmd->dm != NULL) {
- fmd->dm->needsFree = 1;
- fmd->dm->release(fmd->dm);
- fmd->dm = NULL;
- }
-
- if (fmd->frac_mesh != NULL) {
- BKE_fracmesh_free(fmd->frac_mesh, true);
- MEM_freeN(fmd->frac_mesh);
- fmd->frac_mesh = NULL;
- }
-
- if (fmd->frac_mesh == NULL) {
- fmd->frac_mesh = BKE_create_fracture_container();
- if (fmd->execute_threaded)
- {
- fmd->frac_mesh->running = 1;
- }
- }
- }
-
- {
- if (fmd->refresh) {
- /* build normaltree from origdm */
- if (fmd->nor_tree != NULL) {
- BLI_kdtree_free(fmd->nor_tree);
- fmd->nor_tree = NULL;
- }
-
- fmd->nor_tree = build_nor_tree(clean_dm);
- if (fmd->face_pairs != NULL) {
- BLI_ghash_free(fmd->face_pairs, NULL, NULL);
- fmd->face_pairs = NULL;
- }
-
- fmd->face_pairs = BLI_ghash_int_new("face_pairs");
-
- do_fracture(fmd, -1, ob, clean_dm);
-
- if (!fmd->refresh) { /* might have been changed from outside, job cancel*/
- return derivedData;
- }
- }
- if (fmd->dm && fmd->frac_mesh && (fmd->dm->getNumPolys(fmd->dm) > 0) && (fmd->dm_group == NULL)) {
- final_dm = doSimulate(fmd, ob, fmd->dm, clean_dm);
- }
- else {
- final_dm = doSimulate(fmd, ob, clean_dm, clean_dm);
- }
- }
-
- /* free newly created derivedmeshes only, but keep derivedData and final_dm*/
- if ((clean_dm != group_dm) && (clean_dm != derivedData) && (clean_dm != final_dm))
- {
- clean_dm->needsFree = 1;
- clean_dm->release(clean_dm);
- }
-
- if ((group_dm != derivedData) && (group_dm != final_dm))
- {
- group_dm->needsFree = 1;
- group_dm->release(group_dm);
- }
-
- return final_dm;
-}
-
-static DerivedMesh *applyModifierEM(ModifierData *md, Object *ob,
- struct BMEditMesh *UNUSED(editData),
- DerivedMesh *derivedData,
- ModifierApplyFlag UNUSED(flag))
-{
- FractureModifierData *fmd = (FractureModifierData *) md;
- DerivedMesh *final_dm = derivedData;
-
- DerivedMesh *group_dm = get_group_dm(fmd, derivedData);
- DerivedMesh *clean_dm = get_clean_dm(ob, group_dm);
-
- if (BKE_rigidbody_check_sim_running(md->scene->rigidbody_world, BKE_scene_frame_get(md->scene))) {
- fmd->auto_execute = false;
- }
-
- if (fmd->auto_execute) {
- fmd->refresh = true;
- }
-
- if (fmd->frac_mesh != NULL && fmd->frac_mesh->running == 1 && fmd->execute_threaded)
- {
- /* skip modifier execution when fracture job is running */
- return final_dm;
- }
-
- if (fmd->refresh) {
- if (fmd->dm != NULL) {
- fmd->dm->needsFree = 1;
- fmd->dm->release(fmd->dm);
- fmd->dm = NULL;
- }
-
- if (fmd->frac_mesh != NULL) {
- BKE_fracmesh_free(fmd->frac_mesh, true /*fmd->frac_algorithm != MOD_FRACTURE_VORONOI*/);
- MEM_freeN(fmd->frac_mesh);
- fmd->frac_mesh = NULL;
- }
-
- if (fmd->frac_mesh == NULL) {
- fmd->frac_mesh = BKE_create_fracture_container();
- if (fmd->execute_threaded) {
- fmd->frac_mesh->running = 1;
- }
- }
- }
-
- {
- if (fmd->refresh) {
- /* build normaltree from origdm */
- if (fmd->nor_tree != NULL) {
- BLI_kdtree_free(fmd->nor_tree);
- fmd->nor_tree = NULL;
- }
-
- fmd->nor_tree = build_nor_tree(clean_dm);
- if (fmd->face_pairs != NULL) {
- BLI_ghash_free(fmd->face_pairs, NULL, NULL);
- fmd->face_pairs = NULL;
- }
-
- fmd->face_pairs = BLI_ghash_int_new("face_pairs");
-
- do_fracture(fmd, -1, ob, clean_dm);
-
- if (!fmd->refresh) { /*might have been changed from outside, job cancel*/
- return derivedData;
- }
- }
-
- if (fmd->dm && fmd->frac_mesh && (fmd->dm->getNumPolys(fmd->dm) > 0) && (fmd->dm_group == NULL)) {
- final_dm = doSimulate(fmd, ob, fmd->dm, clean_dm);
- }
- else {
- final_dm = doSimulate(fmd, ob, clean_dm, clean_dm);
- }
- }
-
- /* free newly created derivedmeshes only, but keep derivedData and final_dm*/
- if ((clean_dm != group_dm) && (clean_dm != derivedData) && (clean_dm != final_dm))
- {
- clean_dm->needsFree = 1;
- clean_dm->release(clean_dm);
- }
-
- if ((group_dm != derivedData) && (group_dm != final_dm))
- {
- group_dm->needsFree = 1;
- group_dm->release(group_dm);
- }
-
- return final_dm;
-}
-
static void points_from_verts(Object **ob, int totobj, FracPointCloud *points, float mat[4][4], float thresh, FractureModifierData *emd, DerivedMesh *dm, Object *obj)
{
int v, o, pt = points->totpoints;
@@ -803,35 +710,19 @@ static void points_from_greasepencil(Object **ob, int totobj, FracPointCloud *po
point[1] = gps->points[p].y;
point[2] = gps->points[p].z;
- mul_m4_v3(imat, point);
-
- copy_v3_v3(points->points[pt].co, point);
- pt++;
- }
- }
@@ Diff output truncated at 10240 characters. @@
More information about the Bf-blender-cvs
mailing list