[Bf-blender-cvs] [a4412f2b72b] temp-fracture-modifier-2.8: crash fix for deform mblur velocity precalculation (port from 2.7x FM)

Martin Felke noreply at git.blender.org
Sat Aug 11 00:50:07 CEST 2018


Commit: a4412f2b72bd09f1efdce123b94b0540dbe2abe9
Author: Martin Felke
Date:   Sat Aug 11 00:49:44 2018 +0200
Branches: temp-fracture-modifier-2.8
https://developer.blender.org/rBa4412f2b72bd09f1efdce123b94b0540dbe2abe9

crash fix for deform mblur velocity precalculation (port from 2.7x FM)

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

M	source/blender/blenkernel/BKE_fracture.h
M	source/blender/blenkernel/intern/fracture.c
M	source/blender/blenkernel/intern/fracture_automerge.c
M	source/blender/blenkernel/intern/fracture_rigidbody.c

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

diff --git a/source/blender/blenkernel/BKE_fracture.h b/source/blender/blenkernel/BKE_fracture.h
index 2d618495a30..fac481cd14b 100644
--- a/source/blender/blenkernel/BKE_fracture.h
+++ b/source/blender/blenkernel/BKE_fracture.h
@@ -196,5 +196,7 @@ struct Mesh* BKE_fracture_mesh_copy(struct Mesh* source, struct Object* ob);
 struct BMesh* BKE_fracture_mesh_to_bmesh(struct Mesh* me);
 struct Mesh* BKE_fracture_bmesh_to_mesh(struct BMesh* bm);
 
+void BKE_update_velocity_layer(struct FractureModifierData *fmd);
+
 
 #endif /* BKE_FRACTURE_H */
diff --git a/source/blender/blenkernel/intern/fracture.c b/source/blender/blenkernel/intern/fracture.c
index fd19d312002..bc56d086556 100644
--- a/source/blender/blenkernel/intern/fracture.c
+++ b/source/blender/blenkernel/intern/fracture.c
@@ -239,29 +239,6 @@ static int shard_sortsize(const void *s1, const void *s2, void* UNUSED(context))
 	return 0;
 }
 
-static 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;
-	}
-}
-
 void BKE_fracture_custom_data_mesh_to_shard(Shard *s, Mesh *dm)
 {
 	CustomData_reset(&s->vertData);
@@ -272,11 +249,6 @@ void BKE_fracture_custom_data_mesh_to_shard(Shard *s, Mesh *dm)
 	CustomData_copy(&dm->vdata, &s->vertData, CD_MASK_MDEFORMVERT, CD_DUPLICATE, s->totvert);
 	CustomData_copy(&dm->ldata, &s->loopData, CD_MASK_MLOOPUV, CD_DUPLICATE, s->totloop);
 	CustomData_copy(&dm->edata, &s->edgeData, CD_MASK_CREASE | CD_MASK_BWEIGHT | CD_MASK_MEDGE, CD_DUPLICATE, s->totedge);
-
-	//add velocity vertex layers...
-	check_add_layer(&dm->vdata, &s->vertData, CD_PROP_FLT, s->totvert, "velX");
-	check_add_layer(&dm->vdata, &s->vertData, CD_PROP_FLT, s->totvert, "velY");
-	check_add_layer(&dm->vdata, &s->vertData, CD_PROP_FLT, s->totvert, "velZ");
 }
 
 /* modified from BKE_mesh_center_median */
@@ -2494,74 +2466,43 @@ void BKE_bm_mesh_hflag_flush_vert(BMesh *bm, const char hflag)
 	}
 }
 
-void BKE_update_velocity_layer(FractureModifierData *fmd, MeshIsland *mi)
+void BKE_update_velocity_layer(FractureModifierData *fmd)
 {
 	Mesh *dm = fmd->shared->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->shared->islandShards;
-	}
-	else {
-		lb = &fmd->shared->frac_mesh->shard_map;
-	}
-
-	for (s = lb->first; s; s = s->next)
-	{
-		if (s->shard_id == mi->id)
-		{
-			t = s;
-			break;
-		}
-	}
+	totvert = dm->totvert;
 
-	pX = CustomData_get_layer_named(&dm->vdata, CD_PROP_FLT, "velX");
-	pY = CustomData_get_layer_named(&dm->vdata, CD_PROP_FLT, "velY");
-	pZ = CustomData_get_layer_named(&dm->vdata, CD_PROP_FLT, "velZ");
+	velX = CustomData_get_layer_named(&dm->vdata, CD_PROP_FLT, "velX");
+	velY = CustomData_get_layer_named(&dm->vdata, CD_PROP_FLT, "velY");
+	velZ = CustomData_get_layer_named(&dm->vdata, CD_PROP_FLT, "velZ");
 
-	if (!pX ||!pY || !pZ)
-		return;
+	if (!velX)
+		velX = CustomData_add_layer_named(&dm->vdata, 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->vdata, 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->vdata, CD_PROP_FLT, CD_CALLOC, NULL, totvert, "velZ");
 
-	if (t)
+	for (mi = fmd->shared->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];
 	}
 }
 
diff --git a/source/blender/blenkernel/intern/fracture_automerge.c b/source/blender/blenkernel/intern/fracture_automerge.c
index 7af5a949c63..307fb4121d7 100644
--- a/source/blender/blenkernel/intern/fracture_automerge.c
+++ b/source/blender/blenkernel/intern/fracture_automerge.c
@@ -447,6 +447,9 @@ Mesh *BKE_fracture_autohide_do(FractureModifierData *fmd, Mesh *dm, Object *ob,
 	bool do_merge = fmd->do_merge;
 	//struct BMeshToMeshParams bmt = {.calc_object_remap = 0};
 
+	//just before we mess up this mesh, ensure velocity precalculation.
+	BKE_update_velocity_layer(fmd);
+
 	if (fmd->use_centroids && !fmd->use_vertices)
 	{
 		BM_mesh_create(&bm_mesh_allocsize_default,  &((struct BMeshCreateParams){.use_toolflags = true,}));
diff --git a/source/blender/blenkernel/intern/fracture_rigidbody.c b/source/blender/blenkernel/intern/fracture_rigidbody.c
index e90b53a7d06..e01baaf1125 100644
--- a/source/blender/blenkernel/intern/fracture_rigidbody.c
+++ b/source/blender/blenkernel/intern/fracture_rigidbody.c
@@ -2668,9 +2668,6 @@ bool BKE_rigidbody_modifier_sync(ModifierData *md, Object *ob, Scene *scene, flo
 
 					zero_v3(rbo->lin_vel);
 					zero_v3(rbo->ang_vel);
-
-					//reset at start, there no cache read seems to happen
-					//BKE_update_velocity_layer(fmd, mi);
 				}
 
 				if ((ob->rigidbody_object->type == RBO_TYPE_ACTIVE) && (rbo->type == RBO_TYPE_ACTIVE || rbo->flag & RBO_FLAG_KINEMATIC)) {



More information about the Bf-blender-cvs mailing list