[Bf-blender-cvs] [c5cf0667cb7] fracture_modifier: re-enabled deform mblur for FM, and hopefully fixed related crashes

Martin Felke noreply at git.blender.org
Sat Aug 11 00:12:48 CEST 2018


Commit: c5cf0667cb7c0b28feade2b7fa8c59f2fde2fa25
Author: Martin Felke
Date:   Sat Aug 11 00:12:16 2018 +0200
Branches: fracture_modifier
https://developer.blender.org/rBc5cf0667cb7c0b28feade2b7fa8c59f2fde2fa25

re-enabled deform mblur for FM, and hopefully fixed related crashes

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

M	source/blender/blenkernel/BKE_fracture.h
M	source/blender/blenkernel/intern/fracture.c
M	source/blender/blenkernel/intern/pointcache.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 3df6182f95c..a6262dd7fae 100644
--- a/source/blender/blenkernel/BKE_fracture.h
+++ b/source/blender/blenkernel/BKE_fracture.h
@@ -130,7 +130,7 @@ short BKE_fracture_collect_materials(struct Object* o, struct Object* ob, int ma
 void BKE_bm_mesh_hflag_flush_vert(struct BMesh *bm, const char hflag);
 void BKE_meshisland_constraint_create(struct FractureModifierData* fmd, struct MeshIsland *mi1, struct MeshIsland *mi2, int con_type, float thresh);
 void BKE_update_acceleration_map(struct FractureModifierData *fmd, struct MeshIsland* mi, struct Object* ob, int ctime, float acc, struct RigidBodyWorld *rbw);
-void BKE_update_velocity_layer(struct FractureModifierData *fmd, struct MeshIsland *mi);
+void BKE_update_velocity_layer(struct FractureModifierData *fmd);
 void BKE_read_animated_loc_rot(struct FractureModifierData *fmd, Object *ob, bool do_bind);
 
 #endif /* BKE_FRACTURE_H */
diff --git a/source/blender/blenkernel/intern/fracture.c b/source/blender/blenkernel/intern/fracture.c
index 79b8c15f0c1..f346026b96d 100644
--- a/source/blender/blenkernel/intern/fracture.c
+++ b/source/blender/blenkernel/intern/fracture.c
@@ -205,29 +205,6 @@ static int shard_sortsize(const void *s1, const void *s2, void* UNUSED(context))
 	return 0;
 }
 
-void* check_add_layer(CustomData *src, CustomData *dst, int type, int totelem, const char* name)
-{
-	void *layer =  CustomData_get_layer_named(dst, type, name);
-
-	if (!layer) {
-		void* orig = NULL;
-
-		if (src) {
-			orig = CustomData_get_layer_named(src, type, name);
-		}
-
-		if (orig) {
-			return CustomData_add_layer_named(dst, type, CD_DUPLICATE, orig, totelem, name);
-		}
-		else{
-			return CustomData_add_layer_named(dst, type, CD_CALLOC, NULL, totelem, name);
-		}
-	}
-	else {
-		return layer;
-	}
-}
-
 Shard *BKE_custom_data_to_shard(Shard *s, DerivedMesh *dm)
 {
 	CustomData_reset(&s->vertData);
@@ -240,11 +217,6 @@ Shard *BKE_custom_data_to_shard(Shard *s, DerivedMesh *dm)
 	CustomData_copy(&dm->polyData, &s->polyData, CD_MASK_MTEXPOLY, CD_DUPLICATE, s->totpoly);
 	CustomData_copy(&dm->edgeData, &s->edgeData, CD_MASK_CREASE | CD_MASK_BWEIGHT | CD_MASK_MEDGE, CD_DUPLICATE, s->totedge);
 
-	//add velocity vertex layers...
-	check_add_layer(&dm->vertData, &s->vertData, CD_PROP_FLT, s->totvert, "velX");
-	check_add_layer(&dm->vertData, &s->vertData, CD_PROP_FLT, s->totvert, "velY");
-	check_add_layer(&dm->vertData, &s->vertData, CD_PROP_FLT, s->totvert, "velZ");
-
 	return s;
 }
 
@@ -3865,77 +3837,44 @@ void BKE_update_acceleration_map(FractureModifierData *fmd, MeshIsland* mi, Obje
 	}
 }
 
-void BKE_update_velocity_layer(FractureModifierData *fmd, MeshIsland *mi)
+void BKE_update_velocity_layer(FractureModifierData *fmd)
 {
-#if 0
 	DerivedMesh *dm = fmd->visible_mesh_cached;
 	float *velX=NULL, *velY=NULL, *velZ = NULL;
-	RigidBodyOb *rbo = mi->rigidbody;
-	Shard *s, *t = NULL;
-	void *pX, *pY, *pZ, *spX = NULL, *spY = NULL, *spZ = NULL;
-	float *sX=NULL, *sY=NULL, *sZ=NULL;
+	RigidBodyOb *rbo = NULL;
 	int i = 0;
-	ListBase *lb;
+	MeshIsland *mi;
+	int totvert;
 
 	if (!dm)
 		return;
 
-	//XXX TODO deal with split shards to islands etc, here take only "real" shards for now
-	if (fmd->shards_to_islands) {
-		lb = &fmd->islandShards;
-	}
-	else {
-		lb = &fmd->frac_mesh->shard_map;
-	}
-
-	for (s = lb->first; s; s = s->next)
-	{
-		if (s->shard_id == mi->id)
-		{
-			t = s;
-			break;
-		}
-	}
+	totvert = dm->getNumVerts(dm);
 
-	pX = CustomData_get_layer_named(&dm->vertData, CD_PROP_FLT, "velX");
-	pY = CustomData_get_layer_named(&dm->vertData, CD_PROP_FLT, "velY");
-	pZ = CustomData_get_layer_named(&dm->vertData, CD_PROP_FLT, "velZ");
+	velX = CustomData_get_layer_named(&dm->vertData, CD_PROP_FLT, "velX");
+	velY = CustomData_get_layer_named(&dm->vertData, CD_PROP_FLT, "velY");
+	velZ = CustomData_get_layer_named(&dm->vertData, CD_PROP_FLT, "velZ");
 
-	if (!pX ||!pY || !pZ)
-		return;
+	if (!velX)
+		velX = CustomData_add_layer_named(&dm->vertData, CD_PROP_FLT, CD_CALLOC, NULL, totvert, "velX");
 
-	velX = (float*)pX;
-	velY = (float*)pY;
-	velZ = (float*)pZ;
+	if (!velY)
+		velY = CustomData_add_layer_named(&dm->vertData, CD_PROP_FLT, CD_CALLOC, NULL, totvert, "velY");
 
-	//XXX how to represent this in mblur ?
-	//zero_v3(rbo->ang_vel);
+	if (!velZ)
+		velZ = CustomData_add_layer_named(&dm->vertData, CD_PROP_FLT, CD_CALLOC, NULL, totvert, "velZ");
 
-	if (t)
+	for (mi = fmd->meshIslands.first; mi; mi = mi->next)
 	{
-		spX = check_add_layer(NULL, &t->vertData, CD_PROP_FLT, t->totvert, "velX");
-		spY = check_add_layer(NULL, &t->vertData, CD_PROP_FLT, t->totvert, "velY");
-		spZ = check_add_layer(NULL, &t->vertData, CD_PROP_FLT, t->totvert, "velZ");
-	}
+		rbo = mi->rigidbody;
 
-	for (i = 0; i < mi->vertex_count; i++)
-	{
-		if (spX && spY && spZ)
+		for (i = 0; i < mi->vertex_count; i++)
 		{
-			sX = (float*)spX;
-			sY = (float*)spY;
-			sZ = (float*)spZ;
-
-			sX[i] = rbo->lin_vel[0] + rbo->ang_vel[0];
-			sY[i] = rbo->lin_vel[1] + rbo->ang_vel[1];
-			sZ[i] = rbo->lin_vel[2] + rbo->ang_vel[2];
+			velX[mi->vertex_indices[i]] = rbo->lin_vel[0] + rbo->ang_vel[0];
+			velY[mi->vertex_indices[i]] = rbo->lin_vel[1] + rbo->ang_vel[1];
+			velZ[mi->vertex_indices[i]] = rbo->lin_vel[2] + rbo->ang_vel[2];
 		}
-
-		velX[mi->vertex_indices[i]] = rbo->lin_vel[0] + rbo->ang_vel[0];
-		velY[mi->vertex_indices[i]] = rbo->lin_vel[1] + rbo->ang_vel[1];
-		velZ[mi->vertex_indices[i]] = rbo->lin_vel[2] + rbo->ang_vel[2];
 	}
-#endif
 }
 
 /* gah, it could be that simple, if each mod handled its stuff itself */
diff --git a/source/blender/blenkernel/intern/pointcache.c b/source/blender/blenkernel/intern/pointcache.c
index 8f07a8c5959..a10ce7fe67c 100644
--- a/source/blender/blenkernel/intern/pointcache.c
+++ b/source/blender/blenkernel/intern/pointcache.c
@@ -1364,13 +1364,6 @@ static int  ptcache_rigidbody_write(int index, void *rb_v, void **data, int cfra
 			RB_body_get_linear_velocity(rbo->physics_object, rbo->lin_vel);
 			RB_body_get_angular_velocity(rbo->physics_object, rbo->ang_vel);
 
-			//this is only for motionblur, so its enough to be updated when rendering
-			if (fmd && G.is_rendering)
-			{
-				mi = find_meshisland(fmd, rbo->meshisland_index);
-				BKE_update_velocity_layer(fmd, mi);
-			}
-
 			/*if (cfra > rbw->pointcache->startframe)
 			{
 				sub_v3_v3v3(rbo->lin_vel, linvel, rbo->lin_vel);
@@ -1488,13 +1481,6 @@ static void ptcache_rigidbody_read(int index, void *rb_v, void **data, float cfr
 					}
 				}
 			}
-
-			//this is only for motionblur, so its enough to be updated when rendering
-			if (fmd && G.is_rendering)
-			{
-				mi = find_meshisland(fmd, rbo->meshisland_index);
-				BKE_update_velocity_layer(fmd, mi);
-			}
 		}
 	}
 	else if (fmd && fmd->fracture_mode == MOD_FRACTURE_DYNAMIC)
@@ -1620,11 +1606,6 @@ static void ptcache_rigidbody_interpolate(int index, void *rb_v, void **data, fl
 		copy_qt_qt(rbo->orn, keys->rot);
 		copy_v3_v3(rbo->lin_vel, keys->vel);
 		copy_v3_v3(rbo->ang_vel, keys->ave);
-
-		if (fmd && mi && G.is_rendering)
-		{
-			BKE_update_velocity_layer(fmd, mi);
-		}
 	}
 }
 static int ptcache_rigidbody_totpoint(void *rb_v, int UNUSED(cfra))
diff --git a/source/blender/modifiers/intern/MOD_fracture.c b/source/blender/modifiers/intern/MOD_fracture.c
index 1ee201a98c3..6dbf8e80ff0 100644
--- a/source/blender/modifiers/intern/MOD_fracture.c
+++ b/source/blender/modifiers/intern/MOD_fracture.c
@@ -3653,6 +3653,7 @@ static DerivedMesh* centroids_to_verts(FractureModifierData* fmd, BMesh* bm, Obj
 
 static DerivedMesh *do_autoHide(FractureModifierData *fmd, DerivedMesh *dm, Object *ob)
 {
+
 	int totpoly = dm->getNumPolys(dm);
 	int i = 0;
 	BMesh *bm = BM_mesh_create(&bm_mesh_allocsize_default,  &((struct BMeshCreateParams){.use_toolflags = true,}));
@@ -3661,6 +3662,9 @@ static DerivedMesh *do_autoHide(FractureModifierData *fmd, DerivedMesh *dm, Obje
 	int del_faces = 0;
 	bool do_merge = fmd->do_merge;
 
+	//just before we mess up the mesh, ensure velocity precalculation.
+	BKE_update_velocity_layer(fmd);
+
 	if (fmd->use_centroids && !fmd->use_vertices)
 	{
 		result = centroids_to_verts(fmd, bm, ob);



More information about the Bf-blender-cvs mailing list