[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