Lattice Modifier add invert vgroup option
authorCody Winchester <CodyWinch>
Thu, 6 Feb 2020 10:18:41 +0000 (11:18 +0100)
committerBastien Montagne <b.mont29@gmail.com>
Thu, 6 Feb 2020 10:29:59 +0000 (11:29 +0100)
Adds the invert vertex group option to the Lattice modifier.

Adds a short flag and modifies the existing char padding for the correct amount.
Adds a .invert_vgroup to the LatticeDeformUserdata.
Passes the flag into the lattice_deform_verts function where the weights around found and used.
For the other calls of lattice_deform_verts function they pass in NULL for the flag in the same way they pass NULL for the vgroup name.

Reviewed By: mont29

Differential Revision: https://developer.blender.org/D6747

release/scripts/startup/bl_ui/properties_data_modifier.py
source/blender/blenkernel/BKE_lattice.h
source/blender/blenkernel/intern/lattice.c
source/blender/makesdna/DNA_modifier_types.h
source/blender/makesrna/intern/rna_modifier.c
source/blender/modifiers/intern/MOD_lattice.c

index 021a4600a73710431044cc66137f95bab7a8e050..330f05205fcefa596a2fdac95fd56f2ad2b844ad 100644 (file)
@@ -532,7 +532,9 @@ class DATA_PT_modifiers(ModifierButtonsPanel, Panel):
 
         col = split.column()
         col.label(text="Vertex Group:")
-        col.prop_search(md, "vertex_group", ob, "vertex_groups", text="")
+        row = col.row(align=True)
+        row.prop_search(md, "vertex_group", ob, "vertex_groups", text="")
+        row.prop(md, "invert_vertex_group", text="", icon='ARROW_LEFTRIGHT')
 
         layout.separator()
         layout.prop(md, "strength", slider=True)
index a3befa6f3bbc9840ee95397f1cb45cdc15074077..6a55ffe7b9f0d7b22ab8a85c1aeeecb75161238e 100644 (file)
@@ -75,6 +75,7 @@ void lattice_deform_verts(struct Object *laOb,
                           struct Mesh *mesh,
                           float (*vert_coords)[3],
                           int numVerts,
+                          short flag,
                           const char *vgroup,
                           float influence);
 void armature_deform_verts(struct Object *armOb,
index 72b531c446af315d83456fd661f09609be7d20b6..17b705c55c210b65dc4a78bb54512a521223ef6d 100644 (file)
@@ -213,7 +213,7 @@ void BKE_lattice_resize(Lattice *lt, int uNew, int vNew, int wNew, Object *ltOb)
 
     copy_m4_m4(mat, ltOb->obmat);
     unit_m4(ltOb->obmat);
-    lattice_deform_verts(ltOb, NULL, NULL, vert_coords, uNew * vNew * wNew, NULL, 1.0f);
+    lattice_deform_verts(ltOb, NULL, NULL, vert_coords, uNew * vNew * wNew, 0, NULL, 1.0f);
     copy_m4_m4(ltOb->obmat, mat);
 
     lt->typeu = typeu;
@@ -883,6 +883,7 @@ typedef struct LatticeDeformUserdata {
   MDeformVert *dvert;
   int defgrp_index;
   float fac;
+  bool invert_vgroup;
 } LatticeDeformUserdata;
 
 static void lattice_deform_vert_task(void *__restrict userdata,
@@ -892,7 +893,8 @@ static void lattice_deform_vert_task(void *__restrict userdata,
   const LatticeDeformUserdata *data = userdata;
 
   if (data->dvert != NULL) {
-    const float weight = defvert_find_weight(data->dvert + index, data->defgrp_index);
+    const float weight = data->invert_vgroup? 1.0f - defvert_find_weight(data->dvert + index, data->defgrp_index) :
+                                                defvert_find_weight(data->dvert + index, data->defgrp_index);
     if (weight > 0.0f) {
       calc_latt_deform(data->lattice_deform_data, data->vert_coords[index], weight * data->fac);
     }
@@ -907,6 +909,7 @@ void lattice_deform_verts(Object *laOb,
                           Mesh *mesh,
                           float (*vert_coords)[3],
                           int numVerts,
+                          short flag,
                           const char *vgroup,
                           float fac)
 {
@@ -946,6 +949,7 @@ void lattice_deform_verts(Object *laOb,
       .dvert = dvert,
       .defgrp_index = defgrp_index,
       .fac = fac,
+      .invert_vgroup = (flag & MOD_LATTICE_INVERT_VGROUP) != 0,
   };
 
   TaskParallelSettings settings;
@@ -962,7 +966,7 @@ bool object_deform_mball(Object *ob, ListBase *dispbase)
     DispList *dl;
 
     for (dl = dispbase->first; dl; dl = dl->next) {
-      lattice_deform_verts(ob->parent, ob, NULL, (float(*)[3])dl->verts, dl->nr, NULL, 1.0f);
+      lattice_deform_verts(ob->parent, ob, NULL, (float(*)[3])dl->verts, dl->nr, 0, NULL, 1.0f);
     }
 
     return true;
index 39efe838bab2746b53b2bdea57df7408d2914c82..631a995c743bcc086a808f2daf141144955b99c2 100644 (file)
@@ -182,9 +182,15 @@ typedef struct LatticeModifierData {
   /** Optional vertexgroup name, MAX_VGROUP_NAME. */
   char name[64];
   float strength;
-  char _pad[4];
+  short flag;
+  char _pad[2];
 } LatticeModifierData;
 
+/*Lattice modifier flags */
+enum {
+  MOD_LATTICE_INVERT_VGROUP = (1 << 0),
+};
+
 typedef struct CurveModifierData {
   ModifierData modifier;
 
index 6f2f12ebf985f0c63b3f3510dcc3c59fbd6fc546..aebee811428afe105c320a8805cd662ea2a27425 100644 (file)
@@ -1936,6 +1936,11 @@ static void rna_def_modifier_lattice(BlenderRNA *brna)
   RNA_def_property_string_funcs(prop, NULL, NULL, "rna_LatticeModifier_name_set");
   RNA_def_property_update(prop, 0, "rna_Modifier_update");
 
+  prop = RNA_def_property(srna, "invert_vertex_group", PROP_BOOLEAN, PROP_NONE);
+  RNA_def_property_boolean_sdna(prop, NULL, "flag", MOD_LATTICE_INVERT_VGROUP);
+  RNA_def_property_ui_text(prop, "Invert", "Invert vertex group influence");
+  RNA_def_property_update(prop, 0, "rna_Modifier_update");
+
   prop = RNA_def_property(srna, "strength", PROP_FLOAT, PROP_NONE);
   RNA_def_property_range(prop, -FLT_MAX, FLT_MAX);
   RNA_def_property_ui_range(prop, 0, 1, 10, 2);
index a73e96da975f6ece8190513b0c1068441a54c679..3128183060a90350687f140a861a686443756c0b 100644 (file)
@@ -102,7 +102,7 @@ static void deformVerts(ModifierData *md,
   MOD_previous_vcos_store(md, vertexCos); /* if next modifier needs original vertices */
 
   lattice_deform_verts(
-      lmd->object, ctx->object, mesh_src, vertexCos, numVerts, lmd->name, lmd->strength);
+      lmd->object, ctx->object, mesh_src, vertexCos, numVerts, lmd->flag, lmd->name, lmd->strength);
 
   if (!ELEM(mesh_src, NULL, mesh)) {
     BKE_id_free(NULL, mesh_src);