Cleanup: use `rna_enum_` prefix for RNA enums
[blender.git] / source / blender / makesrna / intern / rna_modifier.c
index 3458d84a85cc295bffdbd21e537732e3bcf4276d..4ca7493eb130ffab58b77cd41399f077a44490ec 100644 (file)
@@ -40,7 +40,7 @@
 
 #include "BLI_math.h"
 
-#include "BLF_translation.h"
+#include "BLT_translation.h"
 
 #include "BKE_animsys.h"
 #include "BKE_data_transfer.h"
 #include "WM_api.h"
 #include "WM_types.h"
 
-EnumPropertyItem modifier_type_items[] = {
+EnumPropertyItem rna_enum_object_modifier_type_items[] = {
        {0, "", 0, N_("Modify"), ""},
-    {eModifierType_DataTransfer, "DATA_TRANSFER", ICON_MOD_DATA_TRANSFER, "Data Transfer", ""},
+       {eModifierType_DataTransfer, "DATA_TRANSFER", ICON_MOD_DATA_TRANSFER, "Data Transfer", ""},
        {eModifierType_MeshCache, "MESH_CACHE", ICON_MOD_MESHDEFORM, "Mesh Cache", ""},
+       {eModifierType_NormalEdit, "NORMAL_EDIT", ICON_MOD_NORMALEDIT, "Normal Edit", ""},
        {eModifierType_UVProject, "UV_PROJECT", ICON_MOD_UVPROJECT, "UV Project", ""},
        {eModifierType_UVWarp, "UV_WARP", ICON_MOD_UVPROJECT, "UV Warp", ""},
        {eModifierType_WeightVGEdit, "VERTEX_WEIGHT_EDIT", ICON_MOD_VERTEX_WEIGHT, "Vertex Weight Edit", ""},
@@ -91,6 +92,7 @@ EnumPropertyItem modifier_type_items[] = {
        {0, "", 0, N_("Deform"), ""},
        {eModifierType_Armature, "ARMATURE", ICON_MOD_ARMATURE, "Armature", ""},
        {eModifierType_Cast, "CAST", ICON_MOD_CAST, "Cast", ""},
+       {eModifierType_CorrectiveSmooth, "CORRECTIVE_SMOOTH", ICON_MOD_SMOOTH, "Corrective Smooth", ""},
        {eModifierType_Curve, "CURVE", ICON_MOD_CURVE, "Curve", ""},
        {eModifierType_Displace, "DISPLACE", ICON_MOD_DISPLACE, "Displace", ""},
        {eModifierType_Hook, "HOOK", ICON_HOOK, "Hook", ""},
@@ -118,7 +120,7 @@ EnumPropertyItem modifier_type_items[] = {
        {0, NULL, 0, NULL, NULL}
 };
 
-EnumPropertyItem modifier_triangulate_quad_method_items[] = {
+EnumPropertyItem rna_enum_modifier_triangulate_quad_method_items[] = {
        {MOD_TRIANGULATE_QUAD_BEAUTY, "BEAUTY", 0, "Beauty ", "Split the quads in nice triangles, slower method"},
        {MOD_TRIANGULATE_QUAD_FIXED, "FIXED", 0, "Fixed", "Split the quads on the first and third vertices"},
        {MOD_TRIANGULATE_QUAD_ALTERNATE, "FIXED_ALTERNATE", 0, "Fixed Alternate",
@@ -128,7 +130,7 @@ EnumPropertyItem modifier_triangulate_quad_method_items[] = {
        {0, NULL, 0, NULL, NULL}
 };
 
-EnumPropertyItem modifier_triangulate_ngon_method_items[] = {
+EnumPropertyItem rna_enum_modifier_triangulate_ngon_method_items[] = {
        {MOD_TRIANGULATE_NGON_BEAUTY, "BEAUTY", 0, "Beauty", "Arrange the new triangles evenly (slow)"},
        {MOD_TRIANGULATE_NGON_EARCLIP, "CLIP", 0, "Clip", "Split the polygons with an ear clipping algorithm"},
        {0, NULL, 0, NULL, NULL}
@@ -152,7 +154,7 @@ static EnumPropertyItem modifier_warp_falloff_items[] = {
 
 /* ***** Data Transfer ***** */
 
-EnumPropertyItem DT_method_vertex_items[] = {
+EnumPropertyItem rna_enum_dt_method_vertex_items[] = {
        {MREMAP_MODE_TOPOLOGY, "TOPOLOGY", 0, "Topology",
         "Copy from identical topology meshes"},
        {MREMAP_MODE_VERT_NEAREST, "NEAREST", 0, "Nearest vertex",
@@ -170,7 +172,7 @@ EnumPropertyItem DT_method_vertex_items[] = {
        {0, NULL, 0, NULL, NULL}
 };
 
-EnumPropertyItem DT_method_edge_items[] = {
+EnumPropertyItem rna_enum_dt_method_edge_items[] = {
        {MREMAP_MODE_TOPOLOGY, "TOPOLOGY", 0, "Topology",
         "Copy from identical topology meshes"},
        {MREMAP_MODE_EDGE_VERT_NEAREST, "VERT_NEAREST", 0, "Nearest Vertices",
@@ -184,7 +186,7 @@ EnumPropertyItem DT_method_edge_items[] = {
        {0, NULL, 0, NULL, NULL}
 };
 
-EnumPropertyItem DT_method_loop_items[] = {
+EnumPropertyItem rna_enum_dt_method_loop_items[] = {
        {MREMAP_MODE_TOPOLOGY, "TOPOLOGY", 0, "Topology",
         "Copy from identical topology meshes"},
        {MREMAP_MODE_LOOP_NEAREST_LOOPNOR, "NEAREST_NORMAL", 0, "Nearest Corner And Best Matching Normal",
@@ -200,7 +202,7 @@ EnumPropertyItem DT_method_loop_items[] = {
        {0, NULL, 0, NULL, NULL}
 };
 
-EnumPropertyItem DT_method_poly_items[] = {
+EnumPropertyItem rna_enum_dt_method_poly_items[] = {
        {MREMAP_MODE_TOPOLOGY, "TOPOLOGY", 0, "Topology",
         "Copy from identical topology meshes"},
        {MREMAP_MODE_POLY_NEAREST, "NEAREST", 0, "Nearest Face",
@@ -212,7 +214,7 @@ EnumPropertyItem DT_method_poly_items[] = {
        {0, NULL, 0, NULL, NULL}
 };
 
-EnumPropertyItem DT_mix_mode_items[] = {
+EnumPropertyItem rna_enum_dt_mix_mode_items[] = {
        {CDT_MIX_TRANSFER, "REPLACE", 0, "Replace",
         "Overwrite all elements' data"},
        {CDT_MIX_REPLACE_ABOVE_THRESHOLD, "ABOVE_THRESHOLD", 0, "Above Threshold",
@@ -231,7 +233,7 @@ EnumPropertyItem DT_mix_mode_items[] = {
        {0, NULL, 0, NULL, NULL}
 };
 
-EnumPropertyItem DT_layers_select_src_items[] = {
+EnumPropertyItem rna_enum_dt_layers_select_src_items[] = {
        {DT_LAYERS_ACTIVE_SRC, "ACTIVE", 0, "Active Layer",
         "Only transfer active data layer"},
        {DT_LAYERS_ALL_SRC, "ALL", 0, "All Layers",
@@ -243,7 +245,7 @@ EnumPropertyItem DT_layers_select_src_items[] = {
        {0, NULL, 0, NULL, NULL}
 };
 
-EnumPropertyItem DT_layers_select_dst_items[] = {
+EnumPropertyItem rna_enum_dt_layers_select_dst_items[] = {
        {DT_LAYERS_ACTIVE_DST, "ACTIVE", 0, "Active Layer",
         "Affect active data layer of all targets"},
        {DT_LAYERS_NAME_DST, "NAME", 0, "By Name",
@@ -374,6 +376,10 @@ static StructRNA *rna_Modifier_refine(struct PointerRNA *ptr)
                        return &RNA_WireframeModifier;
                case eModifierType_DataTransfer:
                        return &RNA_DataTransferModifier;
+               case eModifierType_NormalEdit:
+                       return &RNA_NormalEditModifier;
+               case eModifierType_CorrectiveSmooth:
+                       return &RNA_CorrectiveSmoothModifier;
                /* Default */
                case eModifierType_None:
                case eModifierType_ShapeKey:
@@ -402,7 +408,7 @@ static void rna_Modifier_name_set(PointerRNA *ptr, const char *value)
        }
        
        /* fix all the animation data which may link to this */
-       BKE_all_animdata_fix_paths_rename(NULL, "modifiers", oldname, md->name);
+       BKE_animdata_fix_paths_rename_all(NULL, "modifiers", oldname, md->name);
 }
 
 static char *rna_Modifier_path(PointerRNA *ptr)
@@ -441,6 +447,7 @@ RNA_MOD_VGROUP_NAME_SET(Cast, defgrp_name);
 RNA_MOD_VGROUP_NAME_SET(Curve, name);
 RNA_MOD_VGROUP_NAME_SET(DataTransfer, defgrp_name);
 RNA_MOD_VGROUP_NAME_SET(Decimate, defgrp_name);
+RNA_MOD_VGROUP_NAME_SET(CorrectiveSmooth, defgrp_name);
 RNA_MOD_VGROUP_NAME_SET(Displace, defgrp_name);
 RNA_MOD_VGROUP_NAME_SET(Hook, name);
 RNA_MOD_VGROUP_NAME_SET(LaplacianDeform, anchor_grp_name);
@@ -448,6 +455,7 @@ RNA_MOD_VGROUP_NAME_SET(LaplacianSmooth, defgrp_name);
 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(Shrinkwrap, vgroup_name);
 RNA_MOD_VGROUP_NAME_SET(SimpleDeform, vgroup_name);
 RNA_MOD_VGROUP_NAME_SET(Smooth, defgrp_name);
@@ -534,15 +542,18 @@ RNA_MOD_OBJECT_SET(DataTransfer, ob_source, OB_MESH);
 RNA_MOD_OBJECT_SET(Lattice, object, OB_LATTICE);
 RNA_MOD_OBJECT_SET(Mask, ob_arm, OB_ARMATURE);
 RNA_MOD_OBJECT_SET(MeshDeform, object, OB_MESH);
+RNA_MOD_OBJECT_SET(NormalEdit, target, OB_EMPTY);
 RNA_MOD_OBJECT_SET(Shrinkwrap, target, OB_MESH);
 RNA_MOD_OBJECT_SET(Shrinkwrap, auxTarget, OB_MESH);
 
 static void rna_HookModifier_object_set(PointerRNA *ptr, PointerRNA value)
 {
        HookModifierData *hmd = ptr->data;
+       Object *ob = (Object *)value.data;
 
-       hmd->object = (Object *)value.data;
-       BKE_object_modifier_hook_reset((Object *)ptr->id.data, hmd);
+       hmd->object = ob;
+       id_lib_extern((ID *)ob);
+       BKE_object_modifier_hook_reset(ob, hmd);
 }
 
 static PointerRNA rna_UVProjector_object_get(PointerRNA *ptr)
@@ -553,8 +564,10 @@ static PointerRNA rna_UVProjector_object_get(PointerRNA *ptr)
 
 static void rna_UVProjector_object_set(PointerRNA *ptr, PointerRNA value)
 {
-       Object **ob = (Object **)ptr->data;
-       *ob = value.data;
+       Object **ob_p = (Object **)ptr->data;
+       Object *ob = (Object *)value.data;
+       id_lib_extern((ID *)ob);
+       *ob_p = ob;
 }
 
 #undef RNA_MOD_OBJECT_SET
@@ -812,6 +825,38 @@ static void rna_DataTransferModifier_data_types_update(Main *bmain, Scene *scene
        rna_Modifier_update(bmain, scene, ptr);
 }
 
+static void rna_DataTransferModifier_verts_data_types_set(struct PointerRNA *ptr, int value)
+{
+       DataTransferModifierData *dtmd = (DataTransferModifierData *)ptr->data;
+
+       dtmd->data_types &= ~DT_TYPE_VERT_ALL;
+       dtmd->data_types |= value;
+}
+
+static void rna_DataTransferModifier_edges_data_types_set(struct PointerRNA *ptr, int value)
+{
+       DataTransferModifierData *dtmd = (DataTransferModifierData *)ptr->data;
+
+       dtmd->data_types &= ~DT_TYPE_EDGE_ALL;
+       dtmd->data_types |= value;
+}
+
+static void rna_DataTransferModifier_loops_data_types_set(struct PointerRNA *ptr, int value)
+{
+       DataTransferModifierData *dtmd = (DataTransferModifierData *)ptr->data;
+
+       dtmd->data_types &= ~DT_TYPE_LOOP_ALL;
+       dtmd->data_types |= value;
+}
+
+static void rna_DataTransferModifier_polys_data_types_set(struct PointerRNA *ptr, int value)
+{
+       DataTransferModifierData *dtmd = (DataTransferModifierData *)ptr->data;
+
+       dtmd->data_types &= ~DT_TYPE_POLY_ALL;
+       dtmd->data_types |= value;
+}
+
 static EnumPropertyItem *rna_DataTransferModifier_layers_select_src_itemf(bContext *C, PointerRNA *ptr, PropertyRNA *prop, bool *r_free)
 {
        DataTransferModifierData *dtmd = (DataTransferModifierData *)ptr->data;
@@ -819,19 +864,19 @@ static EnumPropertyItem *rna_DataTransferModifier_layers_select_src_itemf(bConte
        int totitem = 0;
 
        if (!C) {  /* needed for docs and i18n tools */
-               return DT_layers_select_src_items;
+               return rna_enum_dt_layers_select_src_items;
        }
 
        /* No active here! */
-       RNA_enum_items_add_value(&item, &totitem, DT_layers_select_src_items, DT_LAYERS_ALL_SRC);
+       RNA_enum_items_add_value(&item, &totitem, rna_enum_dt_layers_select_src_items, DT_LAYERS_ALL_SRC);
 
        if (STREQ(RNA_property_identifier(prop), "layers_vgroup_select_src")) {
                Object *ob_src = dtmd->ob_source;
 
 #if 0  /* XXX Don't think we want this in modifier version... */
                if (BKE_object_pose_armature_get(ob_src)) {
-                       RNA_enum_items_add_value(&item, &totitem, DT_layers_select_src_items, DT_LAYERS_VGROUP_SRC_BONE_SELECT);
-                       RNA_enum_items_add_value(&item, &totitem, DT_layers_select_src_items, DT_LAYERS_VGROUP_SRC_BONE_DEFORM);
+                       RNA_enum_items_add_value(&item, &totitem, rna_enum_dt_layers_select_src_items, DT_LAYERS_VGROUP_SRC_BONE_SELECT);
+                       RNA_enum_items_add_value(&item, &totitem, rna_enum_dt_layers_select_src_items, DT_LAYERS_VGROUP_SRC_BONE_DEFORM);
                }
 #endif
 
@@ -909,12 +954,12 @@ static EnumPropertyItem *rna_DataTransferModifier_layers_select_dst_itemf(bConte
        int totitem = 0;
 
        if (!C) {  /* needed for docs and i18n tools */
-               return DT_layers_select_dst_items;
+               return rna_enum_dt_layers_select_dst_items;
        }
 
        /* No active here! */
-       RNA_enum_items_add_value(&item, &totitem, DT_layers_select_dst_items, DT_LAYERS_NAME_DST);
-       RNA_enum_items_add_value(&item, &totitem, DT_layers_select_dst_items, DT_LAYERS_INDEX_DST);
+       RNA_enum_items_add_value(&item, &totitem, rna_enum_dt_layers_select_dst_items, DT_LAYERS_NAME_DST);
+       RNA_enum_items_add_value(&item, &totitem, rna_enum_dt_layers_select_dst_items, DT_LAYERS_INDEX_DST);
 
        if (STREQ(RNA_property_identifier(prop), "layers_vgroup_select_dst")) {
                /* Only list destination layers if we have a single source! */
@@ -1003,24 +1048,24 @@ static EnumPropertyItem *rna_DataTransferModifier_mix_mode_itemf(bContext *C, Po
        bool support_advanced_mixing, support_threshold;
 
        if (!C) {  /* needed for docs and i18n tools */
-               return DT_mix_mode_items;
+               return rna_enum_dt_mix_mode_items;
        }
 
-       RNA_enum_items_add_value(&item, &totitem, DT_mix_mode_items, CDT_MIX_TRANSFER);
+       RNA_enum_items_add_value(&item, &totitem, rna_enum_dt_mix_mode_items, CDT_MIX_TRANSFER);
 
        BKE_object_data_transfer_get_dttypes_capacity(dtmd->data_types, &support_advanced_mixing, &support_threshold);
 
        if (support_threshold) {
-               RNA_enum_items_add_value(&item, &totitem, DT_mix_mode_items, CDT_MIX_REPLACE_ABOVE_THRESHOLD);
-               RNA_enum_items_add_value(&item, &totitem, DT_mix_mode_items, CDT_MIX_REPLACE_BELOW_THRESHOLD);
+               RNA_enum_items_add_value(&item, &totitem, rna_enum_dt_mix_mode_items, CDT_MIX_REPLACE_ABOVE_THRESHOLD);
+               RNA_enum_items_add_value(&item, &totitem, rna_enum_dt_mix_mode_items, CDT_MIX_REPLACE_BELOW_THRESHOLD);
        }
 
        if (support_advanced_mixing) {
                RNA_enum_item_add_separator(&item, &totitem);
-               RNA_enum_items_add_value(&item, &totitem, DT_mix_mode_items, CDT_MIX_MIX);
-               RNA_enum_items_add_value(&item, &totitem, DT_mix_mode_items, CDT_MIX_ADD);
-               RNA_enum_items_add_value(&item, &totitem, DT_mix_mode_items, CDT_MIX_SUB);
-               RNA_enum_items_add_value(&item, &totitem, DT_mix_mode_items, CDT_MIX_MUL);
+               RNA_enum_items_add_value(&item, &totitem, rna_enum_dt_mix_mode_items, CDT_MIX_MIX);
+               RNA_enum_items_add_value(&item, &totitem, rna_enum_dt_mix_mode_items, CDT_MIX_ADD);
+               RNA_enum_items_add_value(&item, &totitem, rna_enum_dt_mix_mode_items, CDT_MIX_SUB);
+               RNA_enum_items_add_value(&item, &totitem, rna_enum_dt_mix_mode_items, CDT_MIX_MUL);
        }
 
        RNA_enum_item_end(&item, &totitem);
@@ -1029,6 +1074,33 @@ static EnumPropertyItem *rna_DataTransferModifier_mix_mode_itemf(bContext *C, Po
        return item;
 }
 
+static void rna_CorrectiveSmoothModifier_update(Main *bmain, Scene *scene, PointerRNA *ptr)
+{
+       CorrectiveSmoothModifierData *csmd = (CorrectiveSmoothModifierData *)ptr->data;
+
+       MEM_SAFE_FREE(csmd->delta_cache);
+
+       rna_Modifier_update(bmain, scene, ptr);
+}
+
+static void rna_CorrectiveSmoothModifier_rest_source_update(Main *bmain, Scene *scene, PointerRNA *ptr)
+{
+       CorrectiveSmoothModifierData *csmd = (CorrectiveSmoothModifierData *)ptr->data;
+
+       if (csmd->rest_source != MOD_CORRECTIVESMOOTH_RESTSOURCE_BIND) {
+               MEM_SAFE_FREE(csmd->bind_coords);
+               csmd->bind_coords_num = 0;
+       }
+
+       rna_CorrectiveSmoothModifier_update(bmain, scene, ptr);
+}
+
+static int rna_CorrectiveSmoothModifier_is_bind_get(PointerRNA *ptr)
+{
+       CorrectiveSmoothModifierData *csmd = (CorrectiveSmoothModifierData *)ptr->data;
+       return (csmd->bind_coords != NULL);
+}
+
 #else
 
 static PropertyRNA *rna_def_property_subdivision_common(StructRNA *srna, const char type[])
@@ -1083,6 +1155,13 @@ static void rna_def_modifier_subsurf(BlenderRNA *brna)
        RNA_def_property_boolean_sdna(prop, NULL, "flags", eSubsurfModifierFlag_SubsurfUv);
        RNA_def_property_ui_text(prop, "Subdivide UVs", "Use subsurf to subdivide UVs");
        RNA_def_property_update(prop, 0, "rna_Modifier_update");
+
+#ifdef WITH_OPENSUBDIV
+       prop = RNA_def_property(srna, "use_opensubdiv", PROP_BOOLEAN, PROP_NONE);
+       RNA_def_property_boolean_sdna(prop, NULL, "use_opensubdiv", 1);
+       RNA_def_property_ui_text(prop, "Use OpenSubdiv", "Use OpenSubdiv for the subdivisions (viewport only)");
+       RNA_def_property_update(prop, 0, "rna_Modifier_update");
+#endif
 }
 
 static void rna_def_modifier_generic_map_info(StructRNA *srna)
@@ -1151,7 +1230,7 @@ static void rna_def_modifier_warp(BlenderRNA *brna)
        prop = RNA_def_property(srna, "falloff_type", PROP_ENUM, PROP_NONE);
        RNA_def_property_enum_items(prop, modifier_warp_falloff_items);
        RNA_def_property_ui_text(prop, "Falloff Type", "");
-       RNA_def_property_translation_context(prop, BLF_I18NCONTEXT_ID_CURVE); /* Abusing id_curve :/ */
+       RNA_def_property_translation_context(prop, BLT_I18NCONTEXT_ID_CURVE); /* Abusing id_curve :/ */
        RNA_def_property_update(prop, 0, "rna_Modifier_update");
 
        prop = RNA_def_property(srna, "falloff_radius", PROP_FLOAT, PROP_UNSIGNED | PROP_DISTANCE);
@@ -1397,7 +1476,7 @@ static void rna_def_modifier_mirror(BlenderRNA *brna)
        RNA_def_property_float_sdna(prop, NULL, "tolerance");
        RNA_def_property_range(prop, 0, FLT_MAX);
        RNA_def_property_ui_range(prop, 0, 1, 0.01, 6);
-       RNA_def_property_ui_text(prop, "Merge Limit", "Distance from axis within which mirrored vertices are merged");
+       RNA_def_property_ui_text(prop, "Merge Limit", "Distance within which mirrored vertices are merged");
        RNA_def_property_update(prop, 0, "rna_Modifier_update");
 
        prop = RNA_def_property(srna, "mirror_object", PROP_POINTER, PROP_NONE);
@@ -1450,7 +1529,7 @@ static void rna_def_modifier_decimate(BlenderRNA *brna)
        prop = RNA_def_property(srna, "angle_limit", PROP_FLOAT, PROP_ANGLE);
        RNA_def_property_float_sdna(prop, NULL, "angle");
        RNA_def_property_range(prop, 0, DEG2RAD(180));
-       RNA_def_property_ui_range(prop, 0, DEG2RAD(180), 100, 2);
+       RNA_def_property_ui_range(prop, 0, DEG2RAD(180), 10, 2);
        RNA_def_property_ui_text(prop, "Angle Limit", "Only dissolve angles below this (planar only)");
        RNA_def_property_update(prop, 0, "rna_Modifier_update");
 
@@ -1470,6 +1549,24 @@ static void rna_def_modifier_decimate(BlenderRNA *brna)
        RNA_def_property_boolean_sdna(prop, NULL, "flag", MOD_DECIM_FLAG_TRIANGULATE);
        RNA_def_property_ui_text(prop, "Triangulate", "Keep triangulated faces resulting from decimation (collapse only)");
        RNA_def_property_update(prop, 0, "rna_Modifier_update");
+
+       prop = RNA_def_property(srna, "use_symmetry", PROP_BOOLEAN, PROP_NONE);
+       RNA_def_property_boolean_sdna(prop, NULL, "flag", MOD_DECIM_FLAG_SYMMETRY);
+       RNA_def_property_ui_text(prop, "Symmetry", "Maintain symmetry on an axis");
+       RNA_def_property_update(prop, 0, "rna_Modifier_update");
+
+       prop = RNA_def_property(srna, "symmetry_axis", PROP_ENUM, PROP_NONE);
+       RNA_def_property_enum_sdna(prop, NULL, "symmetry_axis");
+       RNA_def_property_enum_items(prop, rna_enum_object_axis_unsigned_items);
+       RNA_def_property_ui_text(prop, "Axis", "Axis of symmetry");
+       RNA_def_property_update(prop, 0, "rna_Modifier_update");
+
+       prop = RNA_def_property(srna, "vertex_group_factor", PROP_FLOAT, PROP_NONE);
+       RNA_def_property_float_sdna(prop, NULL, "defgrp_factor");
+       RNA_def_property_range(prop, 0, 1000);
+       RNA_def_property_ui_range(prop, 0, 10, 1, 4);
+       RNA_def_property_ui_text(prop, "Factor", "Vertex group strength");
+       RNA_def_property_update(prop, 0, "rna_Modifier_update");
        /* end collapse-only option */
 
        /* (mode == MOD_DECIM_MODE_DISSOLVE) */
@@ -1480,7 +1577,7 @@ static void rna_def_modifier_decimate(BlenderRNA *brna)
 
        prop = RNA_def_property(srna, "delimit", PROP_ENUM, PROP_NONE);
        RNA_def_property_flag(prop, PROP_ENUM_FLAG); /* important to run before default set */
-       RNA_def_property_enum_items(prop, mesh_delimit_mode_items);
+       RNA_def_property_enum_items(prop, rna_enum_mesh_delimit_mode_items);
        RNA_def_property_ui_text(prop, "Delimit", "Limit merging geometry");
        RNA_def_property_update(prop, 0, "rna_Modifier_update");
 
@@ -1690,7 +1787,7 @@ static void rna_def_modifier_hook(BlenderRNA *brna)
        prop = RNA_def_property(srna, "falloff_type", PROP_ENUM, PROP_NONE);
        RNA_def_property_enum_items(prop, modifier_warp_falloff_items);  /* share the enum */
        RNA_def_property_ui_text(prop, "Falloff Type", "");
-       RNA_def_property_translation_context(prop, BLF_I18NCONTEXT_ID_CURVE); /* Abusing id_curve :/ */
+       RNA_def_property_translation_context(prop, BLT_I18NCONTEXT_ID_CURVE); /* Abusing id_curve :/ */
        RNA_def_property_update(prop, 0, "rna_Modifier_update");
 
        prop = RNA_def_property(srna, "falloff_radius", PROP_FLOAT, PROP_DISTANCE);
@@ -1914,7 +2011,7 @@ static void rna_def_modifier_edgesplit(BlenderRNA *brna)
 
        prop = RNA_def_property(srna, "split_angle", PROP_FLOAT, PROP_ANGLE);
        RNA_def_property_range(prop, 0.0f, DEG2RADF(180.0f));
-       RNA_def_property_ui_range(prop, 0.0f, DEG2RADF(180.0f), 100, 2);
+       RNA_def_property_ui_range(prop, 0.0f, DEG2RADF(180.0f), 10, 2);
        RNA_def_property_ui_text(prop, "Split Angle", "Angle above which to split edges");
        RNA_def_property_update(prop, 0, "rna_Modifier_update");
 
@@ -1939,9 +2036,11 @@ static void rna_def_modifier_displace(BlenderRNA *brna)
                {MOD_DISP_DIR_Y, "Y", 0, "Y", "Use the texture's intensity value to displace in the Y direction"},
                {MOD_DISP_DIR_Z, "Z", 0, "Z", "Use the texture's intensity value to displace in the Z direction"},
                {MOD_DISP_DIR_NOR, "NORMAL", 0, "Normal",
-                                  "Use the texture's intensity value to displace in the normal direction"},
+                "Use the texture's intensity value to displace along the vertex normal"},
+               {MOD_DISP_DIR_CLNOR, "CUSTOM_NORMAL", 0, "Custom Normal",
+                "Use the texture's intensity value to displace along the (averaged) custom normal (falls back to vertex)"},
                {MOD_DISP_DIR_RGB_XYZ, "RGB_TO_XYZ", 0, "RGB to XYZ",
-                                      "Use the texture's RGB values to displace the mesh in the XYZ direction"},
+                "Use the texture's RGB values to displace the mesh in the XYZ direction"},
                {0, NULL, 0, NULL, NULL}
        };
 
@@ -2106,6 +2205,90 @@ static void rna_def_modifier_smooth(BlenderRNA *brna)
        RNA_def_property_update(prop, 0, "rna_Modifier_update");
 }
 
+
+static void rna_def_modifier_correctivesmooth(BlenderRNA *brna)
+{
+       StructRNA *srna;
+       PropertyRNA *prop;
+
+       static EnumPropertyItem modifier_smooth_type_items[] = {
+               {MOD_CORRECTIVESMOOTH_SMOOTH_SIMPLE, "SIMPLE", 0, "Simple",
+                "Use the average of adjacent edge-vertices"},
+               {MOD_CORRECTIVESMOOTH_SMOOTH_LENGTH_WEIGHT, "LENGTH_WEIGHTED", 0, "Length Weight",
+                "Use the average of adjacent edge-vertices weighted by their length"},
+               {0, NULL, 0, NULL, NULL}
+       };
+
+       static EnumPropertyItem modifier_rest_source_items[] = {
+               {MOD_CORRECTIVESMOOTH_RESTSOURCE_ORCO, "ORCO", 0, "Original Coords",
+                "Use base mesh vert coords as the rest position"},
+               {MOD_CORRECTIVESMOOTH_RESTSOURCE_BIND, "BIND", 0, "Bind Coords",
+                "Use bind vert coords for rest position"},
+               {0, NULL, 0, NULL, NULL}
+       };
+
+       srna = RNA_def_struct(brna, "CorrectiveSmoothModifier", "Modifier");
+       RNA_def_struct_ui_text(srna, "Corrective Smooth Modifier", "Correct distortion caused by deformation");
+       RNA_def_struct_sdna(srna, "CorrectiveSmoothModifierData");
+       RNA_def_struct_ui_icon(srna, ICON_MOD_SMOOTH);
+
+       prop = RNA_def_property(srna, "factor", PROP_FLOAT, PROP_NONE);
+       RNA_def_property_float_sdna(prop, NULL, "lambda");
+       RNA_def_property_range(prop, -FLT_MAX, FLT_MAX);
+       RNA_def_property_ui_range(prop, 0.0, 1.0, 5, 3);
+       RNA_def_property_ui_text(prop, "Lambda Factor", "Smooth factor effect");
+       RNA_def_property_update(prop, 0, "rna_CorrectiveSmoothModifier_update");
+
+       prop = RNA_def_property(srna, "iterations", PROP_INT, PROP_NONE);
+       RNA_def_property_int_sdna(prop, NULL, "repeat");
+       RNA_def_property_ui_range(prop, 0, 200, 1, -1);
+       RNA_def_property_ui_text(prop, "Repeat", "");
+       RNA_def_property_update(prop, 0, "rna_CorrectiveSmoothModifier_update");
+
+       prop = RNA_def_property(srna, "rest_source", PROP_ENUM, PROP_NONE);
+       RNA_def_property_enum_sdna(prop, NULL, "rest_source");
+       RNA_def_property_enum_items(prop, modifier_rest_source_items);
+       RNA_def_property_ui_text(prop, "Rest Source", "Select the source of rest positions");
+       RNA_def_property_update(prop, 0, "rna_CorrectiveSmoothModifier_rest_source_update");
+
+       prop = RNA_def_property(srna, "smooth_type", PROP_ENUM, PROP_NONE);
+       RNA_def_property_enum_sdna(prop, NULL, "smooth_type");
+       RNA_def_property_enum_items(prop, modifier_smooth_type_items);
+       RNA_def_property_ui_text(prop, "Smooth Type", "Method used for smoothing");
+       RNA_def_property_update(prop, 0, "rna_CorrectiveSmoothModifier_update");
+
+       prop = RNA_def_property(srna, "invert_vertex_group", PROP_BOOLEAN, PROP_NONE);
+       RNA_def_property_boolean_sdna(prop, NULL, "flag", MOD_CORRECTIVESMOOTH_INVERT_VGROUP);
+       RNA_def_property_ui_text(prop, "Invert", "Invert vertex group influence");
+       RNA_def_property_update(prop, 0, "rna_CorrectiveSmoothModifier_update");
+
+       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",
+                                "Name of Vertex Group which determines influence of modifier per point");
+       RNA_def_property_string_funcs(prop, NULL, NULL, "rna_CorrectiveSmoothModifier_defgrp_name_set");
+       RNA_def_property_update(prop, 0, "rna_CorrectiveSmoothModifier_update");
+
+       prop = RNA_def_property(srna, "is_bind", PROP_BOOLEAN, PROP_NONE);
+       RNA_def_property_ui_text(prop, "Bind current shape", "");
+       RNA_def_property_boolean_funcs(prop, "rna_CorrectiveSmoothModifier_is_bind_get", NULL);
+       RNA_def_property_clear_flag(prop, PROP_EDITABLE);
+       RNA_def_property_update(prop, 0, "rna_Modifier_update");
+
+       prop = RNA_def_property(srna, "use_only_smooth", PROP_BOOLEAN, PROP_NONE);
+       RNA_def_property_boolean_sdna(prop, NULL, "flag", MOD_CORRECTIVESMOOTH_ONLY_SMOOTH);
+       RNA_def_property_ui_text(prop, "Only Smooth",
+                                "Apply smoothing without reconstructing the surface");
+       RNA_def_property_update(prop, 0, "rna_Modifier_update");
+
+       prop = RNA_def_property(srna, "use_pin_boundary", PROP_BOOLEAN, PROP_NONE);
+       RNA_def_property_boolean_sdna(prop, NULL, "flag", MOD_CORRECTIVESMOOTH_PIN_BOUNDARY);
+       RNA_def_property_ui_text(prop, "Pin Boundaries",
+                                "Excludes boundary vertices from being smoothed");
+       RNA_def_property_update(prop, 0, "rna_CorrectiveSmoothModifier_update");
+}
+
+
 static void rna_def_modifier_laplaciansmooth(BlenderRNA *brna)
 {
        StructRNA *srna;
@@ -2271,7 +2454,7 @@ static void rna_def_modifier_meshdeform(BlenderRNA *brna)
 
        prop = RNA_def_property(srna, "object", PROP_POINTER, PROP_NONE);
        RNA_def_property_ui_text(prop, "Object", "Mesh object to deform with");
-       RNA_def_property_pointer_funcs(prop, NULL, "rna_MeshDeformModifier_object_set", NULL, NULL);
+       RNA_def_property_pointer_funcs(prop, NULL, "rna_MeshDeformModifier_object_set", NULL, "rna_Mesh_object_poll");
        RNA_def_property_flag(prop, PROP_EDITABLE | PROP_ID_SELF_CHECK);
        RNA_def_property_update(prop, 0, "rna_Modifier_dependency_update");
        
@@ -2347,6 +2530,7 @@ static void rna_def_modifier_particleinstance(BlenderRNA *brna)
 
        prop = RNA_def_property(srna, "object", PROP_POINTER, PROP_NONE);
        RNA_def_property_pointer_sdna(prop, NULL, "ob");
+       RNA_def_property_pointer_funcs(prop, NULL, NULL, NULL, "rna_Mesh_object_poll");
        RNA_def_property_ui_text(prop, "Object", "Object that has the particle system");
        RNA_def_property_flag(prop, PROP_EDITABLE | PROP_ID_SELF_CHECK);
        RNA_def_property_update(prop, 0, "rna_Modifier_dependency_update");
@@ -2572,7 +2756,7 @@ static void rna_def_modifier_dynamic_paint(BlenderRNA *brna)
        prop = RNA_def_property(srna, "ui_type", PROP_ENUM, PROP_NONE);
        RNA_def_property_clear_flag(prop, PROP_ANIMATABLE);
        RNA_def_property_enum_sdna(prop, NULL, "type");
-       RNA_def_property_enum_items(prop, prop_dynamicpaint_type_items);
+       RNA_def_property_enum_items(prop, rna_enum_prop_dynamicpaint_type_items);
        RNA_def_property_ui_text(prop, "Type", "");
 }
 
@@ -2664,7 +2848,7 @@ static void rna_def_modifier_bevel(BlenderRNA *brna)
        prop = RNA_def_property(srna, "angle_limit", PROP_FLOAT, PROP_ANGLE);
        RNA_def_property_float_sdna(prop, NULL, "bevel_angle");
        RNA_def_property_range(prop, 0.0f, DEG2RADF(180.0f));
-       RNA_def_property_ui_range(prop, 0.0f, DEG2RADF(180.0f), 100, 2);
+       RNA_def_property_ui_range(prop, 0.0f, DEG2RADF(180.0f), 10, 2);
        RNA_def_property_ui_text(prop, "Angle", "Angle above which to bevel edges");
        RNA_def_property_update(prop, 0, "rna_Modifier_update");
 
@@ -2696,7 +2880,11 @@ static void rna_def_modifier_bevel(BlenderRNA *brna)
        RNA_def_property_range(prop, -1, SHRT_MAX);
        RNA_def_property_ui_text(prop, "Material", "Material index of generated faces, -1 for automatic");
        RNA_def_property_update(prop, 0, "rna_Modifier_update");
-       
+
+       prop = RNA_def_property(srna, "loop_slide", PROP_BOOLEAN, PROP_NONE);
+       RNA_def_property_boolean_negative_sdna(prop, NULL, "flags", MOD_BEVEL_EVEN_WIDTHS);
+       RNA_def_property_ui_text(prop, "Loop Slide", "Prefer sliding along edges to having even widths");
+       RNA_def_property_update(prop, 0, "rna_Modifier_update");
 }
 
 static void rna_def_modifier_shrinkwrap(BlenderRNA *brna)
@@ -2910,7 +3098,7 @@ static void rna_def_modifier_simpledeform(BlenderRNA *brna)
 
        prop = RNA_def_property(srna, "factor", PROP_FLOAT, PROP_NONE);
        RNA_def_property_range(prop, -FLT_MAX, FLT_MAX);
-       RNA_def_property_ui_range(prop, -10, 10, 1, 3);
+       RNA_def_property_ui_range(prop, -10.0, 10.0, 1.0, 3);
        RNA_def_property_ui_text(prop, "Factor", "Amount to deform object");
        RNA_def_property_update(prop, 0, "rna_Modifier_update");
 
@@ -2918,7 +3106,7 @@ static void rna_def_modifier_simpledeform(BlenderRNA *brna)
        RNA_def_property_float_sdna(prop, NULL, "factor");
        RNA_def_property_range(prop, -FLT_MAX, FLT_MAX);
        RNA_def_property_float_default(prop, DEG2RADF(45.0f));
-       RNA_def_property_ui_range(prop, -M_PI, M_PI, DEG2RAD(1), 3);
+       RNA_def_property_ui_range(prop, DEG2RAD(-360.0), DEG2RAD(360.0), 10.0, 3);
        RNA_def_property_ui_text(prop, "Angle", "Angle of deformation");
        RNA_def_property_update(prop, 0, "rna_Modifier_update");
 
@@ -3114,7 +3302,7 @@ static void rna_def_modifier_screw(BlenderRNA *brna)
        RNA_def_property_update(prop, 0, "rna_Modifier_update");
 
        prop = RNA_def_property(srna, "angle", PROP_FLOAT, PROP_ANGLE);
-       RNA_def_property_ui_range(prop, -M_PI * 2, M_PI * 2, 2, -1);
+       RNA_def_property_ui_range(prop, -M_PI * 2, M_PI * 2, 10, -1);
        RNA_def_property_range(prop, -FLT_MAX, FLT_MAX);
        RNA_def_property_ui_text(prop, "Angle", "Angle of revolution");
        RNA_def_property_update(prop, 0, "rna_Modifier_update");
@@ -3167,13 +3355,6 @@ static void rna_def_modifier_uvwarp(BlenderRNA *brna)
        StructRNA *srna;
        PropertyRNA *prop;
 
-       static EnumPropertyItem uvwarp_axis[] = {
-               {0, "X", 0, "X", ""},
-               {1, "Y", 0, "Y", ""},
-               {2, "Z", 0, "Z", ""},
-               {0, NULL, 0, NULL, NULL}
-       };
-
        srna = RNA_def_struct(brna, "UVWarpModifier", "Modifier");
        RNA_def_struct_ui_text(srna, "UVWarp Modifier", "Add target position to uv coordinates");
        RNA_def_struct_sdna(srna, "UVWarpModifierData");
@@ -3181,13 +3362,13 @@ static void rna_def_modifier_uvwarp(BlenderRNA *brna)
 
        prop = RNA_def_property(srna, "axis_u", PROP_ENUM, PROP_NONE);
        RNA_def_property_enum_sdna(prop, NULL, "axis_u");
-       RNA_def_property_enum_items(prop, uvwarp_axis);
+       RNA_def_property_enum_items(prop, rna_enum_object_axis_unsigned_items);
        RNA_def_property_ui_text(prop, "U-Axis", "Pole axis for rotation");
        RNA_def_property_update(prop, 0, "rna_Modifier_update");
 
        prop = RNA_def_property(srna, "axis_v", PROP_ENUM, PROP_NONE);
        RNA_def_property_enum_sdna(prop, NULL, "axis_v");
-       RNA_def_property_enum_items(prop, uvwarp_axis);
+       RNA_def_property_enum_items(prop, rna_enum_object_axis_unsigned_items);
        RNA_def_property_ui_text(prop, "V-Axis", "Pole axis for rotation");
        RNA_def_property_update(prop, 0, "rna_Modifier_update");
 
@@ -3331,7 +3512,7 @@ static void rna_def_modifier_weightvgedit(BlenderRNA *brna)
        prop = RNA_def_property(srna, "falloff_type", PROP_ENUM, PROP_NONE);
        RNA_def_property_enum_items(prop, weightvg_edit_falloff_type_items);
        RNA_def_property_ui_text(prop, "Falloff Type", "How weights are mapped to their new values");
-       RNA_def_property_translation_context(prop, BLF_I18NCONTEXT_ID_CURVE); /* Abusing id_curve :/ */
+       RNA_def_property_translation_context(prop, BLT_I18NCONTEXT_ID_CURVE); /* Abusing id_curve :/ */
        RNA_def_property_update(prop, 0, "rna_Modifier_update");
 
        prop = RNA_def_property(srna, "use_add", PROP_BOOLEAN, PROP_NONE);
@@ -3537,7 +3718,7 @@ static void rna_def_modifier_weightvgproximity(BlenderRNA *brna)
        prop = RNA_def_property(srna, "falloff_type", PROP_ENUM, PROP_NONE);
        RNA_def_property_enum_items(prop, weightvg_proximity_falloff_type_items);
        RNA_def_property_ui_text(prop, "Falloff Type", "How weights are mapped to their new values");
-       RNA_def_property_translation_context(prop, BLF_I18NCONTEXT_ID_CURVE); /* Abusing id_curve :/ */
+       RNA_def_property_translation_context(prop, BLT_I18NCONTEXT_ID_CURVE); /* Abusing id_curve :/ */
        RNA_def_property_update(prop, 0, "rna_Modifier_update");
 
        /* Common masking properties. */
@@ -3838,13 +4019,13 @@ static void rna_def_modifier_triangulate(BlenderRNA *brna)
 
        prop = RNA_def_property(srna, "quad_method", PROP_ENUM, PROP_NONE);
        RNA_def_property_enum_sdna(prop, NULL, "quad_method");
-       RNA_def_property_enum_items(prop, modifier_triangulate_quad_method_items);
+       RNA_def_property_enum_items(prop, rna_enum_modifier_triangulate_quad_method_items);
        RNA_def_property_ui_text(prop, "Quad Method", "Method for splitting the quads into triangles");
        RNA_def_property_update(prop, 0, "rna_Modifier_update");
 
        prop = RNA_def_property(srna, "ngon_method", PROP_ENUM, PROP_NONE);
        RNA_def_property_enum_sdna(prop, NULL, "ngon_method");
-       RNA_def_property_enum_items(prop, modifier_triangulate_ngon_method_items);
+       RNA_def_property_enum_items(prop, rna_enum_modifier_triangulate_ngon_method_items);
        RNA_def_property_ui_text(prop, "Polygon Method", "Method for splitting the polygons into triangles");
        RNA_def_property_update(prop, 0, "rna_Modifier_update");
 }
@@ -3949,13 +4130,13 @@ static void rna_def_modifier_meshcache(BlenderRNA *brna)
        /* Axis Conversion */
        prop = RNA_def_property(srna, "forward_axis", PROP_ENUM, PROP_NONE);
        RNA_def_property_enum_sdna(prop, NULL, "forward_axis");
-       RNA_def_property_enum_items(prop, object_axis_items);
+       RNA_def_property_enum_items(prop, rna_enum_object_axis_items);
        RNA_def_property_ui_text(prop, "Forward", "");
        RNA_def_property_update(prop, 0, "rna_Modifier_update");
 
        prop = RNA_def_property(srna, "up_axis", PROP_ENUM, PROP_NONE);
        RNA_def_property_enum_sdna(prop, NULL, "up_axis");
-       RNA_def_property_enum_items(prop, object_axis_items);
+       RNA_def_property_enum_items(prop, rna_enum_object_axis_items);
        RNA_def_property_ui_text(prop, "Up", "");
        RNA_def_property_update(prop, 0, "rna_Modifier_update");
 
@@ -4121,22 +4302,16 @@ static void rna_def_modifier_datatransfer(BlenderRNA *brna)
        PropertyRNA *prop;
 
        static EnumPropertyItem DT_layer_vert_items[] = {
+               {DT_TYPE_MDEFORMVERT, "VGROUP_WEIGHTS", 0, "Vertex Group(s)", "Transfer active or all vertex groups"},
+#if 0  /* TODO */
+               {DT_TYPE_SHAPEKEY, "SHAPEKEYS", 0, "Shapekey(s)", "Transfer active or all shape keys"},
+#endif
 #if 0  /* XXX When SkinModifier is enabled, it seems to erase its own CD_MVERT_SKIN layer from final DM :( */
                {DT_TYPE_SKIN, "SKIN", 0, "Skin Weight", "Transfer skin weights"},
 #endif
                {DT_TYPE_BWEIGHT_VERT, "BEVEL_WEIGHT_VERT", 0, "Bevel Weight", "Transfer bevel weights"},
                {0, NULL, 0, NULL, NULL}
        };
-       static EnumPropertyItem DT_layer_vert_vgroup_items[] = {
-               {DT_TYPE_MDEFORMVERT, "VGROUP_WEIGHTS", 0, "Vertex Group(s)", "Transfer active or all vertex groups"},
-               {0, NULL, 0, NULL, NULL}
-       };
-#if 0  /* XXX For now, would like to finish/merge work from 2014 gsoc first. */
-       static EnumPropertyItem DT_layer_vert_shapekey_items[] = {
-               {DT_TYPE_SHAPEKEY, "SHAPEKEYS", 0, "Shapekey(s)", "Transfer active or all shape keys"},
-               {0, NULL, 0, NULL, NULL}
-       };
-#endif
 
        static EnumPropertyItem DT_layer_edge_items[] = {
                {DT_TYPE_SHARP_EDGE, "SHARP_EDGE", 0, "Sharp", "Transfer sharp mark"},
@@ -4149,13 +4324,7 @@ static void rna_def_modifier_datatransfer(BlenderRNA *brna)
 
        static EnumPropertyItem DT_layer_loop_items[] = {
                {DT_TYPE_LNOR, "CUSTOM_NORMAL", 0, "Custom Normals", "Transfer custom normals"},
-               {0, NULL, 0, NULL, NULL}
-       };
-       static EnumPropertyItem DT_layer_loop_vcol_items[] = {
                {DT_TYPE_VCOL, "VCOL", 0, "VCol", "Vertex (face corners) colors"},
-               {0, NULL, 0, NULL, NULL}
-       };
-       static EnumPropertyItem DT_layer_loop_uv_items[] = {
                {DT_TYPE_UV, "UV", 0, "UVs", "Transfer UV layers"},
                {0, NULL, 0, NULL, NULL}
        };
@@ -4179,7 +4348,7 @@ static void rna_def_modifier_datatransfer(BlenderRNA *brna)
        RNA_def_property_update(prop, 0, "rna_Modifier_dependency_update");
 
        prop = RNA_def_boolean(srna, "use_object_transform", true, "Object Transform",
-                              "Evaluate source and destination meshes in their respective object spaces");
+                              "Evaluate source and destination meshes in global space");
        RNA_def_property_boolean_sdna(prop, NULL, "flags", MOD_DATATRANSFER_OBSRC_TRANSFORM);
        RNA_def_property_update(prop, 0, "rna_Modifier_update");
 
@@ -4205,58 +4374,47 @@ static void rna_def_modifier_datatransfer(BlenderRNA *brna)
                            "Which vertex data layers to transfer");
        RNA_def_property_flag(prop, PROP_ENUM_FLAG);
        RNA_def_property_enum_sdna(prop, NULL, "data_types");
-       RNA_def_property_update(prop, 0, "rna_DataTransferModifier_data_types_update");
-       prop = RNA_def_enum(srna, "data_types_verts_vgroup", DT_layer_vert_vgroup_items, 0, "Vertex Data Types",
-                           "Which vertex data layers to transfer");
-       RNA_def_property_flag(prop, PROP_ENUM_FLAG);
-       RNA_def_property_enum_sdna(prop, NULL, "data_types");
+       RNA_def_property_enum_funcs(prop, NULL, "rna_DataTransferModifier_verts_data_types_set", NULL);
        RNA_def_property_update(prop, 0, "rna_DataTransferModifier_data_types_update");
 
        prop = RNA_def_enum(srna, "data_types_edges", DT_layer_edge_items, 0, "Edge Data Types",
                            "Which edge data layers to transfer");
        RNA_def_property_flag(prop, PROP_ENUM_FLAG);
        RNA_def_property_enum_sdna(prop, NULL, "data_types");
+       RNA_def_property_enum_funcs(prop, NULL, "rna_DataTransferModifier_edges_data_types_set", NULL);
        RNA_def_property_update(prop, 0, "rna_DataTransferModifier_data_types_update");
 
        prop = RNA_def_enum(srna, "data_types_loops", DT_layer_loop_items, 0, "Face Corner Data Types",
                            "Which face corner data layers to transfer");
        RNA_def_property_flag(prop, PROP_ENUM_FLAG);
        RNA_def_property_enum_sdna(prop, NULL, "data_types");
-       RNA_def_property_update(prop, 0, "rna_DataTransferModifier_data_types_update");
-       prop = RNA_def_enum(srna, "data_types_loops_vcol", DT_layer_loop_vcol_items, 0, "Face Corner Data Types",
-                           "Which face corner data layers to transfer");
-       RNA_def_property_flag(prop, PROP_ENUM_FLAG);
-       RNA_def_property_enum_sdna(prop, NULL, "data_types");
-       RNA_def_property_update(prop, 0, "rna_DataTransferModifier_data_types_update");
-       prop = RNA_def_enum(srna, "data_types_loops_uv", DT_layer_loop_uv_items, 0, "Face Corner Data Types",
-                           "Which face corner data layers to transfer");
-       RNA_def_property_flag(prop, PROP_ENUM_FLAG);
-       RNA_def_property_enum_sdna(prop, NULL, "data_types");
+       RNA_def_property_enum_funcs(prop, NULL, "rna_DataTransferModifier_loops_data_types_set", NULL);
        RNA_def_property_update(prop, 0, "rna_DataTransferModifier_data_types_update");
 
        prop = RNA_def_enum(srna, "data_types_polys", DT_layer_poly_items, 0, "Poly Data Types",
                            "Which poly data layers to transfer");
        RNA_def_property_flag(prop, PROP_ENUM_FLAG);
        RNA_def_property_enum_sdna(prop, NULL, "data_types");
+       RNA_def_property_enum_funcs(prop, NULL, "rna_DataTransferModifier_polys_data_types_set", NULL);
        RNA_def_property_update(prop, 0, "rna_DataTransferModifier_data_types_update");
 
        /* Mapping methods. */
-       prop = RNA_def_enum(srna, "vert_mapping", DT_method_vertex_items, MREMAP_MODE_VERT_NEAREST, "Vertex Mapping",
+       prop = RNA_def_enum(srna, "vert_mapping", rna_enum_dt_method_vertex_items, MREMAP_MODE_VERT_NEAREST, "Vertex Mapping",
                            "Method used to map source vertices to destination ones");
        RNA_def_property_enum_sdna(prop, NULL, "vmap_mode");
        RNA_def_property_update(prop, 0, "rna_Modifier_update");
 
-       prop = RNA_def_enum(srna, "edge_mapping", DT_method_edge_items, MREMAP_MODE_EDGE_NEAREST, "Edge Mapping",
+       prop = RNA_def_enum(srna, "edge_mapping", rna_enum_dt_method_edge_items, MREMAP_MODE_EDGE_NEAREST, "Edge Mapping",
                            "Method used to map source edges to destination ones");
        RNA_def_property_enum_sdna(prop, NULL, "emap_mode");
        RNA_def_property_update(prop, 0, "rna_Modifier_update");
 
-       prop = RNA_def_enum(srna, "loop_mapping", DT_method_loop_items, MREMAP_MODE_LOOP_NEAREST_POLYNOR,
+       prop = RNA_def_enum(srna, "loop_mapping", rna_enum_dt_method_loop_items, MREMAP_MODE_LOOP_NEAREST_POLYNOR,
                            "Face Corner Mapping", "Method used to map source faces' corners to destination ones");
        RNA_def_property_enum_sdna(prop, NULL, "lmap_mode");
        RNA_def_property_update(prop, 0, "rna_Modifier_update");
 
-       prop = RNA_def_enum(srna, "poly_mapping", DT_method_poly_items, MREMAP_MODE_POLY_NEAREST, "Face Mapping",
+       prop = RNA_def_enum(srna, "poly_mapping", rna_enum_dt_method_poly_items, MREMAP_MODE_POLY_NEAREST, "Face Mapping",
                            "Method used to map source faces to destination ones");
        RNA_def_property_enum_sdna(prop, NULL, "pmap_mode");
        RNA_def_property_update(prop, 0, "rna_Modifier_update");
@@ -4287,60 +4445,60 @@ static void rna_def_modifier_datatransfer(BlenderRNA *brna)
        RNA_def_property_update(prop, 0, "rna_Modifier_update");
 
        /* How to handle multi-layers types of data. */
-       prop = RNA_def_enum(srna, "layers_vgroup_select_src", DT_layers_select_src_items, DT_LAYERS_ALL_SRC,
+       prop = RNA_def_enum(srna, "layers_vgroup_select_src", rna_enum_dt_layers_select_src_items, DT_LAYERS_ALL_SRC,
                            "Source Layers Selection", "Which layers to transfer, in case of multi-layers types");
        RNA_def_property_enum_sdna(prop, NULL, "layers_select_src[DT_MULTILAYER_INDEX_MDEFORMVERT]");
        RNA_def_property_enum_funcs(prop, NULL, NULL, "rna_DataTransferModifier_layers_select_src_itemf");
        RNA_def_property_update(prop, 0, "rna_Modifier_update");
 
 #if 0
-       prop = RNA_def_enum(srna, "layers_shapekey_select_src", DT_layers_select_src_items, DT_LAYERS_ALL_SRC,
+       prop = RNA_def_enum(srna, "layers_shapekey_select_src", rna_enum_dt_layers_select_src_items, DT_LAYERS_ALL_SRC,
                            "Source Layers Selection", "Which layers to transfer, in case of multi-layers types");
        RNA_def_property_enum_sdna(prop, NULL, "layers_select_src[DT_MULTILAYER_INDEX_SHAPEKEY]");
        RNA_def_property_enum_funcs(prop, NULL, NULL, "rna_DataTransferModifier_layers_select_src_itemf");
        RNA_def_property_update(prop, 0, "rna_Modifier_update");
 #endif
 
-       prop = RNA_def_enum(srna, "layers_vcol_select_src", DT_layers_select_src_items, DT_LAYERS_ALL_SRC,
+       prop = RNA_def_enum(srna, "layers_vcol_select_src", rna_enum_dt_layers_select_src_items, DT_LAYERS_ALL_SRC,
                            "Source Layers Selection", "Which layers to transfer, in case of multi-layers types");
        RNA_def_property_enum_sdna(prop, NULL, "layers_select_src[DT_MULTILAYER_INDEX_VCOL]");
        RNA_def_property_enum_funcs(prop, NULL, NULL, "rna_DataTransferModifier_layers_select_src_itemf");
        RNA_def_property_update(prop, 0, "rna_Modifier_update");
 
-       prop = RNA_def_enum(srna, "layers_uv_select_src", DT_layers_select_src_items, DT_LAYERS_ALL_SRC,
+       prop = RNA_def_enum(srna, "layers_uv_select_src", rna_enum_dt_layers_select_src_items, DT_LAYERS_ALL_SRC,
                            "Source Layers Selection", "Which layers to transfer, in case of multi-layers types");
        RNA_def_property_enum_sdna(prop, NULL, "layers_select_src[DT_MULTILAYER_INDEX_UV]");
        RNA_def_property_enum_funcs(prop, NULL, NULL, "rna_DataTransferModifier_layers_select_src_itemf");
        RNA_def_property_update(prop, 0, "rna_Modifier_update");
 
-       prop = RNA_def_enum(srna, "layers_vgroup_select_dst", DT_layers_select_dst_items, DT_LAYERS_NAME_DST,
+       prop = RNA_def_enum(srna, "layers_vgroup_select_dst", rna_enum_dt_layers_select_dst_items, DT_LAYERS_NAME_DST,
                            "Destination Layers Matching", "How to match source and destination layers");
        RNA_def_property_enum_sdna(prop, NULL, "layers_select_dst[DT_MULTILAYER_INDEX_MDEFORMVERT]");
        RNA_def_property_enum_funcs(prop, NULL, NULL, "rna_DataTransferModifier_layers_select_dst_itemf");
        RNA_def_property_update(prop, 0, "rna_Modifier_update");
 
 #if 0
-       prop = RNA_def_enum(srna, "layers_shapekey_select_dst", DT_layers_select_dst_items, DT_LAYERS_NAME_DST,
+       prop = RNA_def_enum(srna, "layers_shapekey_select_dst", rna_enum_dt_layers_select_dst_items, DT_LAYERS_NAME_DST,
                            "Destination Layers Matching", "How to match source and destination layers");
        RNA_def_property_enum_sdna(prop, NULL, "layers_select_dst[DT_MULTILAYER_INDEX_SHAPEKEY]");
        RNA_def_property_enum_funcs(prop, NULL, NULL, "rna_DataTransferModifier_layers_select_dst_itemf");
        RNA_def_property_update(prop, 0, "rna_Modifier_update");
 #endif
 
-       prop = RNA_def_enum(srna, "layers_vcol_select_dst", DT_layers_select_dst_items, DT_LAYERS_NAME_DST,
+       prop = RNA_def_enum(srna, "layers_vcol_select_dst", rna_enum_dt_layers_select_dst_items, DT_LAYERS_NAME_DST,
                            "Destination Layers Matching", "How to match source and destination layers");
        RNA_def_property_enum_sdna(prop, NULL, "layers_select_dst[DT_MULTILAYER_INDEX_VCOL]");
        RNA_def_property_enum_funcs(prop, NULL, NULL, "rna_DataTransferModifier_layers_select_dst_itemf");
        RNA_def_property_update(prop, 0, "rna_Modifier_update");
 
-       prop = RNA_def_enum(srna, "layers_uv_select_dst", DT_layers_select_dst_items, DT_LAYERS_NAME_DST,
+       prop = RNA_def_enum(srna, "layers_uv_select_dst", rna_enum_dt_layers_select_dst_items, DT_LAYERS_NAME_DST,
                            "Destination Layers Matching", "How to match source and destination layers");
        RNA_def_property_enum_sdna(prop, NULL, "layers_select_dst[DT_MULTILAYER_INDEX_UV]");
        RNA_def_property_enum_funcs(prop, NULL, NULL, "rna_DataTransferModifier_layers_select_dst_itemf");
        RNA_def_property_update(prop, 0, "rna_Modifier_update");
 
        /* Mix stuff */
-       prop = RNA_def_enum(srna, "mix_mode", DT_mix_mode_items, CDT_MIX_TRANSFER, "Mix Mode",
+       prop = RNA_def_enum(srna, "mix_mode", rna_enum_dt_mix_mode_items, CDT_MIX_TRANSFER, "Mix Mode",
                           "How to affect destination elements with source values");
        RNA_def_property_enum_funcs(prop, NULL, NULL, "rna_DataTransferModifier_mix_mode_itemf");
        RNA_def_property_update(prop, 0, "rna_Modifier_update");
@@ -4361,6 +4519,77 @@ static void rna_def_modifier_datatransfer(BlenderRNA *brna)
        RNA_def_property_update(prop, 0, "rna_Modifier_update");
 }
 
+static void rna_def_modifier_normaledit(BlenderRNA *brna)
+{
+       StructRNA *srna;
+       PropertyRNA *prop;
+
+       static EnumPropertyItem prop_mode_items[] = {
+               {MOD_NORMALEDIT_MODE_RADIAL, "RADIAL", 0, "Radial",
+                       "From an ellipsoid (shape defined by the boundbox's dimensions, target is optional)"},
+               {MOD_NORMALEDIT_MODE_DIRECTIONAL, "DIRECTIONAL", 0, "Directional",
+                       "Normals 'track' (point to) the target object"},
+               {0, NULL, 0, NULL, NULL}
+       };
+
+       static EnumPropertyItem prop_mix_mode_items[] = {
+               {MOD_NORMALEDIT_MIX_COPY, "COPY", 0, "Copy", "Copy new normals (overwrite existing)"},
+               {MOD_NORMALEDIT_MIX_ADD, "ADD", 0, "Add", "Copy sum of new and old normals"},
+               {MOD_NORMALEDIT_MIX_SUB, "SUB", 0, "Subtract", "Copy new normals minus old normals"},
+               {MOD_NORMALEDIT_MIX_MUL, "MUL", 0, "Multiply", "Copy product of old and new normals (*not* cross product)"},
+               {0, NULL, 0, NULL, NULL}
+       };
+
+       srna = RNA_def_struct(brna, "NormalEditModifier", "Modifier");
+       RNA_def_struct_ui_text(srna, "Normal Edit Modifier", "Modifier affecting/generating custom normals");
+       RNA_def_struct_sdna(srna, "NormalEditModifierData");
+       RNA_def_struct_ui_icon(srna, ICON_MOD_NORMALEDIT);
+
+       prop = RNA_def_property(srna, "mode", PROP_ENUM, PROP_NONE);
+       RNA_def_property_enum_items(prop, prop_mode_items);
+       RNA_def_property_ui_text(prop, "Mode", "How to affect (generate) normals");
+       RNA_def_property_update(prop, 0, "rna_Modifier_update");
+
+       prop = RNA_def_float_array(srna, "offset", 3, NULL, -FLT_MAX, FLT_MAX, "Offset",
+                                  "Offset from object's center", -100.0f, 100.0f);
+       RNA_def_property_subtype(prop, PROP_COORDS);
+       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, prop_mix_mode_items);
+       RNA_def_property_ui_text(prop, "Mix Mode", "How to mix generated normals with existing ones");
+       RNA_def_property_update(prop, 0, "rna_Modifier_update");
+
+       prop = RNA_def_float(srna, "mix_factor", 1.0f, 0.0f, 1.0f, "Mix Factor",
+                            "How much of generated normals to mix with exiting ones", 0.0f, 1.0f);
+       RNA_def_property_update(prop, 0, "rna_Modifier_update");
+
+       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 for selecting/weighting the affected areas");
+       RNA_def_property_string_funcs(prop, NULL, NULL, "rna_NormalEditModifier_defgrp_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_NORMALEDIT_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, "target", PROP_POINTER, PROP_NONE);
+       RNA_def_property_ui_text(prop, "Target", "Target object used to affect normals");
+       RNA_def_property_pointer_funcs(prop, NULL, "rna_NormalEditModifier_target_set", NULL, NULL);
+       RNA_def_property_flag(prop, PROP_EDITABLE | PROP_ID_SELF_CHECK);
+       RNA_def_property_update(prop, 0, "rna_Modifier_dependency_update");
+
+       prop = RNA_def_property(srna, "use_direction_parallel", PROP_BOOLEAN, PROP_NONE);
+       RNA_def_property_boolean_sdna(prop, NULL, "flag", MOD_NORMALEDIT_USE_DIRECTION_PARALLEL);
+       RNA_def_property_boolean_default(prop, true);
+       RNA_def_property_ui_text(prop, "Parallel Normals",
+                                "Use same direction for all normals, from origin to target's center "
+                                "(Directional mode only)");
+       RNA_def_property_update(prop, 0, "rna_Modifier_update");
+}
+
 void RNA_def_modifier(BlenderRNA *brna)
 {
        StructRNA *srna;
@@ -4384,7 +4613,7 @@ void RNA_def_modifier(BlenderRNA *brna)
        prop = RNA_def_property(srna, "type", PROP_ENUM, PROP_NONE);
        RNA_def_property_clear_flag(prop, PROP_EDITABLE);
        RNA_def_property_enum_sdna(prop, NULL, "type");
-       RNA_def_property_enum_items(prop, modifier_type_items);
+       RNA_def_property_enum_items(prop, rna_enum_object_modifier_type_items);
        RNA_def_property_ui_text(prop, "Type", "");
        
        /* flags */
@@ -4443,6 +4672,7 @@ void RNA_def_modifier(BlenderRNA *brna)
        rna_def_modifier_displace(brna);
        rna_def_modifier_uvproject(brna);
        rna_def_modifier_smooth(brna);
+       rna_def_modifier_correctivesmooth(brna);
        rna_def_modifier_cast(brna);
        rna_def_modifier_meshdeform(brna);
        rna_def_modifier_particlesystem(brna);
@@ -4475,6 +4705,7 @@ void RNA_def_modifier(BlenderRNA *brna)
        rna_def_modifier_laplaciandeform(brna);
        rna_def_modifier_wireframe(brna);
        rna_def_modifier_datatransfer(brna);
+       rna_def_modifier_normaledit(brna);
 }
 
 #endif