[Bf-blender-cvs] [7622563ae39] fracture_modifier: mblur for fm use centroids / use vertices was missing on remesher, some crash fixes

Martin Felke noreply at git.blender.org
Fri Jan 5 00:00:15 CET 2018


Commit: 7622563ae390fbd0fb3f474bdefe21d5ecfcd5cc
Author: Martin Felke
Date:   Fri Jan 5 00:00:01 2018 +0100
Branches: fracture_modifier
https://developer.blender.org/rB7622563ae390fbd0fb3f474bdefe21d5ecfcd5cc

mblur for fm use centroids / use vertices was missing on remesher, some crash fixes

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

M	intern/rigidbody/rb_bullet_api.cpp
M	source/blender/blenkernel/BKE_customdata.h
M	source/blender/blenkernel/intern/customdata.c
M	source/blender/bmesh/intern/bmesh_interp.c
M	source/blender/bmesh/intern/bmesh_interp.h
M	source/blender/modifiers/intern/MOD_fracture.c
M	source/blender/modifiers/intern/MOD_remesh.c

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

diff --git a/intern/rigidbody/rb_bullet_api.cpp b/intern/rigidbody/rb_bullet_api.cpp
index edfc0eb5f43..e26c1307b97 100644
--- a/intern/rigidbody/rb_bullet_api.cpp
+++ b/intern/rigidbody/rb_bullet_api.cpp
@@ -742,7 +742,7 @@ struct rbFilterCallback : public btOverlapFilterCallback
 			bool meshShape0 = (stype0 == GIMPACT_SHAPE_PROXYTYPE) || (stype0 == TRIANGLE_MESH_SHAPE_PROXYTYPE);
 			bool meshShape1 = (stype1 == GIMPACT_SHAPE_PROXYTYPE) || (stype1 == TRIANGLE_MESH_SHAPE_PROXYTYPE);
 
-			if ((rb0->blenderOb != rb1->blenderOb) && (meshShape0 || meshShape1))
+			if ((rb0->blenderOb != rb1->blenderOb) && (meshShape0 && meshShape1))
 			{
 				btVector3 v0, v1, min0, max0, min1, max1, min, max;
 				v0 = rb0->body->getWorldTransform().getOrigin();
diff --git a/source/blender/blenkernel/BKE_customdata.h b/source/blender/blenkernel/BKE_customdata.h
index e64cdd51392..4d922f0bbca 100644
--- a/source/blender/blenkernel/BKE_customdata.h
+++ b/source/blender/blenkernel/BKE_customdata.h
@@ -275,6 +275,7 @@ void *CustomData_get(const struct CustomData *data, int index, int type);
 void *CustomData_get_n(const struct CustomData *data, int type, int index, int n);
 void *CustomData_bmesh_get(const struct CustomData *data, void *block, int type);
 void *CustomData_bmesh_get_n(const struct CustomData *data, void *block, int type, int n);
+void *CustomData_bmesh_get_named(const CustomData *data, void *block, int type, const char *name);
 
 /* gets the layer at physical index n, with no type checking.
  */
diff --git a/source/blender/blenkernel/intern/customdata.c b/source/blender/blenkernel/intern/customdata.c
index 1f72583e75c..367bf3f82e7 100644
--- a/source/blender/blenkernel/intern/customdata.c
+++ b/source/blender/blenkernel/intern/customdata.c
@@ -2914,6 +2914,18 @@ void *CustomData_bmesh_get_n(const CustomData *data, void *block, int type, int
 	return POINTER_OFFSET(block, data->layers[layer_index + n].offset);
 }
 
+/* why did this miss here before, useful ! */
+void *CustomData_bmesh_get_named(const CustomData *data, void *block, int type, const char *name)
+{
+	int layer_index;
+
+	/* get the layer index of the first layer of type */
+	layer_index = CustomData_get_named_layer_index(data, type, name);
+	if (layer_index == -1) return NULL;
+
+	return POINTER_OFFSET(block, data->layers[layer_index].offset);
+}
+
 /*gets from the layer at physical index n, note: doesn't check type.*/
 void *CustomData_bmesh_get_layer_n(const CustomData *data, void *block, int n)
 {
diff --git a/source/blender/bmesh/intern/bmesh_interp.c b/source/blender/bmesh/intern/bmesh_interp.c
index 20ee31251e8..12be4c16272 100644
--- a/source/blender/bmesh/intern/bmesh_interp.c
+++ b/source/blender/bmesh/intern/bmesh_interp.c
@@ -894,6 +894,12 @@ float BM_elem_float_data_get(CustomData *cd, void *element, int type)
 	return f ? *f : 0.0f;
 }
 
+float BM_elem_float_data_get_named(CustomData *cd, void *element, int type, const char *name)
+{
+	const float *f = CustomData_bmesh_get_named(cd, ((BMHeader *)element)->data, type, name);
+	return f ? *f : 0.0f;
+}
+
 void BM_elem_float_data_set(CustomData *cd, void *element, int type, const float val)
 {
 	float *f = CustomData_bmesh_get(cd, ((BMHeader *)element)->data, type);
diff --git a/source/blender/bmesh/intern/bmesh_interp.h b/source/blender/bmesh/intern/bmesh_interp.h
index dabdd23cf6f..ae0ff421716 100644
--- a/source/blender/bmesh/intern/bmesh_interp.h
+++ b/source/blender/bmesh/intern/bmesh_interp.h
@@ -52,6 +52,7 @@ void  BM_data_layer_free(BMesh *bm, CustomData *data, int type);
 void  BM_data_layer_free_n(BMesh *bm, CustomData *data, int type, int n);
 void  BM_data_layer_copy(BMesh *bm, CustomData *data, int type, int src_n, int dst_n);
 
+float BM_elem_float_data_get_named(CustomData *cd, void *element, int type, const char *name);
 float BM_elem_float_data_get(CustomData *cd, void *element, int type);
 void  BM_elem_float_data_set(CustomData *cd, void *element, int type, const float val);
 
diff --git a/source/blender/modifiers/intern/MOD_fracture.c b/source/blender/modifiers/intern/MOD_fracture.c
index 039265782f4..826e44a7e77 100644
--- a/source/blender/modifiers/intern/MOD_fracture.c
+++ b/source/blender/modifiers/intern/MOD_fracture.c
@@ -3429,19 +3429,50 @@ static void optimize_automerge(FractureModifierData *fmd)
 	printf("remaining | removed groups: %d | %d\n", count, removed);
 }
 
-static void centroids_to_verts(FractureModifierData* fmd, BMesh* bm, Object* ob)
+static DerivedMesh* centroids_to_verts(FractureModifierData* fmd, BMesh* bm, Object* ob)
 {
+	BMIter viter;
+	DerivedMesh *dm = NULL;
+	MVert *mv = NULL;
+	BMVert *v = NULL;
 	MeshIsland *mi;
 	//only add verts where centroids are...
 	float imat[4][4];
+	float *velX, *velY, *velZ;
+	int i = 0;
+	int dm_totvert = BLI_listbase_count(&fmd->meshIslands);
+	int totvert = dm_totvert + bm->totvert;
+
+
 	invert_m4_m4(imat, ob->obmat);
 
+	dm = CDDM_new(totvert, 0, 0, 0, 0);
+
+	mv = dm->getVertArray(dm);
+	velX = CustomData_add_layer_named(&dm->vertData, CD_PROP_FLT, CD_CALLOC, NULL, totvert, "velX");
+	velY = CustomData_add_layer_named(&dm->vertData, CD_PROP_FLT, CD_CALLOC, NULL, totvert, "velY");
+	velZ = CustomData_add_layer_named(&dm->vertData, CD_PROP_FLT, CD_CALLOC, NULL, totvert, "velZ");
+
 	for (mi = fmd->meshIslands.first; mi; mi = mi->next)
 	{
-		float co[3];
-		mul_v3_m4v3(co, imat, mi->rigidbody->pos);
-		BM_vert_create(bm, co, NULL, BM_CREATE_NOP);
+		RigidBodyOb *rbo = mi->rigidbody;
+		mul_v3_m4v3(mv[i].co, imat, mi->rigidbody->pos);
+		velX[i] = rbo->lin_vel[0] + rbo->ang_vel[0];
+		velY[i] = rbo->lin_vel[1] + rbo->ang_vel[1];
+		velZ[i] = rbo->lin_vel[2] + rbo->ang_vel[2];
+		i++;
 	}
+
+	i = 0;
+	BM_ITER_MESH_INDEX(v, &viter, bm, BM_VERTS_OF_MESH, i)
+	{
+		copy_v3_v3(mv[i + dm_totvert].co, v->co);
+		velX[i + dm_totvert] = BM_elem_float_data_get_named(&bm->vdata, v, CD_PROP_FLT, "velX");
+		velY[i + dm_totvert] = BM_elem_float_data_get_named(&bm->vdata, v, CD_PROP_FLT, "velY");
+		velZ[i + dm_totvert] = BM_elem_float_data_get_named(&bm->vdata, v, CD_PROP_FLT, "velZ");
+	}
+
+	return dm;
 }
 
 static DerivedMesh *do_autoHide(FractureModifierData *fmd, DerivedMesh *dm, Object *ob)
@@ -3456,7 +3487,10 @@ static DerivedMesh *do_autoHide(FractureModifierData *fmd, DerivedMesh *dm, Obje
 
 	if (fmd->use_centroids && !fmd->use_vertices)
 	{
-		centroids_to_verts(fmd, bm, ob);
+		result = centroids_to_verts(fmd, bm, ob);
+		BM_mesh_free(bm);
+		MEM_freeN(faces);
+		return result;
 	}
 	else {
 		DM_to_bmesh_ex(dm, bm, true);
@@ -3527,7 +3561,10 @@ static DerivedMesh *do_autoHide(FractureModifierData *fmd, DerivedMesh *dm, Obje
 
 		if (fmd->use_centroids)
 		{
-			centroids_to_verts(fmd, bm, ob);
+			result = centroids_to_verts(fmd, bm, ob);
+			BM_mesh_free(bm);
+			MEM_freeN(faces);
+			return result;
 		}
 	}
 
@@ -3567,7 +3604,11 @@ static DerivedMesh *do_autoHide(FractureModifierData *fmd, DerivedMesh *dm, Obje
 		BM_mesh_normals_update(bm);
 	}
 
-	result = CDDM_from_bmesh(bm, true);
+	//if (!fmd->use_centroids && !fmd->use_vertices)
+	{
+		result = CDDM_from_bmesh(bm, true);
+	}
+
 	BM_mesh_free(bm);
 	MEM_freeN(faces);
 
diff --git a/source/blender/modifiers/intern/MOD_remesh.c b/source/blender/modifiers/intern/MOD_remesh.c
index 06c87001de2..8338cbe0dd8 100644
--- a/source/blender/modifiers/intern/MOD_remesh.c
+++ b/source/blender/modifiers/intern/MOD_remesh.c
@@ -292,6 +292,7 @@ static DerivedMesh *repolygonize(RemeshModifierData *rmd, Object* ob, DerivedMes
 	else if ((rmd->input & MOD_REMESH_VERTICES) && (rmd->input & MOD_REMESH_PARTICLES))
 	{
 		//both, for simplicity only use vert data here
+		float* ovX, *ovY, *ovZ;
 		n = 0;
 
 		if (psys)
@@ -306,6 +307,10 @@ static DerivedMesh *repolygonize(RemeshModifierData *rmd, Object* ob, DerivedMes
 		mv = dm->getVertArray(dm);
 		mv2 = derived->getVertArray(derived);
 
+		ovX = CustomData_get_layer_named(&derived->vertData, CD_PROP_FLT, "velX");
+		ovY = CustomData_get_layer_named(&derived->vertData, CD_PROP_FLT, "velY");
+		ovZ = CustomData_get_layer_named(&derived->vertData, CD_PROP_FLT, "velZ");
+
 		for (i = 0; i < n; i++)
 		{
 			copy_v3_v3(mv[i].co, pos[i]);
@@ -319,9 +324,9 @@ static DerivedMesh *repolygonize(RemeshModifierData *rmd, Object* ob, DerivedMes
 		{
 			copy_v3_v3(mv[i].co, mv2[i-n].co);
 			psize[i] = -1.0f; //use mball sizep
-			velX[i] = 0.0f;
-			velY[i] = 0.0f;
-			velZ[i] = 0.0f;
+			velX[i] = ovX ? ovX[i-n] : 0.0f;
+			velY[i] = ovY ? ovY[i-n] : 0.0f;
+			velZ[i] = ovZ ? ovZ[i-n] : 0.0f;
 		}
 
 		if (pos)



More information about the Bf-blender-cvs mailing list