[Bf-blender-cvs] [d165b13ee40] fracture_modifier: added override with particle size option to mball remesher

Martin Felke noreply at git.blender.org
Fri Dec 29 21:54:14 CET 2017


Commit: d165b13ee40d63c9a1acc5fdfa4b84d82a62000b
Author: Martin Felke
Date:   Fri Dec 29 21:54:02 2017 +0100
Branches: fracture_modifier
https://developer.blender.org/rBd165b13ee40d63c9a1acc5fdfa4b84d82a62000b

added override with particle size option to mball remesher

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

M	source/blender/blenkernel/BKE_mball_tessellate.h
M	source/blender/blenkernel/intern/mball_tessellate.c
M	source/blender/makesdna/DNA_modifier_types.h
M	source/blender/makesrna/intern/rna_modifier.c
M	source/blender/modifiers/intern/MOD_remesh.c

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

diff --git a/source/blender/blenkernel/BKE_mball_tessellate.h b/source/blender/blenkernel/BKE_mball_tessellate.h
index a554cc5f3c9..5109633c28a 100644
--- a/source/blender/blenkernel/BKE_mball_tessellate.h
+++ b/source/blender/blenkernel/BKE_mball_tessellate.h
@@ -35,7 +35,8 @@ void BKE_mball_polygonize(
 
 void BKE_mball_cubeTable_free(void);
 
-struct DerivedMesh* BKE_repolygonize_dm(struct DerivedMesh *dm, float thresh, float basesize[3], float wiresize, float rendersize, bool render);
+struct DerivedMesh* BKE_repolygonize_dm(struct DerivedMesh *dm, float thresh, float basesize[3], float wiresize,
+                                        float rendersize, bool render, bool override_size);
 
 void BKE_dm_from_metaball(struct DispList *dl, struct DerivedMesh *dm);
 
diff --git a/source/blender/blenkernel/intern/mball_tessellate.c b/source/blender/blenkernel/intern/mball_tessellate.c
index 21f73d2d931..e20616e0b17 100644
--- a/source/blender/blenkernel/intern/mball_tessellate.c
+++ b/source/blender/blenkernel/intern/mball_tessellate.c
@@ -1330,23 +1330,33 @@ void BKE_mball_polygonize(EvaluationContext *eval_ctx, Scene *scene, Object *ob,
 	freepolygonize(&process);
 }
 
-static void init_meta_dm(PROCESS* process, DerivedMesh *dm, float stiffness, float radius, float size[3])
+static void init_meta_dm(PROCESS* process, DerivedMesh *dm, float stiffness, float radius, float size[3], bool override_size)
 {
 	float quat[4];
 	unsigned int i;
 	int totvert = dm->getNumVerts(dm), j;
 	MVert* mvert = dm->getVertArray(dm);
+	float* psize = CustomData_get_layer_named(&dm->vertData, CD_PROP_FLT, "psize");
 
 	unit_qt(quat);
 
 	/* make main array */
 	for (j = 0; j < totvert; j++, mvert++)
 	{
+		MetaElem *new_ml;
+
 		//float size[3] = {1.0f, 1.0f, 1.0f};
 		float expx, expy, expz;
 		float tempmin[3], tempmax[3];
+		float sz[3];
 
-		MetaElem *new_ml;
+		if (psize != NULL && psize[j] > 0.0f && override_size)
+		{
+			mul_v3_v3fl(sz, size, psize[j]);
+		}
+		else {
+			copy_v3_v3(sz, size);
+		}
 
 		/* make a copy because of duplicates */
 		new_ml = BLI_memarena_alloc(process->pgn_elements, sizeof(MetaElem));
@@ -1378,7 +1388,9 @@ static void init_meta_dm(PROCESS* process, DerivedMesh *dm, float stiffness, flo
 
 		/* Rotation of MetaElem is stored in quat */
 		//quat_to_mat4(rot, quat);
-		loc_quat_size_to_mat4((float(*)[4])new_ml->mat, mvert->co, quat, size);
+
+
+		loc_quat_size_to_mat4((float(*)[4])new_ml->mat, mvert->co, quat, sz);
 		invert_m4_m4((float(*)[4])new_ml->imat,(float(*)[4])new_ml->mat);
 
 #if 0
@@ -1530,7 +1542,8 @@ void BKE_dm_from_metaball(DispList *dl, DerivedMesh *dm)
 }
 
 
-DerivedMesh* BKE_repolygonize_dm(DerivedMesh *dm, float thresh, float basesize[3], float wiresize, float rendersize, bool render)
+DerivedMesh* BKE_repolygonize_dm(DerivedMesh *dm, float thresh, float basesize[3], float wiresize, float rendersize,
+                                 bool render, bool override_size)
 {
 	DerivedMesh *result = NULL;
 	DispList *dl;
@@ -1561,7 +1574,7 @@ DerivedMesh* BKE_repolygonize_dm(DerivedMesh *dm, float thresh, float basesize[3
 	process.pgn_elements = BLI_memarena_new(BLI_MEMARENA_STD_BUFSIZE, "Metaball memarena");
 
 	/* initialize from DM */
-	init_meta_dm(&process, dm, 2.0f, 2.0f, basesize);
+	init_meta_dm(&process, dm, 2.0f, 2.0f, basesize, override_size);
 
 	if (process.totelem > 0) {
 		build_bvh_spatial(&process, &process.metaball_bvh, 0, process.totelem, &process.allbb);
diff --git a/source/blender/makesdna/DNA_modifier_types.h b/source/blender/makesdna/DNA_modifier_types.h
index 7b908fdf9d4..81b52c68a05 100644
--- a/source/blender/makesdna/DNA_modifier_types.h
+++ b/source/blender/makesdna/DNA_modifier_types.h
@@ -1244,6 +1244,7 @@ typedef enum {
 	eRemeshFlag_Alive    = (1 << 0),
 	eRemeshFlag_Dead     = (1 << 1),
 	eRemeshFlag_Unborn   = (1 << 2),
+	eRemeshFlag_Size     = (1 << 3),
 } MetaballRemeshPsysFlag;
 
 typedef struct RemeshModifierData {
diff --git a/source/blender/makesrna/intern/rna_modifier.c b/source/blender/makesrna/intern/rna_modifier.c
index bf5b1ee6f14..5e8e3dd677d 100644
--- a/source/blender/makesrna/intern/rna_modifier.c
+++ b/source/blender/makesrna/intern/rna_modifier.c
@@ -3865,6 +3865,7 @@ static void rna_def_modifier_remesh(BlenderRNA *brna)
 	    {eRemeshFlag_Alive, "ALIVE", 0, "Alive", "Output a metaball surface using alive particle input data"},
 	    {eRemeshFlag_Dead, "DEAD", 0, "Dead", "Output a metaball surface using dead particle input data"},
 	    {eRemeshFlag_Unborn, "UNBORN", 0, "Unborn", "Output a metaball surface using unborn particle input data"},
+	    {eRemeshFlag_Size, "SIZE", 0, "Size", "Override metaball size by individual particle size"},
 	    {0, NULL, 0, NULL, NULL}
 	};
 
diff --git a/source/blender/modifiers/intern/MOD_remesh.c b/source/blender/modifiers/intern/MOD_remesh.c
index 5742cb2d4f8..65a0f9892cc 100644
--- a/source/blender/modifiers/intern/MOD_remesh.c
+++ b/source/blender/modifiers/intern/MOD_remesh.c
@@ -222,7 +222,9 @@ static DerivedMesh *repolygonize(RemeshModifierData *rmd, DerivedMesh* derived,
 	DerivedMesh *dm = NULL, *result = NULL;
 	MVert *mv = NULL, *mv2 = NULL;
 	float (*pos)[3] = NULL;
+	float *psize = NULL;
 	int i = 0, n = 0;
+	bool override_size = rmd->pflag & eRemeshFlag_Size;
 
 	if (((rmd->input & MOD_REMESH_VERTICES)==0) && (rmd->input & MOD_REMESH_PARTICLES))
 	{
@@ -234,13 +236,15 @@ static DerivedMesh *repolygonize(RemeshModifierData *rmd, DerivedMesh* derived,
 		n = get_particle_positions(rmd, psys, &pos);
 		dm = CDDM_new(n, 0, 0, 0, 0);
 		mv = dm->getVertArray(dm);
+		psize = CustomData_add_layer_named(&dm->vertData, CD_PROP_FLT, CD_CALLOC, NULL, n, "psize");
 
 		for (i = 0; i < n; i++)
 		{
 			copy_v3_v3(mv[i].co, pos[i]);
+			psize[i] = psys->particles[i].size;
 		}
 
-		result = BKE_repolygonize_dm(dm, rmd->thresh, rmd->basesize, rmd->wiresize, rmd->rendersize, render);
+		result = BKE_repolygonize_dm(dm, rmd->thresh, rmd->basesize, rmd->wiresize, rmd->rendersize, render, override_size);
 		dm->release(dm);
 
 		if (pos)
@@ -251,7 +255,7 @@ static DerivedMesh *repolygonize(RemeshModifierData *rmd, DerivedMesh* derived,
 	else if ((rmd->input & MOD_REMESH_VERTICES) && ((rmd->input & MOD_REMESH_PARTICLES) == 0))
 	{
 		//verts only
-		return BKE_repolygonize_dm(derived, rmd->thresh, rmd->basesize, rmd->wiresize, rmd->rendersize, render);
+		return BKE_repolygonize_dm(derived, rmd->thresh, rmd->basesize, rmd->wiresize, rmd->rendersize, render, override_size);
 	}
 	else if ((rmd->input & MOD_REMESH_VERTICES) && (rmd->input & MOD_REMESH_PARTICLES))
 	{
@@ -262,20 +266,24 @@ static DerivedMesh *repolygonize(RemeshModifierData *rmd, DerivedMesh* derived,
 			n = get_particle_positions(rmd, psys, &pos);
 
 		dm = CDDM_new(n + derived->numVertData, 0, 0, 0, 0);
+		psize = CustomData_add_layer_named(&dm->vertData, CD_PROP_FLT, CD_CALLOC, NULL, n + derived->numVertData, "psize");
+
 		mv = dm->getVertArray(dm);
 		mv2 = derived->getVertArray(derived);
 
 		for (i = 0; i < n; i++)
 		{
 			copy_v3_v3(mv[i].co, pos[i]);
+			psize[i] = psys->particles[i].size;
 		}
 
 		for (i = n; i < n + derived->numVertData; i++)
 		{
 			copy_v3_v3(mv[i].co, mv2[i-n].co);
+			psize[i] = -1.0f; //use mball sizep
 		}
 
-		result = BKE_repolygonize_dm(dm, rmd->thresh, rmd->basesize, rmd->wiresize, rmd->rendersize, render);
+		result = BKE_repolygonize_dm(dm, rmd->thresh, rmd->basesize, rmd->wiresize, rmd->rendersize, render, override_size);
 		dm->release(dm);
 
 		if (pos)



More information about the Bf-blender-cvs mailing list