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. @@

_______________________________________________
Bf-blender-cvs mailing list
[email protected]
https://lists.blender.org/mailman/listinfo/bf-blender-cvs

Reply via email to