Merging r38765 through r38817 from trunk into vgroup_modifiers.
authorBastien Montagne <montagne29@wanadoo.fr>
Fri, 29 Jul 2011 13:45:22 +0000 (13:45 +0000)
committerBastien Montagne <montagne29@wanadoo.fr>
Fri, 29 Jul 2011 13:45:22 +0000 (13:45 +0000)
1  2 
release/scripts/startup/bl_ui/properties_data_modifier.py
source/blender/makesdna/DNA_modifier_types.h
source/blender/makesrna/intern/rna_modifier.c

index a789a65c0f881bf0c2f29b025bbdf34aa3a7885a,0a4d0b605140fb0f84a97641d709bb7b5cb20dd4..6680d118a7544ad11e53080e6df79c3e67975e47
@@@ -394,6 -394,7 +394,7 @@@ class DATA_PT_modifiers(ModifierButtons
          col.operator("object.multires_higher_levels_delete", text="Delete Higher")
          col.operator("object.multires_reshape", text="Reshape")
          col.operator("object.multires_base_apply", text="Apply Base")
+         col.prop(md, "use_subsurf_uv")
          col.prop(md, "show_only_control_edges")
  
          layout.separator()
          col.prop(md, "width", slider=True)
          col.prop(md, "narrowness", slider=True)
  
 +    @staticmethod
 +    def weight_vg_mask(layout, ob, md):
 +        layout.label(text="Influence/Mask Options:")
 +        split = layout.split()
 +        col1 = split.column()
 +        col2 = split.column()
 +
 +        col1.label(text="Global Influence:")
 +        col2.prop(md, "mask_constant", text="")
 +
 +        if not md.mask_texture:
 +            col1.label(text="Vertex Group Mask:")
 +            col2.prop_search(md, "mask_vertex_group", ob, "vertex_groups", text="")
 +
 +        if not md.mask_vertex_group:
 +            col1.label(text="Texture Mask:")
 +            col2.template_ID(md, "mask_texture", new="texture.new")
 +            if md.mask_texture:
 +                split = layout.split()
 +                col = split.column()
 +                col.label(text="Texture Coordinates:")
 +                col.prop(md, "mask_tex_mapping", text="")
 +                col = split.column()
 +                col.label(text="Use Channel:")
 +                col.prop(md, "mask_tex_use_channel", text="")
 +
 +                if md.mask_tex_mapping == 'OBJECT':
 +                    layout.prop(md, "mask_tex_map_obj", text="Object")
 +                elif md.mask_tex_mapping == 'UV' and ob.type == 'MESH':
 +                    layout.prop_search(md, "mask_tex_uv_layer", ob.data, "uv_textures")
 +
 +    def WEIGHT_VGEDIT(self, layout, ob, md):
 +        if ob.type == 'MESH':
 +            split = layout.split()
 +            col = split.column()
 +            col.label(text="Vertex Group:")
 +            col.prop_search(md, "vertex_group", ob, "vertex_groups", text="")
 +
 +            col = split.column()
 +            col.label(text="Default Weight:")
 +            col.prop(md, "default_weight", text="")
 +
 +            layout.prop(md, "use_map")
 +            if md.use_map:
 +                split = layout.split()
 +                col = split.column()
 +                col.label("Input:")
 +                col.label("Output:")
 +                col = split.column()
 +                col.prop(md, "map_input_low", text="Min")
 +                col.prop(md, "map_output_low", text="Min")
 +                col = split.column()
 +                col.prop(md, "map_input_high", text="Max")
 +                col.prop(md, "map_output_high", text="Max")
 +
 +            layout.prop(md, "use_map_curve")
 +            if md.use_map_curve:
 +                col = layout.column()
 +                col.template_curve_mapping(md, "map_curve")
 +
 +            layout.prop(md, "use_reverse")
 +
 +            layout.prop(md, "use_clamp")
 +            if md.use_clamp:
 +                row = layout.row()
 +                row.prop(md, "clamp_weight_min")
 +                row.prop(md, "clamp_weight_max")
 +
 +            row = layout.row()
 +            row.prop(md, "use_add")
 +            row.prop(md, "use_remove")
 +            row = layout.row()
 +            if md.use_add:
 +                row.prop(md, "add_threshold")
 +            if md.use_remove:
 +                row.prop(md, "remove_threshold")
 +
 +            # Common mask options…
 +            layout.separator()
 +            self.weight_vg_mask(layout, ob, md)
 +
 +    def WEIGHT_VGMIX(self, layout, ob, md):
 +        if ob.type == 'MESH':
 +            split = layout.split()
 +            col = split.column()
 +            col.label(text="Vertex Group 1:")
 +            col.prop_search(md, "vertex_group", ob, "vertex_groups", text="")
 +            col.label(text="Default Weight 1:")
 +            col.prop(md, "default_weight", text="")
 +
 +            col.label(text="Mix Mode:")
 +            col.prop(md, "mix_mode", text="")
 +
 +            col = split.column()
 +            col.label(text="Vertex Group 2:")
 +            col.prop_search(md, "vertex_group2", ob, "vertex_groups", text="")
 +            col.label(text="Default Weight 2:")
 +            col.prop(md, "default_weight2", text="")
 +
 +            col.label(text="Mix Set:")
 +            col.prop(md, "mix_set", text="")
 +
 +            # Common mask options…
 +            layout.separator()
 +            self.weight_vg_mask(layout, ob, md)
 +
 +    def WEIGHT_VGPROXIMITY(self, layout, ob, md):
 +        if ob.type == 'MESH':
 +            split = layout.split()
 +            col = split.column()
 +            col.label(text="Vertex Group:")
 +            col.prop_search(md, "vertex_group", ob, "vertex_groups", text="")
 +
 +            col = split.column()
 +            col.label(text="Target Object:")
 +            col.prop(md, "target", text="")
 +
 +            row = layout.row()
 +            row.prop(md, "proximity_mode", expand=True)
 +            if md.proximity_mode == 'GEOMETRY':
 +                row = layout.row()
 +                row.prop(md, "proximity_geometry", expand=True)
 +
 +            # Common mask options…
 +            layout.separator()
 +            self.weight_vg_mask(layout, ob, md)
 +
  if __name__ == "__main__":  # only for live edit.
      bpy.utils.register_module(__name__)
index cc8da863c44c7f224f478062837e48ba54b01b08,3787675f339da4766981bf723ced730abf5164b8..a693277b786b009c71c681e693df1d5f206b0c20
@@@ -71,9 -71,6 +71,9 @@@ typedef enum ModifierType 
        eModifierType_Solidify,
        eModifierType_Screw,
        eModifierType_Warp,
 +      eModifierType_WeightVGEdit,
 +      eModifierType_WeightVGMix,
 +      eModifierType_WeightVGProximity,
        NUM_MODIFIER_TYPES
  } ModifierType;
  
@@@ -627,6 -624,7 +627,7 @@@ typedef struct MultiresModifierData 
  
  typedef enum {
        eMultiresModifierFlag_ControlEdges = (1<<0),
+       eMultiresModifierFlag_PlainUv = (1<<1),
  } MultiresModifierFlag;
  
  typedef struct FluidsimModifierData {
@@@ -677,6 -675,7 +678,6 @@@ typedef struct ShrinkwrapModifierData 
  #define MOD_SHRINKWRAP_PROJECT_OVER_Z_AXIS            (1<<2)
  #define MOD_SHRINKWRAP_PROJECT_OVER_NORMAL                    0       /* projection over normal is used if no axis is selected */
  
 -
  typedef struct SimpleDeformModifierData {
        ModifierData modifier;
  
@@@ -786,167 -785,4 +787,167 @@@ typedef enum 
        /* PROP_RANDOM not used */
  } WarpModifierFalloff;
  
 +typedef struct WeightVGEditModifierData {
 +      ModifierData modifier;
 +
 +      /* XXX Note: I tried to keep everything logically ordered – provided the
 +       *           alignment constraints…
 +       */
 +
 +      char    defgrp_name[32];      /* Name of vertex group to edit. */
 +
 +      /* Flags (MOD_WVG_EDIT_MAP, MOD_WVG_EDIT_CMAP, MOD_WVG_EDIT_REVERSE_WEIGHTS,
 +       * MOD_WVG_EDIT_ADD2VG, MOD_WVG_EDIT_REMFVG, MOD_WVG_EDIT_CLAMP).
 +       */
 +      int             edit_flags;
 +      float   default_weight; /* Weight for vertices not in vgroup. */
 +
 +      /* Mapping stuff. */
 +      float   map_org_min, map_org_max;
 +      float   map_new_min, map_new_max;
 +      struct CurveMapping *cmap_curve;  /* The custom mapping curve! */
 +
 +      /* The add/remove vertices weight thresholds. */
 +      float   add_threshold, rem_threshold;
 +
 +      /* Clamping options. */
 +      float   clamp_weight_min, clamp_weight_max;
 +
 +      /* Masking options. */
 +      float   mask_constant; /* The global “influence”, if no vgroup nor tex is used as mask. */
 +      /* Name of mask vertex group from which to get weight factors. */
 +      char    mask_defgrp_name[32];
 +
 +      /* Texture masking. */
 +      int             mask_tex_use_channel;      /* Which channel to use as weightf. */
 +      struct Tex *mask_texture;          /* The texture. */
 +      struct Object *mask_tex_map_obj;   /* Name of the map object. */
 +      /* How to map the texture (using MOD_DISP_MAP_xxx constants). */
 +      int             mask_tex_mapping;
 +      char    mask_tex_uvlayer_name[32]; /* Name of the UV layer. */
 +
 +      /* Padding… */
 +      int pad_i1;
 +} WeightVGEditModifierData;
 +
 +/* WeightVGEdit flags. */
 +/* Use parametric mapping. */
 +#define MOD_WVG_EDIT_MAP                                      (1 << 0)
 +/* Use curve mapping. */
 +#define MOD_WVG_EDIT_CMAP                                     (1 << 1)
 +/* Reverse weights (in the [0.0, 1.0] standard range). */
 +#define MOD_WVG_EDIT_REVERSE_WEIGHTS          (1 << 2)
 +/* Add vertices with higher weight than threshold to vgroup. */
 +#define MOD_WVG_EDIT_ADD2VG                                   (1 << 3)
 +/* Remove vertices with lower weight than threshold from vgroup. */
 +#define MOD_WVG_EDIT_REMFVG                                   (1 << 4)
 +/* Clamp weights. */
 +#define MOD_WVG_EDIT_CLAMP                                    (1 << 5)
 +
 +typedef struct WeightVGMixModifierData {
 +      ModifierData modifier;
 +
 +      /* XXX Note: I tried to keep everything logically ordered – provided the
 +       *           alignment constraints…
 +       */
 +
 +      char    defgrp_name[32];      /* Name of vertex group to modify/weight. */
 +      char    defgrp_name2[32];     /* Name of other vertex group to mix in. */
 +      float   default_weight;       /* Default weight value for first vgroup. */
 +      float   default_weight2;      /* Default weight value to mix in. */
 +      char    mix_mode;             /* How second vgroup’s weights affect first ones */
 +      char    mix_set;              /* What vertices to affect. */
 +
 +      char    pad_c1, pad_c2;
 +      int             pad_i1;
 +
 +      /* Masking options. */
 +      float   mask_constant; /* The global “influence”, if no vgroup nor tex is used as mask. */
 +      /* Name of mask vertex group from which to get weight factors. */
 +      char    mask_defgrp_name[32];
 +
 +      /* Texture masking. */
 +      int             mask_tex_use_channel;      /* Which channel to use as weightf. */
 +      struct Tex *mask_texture;          /* The texture. */
 +      struct Object *mask_tex_map_obj;   /* Name of the map object. */
 +      int             mask_tex_mapping;          /* How to map the texture! */
 +      char    mask_tex_uvlayer_name[32]; /* Name of the UV layer. */
 +
 +      /* Padding… */
 +      int pad_i2;
 +} WeightVGMixModifierData;
 +
 +/* How second vgroup’s weights affect first ones. */
 +#define MOD_WVG_MIX_SET                       1 /* Second weights replace weights. */
 +#define MOD_WVG_MIX_ADD                       2 /* Second weights are added to weights. */
 +#define MOD_WVG_MIX_SUB                       3 /* Second weights are subtracted from weights. */
 +#define MOD_WVG_MIX_MUL                       4 /* Second weights are multiplied with weights. */
 +#define MOD_WVG_MIX_DIV                       5 /* Second weights divide weights. */
 +#define MOD_WVG_MIX_DIF                       6 /* Difference between second weights and weights. */
 +#define MOD_WVG_MIX_AVG                       7 /* Average of both weights. */
 +
 +/* What vertices to affect. */
 +#define MOD_WVG_SET_ALL                       1 /* Affect all vertices. */
 +#define MOD_WVG_SET_ORG                       2 /* Affect only vertices in first vgroup. */
 +#define MOD_WVG_SET_NEW                       3 /* Affect only vertices in second vgroup. */
 +#define MOD_WVG_SET_UNION             4 /* Affect only vertices in one vgroup or the other. */
 +#define MOD_WVG_SET_INTER             5 /* Affect only vertices in both vgroups. */
 +
 +typedef struct WeightVGProximityModifierData {
 +      ModifierData modifier;
 +
 +      /* XXX Note: I tried to keep everything logically ordered – provided the
 +       *           alignment constraints…
 +       */
 +
 +      char    defgrp_name[32];      /* Name of vertex group to modify/weight. */
 +
 +      /* Proximity modes. */
 +      int             proximity_mode;
 +      int             proximity_flags;
 +
 +      /* Target object from which to calculate vertices’ distances. */
 +      struct Object *proximity_ob_target;
 +
 +      /* Masking options. */
 +      float   mask_constant; /* The global “influence”, if no vgroup nor tex is used as mask. */
 +      /* Name of mask vertex group from which to get weight factors. */
 +      char    mask_defgrp_name[32];
 +
 +      /* Texture masking. */
 +      int             mask_tex_use_channel;      /* Which channel to use as weightf. */
 +      struct Tex *mask_texture;          /* The texture. */
 +      struct Object *mask_tex_map_obj;   /* Name of the map object. */
 +      int             mask_tex_mapping;          /* How to map the texture! */
 +      char    mask_tex_uvlayer_name[32]; /* Name of the UV layer. */
 +
 +      /* Padding… */
 +      int pad_i2;
 +} WeightVGProximityModifierData;
 +
 +/* Modes of proximity weighting. */
 +/* Dist from target object to affected object. */
 +#define MOD_WVG_PROXIMITY_OBJECT                      1 /* source vertex to other location */
 +/* Dist from target object to vertex. */
 +#define MOD_WVG_PROXIMITY_GEOMETRY                    2 /* source vertex to other geometry */
 +
 +/* Flags options for proximity weighting. */
 +/* Use nearest vertices of target obj, in MOD_WVG_PROXIMITY_GEOMETRY mode. */
 +#define MOD_WVG_PROXIMITY_GEOM_VERTS          (1 << 0)
 +/* Use nearest edges of target obj, in MOD_WVG_PROXIMITY_GEOMETRY mode. */
 +#define MOD_WVG_PROXIMITY_GEOM_EDGES          (1 << 1)
 +/* Use nearest faces of target obj, in MOD_WVG_PROXIMITY_GEOMETRY mode. */
 +#define MOD_WVG_PROXIMITY_GEOM_FACES          (1 << 2)
 +
 +/* Defines common to all WeightVG modifiers. */
 +/* Tex channel to be used as mask. */
 +#define MOD_WVG_MASK_TEX_USE_INT                      1
 +#define MOD_WVG_MASK_TEX_USE_RED                      2
 +#define MOD_WVG_MASK_TEX_USE_GREEN                    3
 +#define MOD_WVG_MASK_TEX_USE_BLUE                     4
 +#define MOD_WVG_MASK_TEX_USE_HUE                      5
 +#define MOD_WVG_MASK_TEX_USE_SAT                      6
 +#define MOD_WVG_MASK_TEX_USE_VAL                      7
 +#define MOD_WVG_MASK_TEX_USE_ALPHA                    8
 +
  #endif
index 75449382c5eec548cde0bd3dbe453244c665128d,ba655915fb62a961c43bf94264d47655bafc7d25..a6ba56cc590965acf10e54d72babd7b3eab867bd
@@@ -68,9 -68,6 +68,9 @@@ EnumPropertyItem modifier_type_items[] 
        {eModifierType_Solidify, "SOLIDIFY", ICON_MOD_SOLIDIFY, "Solidify", ""},
        {eModifierType_Subsurf, "SUBSURF", ICON_MOD_SUBSURF, "Subdivision Surface", ""},
        {eModifierType_UVProject, "UV_PROJECT", ICON_MOD_UVPROJECT, "UV Project", ""},
 +      {eModifierType_WeightVGEdit, "WEIGHT_VGEDIT", ICON_MOD_WEIGHTVG, "Edit Vertex Group Weights", ""},
 +      {eModifierType_WeightVGMix, "WEIGHT_VGMIX", ICON_MOD_WEIGHTVG, "Mix Two Vertex Groups", ""},
 +      {eModifierType_WeightVGProximity, "WEIGHT_VGPROXIMITY", ICON_MOD_WEIGHTVG, "Weight Vertex Group - Poximity", ""},
        {0, "", 0, "Deform", ""},
        {eModifierType_Armature, "ARMATURE", ICON_MOD_ARMATURE, "Armature", ""},
        {eModifierType_Cast, "CAST", ICON_MOD_CAST, "Cast", ""},
@@@ -186,12 -183,6 +186,12 @@@ static StructRNA* rna_Modifier_refine(s
                        return &RNA_ScrewModifier;
                case eModifierType_Warp:
                        return &RNA_WarpModifier;
 +              case eModifierType_WeightVGEdit:
 +                      return &RNA_WeightVGEditModifier;
 +              case eModifierType_WeightVGMix:
 +                      return &RNA_WeightVGMixModifier;
 +              case eModifierType_WeightVGProximity:
 +                      return &RNA_WeightVGProximityModifier;
                default:
                        return &RNA_Modifier;
        }
@@@ -384,46 -375,6 +384,46 @@@ static void rna_SolidifyModifier_vgroup
        rna_object_vgroup_name_set(ptr, value, smd->defgrp_name, sizeof(smd->defgrp_name));
  }
  
 +static void rna_WeightVGModifier_vgroup_set(PointerRNA *ptr, const char *value)
 +{
 +      ModifierData *md = (ModifierData*)ptr->data;
 +      if (md->type == eModifierType_WeightVGEdit) {
 +              WeightVGEditModifierData *wmd= (WeightVGEditModifierData*)md;
 +              rna_object_vgroup_name_set(ptr, value, wmd->defgrp_name, sizeof(wmd->defgrp_name));
 +      }
 +      else if (md->type == eModifierType_WeightVGMix) {
 +              WeightVGMixModifierData *wmd= (WeightVGMixModifierData*)md;
 +              rna_object_vgroup_name_set(ptr, value, wmd->defgrp_name, sizeof(wmd->defgrp_name));
 +      }
 +      else if (md->type == eModifierType_WeightVGProximity) {
 +              WeightVGProximityModifierData *wmd= (WeightVGProximityModifierData*)md;
 +              rna_object_vgroup_name_set(ptr, value, wmd->defgrp_name, sizeof(wmd->defgrp_name));
 +      }
 +}
 +
 +static void rna_WeightVGModifier_mask_vgroup_set(PointerRNA *ptr, const char *value)
 +{
 +      ModifierData *md = (ModifierData*)ptr->data;
 +      if (md->type == eModifierType_WeightVGEdit) {
 +              WeightVGEditModifierData *wmd= (WeightVGEditModifierData*)md;
 +              rna_object_vgroup_name_set(ptr, value, wmd->mask_defgrp_name, sizeof(wmd->mask_defgrp_name));
 +      }
 +      else if (md->type == eModifierType_WeightVGMix) {
 +              WeightVGMixModifierData *wmd= (WeightVGMixModifierData*)md;
 +              rna_object_vgroup_name_set(ptr, value, wmd->mask_defgrp_name, sizeof(wmd->mask_defgrp_name));
 +      }
 +      else if (md->type == eModifierType_WeightVGProximity) {
 +              WeightVGProximityModifierData *wmd= (WeightVGProximityModifierData*)md;
 +              rna_object_vgroup_name_set(ptr, value, wmd->mask_defgrp_name, sizeof(wmd->mask_defgrp_name));
 +      }
 +}
 +
 +static void rna_WeightVGMixModifier_vgroup2_set(PointerRNA *ptr, const char *value)
 +{
 +      WeightVGMixModifierData *wmd= (WeightVGMixModifierData*)ptr->data;
 +      rna_object_vgroup_name_set(ptr, value, wmd->defgrp_name2, sizeof(wmd->defgrp_name2));
 +}
 +
  static void rna_MappingInfo_uvlayer_set(PointerRNA *ptr, const char *value)
  {
        MappingInfoModifierData *mmd= (MappingInfoModifierData *)ptr->data;
@@@ -448,23 -399,6 +448,23 @@@ static void rna_WaveModifier_uvlayer_se
        rna_object_uvlayer_name_set(ptr, value, wmd->uvlayer_name, sizeof(wmd->uvlayer_name));
  }
  
 +static void rna_WeightVGModifier_mask_uvlayer_set(PointerRNA *ptr, const char *value)
 +{
 +      ModifierData *md = (ModifierData*)ptr->data;
 +      if (md->type == eModifierType_WeightVGEdit) {
 +              WeightVGEditModifierData *wmd = (WeightVGEditModifierData*)md;
 +              rna_object_uvlayer_name_set(ptr, value, wmd->mask_tex_uvlayer_name, sizeof(wmd->mask_tex_uvlayer_name));
 +      }
 +      else if (md->type == eModifierType_WeightVGMix) {
 +              WeightVGMixModifierData *wmd = (WeightVGMixModifierData*)md;
 +              rna_object_uvlayer_name_set(ptr, value, wmd->mask_tex_uvlayer_name, sizeof(wmd->mask_tex_uvlayer_name));
 +      }
 +      else if (md->type == eModifierType_WeightVGProximity) {
 +              WeightVGProximityModifierData *wmd = (WeightVGProximityModifierData*)md;
 +              rna_object_uvlayer_name_set(ptr, value, wmd->mask_tex_uvlayer_name, sizeof(wmd->mask_tex_uvlayer_name));
 +      }
 +}
 +
  static void rna_MultiresModifier_level_range(PointerRNA *ptr, int *min, int *max)
  {
        MultiresModifierData *mmd = (MultiresModifierData*)ptr->data;
@@@ -871,6 -805,11 +871,11 @@@ static void rna_def_modifier_multires(B
        RNA_def_property_boolean_sdna(prop, NULL, "flags", eMultiresModifierFlag_ControlEdges);
        RNA_def_property_ui_text(prop, "Optimal Display", "Skip drawing/rendering of interior subdivided edges");
        RNA_def_property_update(prop, 0, "rna_Modifier_update");
+       prop= RNA_def_property(srna, "use_subsurf_uv", PROP_BOOLEAN, PROP_NONE);
+       RNA_def_property_boolean_negative_sdna(prop, NULL, "flags", eMultiresModifierFlag_PlainUv);
+       RNA_def_property_ui_text(prop, "Subdivide UVs", "Use subsurf to subdivide UVs");
+       RNA_def_property_update(prop, 0, "rna_Modifier_update");
  }
  
  static void rna_def_modifier_lattice(BlenderRNA *brna)
@@@ -2473,313 -2412,6 +2478,313 @@@ static void rna_def_modifier_screw(Blen
        RNA_def_property_update(prop, 0, "rna_Modifier_update");*/
  }
  
 +static void rna_def_modifier_weightvg_mask(BlenderRNA *brna, StructRNA *srna)
 +{
 +      static EnumPropertyItem weightvg_mask_tex_map_items[] = {
 +              {MOD_DISP_MAP_LOCAL, "LOCAL", 0, "Local", ""},
 +              {MOD_DISP_MAP_GLOBAL, "GLOBAL", 0, "Global", ""},
 +              {MOD_DISP_MAP_OBJECT, "OBJECT", 0, "Object", ""},
 +              {MOD_DISP_MAP_UV, "UV", 0, "UV", ""},
 +              {0, NULL, 0, NULL, NULL}};
 +
 +      static EnumPropertyItem weightvg_mask_tex_used_items[] = {
 +              {MOD_WVG_MASK_TEX_USE_INT, "INT", 0, "Intensity", ""},
 +              {MOD_WVG_MASK_TEX_USE_RED, "RED", 0, "Red", ""},
 +              {MOD_WVG_MASK_TEX_USE_GREEN, "GREEN", 0, "Green", ""},
 +              {MOD_WVG_MASK_TEX_USE_BLUE, "BLUE", 0, "Blue", ""},
 +              {MOD_WVG_MASK_TEX_USE_HUE, "HUE", 0, "Hue", ""},
 +              {MOD_WVG_MASK_TEX_USE_SAT, "SAT", 0, "Saturation", ""},
 +              {MOD_WVG_MASK_TEX_USE_VAL, "VAL", 0, "Value", ""},
 +              {MOD_WVG_MASK_TEX_USE_ALPHA, "ALPHA", 0, "Alpha", ""},
 +              {0, NULL, 0, NULL, NULL}};
 +
 +      PropertyRNA *prop;
 +
 +      prop= RNA_def_property(srna, "mask_constant", PROP_FLOAT, PROP_NONE);
 +      RNA_def_property_range(prop, -FLT_MAX, FLT_MAX);
 +      RNA_def_property_ui_range(prop, -100000.0, 100000.0, 10, 0);
 +      RNA_def_property_ui_text(prop, "Influence", "Global influence of current modifications on vgroup.");
 +      RNA_def_property_update(prop, 0, "rna_Modifier_update");
 +
 +      prop= RNA_def_property(srna, "mask_vertex_group", PROP_STRING, PROP_NONE);
 +      RNA_def_property_string_sdna(prop, NULL, "mask_defgrp_name");
 +      RNA_def_property_ui_text(prop, "Mask VGroup", "Masking vertex group name.");
 +      RNA_def_property_string_funcs(prop, NULL, NULL, "rna_WeightVGModifier_mask_vgroup_set");
 +      RNA_def_property_update(prop, 0, "rna_Modifier_update");
 +
 +      prop= RNA_def_property(srna, "mask_texture", PROP_POINTER, PROP_NONE);
 +      RNA_def_property_ui_text(prop, "Masking Tex", "Masking texture.");
 +      RNA_def_property_flag(prop, PROP_EDITABLE);
 +      RNA_def_property_update(prop, 0, "rna_Modifier_update");
 +
 +      prop= RNA_def_property(srna, "mask_tex_use_channel", PROP_ENUM, PROP_NONE);
 +      RNA_def_property_enum_items(prop, weightvg_mask_tex_used_items);
 +      RNA_def_property_ui_text(prop, "Use Channel", "Which texture channel to use for masking.");
 +      RNA_def_property_update(prop, 0, "rna_Modifier_update");
 +
 +      prop= RNA_def_property(srna, "mask_tex_mapping", PROP_ENUM, PROP_NONE);
 +      RNA_def_property_enum_items(prop, weightvg_mask_tex_map_items);
 +      RNA_def_property_ui_text(prop, "Texture Coordinates", "Which texture coordinates "
 +                                                            "to use for mapping.");
 +      RNA_def_property_update(prop, 0, "rna_Modifier_dependency_update");
 +
 +      prop= RNA_def_property(srna, "mask_tex_uv_layer", PROP_STRING, PROP_NONE);
 +      RNA_def_property_string_sdna(prop, NULL, "mask_tex_uvlayer_name");
 +      RNA_def_property_ui_text(prop, "UV Layer", "UV layer name");
 +      RNA_def_property_string_funcs(prop, NULL, NULL, "rna_WeightVGModifier_mask_uvlayer_set");
 +      RNA_def_property_update(prop, 0, "rna_Modifier_update");
 +
 +      prop= RNA_def_property(srna, "mask_tex_map_obj", PROP_POINTER, PROP_NONE);
 +      RNA_def_property_ui_text(prop, "Texture Coordinate Object", "Which object to take texture "
 +                                                                  "coordinates from.");
 +      RNA_def_property_flag(prop, PROP_EDITABLE|PROP_ID_SELF_CHECK);
 +      RNA_def_property_update(prop, 0, "rna_Modifier_dependency_update");
 +}
 +
 +static void rna_def_modifier_weightvgedit(BlenderRNA *brna)
 +{
 +      StructRNA *srna;
 +      PropertyRNA *prop;
 +
 +      srna= RNA_def_struct(brna, "WeightVGEditModifier", "Modifier");
 +      RNA_def_struct_ui_text(srna, "Edit Vertex Group Weights Modifier",
 +                             "Edit the weights of vertices in a group.");
 +      RNA_def_struct_sdna(srna, "WeightVGEditModifierData");
 +      RNA_def_struct_ui_icon(srna, ICON_MOD_WEIGHTVG);
 +
 +      prop= RNA_def_property(srna, "vertex_group", PROP_STRING, PROP_NONE);
 +      RNA_def_property_string_sdna(prop, NULL, "defgrp_name");
 +      RNA_def_property_ui_text(prop, "Vertex Group", "Vertex group name.");
 +      RNA_def_property_string_funcs(prop, NULL, NULL, "rna_WeightVGModifier_vgroup_set");
 +      RNA_def_property_update(prop, 0, "rna_Modifier_update");
 +
 +      prop= RNA_def_property(srna, "use_map", PROP_BOOLEAN, PROP_NONE);
 +      RNA_def_property_boolean_sdna(prop, NULL, "edit_flags", MOD_WVG_EDIT_MAP);
 +      RNA_def_property_ui_text(prop, "Map", "Map vertex group weights.");
 +      RNA_def_property_update(prop, 0, "rna_Modifier_update");
 +
 +      prop= RNA_def_property(srna, "use_map_curve", PROP_BOOLEAN, PROP_NONE);
 +      RNA_def_property_boolean_sdna(prop, NULL, "edit_flags", MOD_WVG_EDIT_CMAP);
 +      RNA_def_property_ui_text(prop, "Curve Map", "Map vertex group weights with a curve.");
 +      RNA_def_property_update(prop, 0, "rna_Modifier_update");
 +
 +      prop= RNA_def_property(srna, "use_reverse", PROP_BOOLEAN, PROP_NONE);
 +      RNA_def_property_boolean_sdna(prop, NULL, "edit_flags", MOD_WVG_EDIT_REVERSE_WEIGHTS);
 +      RNA_def_property_ui_text(prop, "Reverse", "Reverse vertex group weights.");
 +      RNA_def_property_update(prop, 0, "rna_Modifier_update");
 +
 +      prop= RNA_def_property(srna, "use_add", PROP_BOOLEAN, PROP_NONE);
 +      RNA_def_property_boolean_sdna(prop, NULL, "edit_flags", MOD_WVG_EDIT_ADD2VG);
 +      RNA_def_property_ui_text(prop, "Add to VG", "Add vertices with weight over threshold "
 +                                                  "to vgroup.");
 +      RNA_def_property_update(prop, 0, "rna_Modifier_update");
 +
 +      prop= RNA_def_property(srna, "use_remove", PROP_BOOLEAN, PROP_NONE);
 +      RNA_def_property_boolean_sdna(prop, NULL, "edit_flags", MOD_WVG_EDIT_REMFVG);
 +      RNA_def_property_ui_text(prop, "Rem from VG", "Remove vertices with weight below threshold "
 +                                                    "from vgroup.");
 +      RNA_def_property_update(prop, 0, "rna_Modifier_update");
 +
 +      prop= RNA_def_property(srna, "use_clamp", PROP_BOOLEAN, PROP_NONE);
 +      RNA_def_property_boolean_sdna(prop, NULL, "edit_flags", MOD_WVG_EDIT_CLAMP);
 +      RNA_def_property_ui_text(prop, "Clamp", "Clamp vertex group weights.");
 +      RNA_def_property_update(prop, 0, "rna_Modifier_update");
 +
 +      prop= RNA_def_property(srna, "default_weight", PROP_FLOAT, PROP_NONE);
 +      RNA_def_property_range(prop, -FLT_MAX, FLT_MAX);
 +      RNA_def_property_ui_range(prop, -100000.0, 100000.0, 10, 0);
 +      RNA_def_property_ui_text(prop, "Default Weight", "Default weight a vertex will have if "
 +                                                       "it is not in the vgroup.");
 +      RNA_def_property_update(prop, 0, "rna_Modifier_update");
 +
 +      prop= RNA_def_property(srna, "map_input_low", PROP_FLOAT, PROP_NONE);
 +      RNA_def_property_float_sdna(prop, NULL, "map_org_min");
 +      RNA_def_property_range(prop, -FLT_MAX, FLT_MAX);
 +      RNA_def_property_ui_range(prop, -100000.0, 100000.0, 10, 0);
 +      RNA_def_property_ui_text(prop, "Input Low Weight", "Low input mapping value.");
 +      RNA_def_property_update(prop, 0, "rna_Modifier_update");
 +
 +      prop= RNA_def_property(srna, "map_input_high", PROP_FLOAT, PROP_NONE);
 +      RNA_def_property_float_sdna(prop, NULL, "map_org_max");
 +      RNA_def_property_range(prop, -FLT_MAX, FLT_MAX);
 +      RNA_def_property_ui_range(prop, -100000.0, 100000.0, 10, 0);
 +      RNA_def_property_ui_text(prop, "Input High Weight", "High input mapping value.");
 +      RNA_def_property_update(prop, 0, "rna_Modifier_update");
 +
 +      prop= RNA_def_property(srna, "map_output_low", PROP_FLOAT, PROP_NONE);
 +      RNA_def_property_float_sdna(prop, NULL, "map_new_min");
 +      RNA_def_property_range(prop, -FLT_MAX, FLT_MAX);
 +      RNA_def_property_ui_range(prop, -100000.0, 100000.0, 10, 0);
 +      RNA_def_property_ui_text(prop, "Output Low Weight", "Low output mapping value.");
 +      RNA_def_property_update(prop, 0, "rna_Modifier_update");
 +
 +      prop= RNA_def_property(srna, "map_output_high", PROP_FLOAT, PROP_NONE);
 +      RNA_def_property_float_sdna(prop, NULL, "map_new_max");
 +      RNA_def_property_range(prop, -FLT_MAX, FLT_MAX);
 +      RNA_def_property_ui_range(prop, -100000.0, 100000.0, 10, 0);
 +      RNA_def_property_ui_text(prop, "Output High Weight", "High output mapping value.");
 +      RNA_def_property_update(prop, 0, "rna_Modifier_update");
 +
 +      prop= RNA_def_property(srna, "map_curve", PROP_POINTER, PROP_NONE);
 +      RNA_def_property_pointer_sdna(prop, NULL, "cmap_curve");
 +      RNA_def_property_ui_text(prop, "Mapping Curve", "Custom mapping curve.");
 +      RNA_def_property_update(prop, 0, "rna_Modifier_update");
 +
 +      prop= RNA_def_property(srna, "add_threshold", PROP_FLOAT, PROP_NONE);
 +      RNA_def_property_float_sdna(prop, NULL, "add_threshold");
 +      RNA_def_property_range(prop, -FLT_MAX, FLT_MAX);
 +      RNA_def_property_ui_range(prop, -100000.0, 100000.0, 10, 0);
 +      RNA_def_property_ui_text(prop, "Add Threshold", "Lower bound for a vertex’s weight "
 +                                                      "to be added to the vgroup.");
 +      RNA_def_property_update(prop, 0, "rna_Modifier_update");
 +
 +      prop= RNA_def_property(srna, "remove_threshold", PROP_FLOAT, PROP_NONE);
 +      RNA_def_property_float_sdna(prop, NULL, "rem_threshold");
 +      RNA_def_property_range(prop, -FLT_MAX, FLT_MAX);
 +      RNA_def_property_ui_range(prop, -100000.0, 100000.0, 10, 0);
 +      RNA_def_property_ui_text(prop, "Rem Threshold", "Upper bound for a vertex’s weight "
 +                                                      "to be removed from the vgroup.");
 +      RNA_def_property_update(prop, 0, "rna_Modifier_update");
 +
 +      prop= RNA_def_property(srna, "clamp_weight_min", PROP_FLOAT, PROP_NONE);
 +      RNA_def_property_range(prop, -FLT_MAX, FLT_MAX);
 +      RNA_def_property_ui_range(prop, -100000.0, 100000.0, 10, 0);
 +      RNA_def_property_ui_text(prop, "Min Weight", "Lowest weight a vertex can get.");
 +      RNA_def_property_update(prop, 0, "rna_Modifier_update");
 +
 +      prop= RNA_def_property(srna, "clamp_weight_max", PROP_FLOAT, PROP_NONE);
 +      RNA_def_property_range(prop, -FLT_MAX, FLT_MAX);
 +      RNA_def_property_ui_range(prop, -100000.0, 100000.0, 10, 0);
 +      RNA_def_property_ui_text(prop, "Max Weight", "Highest weight a vertex can get.");
 +      RNA_def_property_update(prop, 0, "rna_Modifier_update");
 +
 +      /* Common masking properties. */
 +      rna_def_modifier_weightvg_mask(brna, srna);
 +}
 +
 +static void rna_def_modifier_weightvgmix(BlenderRNA *brna)
 +{
 +      static EnumPropertyItem weightvg_mix_modes_items[] = {
 +              {MOD_WVG_MIX_SET, "SET", 0, "Replace weights", ""},
 +              {MOD_WVG_MIX_ADD, "ADD", 0, "Add to weights", ""},
 +              {MOD_WVG_MIX_SUB, "SUB", 0, "Subtract from weights", ""},
 +              {MOD_WVG_MIX_MUL, "MUL", 0, "Multiply weights", ""},
 +              {MOD_WVG_MIX_DIV, "DIV", 0, "Divide weights", ""},
 +              {MOD_WVG_MIX_DIF, "DIF", 0, "Difference", ""},
 +              {MOD_WVG_MIX_AVG, "AVG", 0, "Average", ""},
 +              {0, NULL, 0, NULL, NULL}};
 +
 +      static EnumPropertyItem weightvg_mix_set_items[] = {
 +              {MOD_WVG_SET_ALL,   "ALL",   0, "All vertices", ""},
 +              {MOD_WVG_SET_ORG,   "ORG",   0, "Vertices from vgroup 1", ""},
 +              {MOD_WVG_SET_NEW,   "NEW",   0, "Vertices from vgroup 2", ""},
 +              {MOD_WVG_SET_UNION, "UNION", 0, "Vertices from one group", ""},
 +              {MOD_WVG_SET_INTER, "INTER", 0, "Vertices from both groups", ""},
 +              {0, NULL, 0, NULL, NULL}};
 +
 +      StructRNA *srna;
 +      PropertyRNA *prop;
 +
 +      srna= RNA_def_struct(brna, "WeightVGMixModifier", "Modifier");
 +      RNA_def_struct_ui_text(srna, "Weight Vertex Group Modifier",
 +                             "Mix the weights of two vertex groups.");
 +      RNA_def_struct_sdna(srna, "WeightVGMixModifierData");
 +      RNA_def_struct_ui_icon(srna, ICON_MOD_WEIGHTVG);
 +
 +      prop= RNA_def_property(srna, "vertex_group", PROP_STRING, PROP_NONE);
 +      RNA_def_property_string_sdna(prop, NULL, "defgrp_name");
 +      RNA_def_property_ui_text(prop, "Vertex Group", "First vertex group name.");
 +      RNA_def_property_string_funcs(prop, NULL, NULL, "rna_WeightVGModifier_vgroup_set");
 +      RNA_def_property_update(prop, 0, "rna_Modifier_update");
 +
 +      prop= RNA_def_property(srna, "vertex_group2", PROP_STRING, PROP_NONE);
 +      RNA_def_property_string_sdna(prop, NULL, "defgrp_name2");
 +      RNA_def_property_ui_text(prop, "Vertex Group 2", "Second vertex group name.");
 +      RNA_def_property_string_funcs(prop, NULL, NULL, "rna_WeightVGMixModifier_vgroup2_set");
 +      RNA_def_property_update(prop, 0, "rna_Modifier_update");
 +
 +      prop= RNA_def_property(srna, "default_weight", PROP_FLOAT, PROP_NONE);
 +      RNA_def_property_range(prop, -FLT_MAX, FLT_MAX);
 +      RNA_def_property_ui_range(prop, -100000.0, 100000.0, 10, 0);
 +      RNA_def_property_ui_text(prop, "Default Weight", "Default weight a vertex will have if "
 +                                                       "it is not in the first vgroup.");
 +      RNA_def_property_update(prop, 0, "rna_Modifier_update");
 +
 +      prop= RNA_def_property(srna, "default_weight2", PROP_FLOAT, PROP_NONE);
 +      RNA_def_property_range(prop, -FLT_MAX, FLT_MAX);
 +      RNA_def_property_ui_range(prop, -100000.0, 100000.0, 10, 0);
 +      RNA_def_property_ui_text(prop, "Default Weight 2", "Default weight a vertex will have if "
 +                                                         "it is not in the second vgroup.");
 +      RNA_def_property_update(prop, 0, "rna_Modifier_update");
 +
 +      prop= RNA_def_property(srna, "mix_mode", PROP_ENUM, PROP_NONE);
 +      RNA_def_property_enum_items(prop, weightvg_mix_modes_items);
 +      RNA_def_property_ui_text(prop, "Mix Mode", "How weights from vgroup 2 affect weights "
 +                                                 "of vgroup 1.");
 +      RNA_def_property_update(prop, 0, "rna_Modifier_update");
 +
 +      prop= RNA_def_property(srna, "mix_set", PROP_ENUM, PROP_NONE);
 +      RNA_def_property_enum_items(prop, weightvg_mix_set_items);
 +      RNA_def_property_ui_text(prop, "Vertex Set", "Which vertices should be affected.");
 +      RNA_def_property_update(prop, 0, "rna_Modifier_update");
 +
 +      /* Common masking properties. */
 +      rna_def_modifier_weightvg_mask(brna, srna);
 +}
 +
 +static void rna_def_modifier_weightvgproximity(BlenderRNA *brna)
 +{
 +      static EnumPropertyItem weightvg_proximity_modes_items[] = {
 +              {MOD_WVG_PROXIMITY_OBJECT, "OBJECT", 0, "Object Distance",
 +               "Use distance between affected and target objects."},
 +              {MOD_WVG_PROXIMITY_GEOMETRY, "GEOMETRY", 0, "Geometry Distance",
 +               "Use distance between affected object’s vertices and target object, or target object’s geometry."},
 +              {0, NULL, 0, NULL, NULL}};
 +
 +      static EnumPropertyItem proximity_geometry_items[] = {
 +              {MOD_WVG_PROXIMITY_GEOM_VERTS, "VERTEX", ICON_VERTEXSEL, "Vertex", ""},
 +              {MOD_WVG_PROXIMITY_GEOM_EDGES, "EDGE", ICON_EDGESEL, "Edge", ""},
 +              {MOD_WVG_PROXIMITY_GEOM_FACES, "FACE", ICON_FACESEL, "Face", ""},
 +              {0, NULL, 0, NULL, NULL}};
 +
 +      StructRNA *srna;
 +      PropertyRNA *prop;
 +
 +      srna= RNA_def_struct(brna, "WeightVGProximityModifier", "Modifier");
 +      RNA_def_struct_ui_text(srna, "Weight Vertex Group - Proximity Modifier",
 +                             "Set the weights of vertices in a group from a target object’s "
 +                             "distance.");
 +      RNA_def_struct_sdna(srna, "WeightVGProximityModifierData");
 +      RNA_def_struct_ui_icon(srna, ICON_MOD_WEIGHTVG);
 +
 +      prop= RNA_def_property(srna, "vertex_group", PROP_STRING, PROP_NONE);
 +      RNA_def_property_string_sdna(prop, NULL, "defgrp_name");
 +      RNA_def_property_ui_text(prop, "Vertex Group", "Vertex group name.");
 +      RNA_def_property_string_funcs(prop, NULL, NULL, "rna_WeightVGModifier_vgroup_set");
 +      RNA_def_property_update(prop, 0, "rna_Modifier_update");
 +
 +      prop= RNA_def_property(srna, "proximity_mode", PROP_ENUM, PROP_NONE);
 +      RNA_def_property_enum_items(prop, weightvg_proximity_modes_items);
 +      RNA_def_property_ui_text(prop, "Proximity Mode", "Which distances to target object to use.");
 +      RNA_def_property_update(prop, 0, "rna_Modifier_update");
 +
 +      prop= RNA_def_property(srna, "proximity_geometry", PROP_ENUM, PROP_NONE);
 +      RNA_def_property_enum_sdna(prop, NULL, "proximity_flags");
 +      RNA_def_property_enum_items(prop, proximity_geometry_items);
 +      RNA_def_property_flag(prop, PROP_ENUM_FLAG); /* important to run before default set */
 +      RNA_def_property_ui_text(prop, "Proximity Geometry", "Use shortest distance to target object’s geometry as weight");
 +      RNA_def_property_update(prop, 0, "rna_Modifier_update");
 +
 +      prop= RNA_def_property(srna, "target", PROP_POINTER, PROP_NONE);
 +      RNA_def_property_pointer_sdna(prop, NULL, "proximity_ob_target");
 +      RNA_def_property_ui_text(prop, "Target Object", "Object to calculate vertices’ distances from.");
 +      RNA_def_property_flag(prop, PROP_EDITABLE|PROP_ID_SELF_CHECK);
 +      RNA_def_property_update(prop, 0, "rna_Modifier_dependency_update");
 +
 +      /* Common masking properties. */
 +      rna_def_modifier_weightvg_mask(brna, srna);
 +}
 +
  void RNA_def_modifier(BlenderRNA *brna)
  {
        StructRNA *srna;
        rna_def_modifier_smoke(brna);
        rna_def_modifier_solidify(brna);
        rna_def_modifier_screw(brna);
 +      rna_def_modifier_weightvgedit(brna);
 +      rna_def_modifier_weightvgmix(brna);
 +      rna_def_modifier_weightvgproximity(brna);
  }
  
  #endif