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

Adds a short flag and char pad to the Curve modifier DNA. Passes the flag into the curve_deform_verts function as the weight values are found there and not in the modifiers .c file.

Reviewed By: mont29

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

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_curve.c

index 330f05205fcefa596a2fdac95fd56f2ad2b844ad..a8b9de409c2b09317923e7f6b141ca8d599d4835 100644 (file)
@@ -316,7 +316,9 @@ class DATA_PT_modifiers(ModifierButtonsPanel, Panel):
         col.prop(md, "object", text="")
         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.label(text="Deformation Axis:")
         layout.row().prop(md, "deform_axis", expand=True)
 
index 6a55ffe7b9f0d7b22ab8a85c1aeeecb75161238e..a426a449ae8091fdacbab63444569cd1b34fc855 100644 (file)
@@ -62,6 +62,7 @@ void curve_deform_verts(struct Object *cuOb,
                         int numVerts,
                         struct MDeformVert *dvert,
                         const int defgrp_index,
+                        short flag,
                         short defaxis);
 void curve_deform_vector(struct Object *cuOb,
                          struct Object *target,
index 17b705c55c210b65dc4a78bb54512a521223ef6d..243c63a8f033620f77f2d62695ef6a1bda105d7d 100644 (file)
@@ -749,12 +749,14 @@ void curve_deform_verts(Object *cuOb,
                         int numVerts,
                         MDeformVert *dvert,
                         const int defgrp_index,
+                        short flag,
                         short defaxis)
 {
   Curve *cu;
   int a;
   CurveDeform cd;
   const bool is_neg_axis = (defaxis > 2);
+  const bool invert_vgroup = (flag & MOD_CURVE_INVERT_VGROUP) != 0;
 
   if (cuOb->type != OB_CURVE) {
     return;
@@ -781,7 +783,8 @@ void curve_deform_verts(Object *cuOb,
 
     if (cu->flag & CU_DEFORM_BOUNDS_OFF) {
       for (a = 0, dvert_iter = dvert; a < numVerts; a++, dvert_iter++) {
-        const float weight = defvert_find_weight(dvert_iter, defgrp_index);
+        const float weight = invert_vgroup? 1.0f - defvert_find_weight(dvert_iter, defgrp_index) :
+                                             defvert_find_weight(dvert_iter, defgrp_index);
 
         if (weight > 0.0f) {
           mul_m4_v3(cd.curvespace, vert_coords[a]);
@@ -797,14 +800,17 @@ void curve_deform_verts(Object *cuOb,
       INIT_MINMAX(cd.dmin, cd.dmax);
 
       for (a = 0, dvert_iter = dvert; a < numVerts; a++, dvert_iter++) {
-        if (defvert_find_weight(dvert_iter, defgrp_index) > 0.0f) {
+        const float weight = invert_vgroup? 1.0f - defvert_find_weight(dvert_iter, defgrp_index) :
+                                             defvert_find_weight(dvert_iter, defgrp_index);
+        if (weight > 0.0f) {
           mul_m4_v3(cd.curvespace, vert_coords[a]);
           minmax_v3v3_v3(cd.dmin, cd.dmax, vert_coords[a]);
         }
       }
 
       for (a = 0, dvert_iter = dvert; a < numVerts; a++, dvert_iter++) {
-        const float weight = defvert_find_weight(dvert_iter, defgrp_index);
+        const float weight = invert_vgroup? 1.0f - defvert_find_weight(dvert_iter, defgrp_index) :
+                                             defvert_find_weight(dvert_iter, defgrp_index);
 
         if (weight > 0.0f) {
           /* already in 'cd.curvespace', prev for loop */
index 631a995c743bcc086a808f2daf141144955b99c2..135ddd8f62f10da38d28a7272342d053a49b8e09 100644 (file)
@@ -199,9 +199,15 @@ typedef struct CurveModifierData {
   char name[64];
   /** Axis along which curve deforms. */
   short defaxis;
-  char _pad[6];
+  short flag;
+  char _pad[4];
 } CurveModifierData;
 
+/* Curve modifier flags */
+enum {
+  MOD_CURVE_INVERT_VGROUP = (1 << 0),
+};
+
 /* CurveModifierData->defaxis */
 enum {
   MOD_CURVE_POSX = 1,
index aebee811428afe105c320a8805cd662ea2a27425..5b7db50ca02b50759c0a6e331c20be3f0d6c4fef 100644 (file)
@@ -1985,6 +1985,11 @@ static void rna_def_modifier_curve(BlenderRNA *brna)
   RNA_def_property_string_funcs(prop, NULL, NULL, "rna_CurveModifier_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_CURVE_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, "deform_axis", PROP_ENUM, PROP_NONE);
   RNA_def_property_enum_sdna(prop, NULL, "defaxis");
   RNA_def_property_enum_items(prop, prop_deform_axis_items);
index f9137572d6f488303320b5a52f4fcb9e63b51e35..7bfe63e562ace242d258eec8335341892036fb48 100644 (file)
@@ -120,7 +120,7 @@ static void deformVerts(ModifierData *md,
   /* silly that defaxis and curve_deform_verts are off by 1
    * but leave for now to save having to call do_versions */
   curve_deform_verts(
-      cmd->object, ctx->object, vertexCos, numVerts, dvert, defgrp_index, cmd->defaxis - 1);
+      cmd->object, ctx->object, vertexCos, numVerts, dvert, defgrp_index, cmd->flag, cmd->defaxis - 1);
 
   if (!ELEM(mesh_src, NULL, mesh)) {
     BKE_id_free(NULL, mesh_src);