Merge branch 'master' into blender2.8
[blender.git] / source / blender / makesrna / intern / rna_modifier.c
index f9b848744d65b4fb1d2c14741171ca07e1472c99..dda2ee1e415fbd0f910f1aa5262aedc09e36d0da 100644 (file)
 
 #include "BKE_animsys.h"
 #include "BKE_data_transfer.h"
-#include "BKE_DerivedMesh.h"
 #include "BKE_dynamicpaint.h"
 #include "BKE_effect.h"
 #include "BKE_mesh_mapping.h"
 #include "BKE_mesh_remap.h"
 #include "BKE_multires.h"
+#include "BKE_ocean.h"
 #include "BKE_smoke.h" /* For smokeModifier_free & smokeModifier_createType */
 
 #include "RNA_access.h"
@@ -68,6 +68,7 @@ const EnumPropertyItem rna_enum_object_modifier_type_items[] = {
        {eModifierType_MeshCache, "MESH_CACHE", ICON_MOD_MESHDEFORM, "Mesh Cache", ""},
        {eModifierType_MeshSequenceCache, "MESH_SEQUENCE_CACHE", ICON_MOD_MESHDEFORM, "Mesh Sequence Cache", ""},
        {eModifierType_NormalEdit, "NORMAL_EDIT", ICON_MOD_NORMALEDIT, "Normal Edit", ""},
+       {eModifierType_WeightedNormal, "WEIGHTED_NORMAL", ICON_MOD_NORMALEDIT, "Weighted Normal", ""},
        {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", ""},
@@ -94,17 +95,17 @@ const EnumPropertyItem rna_enum_object_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", ""},
-       {eModifierType_LaplacianSmooth, "LAPLACIANSMOOTH", ICON_MOD_SMOOTH, "Laplacian Smooth", ""},
        {eModifierType_LaplacianDeform, "LAPLACIANDEFORM", ICON_MOD_MESHDEFORM, "Laplacian Deform", ""},
        {eModifierType_Lattice, "LATTICE", ICON_MOD_LATTICE, "Lattice", ""},
        {eModifierType_MeshDeform, "MESH_DEFORM", ICON_MOD_MESHDEFORM, "Mesh Deform", ""},
        {eModifierType_Shrinkwrap, "SHRINKWRAP", ICON_MOD_SHRINKWRAP, "Shrinkwrap", ""},
        {eModifierType_SimpleDeform, "SIMPLE_DEFORM", ICON_MOD_SIMPLEDEFORM, "Simple Deform", ""},
        {eModifierType_Smooth, "SMOOTH", ICON_MOD_SMOOTH, "Smooth", ""},
+       {eModifierType_CorrectiveSmooth, "CORRECTIVE_SMOOTH", ICON_MOD_SMOOTH, "Smooth Corrective", ""},
+       {eModifierType_LaplacianSmooth, "LAPLACIANSMOOTH", ICON_MOD_SMOOTH, "Smooth Laplacian", ""},
        {eModifierType_SurfaceDeform, "SURFACE_DEFORM", ICON_MOD_MESHDEFORM, "Surface Deform", ""},
        {eModifierType_Warp, "WARP", ICON_MOD_WARP, "Warp", ""},
        {eModifierType_Wave, "WAVE", ICON_MOD_WAVE, "Wave", ""},
@@ -119,7 +120,7 @@ const EnumPropertyItem rna_enum_object_modifier_type_items[] = {
        {eModifierType_ParticleSystem, "PARTICLE_SYSTEM", ICON_MOD_PARTICLES, "Particle System", ""},
        {eModifierType_Smoke, "SMOKE", ICON_MOD_SMOKE, "Smoke", ""},
        {eModifierType_Softbody, "SOFT_BODY", ICON_MOD_SOFT, "Soft Body", ""},
-       {eModifierType_Surface, "SURFACE", ICON_MOD_PHYSICS, "Surface", ""},
+       {eModifierType_Surface, "SURFACE", ICON_MODIFIER, "Surface", ""},
        {0, NULL, 0, NULL, NULL}
 };
 
@@ -139,6 +140,24 @@ const EnumPropertyItem rna_enum_modifier_triangulate_ngon_method_items[] = {
        {0, NULL, 0, NULL, NULL}
 };
 
+const EnumPropertyItem rna_enum_modifier_shrinkwrap_mode_items[] = {
+       {MOD_SHRINKWRAP_ON_SURFACE, "ON_SURFACE", 0, "On Surface",
+                                   "The point is constrained to the surface of the target object, "
+                                   "with distance offset towards the original point location"},
+       {MOD_SHRINKWRAP_INSIDE, "INSIDE", 0, "Inside",
+                               "The point is constrained to be inside the target object"},
+       {MOD_SHRINKWRAP_OUTSIDE, "OUTSIDE", 0, "Outside",
+                                "The point is constrained to be outside the target object"},
+       {MOD_SHRINKWRAP_OUTSIDE_SURFACE, "OUTSIDE_SURFACE", 0, "Outside Surface",
+                                        "The point is constrained to the surface of the target object, "
+                                        "with distance offset always to the outside, towards or away from the original location"},
+       {MOD_SHRINKWRAP_ABOVE_SURFACE, "ABOVE_SURFACE", 0, "Above Surface",
+                                      "The point is constrained to the surface of the target object, "
+                                      "with distance offset applied exactly along the target normal"},
+       {0, NULL, 0, NULL, NULL}
+};
+
+
 #ifndef RNA_RUNTIME
 /* use eWarp_Falloff_*** & eHook_Falloff_***, they're in sync */
 static const EnumPropertyItem modifier_warp_falloff_items[] = {
@@ -286,12 +305,15 @@ const EnumPropertyItem rna_enum_axis_flag_xyz_items[] = {
 
 #include "BKE_cachefile.h"
 #include "BKE_context.h"
-#include "BKE_depsgraph.h"
 #include "BKE_library.h"
+#include "BKE_mesh_runtime.h"
 #include "BKE_modifier.h"
 #include "BKE_object.h"
 #include "BKE_particle.h"
 
+#include "DEG_depsgraph.h"
+#include "DEG_depsgraph_build.h"
+
 #ifdef WITH_ALEMBIC
 #  include "ABC_alembic.h"
 #endif
@@ -411,6 +433,8 @@ static StructRNA *rna_Modifier_refine(struct PointerRNA *ptr)
                        return &RNA_MeshSequenceCacheModifier;
                case eModifierType_SurfaceDeform:
                        return &RNA_SurfaceDeformModifier;
+               case eModifierType_WeightedNormal:
+                       return &RNA_WeightedNormalModifier;
                /* Default */
                case eModifierType_None:
                case eModifierType_ShapeKey:
@@ -453,14 +477,14 @@ static char *rna_Modifier_path(PointerRNA *ptr)
 
 static void rna_Modifier_update(Main *UNUSED(bmain), Scene *UNUSED(scene), PointerRNA *ptr)
 {
-       DAG_id_tag_update(ptr->id.data, OB_RECALC_DATA);
+       DEG_id_tag_update(ptr->id.data, OB_RECALC_DATA);
        WM_main_add_notifier(NC_OBJECT | ND_MODIFIER, ptr->id.data);
 }
 
 static void rna_Modifier_dependency_update(Main *bmain, Scene *scene, PointerRNA *ptr)
 {
        rna_Modifier_update(bmain, scene, ptr);
-       DAG_relations_tag_update(bmain);
+       DEG_relations_tag_update(bmain);
 }
 
 /* Vertex Groups */
@@ -501,6 +525,7 @@ RNA_MOD_VGROUP_NAME_SET(WeightVGMix, defgrp_name_b);
 RNA_MOD_VGROUP_NAME_SET(WeightVGMix, mask_defgrp_name);
 RNA_MOD_VGROUP_NAME_SET(WeightVGProximity, defgrp_name);
 RNA_MOD_VGROUP_NAME_SET(WeightVGProximity, mask_defgrp_name);
+RNA_MOD_VGROUP_NAME_SET(WeightedNormal, defgrp_name);
 RNA_MOD_VGROUP_NAME_SET(Wireframe, defgrp_name);
 
 static void rna_ExplodeModifier_vgroup_get(PointerRNA *ptr, char *value)
@@ -689,15 +714,13 @@ static int rna_MultiresModifier_filepath_length(PointerRNA *ptr)
 static int rna_ShrinkwrapModifier_face_cull_get(PointerRNA *ptr)
 {
        ShrinkwrapModifierData *swm = (ShrinkwrapModifierData *)ptr->data;
-       return swm->shrinkOpts & (MOD_SHRINKWRAP_CULL_TARGET_FRONTFACE | MOD_SHRINKWRAP_CULL_TARGET_BACKFACE);
+       return swm->shrinkOpts & MOD_SHRINKWRAP_CULL_TARGET_MASK;
 }
 
 static void rna_ShrinkwrapModifier_face_cull_set(struct PointerRNA *ptr, int value)
 {
        ShrinkwrapModifierData *swm = (ShrinkwrapModifierData *)ptr->data;
-
-       swm->shrinkOpts =
-           (swm->shrinkOpts & ~(MOD_SHRINKWRAP_CULL_TARGET_FRONTFACE | MOD_SHRINKWRAP_CULL_TARGET_BACKFACE)) | value;
+       swm->shrinkOpts = (swm->shrinkOpts & ~MOD_SHRINKWRAP_CULL_TARGET_MASK) | value;
 }
 
 static bool rna_MeshDeformModifier_is_bound_get(PointerRNA *ptr)
@@ -714,7 +737,7 @@ static PointerRNA rna_SoftBodyModifier_settings_get(PointerRNA *ptr)
 static PointerRNA rna_SoftBodyModifier_point_cache_get(PointerRNA *ptr)
 {
        Object *ob = (Object *)ptr->id.data;
-       return rna_pointer_inherit_refine(ptr, &RNA_PointCache, ob->soft->pointcache);
+       return rna_pointer_inherit_refine(ptr, &RNA_PointCache, ob->soft->shared->pointcache);
 }
 
 static PointerRNA rna_CollisionModifier_settings_get(PointerRNA *ptr)
@@ -737,8 +760,7 @@ static void rna_OceanModifier_init_update(Main *bmain, Scene *scene, PointerRNA
 {
        OceanModifierData *omd = (OceanModifierData *)ptr->data;
 
-       omd->refresh |= MOD_OCEAN_REFRESH_RESET | MOD_OCEAN_REFRESH_CLEAR_CACHE;
-
+       BKE_ocean_free_modifier_cache(omd);
        rna_Modifier_update(bmain, scene, ptr);
 }
 
@@ -752,8 +774,7 @@ static void rna_OceanModifier_ocean_chop_set(PointerRNA *ptr, float value)
        if ((old_value == 0.0f && value > 0.0f) ||
            (old_value > 0.0f && value == 0.0f))
        {
-               omd->refresh |= MOD_OCEAN_REFRESH_RESET;
-               omd->refresh |= MOD_OCEAN_REFRESH_CLEAR_CACHE;
+               BKE_ocean_free_modifier_cache(omd);
        }
 }
 
@@ -775,11 +796,11 @@ static void rna_CurveModifier_dependency_update(Main *bmain, Scene *scene, Point
 {
        CurveModifierData *cmd = (CurveModifierData *)ptr->data;
        rna_Modifier_update(bmain, scene, ptr);
-       DAG_relations_tag_update(bmain);
+       DEG_relations_tag_update(bmain);
        if (cmd->object != NULL) {
                Curve *curve = cmd->object->data;
                if ((curve->flag & CU_PATH) == 0) {
-                       DAG_id_tag_update(&curve->id, OB_RECALC_DATA);
+                       DEG_id_tag_update(&curve->id, OB_RECALC_DATA);
                }
        }
 }
@@ -788,11 +809,11 @@ static void rna_ArrayModifier_dependency_update(Main *bmain, Scene *scene, Point
 {
        ArrayModifierData *amd = (ArrayModifierData *)ptr->data;
        rna_Modifier_update(bmain, scene, ptr);
-       DAG_relations_tag_update(bmain);
+       DEG_relations_tag_update(bmain);
        if (amd->curve_ob != NULL) {
                Curve *curve = amd->curve_ob->data;
                if ((curve->flag & CU_PATH) == 0) {
-                       DAG_id_tag_update(&curve->id, OB_RECALC_DATA);
+                       DEG_id_tag_update(&curve->id, OB_RECALC_DATA);
                }
        }
 }
@@ -815,7 +836,7 @@ static void rna_DataTransferModifier_use_data_update(Main *bmain, Scene *scene,
                dtmd->data_types &= ~DT_TYPE_POLY_ALL;
        }
 
-       rna_Modifier_update(bmain, scene, ptr);
+       rna_Modifier_dependency_update(bmain, scene, ptr);
 }
 
 static void rna_DataTransferModifier_data_types_update(Main *bmain, Scene *scene, PointerRNA *ptr)
@@ -836,7 +857,7 @@ static void rna_DataTransferModifier_data_types_update(Main *bmain, Scene *scene
                dtmd->flags |= MOD_DATATRANSFER_USE_POLY;
        }
 
-       rna_Modifier_update(bmain, scene, ptr);
+       rna_Modifier_dependency_update(bmain, scene, ptr);
 }
 
 static void rna_DataTransferModifier_verts_data_types_set(struct PointerRNA *ptr, int value)
@@ -881,6 +902,9 @@ static const EnumPropertyItem *rna_DataTransferModifier_layers_select_src_itemf(
                return rna_enum_dt_layers_select_src_items;
        }
 
+       Depsgraph *depsgraph = CTX_data_depsgraph(C);
+       Scene *scene = CTX_data_scene(C);
+
        /* No active here! */
        RNA_enum_items_add_value(&item, &totitem, rna_enum_dt_layers_select_src_items, DT_LAYERS_ALL_SRC);
 
@@ -914,22 +938,18 @@ static const EnumPropertyItem *rna_DataTransferModifier_layers_select_src_itemf(
                Object *ob_src = dtmd->ob_source;
 
                if (ob_src) {
-                       DerivedMesh *dm_src;
-                       CustomData *pdata;
+                       Mesh *me_eval;
                        int num_data, i;
 
-                       dm_src = object_get_derived_final(ob_src, false);
-                       if (dm_src != NULL) {
-                               pdata = dm_src->getPolyDataLayout(dm_src);
-                               num_data = CustomData_number_of_layers(pdata, CD_MTEXPOLY);
+                       me_eval = mesh_get_eval_final(depsgraph, scene, ob_src, CD_MASK_BAREMESH | CD_MLOOPUV);
+                       num_data = CustomData_number_of_layers(&me_eval->ldata, CD_MLOOPUV);
 
-                               RNA_enum_item_add_separator(&item, &totitem);
+                       RNA_enum_item_add_separator(&item, &totitem);
 
-                               for (i = 0; i < num_data; i++) {
-                                       tmp_item.value = i;
-                                       tmp_item.identifier = tmp_item.name = CustomData_get_layer_name(pdata, CD_MTEXPOLY, i);
-                                       RNA_enum_item_add(&item, &totitem, &tmp_item);
-                               }
+                       for (i = 0; i < num_data; i++) {
+                               tmp_item.value = i;
+                               tmp_item.identifier = tmp_item.name = CustomData_get_layer_name(&me_eval->ldata, CD_MLOOPUV, i);
+                               RNA_enum_item_add(&item, &totitem, &tmp_item);
                        }
                }
        }
@@ -937,22 +957,18 @@ static const EnumPropertyItem *rna_DataTransferModifier_layers_select_src_itemf(
                Object *ob_src = dtmd->ob_source;
 
                if (ob_src) {
-                       DerivedMesh *dm_src;
-                       CustomData *ldata;
+                       Mesh *me_eval;
                        int num_data, i;
 
-                       dm_src = object_get_derived_final(ob_src, false);
-                       if (dm_src != NULL) {
-                               ldata = dm_src->getLoopDataLayout(dm_src);
-                               num_data = CustomData_number_of_layers(ldata, CD_MLOOPCOL);
+                       me_eval = mesh_get_eval_final(depsgraph, scene, ob_src, CD_MASK_BAREMESH | CD_MLOOPCOL);
+                       num_data = CustomData_number_of_layers(&me_eval->ldata, CD_MLOOPCOL);
 
-                               RNA_enum_item_add_separator(&item, &totitem);
+                       RNA_enum_item_add_separator(&item, &totitem);
 
-                               for (i = 0; i < num_data; i++) {
-                                       tmp_item.value = i;
-                                       tmp_item.identifier = tmp_item.name = CustomData_get_layer_name(ldata, CD_MLOOPCOL, i);
-                                       RNA_enum_item_add(&item, &totitem, &tmp_item);
-                               }
+                       for (i = 0; i < num_data; i++) {
+                               tmp_item.value = i;
+                               tmp_item.identifier = tmp_item.name = CustomData_get_layer_name(&me_eval->ldata, CD_MLOOPCOL, i);
+                               RNA_enum_item_add(&item, &totitem, &tmp_item);
                        }
                }
        }
@@ -1006,18 +1022,18 @@ static const EnumPropertyItem *rna_DataTransferModifier_layers_select_dst_itemf(
 
                        if (ob_dst && ob_dst->data) {
                                Mesh *me_dst;
-                               CustomData *pdata;
+                               CustomData *ldata;
                                int num_data, i;
 
                                me_dst = ob_dst->data;
-                               pdata = &me_dst->pdata;
-                               num_data = CustomData_number_of_layers(pdata, CD_MTEXPOLY);
+                               ldata = &me_dst->ldata;
+                               num_data = CustomData_number_of_layers(ldata, CD_MLOOPUV);
 
                                RNA_enum_item_add_separator(&item, &totitem);
 
                                for (i = 0; i < num_data; i++) {
                                        tmp_item.value = i;
-                                       tmp_item.identifier = tmp_item.name = CustomData_get_layer_name(pdata, CD_MTEXPOLY, i);
+                                       tmp_item.identifier = tmp_item.name = CustomData_get_layer_name(ldata, CD_MLOOPUV, i);
                                        RNA_enum_item_add(&item, &totitem, &tmp_item);
                                }
                        }
@@ -1176,15 +1192,53 @@ static void rna_ParticleInstanceModifier_particle_system_set(PointerRNA *ptr, co
 
 #else
 
+/* NOTE: *MUST* return subdivision_type property. */
 static PropertyRNA *rna_def_property_subdivision_common(StructRNA *srna, const char type[])
 {
        static const EnumPropertyItem prop_subdivision_type_items[] = {
-               {0, "CATMULL_CLARK", 0, "Catmull-Clark", ""},
-               {1, "SIMPLE", 0, "Simple", ""},
+               {SUBSURF_TYPE_CATMULL_CLARK, "CATMULL_CLARK", 0, "Catmull-Clark", ""},
+               {SUBSURF_TYPE_SIMPLE, "SIMPLE", 0, "Simple", ""},
                {0, NULL, 0, NULL, NULL}
        };
 
-       PropertyRNA *prop = RNA_def_property(srna, "subdivision_type", PROP_ENUM, PROP_NONE);
+       static const EnumPropertyItem prop_uv_smooth_items[] = {
+               {SUBSURF_UV_SMOOTH_NONE, "NONE", 0,
+                "Sharp", "UVs are not smoothed, boundaries are kept sharp"},
+               {SUBSURF_UV_SMOOTH_PRESERVE_CORNERS, "PRESERVE_CORNERS", 0,
+                "Smooth, keep corners", "UVs are smoothed, corners on discontinuous boundary are kept sharp"},
+#if 0
+               {SUBSURF_UV_SMOOTH_PRESERVE_CORNERS_AND_JUNCTIONS, "PRESERVE_CORNERS_AND_JUNCTIONS", 0,
+                "Smooth, keep corners+junctions", "UVs are smoothed, corners on discontinuous boundary and "
+                "junctions of 3 or more regions are kept sharp"},
+               {SUBSURF_UV_SMOOTH_PRESERVE_CORNERS_JUNCTIONS_AND_CONCAVE, "PRESERVE_CORNERS_JUNCTIONS_AND_CONCAVE", 0,
+                "Smooth, keep corners+junctions+concave", "UVs are smoothed, corners on discontinuous boundary, "
+                "junctions of 3 or more regions and darts and concave corners are kept sharp"},
+               {SUBSURF_UV_SMOOTH_PRESERVE_BOUNDARIES, "PRESERVE_BOUNDARIES", 0,
+                "Smooth, keep corners", "UVs are smoothed, boundaries are kept sharp"},
+               {SUBSURF_UV_SMOOTH_ALL, "PRESERVE_BOUNDARIES", 0,
+                "Smooth all", "UVs and boundaries are smoothed"},
+#endif
+               {0, NULL, 0, NULL, NULL}
+       };
+
+       PropertyRNA *prop;
+
+       prop = RNA_def_property(srna, "uv_smooth", PROP_ENUM, PROP_NONE);
+       RNA_def_property_enum_sdna(prop, NULL, "uv_smooth");
+       RNA_def_property_enum_items(prop, prop_uv_smooth_items);
+       RNA_def_property_ui_text(prop, "UV Smooth", "Controls how smoothing is applied to UVs");
+       RNA_def_property_update(prop, 0, "rna_Modifier_update");
+
+#ifdef WITH_OPENSUBDIV_MODIFIER
+       prop = RNA_def_property(srna, "quality", PROP_INT, PROP_UNSIGNED);
+       RNA_def_property_int_sdna(prop, NULL, "quality");
+       RNA_def_property_range(prop, 1, 10);
+       RNA_def_property_ui_range(prop, 1, 6, 1, -1);
+       RNA_def_property_ui_text(prop, "Quality", "Accuracy of vertex positions, lower value is faster but less precise");
+       RNA_def_property_update(prop, 0, "rna_Modifier_update");
+#endif
+
+       prop = RNA_def_property(srna, "subdivision_type", PROP_ENUM, PROP_NONE);
        RNA_def_property_enum_sdna(prop, NULL, type);
        RNA_def_property_enum_items(prop, prop_subdivision_type_items);
        RNA_def_property_ui_text(prop, "Subdivision Type", "Select type of subdivision algorithm");
@@ -1223,18 +1277,6 @@ static void rna_def_modifier_subsurf(BlenderRNA *brna)
        RNA_def_property_boolean_sdna(prop, NULL, "flags", eSubsurfModifierFlag_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_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)
@@ -1312,7 +1354,7 @@ static void rna_def_modifier_warp(BlenderRNA *brna)
 
        prop = RNA_def_property(srna, "falloff_curve", PROP_POINTER, PROP_NONE);
        RNA_def_property_pointer_sdna(prop, NULL, "curfalloff");
-       RNA_def_property_ui_text(prop, "Falloff Curve", "Custom Lamp Falloff Curve");
+       RNA_def_property_ui_text(prop, "Falloff Curve", "Custom falloff curve");
        RNA_def_property_update(prop, 0, "rna_Modifier_update");
 
        prop = RNA_def_property(srna, "use_volume_preserve", PROP_BOOLEAN, PROP_NONE);
@@ -1380,11 +1422,6 @@ static void rna_def_modifier_multires(BlenderRNA *brna)
        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)
@@ -1835,6 +1872,7 @@ static void rna_def_modifier_armature(BlenderRNA *brna)
        RNA_def_property_ui_text(prop, "Object", "Armature object to deform with");
        RNA_def_property_pointer_funcs(prop, NULL, "rna_ArmatureModifier_object_set", NULL, "rna_Armature_object_poll");
        RNA_def_property_flag(prop, PROP_EDITABLE | PROP_ID_SELF_CHECK);
+       RNA_def_property_override_flag(prop, PROPOVERRIDE_OVERRIDABLE_STATIC);
        RNA_def_property_update(prop, 0, "rna_Modifier_dependency_update");
 
        prop = RNA_def_property(srna, "use_bone_envelopes", PROP_BOOLEAN, PROP_NONE);
@@ -1902,7 +1940,7 @@ static void rna_def_modifier_hook(BlenderRNA *brna)
 
        prop = RNA_def_property(srna, "falloff_curve", PROP_POINTER, PROP_NONE);
        RNA_def_property_pointer_sdna(prop, NULL, "curfalloff");
-       RNA_def_property_ui_text(prop, "Falloff Curve", "Custom Lamp Falloff Curve");
+       RNA_def_property_ui_text(prop, "Falloff Curve", "Custom falloff curve");
        RNA_def_property_update(prop, 0, "rna_Modifier_update");
 
        prop = RNA_def_property(srna, "center", PROP_FLOAT, PROP_NONE);
@@ -2264,11 +2302,6 @@ static void rna_def_modifier_uvproject(BlenderRNA *brna)
                                          "rna_iterator_array_end", "rna_iterator_array_get", NULL, NULL, NULL, NULL);
        RNA_def_property_ui_text(prop, "Projectors", "");
 
-       prop = RNA_def_property(srna, "image", PROP_POINTER, PROP_NONE);
-       RNA_def_property_ui_text(prop, "Image", "");
-       RNA_def_property_flag(prop, PROP_EDITABLE);
-       RNA_def_property_update(prop, 0, "rna_Modifier_update");
-
        prop = RNA_def_property(srna, "aspect_x", PROP_FLOAT, PROP_NONE);
        RNA_def_property_float_sdna(prop, NULL, "aspectx");
        RNA_def_property_flag(prop, PROP_PROPORTIONAL);
@@ -2301,11 +2334,6 @@ static void rna_def_modifier_uvproject(BlenderRNA *brna)
        RNA_def_property_ui_text(prop, "Vertical Scale", "");
        RNA_def_property_update(prop, 0, "rna_Modifier_update");
 
-       prop = RNA_def_property(srna, "use_image_override", PROP_BOOLEAN, PROP_NONE);
-       RNA_def_property_boolean_sdna(prop, NULL, "flags", MOD_UVPROJECT_OVERRIDEIMAGE);
-       RNA_def_property_ui_text(prop, "Override Image", "Override faces' current images with the given image");
-       RNA_def_property_update(prop, 0, "rna_Modifier_update");
-
        srna = RNA_def_struct(brna, "UVProjector", NULL);
        RNA_def_struct_ui_text(srna, "UVProjector", "UV projector used by the UV project modifier");
 
@@ -3014,6 +3042,14 @@ static void rna_def_modifier_bevel(BlenderRNA *brna)
                {0, NULL, 0, NULL, NULL}
        };
 
+       static EnumPropertyItem prop_harden_normals_items[] = {
+               { MOD_BEVEL_HN_NONE, "HN_NONE", 0, "Off", "Do not use Harden Normals" },
+               { MOD_BEVEL_HN_FACE, "HN_FACE", 0, "Face Area", "Use faces as weight" },
+               { MOD_BEVEL_HN_ADJ, "HN_ADJ", 0, "Vertex average", "Use adjacent vertices as weight" },
+               { MOD_BEVEL_FIX_SHA, "FIX_SHA", 0, "Fix shading", "Fix normal shading continuity" },
+               { 0, NULL, 0, NULL, NULL },
+       };
+
        srna = RNA_def_struct(brna, "BevelModifier", "Modifier");
        RNA_def_struct_ui_text(srna, "Bevel Modifier", "Bevel modifier to make edges and vertices more rounded");
        RNA_def_struct_sdna(srna, "BevelModifierData");
@@ -3090,6 +3126,33 @@ static void rna_def_modifier_bevel(BlenderRNA *brna)
        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");
+
+       prop = RNA_def_property(srna, "mark_seam", PROP_BOOLEAN, PROP_NONE);
+       RNA_def_property_boolean_sdna(prop, NULL, "edge_flags", MOD_BEVEL_MARK_SEAM);
+       RNA_def_property_ui_text(prop, "Mark Seams", "Mark Seams along beveled edges");
+       RNA_def_property_update(prop, 0, "rna_Modifier_update");
+
+       prop = RNA_def_property(srna, "mark_sharp", PROP_BOOLEAN, PROP_NONE);
+       RNA_def_property_boolean_sdna(prop, NULL, "edge_flags", MOD_BEVEL_MARK_SHARP);
+       RNA_def_property_ui_text(prop, "Mark Sharp", "Mark beveled edges as sharp");
+       RNA_def_property_update(prop, 0, "rna_Modifier_update");
+
+       prop = RNA_def_property(srna, "hnmode", PROP_ENUM, PROP_NONE);
+       RNA_def_property_enum_items(prop, prop_harden_normals_items);
+       RNA_def_property_ui_text(prop, "Normal Mode", "Weighting mode for Harden Normals");
+       RNA_def_property_update(prop, 0, "rna_Modifier_update");
+
+       prop = RNA_def_property(srna, "hn_strength", PROP_FLOAT, PROP_NONE);
+       RNA_def_property_float_default(prop, 0.5f);
+       RNA_def_property_range(prop, 0, 1);
+       RNA_def_property_ui_range(prop, 0, 1, 1, 2);
+       RNA_def_property_ui_text(prop, "Normal Strength", "Strength of calculated normal");
+       RNA_def_property_update(prop, 0, "rna_Modifier_update");
+
+       prop = RNA_def_property(srna, "set_wn_strength", PROP_BOOLEAN, PROP_NONE);
+       RNA_def_property_boolean_sdna(prop, NULL, "flags", MOD_BEVEL_SET_WN_STR);
+       RNA_def_property_ui_text(prop, "Face Strength", "Set face strength of beveled faces for use in WN Modifier");
+       RNA_def_property_update(prop, 0, "rna_Modifier_update");
 }
 
 static void rna_def_modifier_shrinkwrap(BlenderRNA *brna)
@@ -3124,7 +3187,13 @@ static void rna_def_modifier_shrinkwrap(BlenderRNA *brna)
        RNA_def_property_enum_sdna(prop, NULL, "shrinkType");
        RNA_def_property_enum_items(prop, shrink_type_items);
        RNA_def_property_ui_text(prop, "Mode", "");
-       RNA_def_property_update(prop, 0, "rna_Modifier_update");
+       RNA_def_property_update(prop, 0, "rna_Modifier_dependency_update");
+
+       prop = RNA_def_property(srna, "wrap_mode", PROP_ENUM, PROP_NONE);
+       RNA_def_property_enum_sdna(prop, NULL, "shrinkMode");
+       RNA_def_property_enum_items(prop, rna_enum_modifier_shrinkwrap_mode_items);
+       RNA_def_property_ui_text(prop, "Snap Mode", "Select how vertices are constrained to the target surface");
+       RNA_def_property_update(prop, 0, "rna_Modifier_dependency_update");
 
        prop = RNA_def_property(srna, "cull_face", PROP_ENUM, PROP_NONE);
        RNA_def_property_enum_sdna(prop, NULL, "shrinkOpts");
@@ -3202,9 +3271,9 @@ static void rna_def_modifier_shrinkwrap(BlenderRNA *brna)
        RNA_def_property_ui_text(prop, "Positive", "Allow vertices to move in the positive direction of axis");
        RNA_def_property_update(prop, 0, "rna_Modifier_update");
 
-       prop = RNA_def_property(srna, "use_keep_above_surface", PROP_BOOLEAN, PROP_NONE);
-       RNA_def_property_boolean_sdna(prop, NULL, "shrinkOpts", MOD_SHRINKWRAP_KEEP_ABOVE_SURFACE);
-       RNA_def_property_ui_text(prop, "Keep Above Surface", "");
+       prop = RNA_def_property(srna, "use_invert_cull", PROP_BOOLEAN, PROP_NONE);
+       RNA_def_property_boolean_sdna(prop, NULL, "shrinkOpts", MOD_SHRINKWRAP_INVERT_CULL_TARGET);
+       RNA_def_property_ui_text(prop, "Invert Cull", "When projecting in the negative direction invert the face cull mode");
        RNA_def_property_update(prop, 0, "rna_Modifier_update");
 
        prop = RNA_def_property(srna, "invert_vertex_group", PROP_BOOLEAN, PROP_NONE);
@@ -4897,6 +4966,68 @@ static void rna_def_modifier_surfacedeform(BlenderRNA *brna)
        RNA_def_property_clear_flag(prop, PROP_EDITABLE);
 }
 
+static void rna_def_modifier_weightednormal(BlenderRNA *brna)
+{
+       StructRNA *srna;
+       PropertyRNA *prop;
+
+       static EnumPropertyItem prop_weighting_mode_items[] = {
+               {MOD_WEIGHTEDNORMAL_MODE_FACE, "FACE_AREA", 0, "Face Area", "Generate face area weighted normals"},
+               {MOD_WEIGHTEDNORMAL_MODE_ANGLE, "CORNER_ANGLE", 0, "Corner Angle", "Generate corner angle weighted normals"},
+               {MOD_WEIGHTEDNORMAL_MODE_FACE_ANGLE, "FACE_AREA_WITH_ANGLE", 0, "Face Area And Angle",
+                                                    "Generated normals weighted by both face area and angle"},
+               {0, NULL, 0, NULL, NULL}
+       };
+
+       srna = RNA_def_struct(brna, "WeightedNormalModifier", "Modifier");
+       RNA_def_struct_ui_text(srna, "WeightedNormal Modifier", "");
+       RNA_def_struct_sdna(srna, "WeightedNormalModifierData");
+       RNA_def_struct_ui_icon(srna, ICON_MOD_NORMALEDIT);
+
+       prop = RNA_def_property(srna, "weight", PROP_INT, PROP_NONE);
+       RNA_def_property_range(prop, 1, 100);
+       RNA_def_property_ui_range(prop, 1, 100, 1, -1);
+       RNA_def_property_ui_text(prop, "Weight",
+                                "Corrective factor applied to faces' weights, 50 is neutral, "
+                                "lower values increase weight of weak faces, "
+                                "higher values increase weight of strong faces");
+       RNA_def_property_update(prop, 0, "rna_Modifier_update");
+
+       prop = RNA_def_property(srna, "mode", PROP_ENUM, PROP_NONE);
+       RNA_def_property_enum_items(prop, prop_weighting_mode_items);
+       RNA_def_property_ui_text(prop, "Weighting Mode", "Weighted vertex normal mode to use");
+       RNA_def_property_update(prop, 0, "rna_Modifier_update");
+
+       prop = RNA_def_property(srna, "thresh", PROP_FLOAT, PROP_NONE);
+       RNA_def_property_range(prop, 0, 10);
+       RNA_def_property_ui_range(prop, 0, 10, 1, 2);
+       RNA_def_property_ui_text(prop, "Threshold", "Threshold value for different weights to be considered equal");
+       RNA_def_property_update(prop, 0, "rna_Modifier_update");
+
+       prop = RNA_def_property(srna, "keep_sharp", PROP_BOOLEAN, PROP_NONE);
+       RNA_def_property_boolean_sdna(prop, NULL, "flag", MOD_WEIGHTEDNORMAL_KEEP_SHARP);
+       RNA_def_property_ui_text(prop, "Keep Sharp",
+                                "Keep sharp edges as computed for default split normals, "
+                                "instead of setting a single weighted normal for each vertex");
+       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 modifying the selected areas");
+       RNA_def_property_string_funcs(prop, NULL, NULL, "rna_WeightedNormalModifier_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_WEIGHTEDNORMAL_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, "face_influence", PROP_BOOLEAN, PROP_NONE);
+       RNA_def_property_boolean_sdna(prop, NULL, "flag", MOD_WEIGHTEDNORMAL_FACE_INFLUENCE);
+       RNA_def_property_ui_text(prop, "Face Influence", "Use influence of face for weighting");
+       RNA_def_property_update(prop, 0, "rna_Modifier_update");
+}
+
 void RNA_def_modifier(BlenderRNA *brna)
 {
        StructRNA *srna;
@@ -4928,11 +5059,13 @@ void RNA_def_modifier(BlenderRNA *brna)
        RNA_def_property_boolean_sdna(prop, NULL, "mode", eModifierMode_Realtime);
        RNA_def_property_ui_text(prop, "Realtime", "Display modifier in viewport");
        RNA_def_property_flag(prop, PROP_LIB_EXCEPTION);
+       RNA_def_property_override_flag(prop, PROPOVERRIDE_OVERRIDABLE_STATIC);
        RNA_def_property_update(prop, 0, "rna_Modifier_update");
        RNA_def_property_ui_icon(prop, ICON_RESTRICT_VIEW_OFF, 0);
 
        prop = RNA_def_property(srna, "show_render", PROP_BOOLEAN, PROP_NONE);
        RNA_def_property_boolean_sdna(prop, NULL, "mode", eModifierMode_Render);
+       RNA_def_property_override_flag(prop, PROPOVERRIDE_OVERRIDABLE_STATIC);
        RNA_def_property_ui_text(prop, "Render", "Use modifier during render");
        RNA_def_property_ui_icon(prop, ICON_SCENE, 0);
        RNA_def_property_update(prop, NC_OBJECT | ND_MODIFIER, NULL);
@@ -4951,6 +5084,7 @@ void RNA_def_modifier(BlenderRNA *brna)
 
        prop = RNA_def_property(srna, "show_expanded", PROP_BOOLEAN, PROP_NONE);
        RNA_def_property_boolean_sdna(prop, NULL, "mode", eModifierMode_Expanded);
+       RNA_def_property_override_flag(prop, PROPOVERRIDE_OVERRIDABLE_STATIC);
        RNA_def_property_ui_text(prop, "Expanded", "Set modifier expanded in the user interface");
        RNA_def_property_ui_icon(prop, ICON_TRIA_RIGHT, 1);
 
@@ -5015,6 +5149,7 @@ void RNA_def_modifier(BlenderRNA *brna)
        rna_def_modifier_normaledit(brna);
        rna_def_modifier_meshseqcache(brna);
        rna_def_modifier_surfacedeform(brna);
+       rna_def_modifier_weightednormal(brna);
 }
 
 #endif