[Bf-blender-cvs] [c381b3fadc3] fracture_modifier: added vertexgroup to influence metaball radii

Martin Felke noreply at git.blender.org
Wed Feb 28 17:54:54 CET 2018


Commit: c381b3fadc3788492adb7786d8f4031ffba8ee71
Author: Martin Felke
Date:   Wed Feb 28 17:54:10 2018 +0100
Branches: fracture_modifier
https://developer.blender.org/rBc381b3fadc3788492adb7786d8f4031ffba8ee71

added vertexgroup to influence metaball radii

note, the weight (0...1) is normed to a size factor -0.5 ... 0.5 to also allow negative mball elements.

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

M	release/scripts/startup/bl_ui/properties_data_modifier.py
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/release/scripts/startup/bl_ui/properties_data_modifier.py b/release/scripts/startup/bl_ui/properties_data_modifier.py
index e5e36d8bc8d..4467d44ee0f 100644
--- a/release/scripts/startup/bl_ui/properties_data_modifier.py
+++ b/release/scripts/startup/bl_ui/properties_data_modifier.py
@@ -1142,6 +1142,7 @@ class DATA_PT_modifiers(ModifierButtonsPanel, Panel):
             col.prop(md, "mball_threshold")
             col.prop(md, "mball_resolution")
             col.prop(md, "mball_render_resolution")
+            layout.prop_search(md, "size_vertex_group", ob, "vertex_groups", text = "Size Vertex Group")
             layout.prop(md, "use_smooth_shade")
 
         else:
diff --git a/source/blender/blenkernel/BKE_mball_tessellate.h b/source/blender/blenkernel/BKE_mball_tessellate.h
index 041b0303596..6d8ff19e45a 100644
--- a/source/blender/blenkernel/BKE_mball_tessellate.h
+++ b/source/blender/blenkernel/BKE_mball_tessellate.h
@@ -36,7 +36,7 @@ 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, bool override_size);
+                                        float rendersize, bool render, bool override_size, int defgrp_size);
 
 void BKE_dm_from_metaball(struct DispList *dl, struct DerivedMesh *dm, struct DerivedMesh *odm, int *orig_index);
 
diff --git a/source/blender/blenkernel/intern/mball_tessellate.c b/source/blender/blenkernel/intern/mball_tessellate.c
index 7f6facea0d8..4268b7cdbaf 100644
--- a/source/blender/blenkernel/intern/mball_tessellate.c
+++ b/source/blender/blenkernel/intern/mball_tessellate.c
@@ -1337,13 +1337,15 @@ 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], bool override_size)
+static void init_meta_dm(PROCESS* process, DerivedMesh *dm, float stiffness, float radius, float size[3],
+                         bool override_size, int defgrp_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");
+	MDeformVert *dvert = CustomData_get_layer(&dm->vertData, CD_MDEFORMVERT);
 
 	unit_qt(quat);
 
@@ -1383,6 +1385,23 @@ static void init_meta_dm(PROCESS* process, DerivedMesh *dm, float stiffness, flo
 		/* if metaball is negative, set stiffness negative */
 		//if (new_ml->flag & MB_NEGATIVE) new_ml->s = -new_ml->s;
 
+		if (dvert && defgrp_size > -1)
+		{
+			MDeformVert *dv = dvert + j;
+			if (dv && dv->dw)
+			{
+				float w = dv->dw[defgrp_size].weight - 0.5f;
+				//map 0..1 weights to -0.5f ... + 0.5f size factor, to allow also negative sizes... 0.5f weight is 0 size
+				mul_v3_fl(sz, w);
+
+				/* if metaball is negative, set stiffness negative, indicated by weight < 0.5f here */
+				if (w < 0.5f)
+				{
+					new_ml->s = -new_ml->s;
+				}
+			}
+		}
+
 		/* Translation of MetaElem */
 		/*unit_m4(pos);
 		pos[3][0] = mvert->co[0];
@@ -1574,7 +1593,7 @@ void BKE_dm_from_metaball(DispList *dl, DerivedMesh *dm, DerivedMesh *odm, int *
 
 
 DerivedMesh* BKE_repolygonize_dm(DerivedMesh *dm, float thresh, float basesize[3], float wiresize, float rendersize,
-                                 bool render, bool override_size)
+                                 bool render, bool override_size, int defgrp_size)
 {
 	DerivedMesh *result = NULL;
 	DispList *dl;
@@ -1605,7 +1624,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, override_size);
+	init_meta_dm(&process, dm, 2.0f, 2.0f, basesize, override_size, defgrp_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 b7969671adc..cd70132c254 100644
--- a/source/blender/makesdna/DNA_modifier_types.h
+++ b/source/blender/makesdna/DNA_modifier_types.h
@@ -1275,6 +1275,7 @@ typedef struct RemeshModifierData {
 	int input;
 	int pflag;
 	int psys;
+	char size_defgrp_name[64];  /* MAX_VGROUP_NAME */
 
 	/* octree depth */
 	char depth;
diff --git a/source/blender/makesrna/intern/rna_modifier.c b/source/blender/makesrna/intern/rna_modifier.c
index 5cd1a94a59b..289b08b2a31 100644
--- a/source/blender/makesrna/intern/rna_modifier.c
+++ b/source/blender/makesrna/intern/rna_modifier.c
@@ -490,6 +490,7 @@ RNA_MOD_VGROUP_NAME_SET(Lattice, name);
 RNA_MOD_VGROUP_NAME_SET(Mask, vgroup);
 RNA_MOD_VGROUP_NAME_SET(MeshDeform, defgrp_name);
 RNA_MOD_VGROUP_NAME_SET(NormalEdit, defgrp_name);
+RNA_MOD_VGROUP_NAME_SET(Remesh, size_defgrp_name);
 RNA_MOD_VGROUP_NAME_SET(Shrinkwrap, vgroup_name);
 RNA_MOD_VGROUP_NAME_SET(SimpleDeform, vgroup_name);
 RNA_MOD_VGROUP_NAME_SET(Smooth, defgrp_name);
@@ -3988,6 +3989,12 @@ static void rna_def_modifier_remesh(BlenderRNA *brna)
 	RNA_def_property_flag(prop, PROP_ENUM_FLAG);
 	RNA_def_property_ui_text(prop, "Filter", "Which particles to consider in remeshing");
 	RNA_def_property_update(prop, 0, "rna_Modifier_update");
+
+	prop = RNA_def_property(srna, "size_vertex_group", PROP_STRING, PROP_NONE);
+	RNA_def_property_string_sdna(prop, NULL, "size_defgrp_name");
+	RNA_def_property_ui_text(prop, "Size Vertex Group", "Vertex group name which optionally defines metaball size");
+	RNA_def_property_string_funcs(prop, NULL, NULL, "rna_RemeshModifier_size_defgrp_name_set");
+	RNA_def_property_update(prop, 0, "rna_Modifier_update");
 }
 
 static void rna_def_modifier_ocean(BlenderRNA *brna)
diff --git a/source/blender/modifiers/intern/MOD_remesh.c b/source/blender/modifiers/intern/MOD_remesh.c
index 2d50b7d0687..4ff67830dcb 100644
--- a/source/blender/modifiers/intern/MOD_remesh.c
+++ b/source/blender/modifiers/intern/MOD_remesh.c
@@ -35,6 +35,7 @@
 #include "BKE_cdderivedmesh.h"
 #include "BKE_DerivedMesh.h"
 #include "BKE_mball_tessellate.h"
+#include "BKE_deform.h"
 
 #include "DNA_meshdata_types.h"
 #include "DNA_modifier_types.h"
@@ -236,6 +237,14 @@ static DerivedMesh *repolygonize(RemeshModifierData *rmd, Object* ob, DerivedMes
 	int i = 0, n = 0, *index, *orig_index;
 	bool override_size = rmd->pflag & eRemeshFlag_Size;
 	bool verts_only = rmd->pflag & eRemeshFlag_Verts;
+	MDeformVert *dvert = NULL;
+	int defgrp_size = -1;
+
+	if (rmd->size_defgrp_name[0])
+	{
+		defgrp_size = defgroup_name_index(ob, rmd->size_defgrp_name);
+		dvert = CustomData_get_layer(&derived->vertData, CD_MDEFORMVERT);
+	}
 
 	if (((rmd->input & MOD_REMESH_VERTICES)==0) && (rmd->input & MOD_REMESH_PARTICLES))
 	{
@@ -261,7 +270,6 @@ static DerivedMesh *repolygonize(RemeshModifierData *rmd, Object* ob, DerivedMes
 
 		orig_index = CustomData_add_layer(&dm->vertData, CD_ORIGINDEX, CD_CALLOC, NULL, n);
 
-
 #pragma omp parallel for
 		for (i = 0; i < n; i++)
 		{
@@ -287,7 +295,8 @@ static DerivedMesh *repolygonize(RemeshModifierData *rmd, Object* ob, DerivedMes
 		else {
 			BLI_memarena_free(pardata);
 //#pragma omp parallel num_threads(4)
-			result = BKE_repolygonize_dm(dm, rmd->thresh, rmd->basesize, rmd->wiresize, rmd->rendersize, render, override_size);
+			result = BKE_repolygonize_dm(dm, rmd->thresh, rmd->basesize, rmd->wiresize, rmd->rendersize, render,
+			                             override_size, defgrp_size);
 			dm->release(dm);
 			return result;
 		}
@@ -297,7 +306,8 @@ static DerivedMesh *repolygonize(RemeshModifierData *rmd, Object* ob, DerivedMes
 		//verts only
 		DerivedMesh *result = NULL;
 //#pragma omp parallel
-		result = BKE_repolygonize_dm(derived, rmd->thresh, rmd->basesize, rmd->wiresize, rmd->rendersize, render, override_size);
+		result = BKE_repolygonize_dm(derived, rmd->thresh, rmd->basesize, rmd->wiresize,
+		                             rmd->rendersize, render, override_size, defgrp_size);
 		return result;
 	}
 	else if ((rmd->input & MOD_REMESH_VERTICES) && (rmd->input & MOD_REMESH_PARTICLES))
@@ -306,6 +316,7 @@ static DerivedMesh *repolygonize(RemeshModifierData *rmd, Object* ob, DerivedMes
 		float* ovX, *ovY, *ovZ, *oqX, *oqY, *oqZ, *oqW;
 		n = 0;
 		MemArena *pardata = BLI_memarena_new(BLI_MEMARENA_STD_BUFSIZE, "pardata");
+		MDeformVert *dvert_new = NULL;
 
 		if (psys)
 			n = get_particle_data(rmd, psys, ob, &pos, &size, &vel, &rot, &index, pardata);
@@ -323,6 +334,10 @@ static DerivedMesh *repolygonize(RemeshModifierData *rmd, Object* ob, DerivedMes
 
 		orig_index = CustomData_add_layer(&dm->vertData, CD_ORIGINDEX, CD_CALLOC, NULL, n + derived->numVertData);
 
+		if (dvert && defgrp_size > -1) {
+			dvert_new = CustomData_add_layer(&dm->vertData, CD_MDEFORMVERT, CD_CALLOC, NULL, n + derived->numVertData);
+		}
+
 		mv = dm->getVertArray(dm);
 		mv2 = derived->getVertArray(derived);
 
@@ -351,6 +366,11 @@ static DerivedMesh *repolygonize(RemeshModifierData *rmd, Object* ob, DerivedMes
 			quatW[i] = rot[i][3];
 
 			orig_index[i] = index[i];
+
+			if (dvert_new && dvert && defgrp_size > -1)
+			{
+				defvert_add_index_notest(dvert_new + i, defgrp_size, 1.0f);
+			}
 		}
 
 #pragma omp parallel for
@@ -368,6 +388,18 @@ static DerivedMesh *repolygonize(RemeshModifierData *rmd, Object* ob, DerivedMes
 			quatW[i] = oqW ? oqW[i-n] : 0.0f;
 
 			orig_index[i] = i;
+			if (dvert_new && dvert && defgrp_size > -1)
+			{
+				int ind = i-n;
+				MDeformWeight *dw = (dvert + ind)->dw;
+				float w = 1.0f;
+				if (dw)
+				{
+					w = dw[defgrp_size].weight;
+				}
+
+				defvert_add_index_notest(dvert_new + i, defgrp_size, w);
+			}
 		}
 
 		if (verts_only)
@@ -378,7 +410,7 @@ static DerivedMesh *repolygonize(RemeshModifierData *rmd, Object* ob, DerivedMes
 		else {
 			BLI_memarena_free(pardata);
 //#pragma omp parallel
-			result = BKE_repolygonize_dm(dm, rmd->thresh, rmd->basesize, rmd->wiresize, rmd->rendersize, render, override_size);
+			result = 

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list