[Bf-blender-cvs] [3553669] fracture_modifier: attempt to make mesh island packing faster when being called in a loop, create the dm only once after packing

Martin Felke noreply at git.blender.org
Wed Jan 20 00:23:43 CET 2016


Commit: 3553669d125bafc5241f4a5739fbac87e18e1c47
Author: Martin Felke
Date:   Wed Jan 20 00:23:33 2016 +0100
Branches: fracture_modifier
https://developer.blender.org/rB3553669d125bafc5241f4a5739fbac87e18e1c47

attempt to make mesh island packing faster when being called in a loop, create the dm only once after packing

===================================================================

M	source/blender/blenkernel/BKE_fracture.h
M	source/blender/blenkernel/intern/fracture.c
M	source/blender/blenkernel/intern/rigidbody.c
M	source/blender/editors/object/object_modifier.c
M	source/blender/makesrna/intern/rna_modifier.c
M	source/blender/modifiers/intern/MOD_fracture.c

===================================================================

diff --git a/source/blender/blenkernel/BKE_fracture.h b/source/blender/blenkernel/BKE_fracture.h
index d12f7e4..ae45fb0 100644
--- a/source/blender/blenkernel/BKE_fracture.h
+++ b/source/blender/blenkernel/BKE_fracture.h
@@ -105,8 +105,8 @@ void BKE_fracture_store_settings(struct FractureModifierData *fs, struct Fractur
 struct Shard* BKE_create_initial_shard(struct DerivedMesh *dm);
 void BKE_copy_customdata_layers(struct CustomData* dest, struct CustomData *src, int type, int count);
 
-struct MeshIsland *BKE_fracture_mesh_island_add(struct FractureModifierData *fmd, struct Object *own, struct Object *target, int index);
-void BKE_fracture_mesh_island_remove(struct FractureModifierData *fmd, struct MeshIsland *mi);
+struct MeshIsland *BKE_fracture_mesh_island_add(struct FractureModifierData *fmd, struct Object *own, struct Object *target, int index, bool update);
+void BKE_fracture_mesh_island_remove(struct FractureModifierData *fmd, struct MeshIsland *mi, bool update);
 void BKE_fracture_mesh_island_remove_all(struct FractureModifierData *fmd);
 
 struct RigidBodyShardCon* BKE_fracture_mesh_islands_connect(struct FractureModifierData *fmd, struct MeshIsland *mi1, struct MeshIsland *mi2, short con_type, int index);
@@ -114,5 +114,6 @@ void BKE_fracture_mesh_constraint_remove(struct FractureModifierData* fmd, struc
 void BKE_fracture_mesh_constraint_remove_all(struct FractureModifierData *fmd);
 
 void BKE_fracture_free_mesh_island(struct FractureModifierData *rmd, struct MeshIsland *mi, bool remove_rigidbody);
+int BKE_fracture_update_visual_mesh(struct FractureModifierData *fmd, bool do_custom_data);
 
 #endif /* BKE_FRACTURE_H */
diff --git a/source/blender/blenkernel/intern/fracture.c b/source/blender/blenkernel/intern/fracture.c
index 75b3194..61cda42 100644
--- a/source/blender/blenkernel/intern/fracture.c
+++ b/source/blender/blenkernel/intern/fracture.c
@@ -1729,6 +1729,10 @@ static DerivedMesh *create_dm(FractureModifierData *fmd, bool doCustomData)
 		}
 	}
 	else {
+
+		if (!fmd->frac_mesh)
+			return NULL;
+
 		for (s = fmd->frac_mesh->shard_map.first; s; s = s->next) {
 			num_verts += s->totvert;
 			num_polys += s->totpoly;
@@ -2210,7 +2214,10 @@ static void fracture_update_shards(FractureModifierData *fmd, Shard *s, int inde
 	FracMesh* fm;
 
 	if (!fmd->frac_mesh)
+	{
 		fmd->frac_mesh = BKE_create_fracture_container();
+		fmd->frac_mesh->progress_counter = 0; //XXXX ABUSE this for vertstart now, threading doesnt work anyway yet
+	}
 
 	fm = fmd->frac_mesh;
 	BLI_addtail(&fm->shard_map, s);
@@ -2227,7 +2234,7 @@ static MeshIsland* fracture_shard_to_island(FractureModifierData *fmd, Shard *s,
 {
 	MeshIsland *mi;
 	int k = 0, j = 0, totvert;
-	MVert *mverts, *verts, *mv;
+	MVert *mverts = NULL, *verts, *mv;
 
 	//create mesh island and intialize
 	mi = MEM_callocN(sizeof(MeshIsland), "meshIsland");
@@ -2240,11 +2247,19 @@ static MeshIsland* fracture_shard_to_island(FractureModifierData *fmd, Shard *s,
 
 	//link up the visual mesh verts
 	mi->vertices_cached = MEM_mallocN(sizeof(MVert *) * s->totvert, "vert_cache");
-	mverts = CDDM_get_verts(fmd->visible_mesh_cached);
+	if (fmd->visible_mesh_cached) /*ensure to be NULL in "pack, unpack" methods */
+		mverts = CDDM_get_verts(fmd->visible_mesh_cached);
 	mi->vertex_indices = MEM_mallocN(sizeof(int) * mi->vertex_count, "mi->vertex_indices");
 
 	for (k = 0; k < s->totvert; k++) {
-		mi->vertices_cached[k] = mverts + vertstart + k;
+		if (mverts)
+		{
+			mi->vertices_cached[k] = mverts + vertstart + k;
+		}
+		else
+		{
+			mi->vertices_cached[k] = NULL;
+		}
 		mi->vertex_indices[k] = vertstart + k;
 	}
 
@@ -2296,7 +2311,7 @@ static MeshIsland* fracture_shard_to_island(FractureModifierData *fmd, Shard *s,
 	return mi;
 }
 
-static int fracture_update_visual_mesh(FractureModifierData *fmd, bool do_custom_data)
+int BKE_fracture_update_visual_mesh(FractureModifierData *fmd, bool do_custom_data)
 {
 	MeshIsland *mi;
 	DerivedMesh *dm = fmd->visible_mesh_cached;
@@ -2312,6 +2327,10 @@ static int fracture_update_visual_mesh(FractureModifierData *fmd, bool do_custom
 	}
 
 	fmd->visible_mesh_cached = create_dm(fmd, do_custom_data);
+
+	if (!fmd->visible_mesh_cached)
+		return 0;
+
 	dm = fmd->visible_mesh_cached;
 	mv = dm->getVertArray(dm);
 	totvert = dm->getNumVerts(dm);
@@ -2354,11 +2373,11 @@ static int fracture_update_visual_mesh(FractureModifierData *fmd, bool do_custom
 	return vertstart;
 }
 
-MeshIsland* BKE_fracture_mesh_island_add(FractureModifierData *fmd, Object* own, Object *target, int index)
+MeshIsland* BKE_fracture_mesh_island_add(FractureModifierData *fmd, Object* own, Object *target, int index, bool update)
 {
 	MeshIsland *mi;
 	Shard *s;
-	int vertstart;
+	int vertstart = 0;
 	float loc[3], rot[4];
 
 	if (fmd->fracture_mode != MOD_FRACTURE_EXTERNAL || own->type != OB_MESH)
@@ -2366,7 +2385,14 @@ MeshIsland* BKE_fracture_mesh_island_add(FractureModifierData *fmd, Object* own,
 
 	s = fracture_object_to_shard(own, target);
 	fracture_update_shards(fmd, s, index);
-	vertstart = fracture_update_visual_mesh(fmd, true);
+	if (update) {
+		vertstart = BKE_fracture_update_visual_mesh(fmd, true);
+	}
+	else
+	{
+		vertstart = fmd->frac_mesh->progress_counter;
+		fmd->frac_mesh->progress_counter += s->totvert;
+	}
 
 	//hrm need to rebuild ALL islands since vertex refs are bonkers now after mesh has changed
 	mi = fracture_shard_to_island(fmd, s, vertstart);
@@ -2450,7 +2476,7 @@ void BKE_fracture_free_mesh_island(FractureModifierData *rmd, MeshIsland *mi, bo
 	mi = NULL;
 }
 
-void BKE_fracture_mesh_island_remove(FractureModifierData *fmd, MeshIsland *mi)
+void BKE_fracture_mesh_island_remove(FractureModifierData *fmd, MeshIsland *mi, bool update)
 {
 	if (BLI_listbase_is_single(&fmd->meshIslands))
 	{
@@ -2479,7 +2505,8 @@ void BKE_fracture_mesh_island_remove(FractureModifierData *fmd, MeshIsland *mi)
 
 			BKE_fracture_free_mesh_island(fmd, mi, true);
 
-			fracture_update_visual_mesh(fmd, true);
+			if (update)
+				BKE_fracture_update_visual_mesh(fmd, true);
 		}
 	}
 }
diff --git a/source/blender/blenkernel/intern/rigidbody.c b/source/blender/blenkernel/intern/rigidbody.c
index e6d0ac2..33a4132 100644
--- a/source/blender/blenkernel/intern/rigidbody.c
+++ b/source/blender/blenkernel/intern/rigidbody.c
@@ -486,8 +486,8 @@ void BKE_rigidbody_update_cell(struct MeshIsland *mi, Object *ob, float loc[3],
 		}
 		
 		vert = mi->vertices_cached[j];
-		//if (vert == NULL) break;
-		//if (vert->co == NULL) break;
+		if (vert == NULL) break;
+		if (vert->co == NULL) break;
 		//if (rmd->refresh == true) break;
 
 		startco[0] = mi->vertco[j * 3];
diff --git a/source/blender/editors/object/object_modifier.c b/source/blender/editors/object/object_modifier.c
index b520376..caf8fd0 100644
--- a/source/blender/editors/object/object_modifier.c
+++ b/source/blender/editors/object/object_modifier.c
@@ -62,6 +62,7 @@
 #include "BKE_displist.h"
 #include "BKE_DerivedMesh.h"
 #include "BKE_effect.h"
+#include "BKE_fracture.h"
 #include "BKE_global.h"
 #include "BKE_key.h"
 #include "BKE_lattice.h"
@@ -2438,6 +2439,19 @@ static int fracture_refresh_exec(bContext *C, wmOperator *op)
 
 	rmd->reset_shards = RNA_boolean_get(op->ptr, "reset");
 
+	if (rmd->fracture_mode == MOD_FRACTURE_EXTERNAL)
+	{
+		DerivedMesh *dm = rmd->visible_mesh_cached;
+		if (dm)
+		{
+			dm->needsFree = 1;
+			dm->release(dm);
+			dm = rmd->visible_mesh_cached = NULL;
+		}
+
+		BKE_fracture_update_visual_mesh(rmd, true);
+	}
+
 	if (scene->rigidbody_world != NULL)
 	{
 		start = (double)scene->rigidbody_world->pointcache->startframe;
diff --git a/source/blender/makesrna/intern/rna_modifier.c b/source/blender/makesrna/intern/rna_modifier.c
index ba2cc0e..2435302 100644
--- a/source/blender/makesrna/intern/rna_modifier.c
+++ b/source/blender/makesrna/intern/rna_modifier.c
@@ -1216,7 +1216,7 @@ static MeshIsland *rna_FractureModifier_mesh_island_new(ID* id, FractureModifier
 	Object *owner = (Object*)id;
 	if (ob != owner)
 	{
-		MeshIsland* mi = BKE_fracture_mesh_island_add(fmd, owner, ob, index);
+		MeshIsland* mi = BKE_fracture_mesh_island_add(fmd, owner, ob, index, update);
 
 		if (update)
 		{
@@ -1239,7 +1239,7 @@ static void rna_FractureModifier_mesh_island_remove(ID *id, FractureModifierData
 		return;
 	}
 
-	BKE_fracture_mesh_island_remove(fmd, mi);
+	BKE_fracture_mesh_island_remove(fmd, mi, update);
 	RNA_POINTER_INVALIDATE(mi_ptr);
 
 	if (update)
diff --git a/source/blender/modifiers/intern/MOD_fracture.c b/source/blender/modifiers/intern/MOD_fracture.c
index 26d7fef..96bd98a 100644
--- a/source/blender/modifiers/intern/MOD_fracture.c
+++ b/source/blender/modifiers/intern/MOD_fracture.c
@@ -4231,6 +4231,12 @@ static DerivedMesh *applyModifier(ModifierData *md, Object *ob,
 	{
 		fmd->refresh = false;
 		fmd->shards_to_islands = false;
+
+		if (!fmd->visible_mesh_cached)
+		{
+			BKE_fracture_update_visual_mesh(fmd, true);
+		}
+
 		if (fmd->visible_mesh_cached)
 			return CDDM_copy(fmd->visible_mesh_cached);
 	}




More information about the Bf-blender-cvs mailing list