Merge branch 'master' into blender2.8
authorCampbell Barton <ideasman42@gmail.com>
Sat, 9 Jun 2018 12:42:01 +0000 (14:42 +0200)
committerCampbell Barton <ideasman42@gmail.com>
Sat, 9 Jun 2018 12:43:01 +0000 (14:43 +0200)
52 files changed:
1  2 
source/blender/makesrna/intern/makesrna.c
source/blender/makesrna/intern/rna_ID.c
source/blender/makesrna/intern/rna_access.c
source/blender/makesrna/intern/rna_action.c
source/blender/makesrna/intern/rna_animation.c
source/blender/makesrna/intern/rna_armature.c
source/blender/makesrna/intern/rna_boid.c
source/blender/makesrna/intern/rna_brush.c
source/blender/makesrna/intern/rna_cloth.c
source/blender/makesrna/intern/rna_color.c
source/blender/makesrna/intern/rna_constraint.c
source/blender/makesrna/intern/rna_curve.c
source/blender/makesrna/intern/rna_define.c
source/blender/makesrna/intern/rna_dynamicpaint.c
source/blender/makesrna/intern/rna_fcurve.c
source/blender/makesrna/intern/rna_fluidsim.c
source/blender/makesrna/intern/rna_group.c
source/blender/makesrna/intern/rna_image.c
source/blender/makesrna/intern/rna_key.c
source/blender/makesrna/intern/rna_lamp.c
source/blender/makesrna/intern/rna_lattice.c
source/blender/makesrna/intern/rna_main.c
source/blender/makesrna/intern/rna_material.c
source/blender/makesrna/intern/rna_mesh.c
source/blender/makesrna/intern/rna_mesh_api.c
source/blender/makesrna/intern/rna_mesh_utils.h
source/blender/makesrna/intern/rna_meta.c
source/blender/makesrna/intern/rna_modifier.c
source/blender/makesrna/intern/rna_nla.c
source/blender/makesrna/intern/rna_nodetree.c
source/blender/makesrna/intern/rna_object.c
source/blender/makesrna/intern/rna_object_api.c
source/blender/makesrna/intern/rna_object_force.c
source/blender/makesrna/intern/rna_particle.c
source/blender/makesrna/intern/rna_pose.c
source/blender/makesrna/intern/rna_render.c
source/blender/makesrna/intern/rna_rigidbody.c
source/blender/makesrna/intern/rna_rna.c
source/blender/makesrna/intern/rna_scene.c
source/blender/makesrna/intern/rna_scene_api.c
source/blender/makesrna/intern/rna_screen.c
source/blender/makesrna/intern/rna_sculpt_paint.c
source/blender/makesrna/intern/rna_smoke.c
source/blender/makesrna/intern/rna_space.c
source/blender/makesrna/intern/rna_texture.c
source/blender/makesrna/intern/rna_ui.c
source/blender/makesrna/intern/rna_ui_api.c
source/blender/makesrna/intern/rna_userdef.c
source/blender/makesrna/intern/rna_vfont.c
source/blender/makesrna/intern/rna_wm.c
source/blender/makesrna/intern/rna_wm_api.c
source/blender/makesrna/intern/rna_world.c

@@@ -324,21 -324,21 +324,21 @@@ static void rna_def_dopesheet(BlenderRN
        RNA_def_property_ui_text(prop, "Show Errors", "Only include F-Curves and drivers that are disabled or have errors");
        RNA_def_property_ui_icon(prop, ICON_HELP, 0); /* XXX: this doesn't quite fit */
        RNA_def_property_update(prop, NC_ANIMATION | ND_ANIMCHAN | NA_EDITED, NULL);
-       
 -      /* Object Group Filtering Settings */
 -      prop = RNA_def_property(srna, "show_only_group_objects", PROP_BOOLEAN, PROP_NONE);
 +      /* Object Collection Filtering Settings */
 +      prop = RNA_def_property(srna, "show_only_collection_objects", PROP_BOOLEAN, PROP_NONE);
        RNA_def_property_boolean_sdna(prop, NULL, "filterflag", ADS_FILTER_ONLYOBGROUP);
 -      RNA_def_property_ui_text(prop, "Only Objects in Group",
 -                               "Only include channels from objects in the specified group");
 +      RNA_def_property_ui_text(prop, "Only Objects in Collection",
 +                               "Only include channels from objects in the specified collection");
        RNA_def_property_ui_icon(prop, ICON_GROUP, 0);
        RNA_def_property_update(prop, NC_ANIMATION | ND_ANIMCHAN | NA_EDITED, NULL);
-       
 -      prop = RNA_def_property(srna, "filter_group", PROP_POINTER, PROP_NONE);
 +      prop = RNA_def_property(srna, "filter_collection", PROP_POINTER, PROP_NONE);
        RNA_def_property_pointer_sdna(prop, NULL, "filter_grp");
        RNA_def_property_flag(prop, PROP_EDITABLE);
 -      RNA_def_property_ui_text(prop, "Filtering Group", "Group that included object should be a member of");
 +      RNA_def_property_ui_text(prop, "Filtering Collection", "Collection that included object should be a member of");
        RNA_def_property_update(prop, NC_ANIMATION | ND_ANIMCHAN | NA_EDITED, NULL);
-       
        /* FCurve Display Name Search Settings */
        prop = RNA_def_property(srna, "show_only_matching_fcurves", PROP_BOOLEAN, PROP_NONE);
        RNA_def_property_boolean_sdna(prop, NULL, "filterflag", ADS_FILTER_BY_FCU_NAME);
@@@ -85,11 -84,11 +85,11 @@@ const EnumPropertyItem rna_enum_keying_
  static void rna_AnimData_update(Main *UNUSED(bmain), Scene *UNUSED(scene), PointerRNA *ptr)
  {
        ID *id = ptr->id.data;
-       
-       /* tag for refresh so that scheduled updates (e.g. action changed) will 
-        * get computed and reflected in the scene [#34869] 
+       /* tag for refresh so that scheduled updates (e.g. action changed) will
+        * get computed and reflected in the scene [#34869]
         */
 -      DAG_id_tag_update(id, OB_RECALC_OB | OB_RECALC_DATA);
 +      DEG_id_tag_update(id, OB_RECALC_OB | OB_RECALC_DATA);
  }
  
  static int rna_AnimData_action_editable(PointerRNA *ptr, const char **UNUSED(r_info))
@@@ -1086,11 -1054,10 +1086,11 @@@ static void rna_def_animdata(BlenderRN
        prop = RNA_def_property(srna, "drivers", PROP_COLLECTION, PROP_NONE);
        RNA_def_property_collection_sdna(prop, NULL, "drivers", NULL);
        RNA_def_property_struct_type(prop, "FCurve");
 +      RNA_def_property_override_flag(prop, PROPOVERRIDE_OVERRIDABLE_STATIC);
        RNA_def_property_ui_text(prop, "Drivers", "The Drivers/Expressions for this data-block");
-       
        rna_api_animdata_drivers(brna, prop);
-       
        /* General Settings */
        prop = RNA_def_property(srna, "use_nla", PROP_BOOLEAN, PROP_NONE);
        RNA_def_property_boolean_negative_sdna(prop, NULL, "flag", ADT_NLA_EVAL_OFF);
@@@ -148,8 -146,7 +148,8 @@@ static void rna_Armature_update_layers(
  static void rna_Armature_redraw_data(Main *UNUSED(bmain), Scene *UNUSED(scene), PointerRNA *ptr)
  {
        ID *id = ptr->id.data;
-       
 +      DEG_id_tag_update(id, DEG_TAG_COPY_ON_WRITE);
        WM_main_add_notifier(NC_GEOM | ND_DATA, id);
  }
  
@@@ -168,34 -165,28 +168,34 @@@ static void rna_Bone_update_renamed(Mai
  static void rna_Bone_select_update(Main *UNUSED(bmain), Scene *UNUSED(scene), PointerRNA *ptr)
  {
        ID *id = ptr->id.data;
-       
 -      /* special updates for cases where rigs try to hook into armature drawing stuff
 -       * e.g. Mask Modifier - 'Armature' option
 +      /* 1) special updates for cases where rigs try to hook into armature drawing stuff
 +       *    e.g. Mask Modifier - 'Armature' option
 +       * 2) tag armature for copy-on-write, so that selection status (set by addons)
 +       *    will update properly, like standard tools do already
         */
        if (id) {
                if (GS(id->name) == ID_AR) {
                        bArmature *arm = (bArmature *)id;
-                       
                        if (arm->flag & ARM_HAS_VIZ_DEPS) {
 -                              DAG_id_tag_update(id, OB_RECALC_DATA);
 +                              DEG_id_tag_update(id, OB_RECALC_DATA);
                        }
-                       
++
 +                      DEG_id_tag_update(id, DEG_TAG_COPY_ON_WRITE);
                }
                else if (GS(id->name) == ID_OB) {
                        Object *ob = (Object *)id;
                        bArmature *arm = (bArmature *)ob->data;
-                       
                        if (arm->flag & ARM_HAS_VIZ_DEPS) {
 -                              DAG_id_tag_update(id, OB_RECALC_DATA);
 +                              DEG_id_tag_update(id, OB_RECALC_DATA);
                        }
-                       
++
 +                      DEG_id_tag_update(&arm->id, DEG_TAG_COPY_ON_WRITE);
                }
        }
-       
        WM_main_add_notifier(NC_GEOM | ND_DATA, id);
  
        /* spaces that show animation data of the selected bone need updating */
@@@ -279,13 -258,8 +279,13 @@@ static void rna_bone_layer_set(int *lay
  
  static void rna_Bone_layer_set(PointerRNA *ptr, const int *values)
  {
 +      bArmature *arm = (bArmature *)ptr->id.data;
        Bone *bone = (Bone *)ptr->data;
-       
++
        rna_bone_layer_set(&bone->layer, values);
-       
++
 +      arm->layer_used = 0;
 +      rna_Armature_layer_used_refresh(arm, &arm->bonebase);
  }
  
  static void rna_Armature_layer_set(PointerRNA *ptr, const int *values)
@@@ -752,10 -726,9 +752,10 @@@ static void rna_def_bone(BlenderRNA *br
        prop = RNA_def_property(srna, "parent", PROP_POINTER, PROP_NONE);
        RNA_def_property_struct_type(prop, "Bone");
        RNA_def_property_pointer_sdna(prop, NULL, "parent");
 +      RNA_def_property_flag(prop, PROP_PTR_NO_OWNERSHIP);
        RNA_def_property_ui_text(prop, "Parent", "Parent bone (in same Armature)");
        RNA_def_property_update(prop, 0, "rna_Armature_redraw_data");
-       
        /* children (collection) */
        prop = RNA_def_property(srna, "children", PROP_COLLECTION, PROP_NONE);
        RNA_def_property_collection_sdna(prop, NULL, "childbase", NULL);
@@@ -96,13 -94,13 +96,13 @@@ static void rna_Boids_reset(Main *UNUSE
  {
        if (ptr->type == &RNA_ParticleSystem) {
                ParticleSystem *psys = (ParticleSystem *)ptr->data;
-               
                psys->recalc = PSYS_RECALC_RESET;
  
 -              DAG_id_tag_update(ptr->id.data, OB_RECALC_DATA);
 +              DEG_id_tag_update(ptr->id.data, OB_RECALC_DATA);
        }
        else
 -              DAG_id_tag_update(ptr->id.data, OB_RECALC_DATA | PSYS_RECALC_RESET);
 +              DEG_id_tag_update(ptr->id.data, OB_RECALC_DATA | PSYS_RECALC_RESET);
  
        WM_main_add_notifier(NC_OBJECT | ND_PARTICLE | NA_EDITED, NULL);
  }
@@@ -110,15 -108,15 +110,15 @@@ static void rna_Boids_reset_deps(Main *
  {
        if (ptr->type == &RNA_ParticleSystem) {
                ParticleSystem *psys = (ParticleSystem *)ptr->data;
-               
                psys->recalc = PSYS_RECALC_RESET;
  
 -              DAG_id_tag_update(ptr->id.data, OB_RECALC_DATA);
 +              DEG_id_tag_update(ptr->id.data, OB_RECALC_DATA);
        }
        else
 -              DAG_id_tag_update(ptr->id.data, OB_RECALC_DATA | PSYS_RECALC_RESET);
 +              DEG_id_tag_update(ptr->id.data, OB_RECALC_DATA | PSYS_RECALC_RESET);
  
 -      DAG_relations_tag_update(bmain);
 +      DEG_relations_tag_update(bmain);
  
        WM_main_add_notifier(NC_OBJECT | ND_PARTICLE | NA_EDITED, NULL);
  }
@@@ -705,12 -690,11 +705,12 @@@ static void rna_def_brush_texture_slot(
        prop = RNA_def_property(srna, "random_angle", PROP_FLOAT, PROP_ANGLE);
        RNA_def_property_range(prop, 0, M_PI * 2);
        RNA_def_property_ui_text(prop, "Random Angle", "Brush texture random angle");
 +      RNA_def_property_flag(prop, PROP_CONTEXT_UPDATE);
        RNA_def_property_update(prop, 0, "rna_TextureSlot_update");
-       
        TEXTURE_CAPABILITY(has_texture_angle_source, "Has Texture Angle Source");
        TEXTURE_CAPABILITY(has_random_texture_angle, "Has Random Texture Angle");
-       TEXTURE_CAPABILITY(has_texture_angle, "Has Texture Angle Source");      
+       TEXTURE_CAPABILITY(has_texture_angle, "Has Texture Angle Source");
  }
  
  static void rna_def_sculpt_capabilities(BlenderRNA *brna)
@@@ -1379,10 -1363,10 +1379,10 @@@ static void rna_def_brush(BlenderRNA *b
        RNA_def_property_pointer_sdna(prop, NULL, "mtex");
        RNA_def_property_clear_flag(prop, PROP_EDITABLE);
        RNA_def_property_ui_text(prop, "Texture Slot", "");
-       
        prop = RNA_def_property(srna, "texture", PROP_POINTER, PROP_NONE);
        RNA_def_property_pointer_sdna(prop, NULL, "mtex.tex");
 -      RNA_def_property_flag(prop, PROP_EDITABLE);
 +      RNA_def_property_flag(prop, PROP_EDITABLE | PROP_CONTEXT_UPDATE);
        RNA_def_property_ui_text(prop, "Texture", "");
        RNA_def_property_update(prop, NC_TEXTURE, "rna_Brush_main_tex_update");
  
@@@ -158,8 -157,19 +158,8 @@@ static char *rna_ColorRamp_path(Pointer
        /* handle the cases where a single data-block may have 2 ramp types */
        if (ptr->id.data) {
                ID *id = ptr->id.data;
-               
                switch (GS(id->name)) {
 -                      case ID_MA: /* material has 2 cases - diffuse and specular */
 -                      {
 -                              Material *ma = (Material *)id;
 -
 -                              if (ptr->data == ma->ramp_col)
 -                                      path = BLI_strdup("diffuse_ramp");
 -                              else if (ptr->data == ma->ramp_spec)
 -                                      path = BLI_strdup("specular_ramp");
 -                              break;
 -                      }
 -
                        case ID_NT:
                        {
                                bNodeTree *ntree = (bNodeTree *)id;
@@@ -232,8 -242,24 +232,8 @@@ static char *rna_ColorRampElement_path(
        /* FIXME: this is a very slow way to do it, but it will have to suffice... */
        if (ptr->id.data) {
                ID *id = ptr->id.data;
-               
                switch (GS(id->name)) {
 -                      case ID_MA: /* 2 cases for material - diffuse and spec */
 -                      {
 -                              Material *ma = (Material *)id;
 -
 -                              /* try diffuse first */
 -                              if (ma->ramp_col) {
 -                                      RNA_pointer_create(id, &RNA_ColorRamp, ma->ramp_col, &ramp_ptr);
 -                                      COLRAMP_GETPATH;
 -                              }
 -                              /* try specular if not diffuse */
 -                              if (!path && ma->ramp_spec) {
 -                                      RNA_pointer_create(id, &RNA_ColorRamp, ma->ramp_spec, &ramp_ptr);
 -                                      COLRAMP_GETPATH;
 -                              }
 -                              break;
 -                      }
                        case ID_NT:
                        {
                                bNodeTree *ntree = (bNodeTree *)id;
@@@ -288,8 -314,8 +288,8 @@@ static void rna_ColorRamp_update(Main *
                        case ID_MA:
                        {
                                Material *ma = ptr->id.data;
-                               
 -                              DAG_id_tag_update(&ma->id, 0);
 +                              DEG_id_tag_update(&ma->id, 0);
                                WM_main_add_notifier(NC_MATERIAL | ND_SHADING_DRAW, ma);
                                break;
                        }
                        case ID_PA:
                        {
                                ParticleSettings *part = ptr->id.data;
-                               
 -                              DAG_id_tag_update(&part->id, OB_RECALC_DATA | PSYS_RECALC_REDO);
 +                              DEG_id_tag_update(&part->id, OB_RECALC_DATA | PSYS_RECALC_REDO);
                                WM_main_add_notifier(NC_OBJECT | ND_PARTICLE | NA_EDITED, part);
                        }
                        default:
@@@ -90,21 -90,21 +90,21 @@@ const EnumPropertyItem rna_enum_constra
        {CONSTRAINT_TYPE_TRACKTO,   "TRACK_TO", ICON_CONSTRAINT_DATA, "Track To",
                                    "Legacy tracking constraint prone to twisting artifacts"},
        {0, "", 0, N_("Relationship"), ""},
-       {CONSTRAINT_TYPE_ACTION,     "ACTION", ICON_CONSTRAINT_DATA, "Action", 
+       {CONSTRAINT_TYPE_ACTION,     "ACTION", ICON_CONSTRAINT_DATA, "Action",
                                     "Use transform property of target to look up pose for owner from an Action"},
-       {CONSTRAINT_TYPE_CHILDOF,    "CHILD_OF", ICON_CONSTRAINT_DATA, "Child Of", 
+       {CONSTRAINT_TYPE_CHILDOF,    "CHILD_OF", ICON_CONSTRAINT_DATA, "Child Of",
                                     "Make target the 'detachable' parent of owner"},
-       {CONSTRAINT_TYPE_MINMAX,     "FLOOR", ICON_CONSTRAINT_DATA, "Floor", 
+       {CONSTRAINT_TYPE_MINMAX,     "FLOOR", ICON_CONSTRAINT_DATA, "Floor",
                                     "Use position (and optionally rotation) of target to define a 'wall' or 'floor' that the owner can not cross"},
-       {CONSTRAINT_TYPE_FOLLOWPATH, "FOLLOW_PATH", ICON_CONSTRAINT_DATA, "Follow Path", 
+       {CONSTRAINT_TYPE_FOLLOWPATH, "FOLLOW_PATH", ICON_CONSTRAINT_DATA, "Follow Path",
                                     "Use to animate an object/bone following a path"},
-       {CONSTRAINT_TYPE_PIVOT,      "PIVOT", ICON_CONSTRAINT_DATA, "Pivot", 
+       {CONSTRAINT_TYPE_PIVOT,      "PIVOT", ICON_CONSTRAINT_DATA, "Pivot",
                                     "Change pivot point for transforms (buggy)"},
 -      {CONSTRAINT_TYPE_RIGIDBODYJOINT, "RIGID_BODY_JOINT", ICON_CONSTRAINT_DATA, "Rigid Body Joint",
 -                                       "Use to define a Rigid Body Constraint (for Game Engine use only)"},
 +      /* {CONSTRAINT_TYPE_RIGIDBODYJOINT, "RIGID_BODY_JOINT", ICON_CONSTRAINT_DATA, "Rigid Body Joint",
 +                                       "Use to define a Rigid Body Constraint (for Game Engine use only)"}, */
-       /* {CONSTRAINT_TYPE_PYTHON,     "SCRIPT", ICON_CONSTRAINT_DATA, "Script", 
+       /* {CONSTRAINT_TYPE_PYTHON,     "SCRIPT", ICON_CONSTRAINT_DATA, "Script",
                                     "Custom constraint(s) written in Python (Not yet implemented)"}, */
-       {CONSTRAINT_TYPE_SHRINKWRAP, "SHRINKWRAP", ICON_CONSTRAINT_DATA, "Shrinkwrap", 
+       {CONSTRAINT_TYPE_SHRINKWRAP, "SHRINKWRAP", ICON_CONSTRAINT_DATA, "Shrinkwrap",
                                     "Restrict movements to surface of target mesh"},
        {0, NULL, 0, NULL, NULL}
  };
@@@ -2361,12 -2536,10 +2361,12 @@@ void RNA_def_constraint(BlenderRNA *brn
        /* flags */
        prop = RNA_def_property(srna, "mute", PROP_BOOLEAN, PROP_NONE);
        RNA_def_property_boolean_sdna(prop, NULL, "flag", CONSTRAINT_OFF);
 +      RNA_def_property_override_flag(prop, PROPOVERRIDE_OVERRIDABLE_STATIC);
        RNA_def_property_ui_text(prop, "Disable", "Enable/Disable Constraint");
-       
        prop = RNA_def_property(srna, "show_expanded", PROP_BOOLEAN, PROP_NONE);
        RNA_def_property_boolean_sdna(prop, NULL, "flag", CONSTRAINT_EXPAND);
 +      RNA_def_property_override_flag(prop, PROPOVERRIDE_OVERRIDABLE_STATIC);
        RNA_def_property_ui_text(prop, "Expanded", "Constraint's panel is expanded in UI");
        RNA_def_property_ui_icon(prop, ICON_TRIA_RIGHT, 1);
  
@@@ -824,7 -823,19 +824,7 @@@ static void rna_def_dynamic_paint_brush
        RNA_def_property_ui_range(prop, 0.0, 1.0, 5, 2);
        RNA_def_property_ui_text(prop, "Paint Alpha", "Paint alpha");
        RNA_def_property_update(prop, NC_OBJECT | ND_MODIFIER, "rna_DynamicPaint_redoModifier");
-       
 -      prop = RNA_def_property(srna, "use_material", PROP_BOOLEAN, PROP_NONE);
 -      RNA_def_property_boolean_sdna(prop, NULL, "flags", MOD_DPAINT_USE_MATERIAL);
 -      RNA_def_property_ui_text(prop, "Use object material", "Use object material to define color and influence");
 -      RNA_def_property_update(prop, NC_OBJECT | ND_MODIFIER, "rna_DynamicPaint_redoModifier");
 -
 -      prop = RNA_def_property(srna, "material", PROP_POINTER, PROP_NONE);
 -      RNA_def_property_pointer_sdna(prop, NULL, "mat");
 -      RNA_def_property_ui_text(prop, "Material",
 -                               "Material to use (if not defined, material linked to the mesh is used)");
 -      RNA_def_property_flag(prop, PROP_EDITABLE);
 -      RNA_def_property_update(prop, NC_OBJECT | ND_MODIFIER, "rna_DynamicPaint_redoModifier");
 -
        prop = RNA_def_property(srna, "use_absolute_alpha", PROP_BOOLEAN, PROP_NONE);
        RNA_def_property_boolean_sdna(prop, NULL, "flags", MOD_DPAINT_ABS_ALPHA);
        RNA_def_property_ui_text(prop, "Absolute Alpha",
@@@ -138,11 -136,11 +138,11 @@@ static void rna_ChannelDriver_update_da
        ChannelDriver *driver = ptr->data;
  
        driver->flag &= ~DRIVER_FLAG_INVALID;
-       
        /* TODO: this really needs an update guard... */
 -      DAG_relations_tag_update(bmain);
 -      DAG_id_tag_update(id, OB_RECALC_OB | OB_RECALC_DATA);
 +      DEG_relations_tag_update(bmain);
 +      DEG_id_tag_update(id, OB_RECALC_OB | OB_RECALC_DATA);
-       
        WM_main_add_notifier(NC_SCENE | ND_FRAME, scene);
  }
  
@@@ -602,22 -588,10 +602,22 @@@ static void rna_FModifier_update(Main *
        ID *id = ptr->id.data;
        FModifier *fcm = (FModifier *)ptr->data;
        AnimData *adt = BKE_animdata_from_id(id);
-       
 -      DAG_id_tag_update(id, (GS(id->name) == ID_OB) ? OB_RECALC_OB : OB_RECALC_DATA);
++
 +      DEG_id_tag_update(id, (GS(id->name) == ID_OB) ? OB_RECALC_OB : OB_RECALC_DATA);
-       
++
 +      /* tag datablock for time update so that animation is recalculated,
 +       * as FModifiers affect how animation plays...
 +       */
 +      DEG_id_tag_update(id, DEG_TAG_TIME);
        if (adt != NULL) {
                adt->recalc |= ADT_RECALC_ANIM;
-               
++
 +              if (adt->action != NULL) {
 +                      /* action is separate datablock, needs separate tag */
 +                      DEG_id_tag_update(&adt->action->id, DEG_TAG_COPY_ON_WRITE);
 +              }
        }
-       
++
        if (fcm->curve && fcm->type == FMODIFIER_TYPE_CYCLES) {
                calchandles_fcurve(fcm->curve);
        }
@@@ -1582,9 -1555,8 +1582,9 @@@ static void rna_def_drivervar(BlenderRN
        prop = RNA_def_property(srna, "targets", PROP_COLLECTION, PROP_NONE);
        RNA_def_property_collection_sdna(prop, NULL, "targets", "num_targets");
        RNA_def_property_struct_type(prop, "DriverTarget");
 +      RNA_def_property_override_flag(prop, PROPOVERRIDE_OVERRIDABLE_STATIC);
        RNA_def_property_ui_text(prop, "Targets", "Sources of input data for evaluating this variable");
-       
        /* Name Validity Flags */
        prop = RNA_def_property(srna, "is_name_valid", PROP_BOOLEAN, PROP_NONE);
        RNA_def_property_boolean_negative_sdna(prop, NULL, "flag", DVAR_FLAG_INVALID_NAME);
@@@ -1659,11 -1631,15 +1659,11 @@@ static void rna_def_channeldriver(Blend
        prop = RNA_def_property(srna, "variables", PROP_COLLECTION, PROP_NONE);
        RNA_def_property_collection_sdna(prop, NULL, "variables", NULL);
        RNA_def_property_struct_type(prop, "DriverVariable");
 +      RNA_def_property_override_flag(prop, PROPOVERRIDE_OVERRIDABLE_STATIC);
        RNA_def_property_ui_text(prop, "Variables", "Properties acting as inputs for this driver");
        rna_def_channeldriver_variables(brna, prop);
-       
        /* Settings */
 -      prop = RNA_def_property(srna, "show_debug_info", PROP_BOOLEAN, PROP_NONE);
 -      RNA_def_property_boolean_sdna(prop, NULL, "flag", DRIVER_FLAG_SHOWDEBUG);
 -      RNA_def_property_ui_text(prop, "Show Debug Info",
 -                               "Show intermediate values for the driver calculations to allow debugging of drivers");
 -
        prop = RNA_def_property(srna, "use_self", PROP_BOOLEAN, PROP_NONE);
        RNA_def_property_boolean_sdna(prop, NULL, "flag", DRIVER_FLAG_USE_SELF);
        RNA_def_property_ui_text(prop, "Use Self",
@@@ -1939,10 -1915,9 +1939,10 @@@ static void rna_def_fcurve(BlenderRNA *
  
        /* Pointers */
        prop = RNA_def_property(srna, "driver", PROP_POINTER, PROP_NONE);
 +      RNA_def_property_override_flag(prop, PROPOVERRIDE_OVERRIDABLE_STATIC);
        RNA_def_property_clear_flag(prop, PROP_EDITABLE);
        RNA_def_property_ui_text(prop, "Driver", "Channel Driver (only set for Driver F-Curves)");
-       
        prop = RNA_def_property(srna, "group", PROP_POINTER, PROP_NONE);
        RNA_def_property_pointer_sdna(prop, NULL, "grp");
        RNA_def_property_flag(prop, PROP_EDITABLE);
        prop = RNA_def_property(srna, "mute", PROP_BOOLEAN, PROP_NONE);
        RNA_def_property_boolean_sdna(prop, NULL, "flag", FCURVE_MUTED);
        RNA_def_property_ui_text(prop, "Muted", "F-Curve is not evaluated");
 -      RNA_def_property_update(prop, NC_ANIMATION | ND_ANIMCHAN | NA_EDITED, NULL);
 +      RNA_def_property_update(prop, NC_ANIMATION | ND_ANIMCHAN | NA_EDITED, "rna_FCurve_update_eval");
-       
        prop = RNA_def_property(srna, "hide", PROP_BOOLEAN, PROP_NONE);
        RNA_def_property_boolean_negative_sdna(prop, NULL, "flag", FCURVE_VISIBLE);
        RNA_def_property_ui_text(prop, "Hide", "F-Curve and its keyframes are hidden in the Graph Editor graphs");
@@@ -102,72 -73,27 +102,72 @@@ static void rna_Collection_objects_unli
        WM_main_add_notifier(NC_OBJECT | ND_DRAW, &object->id);
  }
  
 +static void rna_Collection_children_begin(CollectionPropertyIterator *iter, PointerRNA *ptr)
 +{
 +      Collection *collection = (Collection *)ptr->data;
 +      rna_iterator_listbase_begin(iter, &collection->children, NULL);
 +}
 +
 +static PointerRNA rna_Collection_children_get(CollectionPropertyIterator *iter)
 +{
 +      ListBaseIterator *internal = &iter->internal.listbase;
 +
 +      /* we are actually iterating a CollectionBase list, so override get */
 +      CollectionChild *child = (CollectionChild *)internal->link;
 +      return rna_pointer_inherit_refine(&iter->parent, &RNA_Collection, child->collection);
 +}
 +
 +static void rna_Collection_children_link(Collection *collection, Main *bmain, ReportList *reports, Collection *child)
 +{
 +      if (!BKE_collection_child_add(bmain, collection, child)) {
 +              BKE_reportf(reports, RPT_ERROR, "Collection '%s' already in collection '%s'", child->id.name + 2, collection->id.name + 2);
 +              return;
 +      }
 +
 +      DEG_relations_tag_update(bmain);
 +      WM_main_add_notifier(NC_OBJECT | ND_DRAW, &child->id);
 +}
 +
 +static void rna_Collection_children_unlink(Collection *collection, Main *bmain, ReportList *reports, Collection *child)
 +{
 +      if (!BKE_collection_child_remove(bmain, collection, child)) {
 +              BKE_reportf(reports, RPT_ERROR, "Collection '%s' not in collection '%s'", child->id.name + 2, collection->id.name + 2);
 +              return;
 +      }
 +
 +      DEG_relations_tag_update(bmain);
 +      WM_main_add_notifier(NC_OBJECT | ND_DRAW, &child->id);
 +}
 +
 +static void rna_Collection_flag_update(Main *bmain, Scene *scene, PointerRNA *ptr)
 +{
 +      Collection *collection = (Collection *)ptr->data;
 +      BKE_collection_object_cache_free(collection);
 +      BKE_main_collection_sync(bmain);
 +
 +      DEG_relations_tag_update(bmain);
 +      DEG_id_tag_update(&collection->id, 0);
 +      WM_main_add_notifier(NC_SCENE | ND_OB_SELECT, scene);
 +}
 +
  #else
  
 -/* group.objects */
 -static void rna_def_group_objects(BlenderRNA *brna, PropertyRNA *cprop)
 +/* collection.objects */
 +static void rna_def_collection_objects(BlenderRNA *brna, PropertyRNA *cprop)
  {
        StructRNA *srna;
 -/*    PropertyRNA *prop; */
 -
        FunctionRNA *func;
        PropertyRNA *parm;
-       
 -      RNA_def_property_srna(cprop, "GroupObjects");
 -      srna = RNA_def_struct(brna, "GroupObjects", NULL);
 -      RNA_def_struct_sdna(srna, "Group");
 -      RNA_def_struct_ui_text(srna, "Group Objects", "Collection of group objects");
 +      RNA_def_property_srna(cprop, "CollectionObjects");
 +      srna = RNA_def_struct(brna, "CollectionObjects", NULL);
 +      RNA_def_struct_sdna(srna, "Collection");
 +      RNA_def_struct_ui_text(srna, "Collection Objects", "Collection of collection objects");
  
        /* add object */
 -      func = RNA_def_function(srna, "link", "rna_Group_objects_link");
 -      RNA_def_function_flag(func, FUNC_USE_CONTEXT | FUNC_USE_REPORTS);
 -      RNA_def_function_ui_description(func, "Add this object to a group");
 -      /* object to add */
 +      func = RNA_def_function(srna, "link", "rna_Collection_objects_link");
 +      RNA_def_function_flag(func, FUNC_USE_REPORTS | FUNC_USE_MAIN);
 +      RNA_def_function_ui_description(func, "Add this object to a collection");
        parm = RNA_def_pointer(func, "object", "Object", "", "Object to add");
        RNA_def_parameter_flags(parm, PROP_NEVER_NULL, PARM_REQUIRED);
  
@@@ -705,10 -719,9 +705,10 @@@ static void rna_def_image(BlenderRNA *b
        RNA_def_property_ui_text(prop, "Fields", "Use fields of the image");
        RNA_def_property_update(prop, NC_IMAGE | ND_DISPLAY, "rna_Image_fields_update");
        RNA_def_property_clear_flag(prop, PROP_ANIMATABLE);
-       
  
        prop = RNA_def_property(srna, "use_view_as_render", PROP_BOOLEAN, PROP_NONE);
 +      RNA_def_property_override_flag(prop, PROPOVERRIDE_OVERRIDABLE_STATIC);
        RNA_def_property_boolean_sdna(prop, NULL, "flag", IMA_VIEW_AS_RENDER);
        RNA_def_property_ui_text(prop, "View as Render", "Apply render part of display transformation when displaying this image on the screen");
        RNA_def_property_update(prop, NC_IMAGE | ND_DISPLAY, NULL);
@@@ -173,9 -402,14 +173,9 @@@ static void rna_def_lamp(BlenderRNA *br
        RNA_def_property_flag(prop, PROP_CONTEXT_UPDATE);
        RNA_def_property_ui_text(prop, "Use Nodes", "Use shader nodes to render the lamp");
        RNA_def_property_update(prop, 0, "rna_Lamp_use_nodes_update");
-       
        /* common */
        rna_def_animdata_common(srna);
 -
 -      /* textures */
 -      rna_def_mtex_common(brna, srna, "rna_Lamp_mtex_begin", "rna_Lamp_active_texture_get",
 -                          "rna_Lamp_active_texture_set", NULL, "LampTextureSlot", "LampTextureSlots",
 -                          "rna_Lamp_draw_update", "rna_Lamp_draw_update");
  }
  
  static void rna_def_lamp_falloff(StructRNA *srna)
@@@ -245,164 -437,1676 +245,164 @@@ void rna_mtex_texture_slots_clear(ID *s
  
  #else
  
 -static void rna_def_material_mtex(BlenderRNA *brna)
 +static void rna_def_material_display(StructRNA *srna)
  {
 -      StructRNA *srna;
        PropertyRNA *prop;
  
 -      static const EnumPropertyItem prop_mapping_items[] = {
 -              {MTEX_FLAT, "FLAT", 0, "Flat", "Map X and Y coordinates directly"},
 -              {MTEX_CUBE, "CUBE", 0, "Cube", "Map using the normal vector"},
 -              {MTEX_TUBE, "TUBE", 0, "Tube", "Map with Z as central axis"},
 -              {MTEX_SPHERE, "SPHERE", 0, "Sphere", "Map with Z as central axis"},
 -              {0, NULL, 0, NULL, NULL}
 -      };
 -
 -      static const EnumPropertyItem prop_x_mapping_items[] = {
 -              {0, "NONE", 0, "None", ""},
 -              {1, "X", 0, "X", ""},
 -              {2, "Y", 0, "Y", ""},
 -              {3, "Z", 0, "Z", ""},
 -              {0, NULL, 0, NULL, NULL}
 -      };
 -
 -      static const EnumPropertyItem prop_y_mapping_items[] = {
 -              {0, "NONE", 0, "None", ""},
 -              {1, "X", 0, "X", ""},
 -              {2, "Y", 0, "Y", ""},
 -              {3, "Z", 0, "Z", ""},
 -              {0, NULL, 0, NULL, NULL}
 -      };
 -
 -      static const EnumPropertyItem prop_z_mapping_items[] = {
 -              {0, "NONE", 0, "None", ""},
 -              {1, "X", 0, "X", ""},
 -              {2, "Y", 0, "Y", ""},
 -              {3, "Z", 0, "Z", ""},
 -              {0, NULL, 0, NULL, NULL}
 -      };
 -
 -      static const EnumPropertyItem prop_normal_map_space_items[] = {
 -              {MTEX_NSPACE_CAMERA, "CAMERA", 0, "Camera", ""},
 -              {MTEX_NSPACE_WORLD, "WORLD", 0, "World", ""},
 -              {MTEX_NSPACE_OBJECT, "OBJECT", 0, "Object", ""},
 -              {MTEX_NSPACE_TANGENT, "TANGENT", 0, "Tangent", ""},
 -              {0, NULL, 0, NULL, NULL}
 -      };
 -
 -      static const EnumPropertyItem prop_bump_method_items[] = {
 -              {0, "BUMP_ORIGINAL", 0, "Original", ""},
 -              {MTEX_COMPAT_BUMP, "BUMP_COMPATIBLE", 0, "Compatible", ""},
 -              {MTEX_3TAP_BUMP, "BUMP_LOW_QUALITY", 0, "Low Quality", "Use 3 tap filtering"},
 -              {MTEX_5TAP_BUMP, "BUMP_MEDIUM_QUALITY", 0, "Medium Quality", "Use 5 tap filtering"},
 -              {MTEX_BICUBIC_BUMP, "BUMP_BEST_QUALITY", 0,
 -               "Best Quality", "Use bicubic filtering (requires OpenGL 3.0+, it will fall back on "
 -               "medium setting for other systems)"},
 -              {0, NULL, 0, NULL, NULL}
 -      };
 -
 -      static const EnumPropertyItem prop_bump_space_items[] = {
 -              {0, "BUMP_VIEWSPACE", 0, "ViewSpace", ""},
 -              {MTEX_BUMP_OBJECTSPACE, "BUMP_OBJECTSPACE", 0, "ObjectSpace", ""},
 -              {MTEX_BUMP_TEXTURESPACE, "BUMP_TEXTURESPACE", 0, "TextureSpace", ""},
 -              {0, NULL, 0, NULL, NULL}
 -      };
 -
 -      srna = RNA_def_struct(brna, "MaterialTextureSlot", "TextureSlot");
 -      RNA_def_struct_sdna(srna, "MTex");
 -      RNA_def_struct_ui_text(srna, "Material Texture Slot", "Texture slot for textures in a Material data-block");
 -
 -      prop = RNA_def_property(srna, "texture_coords", PROP_ENUM, PROP_NONE);
 -      RNA_def_property_enum_sdna(prop, NULL, "texco");
 -      RNA_def_property_enum_items(prop, prop_texture_coordinates_items);
 -      RNA_def_property_enum_funcs(prop, NULL, NULL, "rna_Material_texture_coordinates_itemf");
 -      RNA_def_property_ui_text(prop, "Texture Coordinates", "");
 -      RNA_def_property_update(prop, 0, "rna_Material_update");
 -
 -      prop = RNA_def_property(srna, "object", PROP_POINTER, PROP_NONE);
 -      RNA_def_property_pointer_sdna(prop, NULL, "object");
 -      RNA_def_property_struct_type(prop, "Object");
 -      RNA_def_property_flag(prop, PROP_EDITABLE);
 -      RNA_def_property_ui_text(prop, "Object", "Object to use for mapping with Object texture coordinates");
 -      RNA_def_property_update(prop, 0, "rna_Material_update");
 -
 -      prop = RNA_def_property(srna, "uv_layer", PROP_STRING, PROP_NONE);
 -      RNA_def_property_string_sdna(prop, NULL, "uvname");
 -      RNA_def_property_ui_text(prop, "UV Map", "UV map to use for mapping with UV texture coordinates");
 -      RNA_def_property_update(prop, 0, "rna_Material_update");
 -
 -      prop = RNA_def_property(srna, "use_from_dupli", PROP_BOOLEAN, PROP_NONE);
 -      RNA_def_property_boolean_sdna(prop, NULL, "texflag", MTEX_DUPLI_MAPTO);
 -      RNA_def_property_ui_text(prop, "From Dupli",
 -                               "Dupli's instanced from verts, faces or particles, inherit texture coordinate "
 -                               "from their parent");
 -      RNA_def_property_update(prop, 0, "rna_Material_update");
 -
 -      prop = RNA_def_property(srna, "use_map_to_bounds", PROP_BOOLEAN, PROP_NONE);
 -      RNA_def_property_boolean_sdna(prop, NULL, "texflag", MTEX_MAPTO_BOUNDS);
 -      RNA_def_property_ui_text(prop, "Map to Bounds",
 -                               "Map coordinates in object bounds");
 -      RNA_def_property_update(prop, 0, "rna_Material_update");
 -
 -      prop = RNA_def_property(srna, "use_from_original", PROP_BOOLEAN, PROP_NONE);
 -      RNA_def_property_boolean_sdna(prop, NULL, "texflag", MTEX_OB_DUPLI_ORIG);
 -      RNA_def_property_ui_text(prop, "From Original",
 -                               "Dupli's derive their object coordinates from the original object's transformation");
 -      RNA_def_property_update(prop, 0, "rna_Material_update");
 -
 -      prop = RNA_def_property(srna, "use_map_color_diffuse", PROP_BOOLEAN, PROP_NONE);
 -      RNA_def_property_boolean_sdna(prop, NULL, "mapto", MAP_COL);
 -      RNA_def_property_ui_text(prop, "Diffuse Color", "The texture affects basic color of the material");
 -      RNA_def_property_update(prop, 0, "rna_Material_update");
 -
 -      prop = RNA_def_property(srna, "use_map_normal", PROP_BOOLEAN, PROP_NONE);
 -      RNA_def_property_boolean_sdna(prop, NULL, "mapto", MAP_NORM);
 -      RNA_def_property_ui_text(prop, "Normal", "The texture affects the rendered normal");
 -      RNA_def_property_update(prop, 0, "rna_Material_update");
 -
 -      prop = RNA_def_property(srna, "use_map_color_spec", PROP_BOOLEAN, PROP_NONE);
 -      RNA_def_property_boolean_sdna(prop, NULL, "mapto", MAP_COLSPEC);
 -      RNA_def_property_ui_text(prop, "Specular Color", "The texture affects the specularity color");
 -      RNA_def_property_update(prop, 0, "rna_Material_update");
 -
 -      prop = RNA_def_property(srna, "use_map_mirror", PROP_BOOLEAN, PROP_NONE);
 -      RNA_def_property_boolean_sdna(prop, NULL, "mapto", MAP_COLMIR);
 -      RNA_def_property_ui_text(prop, "Mirror", "The texture affects the mirror color");
 -      RNA_def_property_update(prop, 0, "rna_Material_update");
 -
 -      prop = RNA_def_property(srna, "use_map_diffuse", PROP_BOOLEAN, PROP_NONE);
 -      RNA_def_property_boolean_sdna(prop, NULL, "mapto", MAP_REF);
 -      RNA_def_property_ui_text(prop, "Diffuse", "The texture affects the value of diffuse reflectivity");
 -      RNA_def_property_update(prop, 0, "rna_Material_update");
 -
 -      prop = RNA_def_property(srna, "use_map_specular", PROP_BOOLEAN, PROP_NONE);
 -      RNA_def_property_boolean_sdna(prop, NULL, "mapto", MAP_SPEC);
 -      RNA_def_property_ui_text(prop, "Specular", "The texture affects the value of specular reflectivity");
 -      RNA_def_property_update(prop, 0, "rna_Material_update");
 -
 -      prop = RNA_def_property(srna, "use_map_ambient", PROP_BOOLEAN, PROP_NONE);
 -      RNA_def_property_boolean_sdna(prop, NULL, "mapto", MAP_AMB);
 -      RNA_def_property_ui_text(prop, "Ambient", "The texture affects the value of ambient");
 -      RNA_def_property_update(prop, 0, "rna_Material_update");
 +      prop = RNA_def_property(srna, "diffuse_color", PROP_FLOAT, PROP_COLOR);
 +      RNA_def_property_float_sdna(prop, NULL, "r");
 +      RNA_def_property_array(prop, 3);
 +      RNA_def_property_ui_text(prop, "Diffuse Color", "Diffuse color of the material");
 +      RNA_def_property_update(prop, 0, "rna_Material_draw_update");
-       
 -      prop = RNA_def_property(srna, "use_map_hardness", PROP_BOOLEAN, PROP_NONE);
 -      RNA_def_property_boolean_sdna(prop, NULL, "mapto", MAP_HAR);
 -      RNA_def_property_ui_text(prop, "Hardness", "The texture affects the hardness value");
 -      RNA_def_property_update(prop, 0, "rna_Material_update");
 +      prop = RNA_def_property(srna, "specular_color", PROP_FLOAT, PROP_COLOR);
 +      RNA_def_property_float_sdna(prop, NULL, "specr");
 +      RNA_def_property_array(prop, 3);
 +      RNA_def_property_ui_text(prop, "Specular Color", "Specular color of the material");
 +      RNA_def_property_update(prop, 0, "rna_Material_draw_update");
  
 -      prop = RNA_def_property(srna, "use_map_raymir", PROP_BOOLEAN, PROP_NONE);
 -      RNA_def_property_boolean_sdna(prop, NULL, "mapto", MAP_RAYMIRR);
 -      RNA_def_property_ui_text(prop, "Ray-Mirror", "The texture affects the ray-mirror value");
 -      RNA_def_property_update(prop, 0, "rna_Material_update");
 +      prop = RNA_def_property(srna, "roughness", PROP_FLOAT, PROP_FACTOR);
 +      RNA_def_property_float_sdna(prop, NULL, "roughness");
 +      RNA_def_property_float_default(prop, 0.25f);
 +      RNA_def_property_range(prop, 0, 1);
 +      RNA_def_property_ui_text(prop, "Roughness", "Roughness of the material");
 +      RNA_def_property_update(prop, 0, "rna_Material_draw_update");
-       
 -      prop = RNA_def_property(srna, "use_map_alpha", PROP_BOOLEAN, PROP_NONE);
 -      RNA_def_property_boolean_sdna(prop, NULL, "mapto", MAP_ALPHA);
 -      RNA_def_property_ui_text(prop, "Alpha", "The texture affects the alpha value");
 -      RNA_def_property_update(prop, 0, "rna_Material_update");
 +      prop = RNA_def_property(srna, "specular_intensity", PROP_FLOAT, PROP_FACTOR);
 +      RNA_def_property_float_sdna(prop, NULL, "spec");
 +      RNA_def_property_float_default(prop, 0.5f);
 +      RNA_def_property_range(prop, 0, 1);
 +      RNA_def_property_ui_text(prop, "Specular", "How intense (bright) the specular reflection is");
 +      RNA_def_property_update(prop, 0, "rna_Material_draw_update");
  
 -      prop = RNA_def_property(srna, "use_map_emit", PROP_BOOLEAN, PROP_NONE);
 -      RNA_def_property_boolean_sdna(prop, NULL, "mapto", MAP_EMIT);
 -      RNA_def_property_ui_text(prop, "Emit", "The texture affects the emit value");
 +      prop = RNA_def_property(srna, "metallic", PROP_FLOAT, PROP_FACTOR);
 +      RNA_def_property_float_sdna(prop, NULL, "metallic");
 +      RNA_def_property_range(prop, 0.0f, 1.0f);
 +      RNA_def_property_ui_text(prop, "Metallic", "Amount of mirror reflection for raytrace");
        RNA_def_property_update(prop, 0, "rna_Material_update");
  
 -      prop = RNA_def_property(srna, "use_map_translucency", PROP_BOOLEAN, PROP_NONE);
 -      RNA_def_property_boolean_sdna(prop, NULL, "mapto", MAP_TRANSLU);
 -      RNA_def_property_ui_text(prop, "Translucency", "The texture affects the translucency value");
 +      /* Freestyle line color */
 +      prop = RNA_def_property(srna, "line_color", PROP_FLOAT, PROP_COLOR);
 +      RNA_def_property_float_sdna(prop, NULL, "line_col");
 +      RNA_def_property_array(prop, 4);
 +      RNA_def_property_ui_text(prop, "Line Color", "Line color used for Freestyle line rendering");
        RNA_def_property_update(prop, 0, "rna_Material_update");
  
 -      prop = RNA_def_property(srna, "use_map_displacement", PROP_BOOLEAN, PROP_NONE);
 -      RNA_def_property_boolean_sdna(prop, NULL, "mapto", MAP_DISPLACE);
 -      RNA_def_property_ui_text(prop, "Displacement", "Let the texture displace the surface");
 +      prop = RNA_def_property(srna, "line_priority", PROP_INT, PROP_NONE);
 +      RNA_def_property_int_sdna(prop, NULL, "line_priority");
 +      RNA_def_property_range(prop, 0, 32767);
 +      RNA_def_property_ui_text(prop, "Line Priority",
 +                               "The line color of a higher priority is used at material boundaries");
        RNA_def_property_update(prop, 0, "rna_Material_update");
 +}
  
 -      prop = RNA_def_property(srna, "use_map_warp", PROP_BOOLEAN, PROP_NONE);
 -      RNA_def_property_boolean_sdna(prop, NULL, "mapto", MAP_WARP);
 -      RNA_def_property_ui_text(prop, "Warp", "Let the texture warp texture coordinates of next channels");
 -      RNA_def_property_update(prop, 0, "rna_Material_update");
 +void RNA_def_material(BlenderRNA *brna)
 +{
 +      StructRNA *srna;
 +      PropertyRNA *prop;
  
 -      prop = RNA_def_property(srna, "mapping_x", PROP_ENUM, PROP_NONE);
 -      RNA_def_property_enum_sdna(prop, NULL, "projx");
 -      RNA_def_property_enum_items(prop, prop_x_mapping_items);
 -      RNA_def_property_ui_text(prop, "X Mapping", "");
 -      RNA_def_property_update(prop, 0, "rna_Material_update");
 +      /* Render Preview Types */
 +      static const EnumPropertyItem preview_type_items[] = {
 +              {MA_FLAT, "FLAT", ICON_MATPLANE, "Flat", "Flat XY plane"},
 +              {MA_SPHERE, "SPHERE", ICON_MATSPHERE, "Sphere", "Sphere"},
 +              {MA_CUBE, "CUBE", ICON_MATCUBE, "Cube", "Cube"},
 +              {MA_MONKEY, "MONKEY", ICON_MONKEY, "Monkey", "Monkey"},
 +              {MA_HAIR, "HAIR", ICON_HAIR, "Hair", "Hair strands"},
 +              {MA_SPHERE_A, "SPHERE_A", ICON_MAT_SPHERE_SKY, "World Sphere", "Large sphere with sky"},
 +              {0, NULL, 0, NULL, NULL}
 +      };
  
 -      prop = RNA_def_property(srna, "mapping_y", PROP_ENUM, PROP_NONE);
 -      RNA_def_property_enum_sdna(prop, NULL, "projy");
 -      RNA_def_property_enum_items(prop, prop_y_mapping_items);
 -      RNA_def_property_ui_text(prop, "Y Mapping", "");
 -      RNA_def_property_update(prop, 0, "rna_Material_update");
 +      static EnumPropertyItem prop_eevee_blend_items[] = {
 +              {MA_BM_SOLID, "OPAQUE", 0, "Opaque", "Render surface without transparency"},
 +              {MA_BM_ADD, "ADD", 0, "Additive", "Render surface and blend the result with additive blending"},
 +              {MA_BM_MULTIPLY, "MULTIPLY", 0, "Multiply", "Render surface and blend the result with multiplicative blending"},
 +              {MA_BM_CLIP, "CLIP", 0, "Alpha Clip", "Use the alpha threshold to clip the visibility (binary visibility)"},
 +              {MA_BM_HASHED, "HASHED", 0, "Alpha Hashed", "Use noise to dither the binary visibility (works well with multi-samples)"},
 +              {MA_BM_BLEND, "BLEND", 0, "Alpha Blend", "Render polygon transparent, depending on alpha channel of the texture"},
 +              {0, NULL, 0, NULL, NULL}
 +      };
  
 -      prop = RNA_def_property(srna, "mapping_z", PROP_ENUM, PROP_NONE);
 -      RNA_def_property_enum_sdna(prop, NULL, "projz");
 -      RNA_def_property_enum_items(prop, prop_z_mapping_items);
 -      RNA_def_property_ui_text(prop, "Z Mapping", "");
 -      RNA_def_property_update(prop, 0, "rna_Material_update");
 +      static EnumPropertyItem prop_eevee_blend_shadow_items[] = {
 +              {MA_BS_NONE, "NONE", 0, "None", "Material will cast no shadow"},
 +              {MA_BS_SOLID, "OPAQUE", 0, "Opaque", "Material will cast shadows without transparency"},
 +              {MA_BS_CLIP, "CLIP", 0, "Clip", "Use the alpha threshold to clip the visibility (binary visibility)"},
 +              {MA_BS_HASHED, "HASHED", 0, "Hashed", "Use noise to dither the binary visibility and use filtering to reduce the noise"},
 +              {0, NULL, 0, NULL, NULL}
 +      };
  
 -      prop = RNA_def_property(srna, "mapping", PROP_ENUM, PROP_NONE);
 -      RNA_def_property_enum_items(prop, prop_mapping_items);
 -      RNA_def_property_ui_text(prop, "Mapping", "");
 -      RNA_def_property_update(prop, 0, "rna_Material_update");
 +      srna = RNA_def_struct(brna, "Material", "ID");
 +      RNA_def_struct_ui_text(srna, "Material",
 +                             "Material data-block to define the appearance of geometric objects for rendering");
 +      RNA_def_struct_ui_icon(srna, ICON_MATERIAL_DATA);
-       
 -      prop = RNA_def_property(srna, "normal_map_space", PROP_ENUM, PROP_NONE);
 -      RNA_def_property_enum_sdna(prop, NULL, "normapspace");
 -      RNA_def_property_enum_items(prop, prop_normal_map_space_items);
 -      RNA_def_property_ui_text(prop, "Normal Map Space", "Set space of normal map image");
 -      RNA_def_property_update(prop, 0, "rna_Material_update");
 +      /* Blending (only Eevee for now) */
 +      prop = RNA_def_property(srna, "blend_method", PROP_ENUM, PROP_NONE);
 +      RNA_def_property_enum_items(prop, prop_eevee_blend_items);
 +      RNA_def_property_ui_text(prop, "Blend Mode", "Blend Mode for Transparent Faces");
 +      RNA_def_property_update(prop, 0, "rna_Material_draw_update");
  
 -      prop = RNA_def_property(srna, "normal_factor", PROP_FLOAT, PROP_NONE);
 -      RNA_def_property_float_sdna(prop, NULL, "norfac");
 -      RNA_def_property_ui_range(prop, -5, 5, 10, 3);
 -      RNA_def_property_ui_text(prop, "Normal Factor", "Amount texture affects normal values");
 -      RNA_def_property_update(prop, 0, "rna_Material_update");
 +      prop = RNA_def_property(srna, "transparent_shadow_method", PROP_ENUM, PROP_NONE);
 +      RNA_def_property_enum_sdna(prop, NULL, "blend_shadow");
 +      RNA_def_property_enum_items(prop, prop_eevee_blend_shadow_items);
 +      RNA_def_property_ui_text(prop, "Transparent Shadow", "Shadow method for transparent material");
 +      RNA_def_property_update(prop, 0, "rna_Material_draw_update");
  
 -      prop = RNA_def_property(srna, "displacement_factor", PROP_FLOAT, PROP_NONE);
 -      RNA_def_property_float_sdna(prop, NULL, "dispfac");
 -      RNA_def_property_ui_range(prop, -1, 1, 10, 3);
 -      RNA_def_property_ui_text(prop, "Displacement Factor", "Amount texture displaces the surface");
 -      RNA_def_property_update(prop, 0, "rna_Material_update");
 +      prop = RNA_def_property(srna, "alpha_threshold", PROP_FLOAT, PROP_FACTOR);
 +      RNA_def_property_range(prop, 0, 1);
 +      RNA_def_property_ui_text(prop, "Clip Threshold", "A pixel is rendered only if its alpha value is above this threshold");
 +      RNA_def_property_update(prop, 0, "rna_Material_draw_update");
  
 -      prop = RNA_def_property(srna, "warp_factor", PROP_FLOAT, PROP_NONE);
 -      RNA_def_property_float_sdna(prop, NULL, "warpfac");
 -      RNA_def_property_ui_range(prop, 0, 1, 10, 3);
 -      RNA_def_property_ui_text(prop, "Warp Factor", "Amount texture affects texture coordinates of next channels");
 -      RNA_def_property_update(prop, 0, "rna_Material_update");
 +      prop = RNA_def_property(srna, "show_transparent_backside", PROP_BOOLEAN, PROP_NONE);
 +      RNA_def_property_boolean_negative_sdna(prop, NULL, "blend_flag", MA_BL_HIDE_BACKSIDE);
 +      RNA_def_property_ui_text(prop, "Show Backside", "Limit transparency to a single layer "
 +                                                       "(avoids transparency sorting problems)");
 +      RNA_def_property_update(prop, 0, "rna_Material_draw_update");
  
 -      prop = RNA_def_property(srna, "specular_color_factor", PROP_FLOAT, PROP_NONE);
 -      RNA_def_property_float_sdna(prop, NULL, "colspecfac");
 -      RNA_def_property_ui_range(prop, 0, 1, 10, 3);
 -      RNA_def_property_ui_text(prop, "Specular Color Factor", "Amount texture affects specular color");
 -      RNA_def_property_update(prop, 0, "rna_Material_update");
 +      prop = RNA_def_property(srna, "use_screen_refraction", PROP_BOOLEAN, PROP_NONE);
 +      RNA_def_property_boolean_sdna(prop, NULL, "blend_flag", MA_BL_SS_REFRACTION);
 +      RNA_def_property_ui_text(prop, "Screen Space Refraction", "Use raytraced screen space refractions");
 +      RNA_def_property_update(prop, 0, "rna_Material_draw_update");
  
 -      prop = RNA_def_property(srna, "diffuse_color_factor", PROP_FLOAT, PROP_NONE);
 -      RNA_def_property_float_sdna(prop, NULL, "colfac");
 -      RNA_def_property_ui_range(prop, 0, 1, 10, 3);
 -      RNA_def_property_ui_text(prop, "Diffuse Color Factor", "Amount texture affects diffuse color");
 -      RNA_def_property_update(prop, 0, "rna_Material_update");
 +      prop = RNA_def_property(srna, "use_screen_subsurface", PROP_BOOLEAN, PROP_NONE);
 +      RNA_def_property_boolean_sdna(prop, NULL, "blend_flag", MA_BL_SS_SUBSURFACE);
 +      RNA_def_property_ui_text(prop, "Screen Space Subsurface Scattering", "Use post process subsurface scattering");
 +      RNA_def_property_update(prop, 0, "rna_Material_draw_update");
  
 -      prop = RNA_def_property(srna, "mirror_factor", PROP_FLOAT, PROP_NONE);
 -      RNA_def_property_float_sdna(prop, NULL, "mirrfac");
 -      RNA_def_property_ui_range(prop, 0, 1, 10, 3);
 -      RNA_def_property_ui_text(prop, "Mirror Factor", "Amount texture affects mirror color");
 -      RNA_def_property_update(prop, 0, "rna_Material_update");
 +      prop = RNA_def_property(srna, "use_sss_translucency", PROP_BOOLEAN, PROP_NONE);
 +      RNA_def_property_boolean_sdna(prop, NULL, "blend_flag", MA_BL_TRANSLUCENCY);
 +      RNA_def_property_ui_text(prop, "Subsurface Translucency", "Add translucency effect to subsurface");
 +      RNA_def_property_update(prop, 0, "rna_Material_draw_update");
  
 -      prop = RNA_def_property(srna, "alpha_factor", PROP_FLOAT, PROP_NONE);
 -      RNA_def_property_float_sdna(prop, NULL, "alphafac");
 -      RNA_def_property_ui_range(prop, -1, 1, 10, 3);
 -      RNA_def_property_ui_text(prop, "Alpha Factor", "Amount texture affects alpha");
 -      RNA_def_property_update(prop, 0, "rna_Material_update");
 +      prop = RNA_def_property(srna, "refraction_depth", PROP_FLOAT, PROP_DISTANCE);
 +      RNA_def_property_float_sdna(prop, NULL, "refract_depth");
 +      RNA_def_property_range(prop, 0.0f, FLT_MAX);
 +      RNA_def_property_ui_text(prop, "Refraction Depth", "Approximate the thickness of the object to compute two refraction "
 +                                                         "event (0 is disabled)");
 +      RNA_def_property_update(prop, 0, "rna_Material_draw_update");
  
 -      prop = RNA_def_property(srna, "diffuse_factor", PROP_FLOAT, PROP_NONE);
 -      RNA_def_property_float_sdna(prop, NULL, "difffac");
 -      RNA_def_property_ui_range(prop, -1, 1, 10, 3);
 -      RNA_def_property_ui_text(prop, "Diffuse Factor", "Amount texture affects diffuse reflectivity");
 -      RNA_def_property_update(prop, 0, "rna_Material_update");
 +      /* For Preview Render */
 +      prop = RNA_def_property(srna, "preview_render_type", PROP_ENUM, PROP_NONE);
 +      RNA_def_property_enum_sdna(prop, NULL, "pr_type");
 +      RNA_def_property_enum_items(prop, preview_type_items);
 +      RNA_def_property_ui_text(prop, "Preview render type", "Type of preview render");
 +      RNA_def_property_update(prop, 0, "rna_Material_update_previews");
-       
 -      prop = RNA_def_property(srna, "specular_factor", PROP_FLOAT, PROP_NONE);
 -      RNA_def_property_float_sdna(prop, NULL, "specfac");
 -      RNA_def_property_ui_range(prop, -1, 1, 10, 3);
 -      RNA_def_property_ui_text(prop, "Specular Factor", "Amount texture affects specular reflectivity");
 -      RNA_def_property_update(prop, 0, "rna_Material_update");
 +      prop = RNA_def_property(srna, "pass_index", PROP_INT, PROP_UNSIGNED);
 +      RNA_def_property_int_sdna(prop, NULL, "index");
 +      RNA_def_property_ui_text(prop, "Pass Index", "Index number for the \"Material Index\" render pass");
 +      RNA_def_property_update(prop, NC_OBJECT, "rna_Material_update");
  
 -      prop = RNA_def_property(srna, "emit_factor", PROP_FLOAT, PROP_NONE);
 -      RNA_def_property_float_sdna(prop, NULL, "emitfac");
 -      RNA_def_property_ui_range(prop, -1, 1, 10, 3);
 -      RNA_def_property_ui_text(prop, "Emit Factor", "Amount texture affects emission");
 -      RNA_def_property_update(prop, 0, "rna_Material_update");
 +      /* nodetree */
 +      prop = RNA_def_property(srna, "node_tree", PROP_POINTER, PROP_NONE);
 +      RNA_def_property_pointer_sdna(prop, NULL, "nodetree");
 +      RNA_def_property_ui_text(prop, "Node Tree", "Node tree for node based materials");
  
 -      prop = RNA_def_property(srna, "hardness_factor", PROP_FLOAT, PROP_NONE);
 -      RNA_def_property_float_sdna(prop, NULL, "hardfac");
 -      RNA_def_property_ui_range(prop, -1, 1, 10, 3);
 -      RNA_def_property_ui_text(prop, "Hardness Factor", "Amount texture affects hardness");
 -      RNA_def_property_update(prop, 0, "rna_Material_update");
 -
 -      prop = RNA_def_property(srna, "raymir_factor", PROP_FLOAT, PROP_NONE);
 -      RNA_def_property_float_sdna(prop, NULL, "raymirrfac");
 -      RNA_def_property_ui_range(prop, -1, 1, 10, 3);
 -      RNA_def_property_ui_text(prop, "Ray Mirror Factor", "Amount texture affects ray mirror");
 -      RNA_def_property_update(prop, 0, "rna_Material_update");
 -
 -      prop = RNA_def_property(srna, "translucency_factor", PROP_FLOAT, PROP_NONE);
 -      RNA_def_property_float_sdna(prop, NULL, "translfac");
 -      RNA_def_property_ui_range(prop, -1, 1, 10, 3);
 -      RNA_def_property_ui_text(prop, "Translucency Factor", "Amount texture affects translucency");
 -      RNA_def_property_update(prop, 0, "rna_Material_update");
 -
 -      prop = RNA_def_property(srna, "ambient_factor", PROP_FLOAT, PROP_NONE);
 -      RNA_def_property_float_sdna(prop, NULL, "ambfac");
 -      RNA_def_property_ui_range(prop, -1, 1, 10, 3);
 -      RNA_def_property_ui_text(prop, "Ambient Factor", "Amount texture affects ambient");
 -      RNA_def_property_update(prop, 0, "rna_Material_update");
 -
 -      /* volume material */
 -      prop = RNA_def_property(srna, "use_map_color_emission", PROP_BOOLEAN, PROP_NONE);
 -      RNA_def_property_boolean_sdna(prop, NULL, "mapto", MAP_EMISSION_COL);
 -      RNA_def_property_ui_text(prop, "Emission Color", "The texture affects the color of emission");
 -      RNA_def_property_update(prop, 0, "rna_Material_update");
 -
 -      prop = RNA_def_property(srna, "use_map_color_reflection", PROP_BOOLEAN, PROP_NONE);
 -      RNA_def_property_boolean_sdna(prop, NULL, "mapto", MAP_REFLECTION_COL);
 -      RNA_def_property_ui_text(prop, "Reflection Color", "The texture affects the color of scattered light");
 -      RNA_def_property_update(prop, 0, "rna_Material_update");
 -
 -      prop = RNA_def_property(srna, "use_map_color_transmission", PROP_BOOLEAN, PROP_NONE);
 -      RNA_def_property_boolean_sdna(prop, NULL, "mapto", MAP_TRANSMISSION_COL);
 -      RNA_def_property_ui_text(prop, "Transmission Color",
 -                               "The texture affects the result color after other light has been scattered/absorbed");
 -      RNA_def_property_update(prop, NC_TEXTURE, NULL);
 -
 -      prop = RNA_def_property(srna, "use_map_density", PROP_BOOLEAN, PROP_NONE);
 -      RNA_def_property_boolean_sdna(prop, NULL, "mapto", MAP_DENSITY);
 -      RNA_def_property_ui_text(prop, "Density", "The texture affects the volume's density");
 -      RNA_def_property_update(prop, 0, "rna_Material_update");
 -
 -      prop = RNA_def_property(srna, "use_map_emission", PROP_BOOLEAN, PROP_NONE);
 -      RNA_def_property_boolean_sdna(prop, NULL, "mapto", MAP_EMISSION);
 -      RNA_def_property_ui_text(prop, "Emission", "The texture affects the volume's emission");
 -      RNA_def_property_update(prop, 0, "rna_Material_update");
 -
 -      prop = RNA_def_property(srna, "use_map_scatter", PROP_BOOLEAN, PROP_NONE);
 -      RNA_def_property_boolean_sdna(prop, NULL, "mapto", MAP_SCATTERING);
 -      RNA_def_property_ui_text(prop, "Scattering", "The texture affects the volume's scattering");
 -      RNA_def_property_update(prop, 0, "rna_Material_update");
 -
 -      prop = RNA_def_property(srna, "use_map_reflect", PROP_BOOLEAN, PROP_NONE);
 -      RNA_def_property_boolean_sdna(prop, NULL, "mapto", MAP_REFLECTION);
 -      RNA_def_property_ui_text(prop, "Reflection", "The texture affects the reflected light's brightness");
 -      RNA_def_property_update(prop, NC_TEXTURE, NULL);
 -
 -      prop = RNA_def_property(srna, "emission_color_factor", PROP_FLOAT, PROP_NONE);
 -      RNA_def_property_float_sdna(prop, NULL, "colemitfac");
 -      RNA_def_property_ui_range(prop, 0, 1, 10, 3);
 -      RNA_def_property_ui_text(prop, "Emission Color Factor", "Amount texture affects emission color");
 -      RNA_def_property_update(prop, 0, "rna_Material_update");
 -
 -      prop = RNA_def_property(srna, "reflection_color_factor", PROP_FLOAT, PROP_NONE);
 -      RNA_def_property_float_sdna(prop, NULL, "colreflfac");
 -      RNA_def_property_ui_range(prop, 0, 1, 10, 3);
 -      RNA_def_property_ui_text(prop, "Reflection Color Factor", "Amount texture affects color of out-scattered light");
 -      RNA_def_property_update(prop, 0, "rna_Material_update");
 -
 -      prop = RNA_def_property(srna, "transmission_color_factor", PROP_FLOAT, PROP_NONE);
 -      RNA_def_property_float_sdna(prop, NULL, "coltransfac");
 -      RNA_def_property_ui_range(prop, 0, 1, 10, 3);
 -      RNA_def_property_ui_text(prop, "Transmission Color Factor",
 -                               "Amount texture affects result color after light has been scattered/absorbed");
 -      RNA_def_property_update(prop, NC_TEXTURE, NULL);
 -
 -      prop = RNA_def_property(srna, "density_factor", PROP_FLOAT, PROP_NONE);
 -      RNA_def_property_float_sdna(prop, NULL, "densfac");
 -      RNA_def_property_ui_range(prop, 0, 1, 10, 3);
 -      RNA_def_property_ui_text(prop, "Density Factor", "Amount texture affects density");
 -      RNA_def_property_update(prop, 0, "rna_Material_update");
 -
 -      prop = RNA_def_property(srna, "emission_factor", PROP_FLOAT, PROP_NONE);
 -      RNA_def_property_float_sdna(prop, NULL, "emitfac");
 -      RNA_def_property_ui_range(prop, 0, 1, 10, 3);
 -      RNA_def_property_ui_text(prop, "Emission Factor", "Amount texture affects emission");
 -      RNA_def_property_update(prop, 0, "rna_Material_update");
 -
 -      prop = RNA_def_property(srna, "scattering_factor", PROP_FLOAT, PROP_NONE);
 -      RNA_def_property_float_sdna(prop, NULL, "scatterfac");
 -      RNA_def_property_ui_range(prop, 0, 1, 10, 3);
 -      RNA_def_property_ui_text(prop, "Scattering Factor", "Amount texture affects scattering");
 -      RNA_def_property_update(prop, 0, "rna_Material_update");
 -
 -      prop = RNA_def_property(srna, "reflection_factor", PROP_FLOAT, PROP_NONE);
 -      RNA_def_property_float_sdna(prop, NULL, "reflfac");
 -      RNA_def_property_ui_range(prop, 0, 1, 10, 3);
 -      RNA_def_property_ui_text(prop, "Reflection Factor", "Amount texture affects brightness of out-scattered light");
 -      RNA_def_property_update(prop, 0, "rna_Material_update");
 -
 -      /* end volume material */
 -
 -      prop = RNA_def_property(srna, "use", PROP_BOOLEAN, PROP_NONE);
 -      RNA_def_property_boolean_funcs(prop, "rna_MaterialTextureSlot_use_get", "rna_MaterialTextureSlot_use_set");
 -      RNA_def_property_ui_text(prop, "Enabled", "Enable this material texture slot");
 -      RNA_def_property_update(prop, 0, "rna_Material_update");
 -
 -      prop = RNA_def_property(srna, "bump_method", PROP_ENUM, PROP_NONE);
 -      RNA_def_property_enum_bitflag_sdna(prop, NULL, "texflag");
 -      RNA_def_property_enum_items(prop, prop_bump_method_items);
 -      RNA_def_property_ui_text(prop, "Bump Method", "Method to use for bump mapping");
 -      RNA_def_property_update(prop, 0, "rna_Material_update");
 -
 -      prop = RNA_def_property(srna, "bump_objectspace", PROP_ENUM, PROP_NONE);
 -      RNA_def_property_enum_bitflag_sdna(prop, NULL, "texflag");
 -      RNA_def_property_enum_items(prop, prop_bump_space_items);
 -      RNA_def_property_ui_text(prop, "Bump Space", "Space to apply bump mapping in");
 -      RNA_def_property_update(prop, 0, "rna_Material_update");
 -}
 -
 -static void rna_def_material_gamesettings(BlenderRNA *brna)
 -{
 -      StructRNA *srna;
 -      PropertyRNA *prop;
 -
 -      static const EnumPropertyItem prop_alpha_blend_items[] = {
 -              {GEMAT_SOLID, "OPAQUE", 0, "Opaque", "Render color of textured face as color"},
 -              {GEMAT_ADD, "ADD", 0, "Add", "Render face transparent and add color of face"},
 -              {GEMAT_CLIP, "CLIP", 0, "Alpha Clip", "Use the image alpha values clipped with no blending (binary alpha)"},
 -              {GEMAT_ALPHA, "ALPHA", 0, "Alpha Blend",
 -               "Render polygon transparent, depending on alpha channel of the texture"},
 -              {GEMAT_ALPHA_SORT, "ALPHA_SORT", 0, "Alpha Sort",
 -               "Sort faces for correct alpha drawing (slow, use Alpha Clip instead when possible)"},
 -              {GEMAT_ALPHA_TO_COVERAGE, "ALPHA_ANTIALIASING", 0, "Alpha Anti-Aliasing",
 -               "Use textures alpha as anti-aliasing mask, requires multi-sample OpenGL display"},
 -              {0, NULL, 0, NULL, NULL}
 -      };
 -
 -      static const EnumPropertyItem prop_face_orientation_items[] = {
 -              {GEMAT_NORMAL, "NORMAL", 0, "Normal", "No transformation"},
 -              {GEMAT_HALO, "HALO", 0, "Halo", "Screen aligned billboard"},
 -              {GEMAT_BILLBOARD, "BILLBOARD", 0, "Billboard", "Billboard with Z-axis constraint"},
 -              {GEMAT_SHADOW, "SHADOW", 0, "Shadow", "Faces are used for shadow"},
 -              {0, NULL, 0, NULL, NULL}
 -      };
 -
 -      srna = RNA_def_struct(brna, "MaterialGameSettings", NULL);
 -      RNA_def_struct_sdna(srna, "GameSettings");
 -      RNA_def_struct_nested(brna, srna, "Material");
 -      RNA_def_struct_ui_text(srna, "Material Game Settings", "Game Engine settings for a Material data-block");
 -
 -      prop = RNA_def_property(srna, "use_backface_culling", PROP_BOOLEAN, PROP_NONE);
 -      RNA_def_property_boolean_sdna(prop, NULL, "flag", GEMAT_BACKCULL); /* use bitflags */
 -      RNA_def_property_ui_text(prop, "Backface Culling", "Hide Back of the face in Game Engine ");
 -      RNA_def_property_update(prop, 0, "rna_Material_draw_update");
 -
 -      prop = RNA_def_property(srna, "text", PROP_BOOLEAN, PROP_NONE);
 -      RNA_def_property_boolean_sdna(prop, NULL, "flag", GEMAT_TEXT); /* use bitflags */
 -      RNA_def_property_ui_text(prop, "Text", "Use material as text in Game Engine ");
 -      RNA_def_property_update(prop, 0, "rna_Material_draw_update");
 -
 -      prop = RNA_def_property(srna, "invisible", PROP_BOOLEAN, PROP_NONE);
 -      RNA_def_property_boolean_sdna(prop, NULL, "flag", GEMAT_INVISIBLE); /* use bitflags */
 -      RNA_def_property_ui_text(prop, "Invisible", "Make face invisible");
 -      RNA_def_property_update(prop, 0, "rna_Material_draw_update");
 -
 -      prop = RNA_def_property(srna, "alpha_blend", PROP_ENUM, PROP_NONE);
 -      RNA_def_property_enum_sdna(prop, NULL, "alpha_blend");
 -      RNA_def_property_enum_items(prop, prop_alpha_blend_items);
 -      RNA_def_property_ui_text(prop, "Blend Mode", "Blend Mode for Transparent Faces");
 -      RNA_def_property_update(prop, 0, "rna_Material_draw_update");
 -
 -      prop = RNA_def_property(srna, "face_orientation", PROP_ENUM, PROP_NONE);
 -      RNA_def_property_enum_items(prop, prop_face_orientation_items);
 -      RNA_def_property_ui_text(prop, "Face Orientations", "Especial face orientation options");
 -
 -      prop = RNA_def_property(srna, "physics", PROP_BOOLEAN, PROP_NONE);
 -      RNA_def_property_boolean_negative_sdna(prop, NULL, "flag", GEMAT_NOPHYSICS); /* use bitflags */
 -      RNA_def_property_ui_text(prop, "Physics", "Use physics properties of materials ");
 -}
 -
 -static void rna_def_material_colors(StructRNA *srna)
 -{
 -      PropertyRNA *prop;
 -
 -      static const EnumPropertyItem prop_ramp_input_items[] = {
 -              {MA_RAMP_IN_SHADER, "SHADER", 0, "Shader", ""},
 -              {MA_RAMP_IN_ENERGY, "ENERGY", 0, "Energy", ""},
 -              {MA_RAMP_IN_NOR, "NORMAL", 0, "Normal", ""},
 -              {MA_RAMP_IN_RESULT, "RESULT", 0, "Result", ""},
 -              {0, NULL, 0, NULL, NULL}
 -      };
 -
 -      prop = RNA_def_property(srna, "diffuse_color", PROP_FLOAT, PROP_COLOR);
 -      RNA_def_property_float_sdna(prop, NULL, "r");
 -      RNA_def_property_array(prop, 3);
 -      RNA_def_property_ui_text(prop, "Diffuse Color", "Diffuse color of the material");
 -      RNA_def_property_update(prop, 0, "rna_Material_draw_update");
 -
 -      prop = RNA_def_property(srna, "specular_color", PROP_FLOAT, PROP_COLOR);
 -      RNA_def_property_float_sdna(prop, NULL, "specr");
 -      RNA_def_property_array(prop, 3);
 -      RNA_def_property_ui_text(prop, "Specular Color", "Specular color of the material");
 -      RNA_def_property_update(prop, 0, "rna_Material_draw_update");
 -
 -      prop = RNA_def_property(srna, "mirror_color", PROP_FLOAT, PROP_COLOR);
 -      RNA_def_property_float_sdna(prop, NULL, "mirr");
 -      RNA_def_property_array(prop, 3);
 -      RNA_def_property_ui_text(prop, "Mirror Color", "Mirror color of the material");
 -      RNA_def_property_update(prop, 0, "rna_Material_update");
 -
 -      prop = RNA_def_property(srna, "alpha", PROP_FLOAT, PROP_FACTOR);
 -      RNA_def_property_range(prop, 0.0f, 1.0f);
 -      RNA_def_property_ui_text(prop, "Alpha", "Alpha transparency of the material");
 -      RNA_def_property_update(prop, 0, "rna_Material_draw_update");
 -
 -      prop = RNA_def_property(srna, "specular_alpha", PROP_FLOAT, PROP_FACTOR);
 -      RNA_def_property_float_sdna(prop, NULL, "spectra");
 -      RNA_def_property_range(prop, 0.0f, 1.0f);
 -      RNA_def_property_ui_text(prop, "Specular Alpha", "Alpha transparency for specular areas");
 -      RNA_def_property_update(prop, 0, "rna_Material_update");
 -
 -      /* Color bands */
 -      prop = RNA_def_property(srna, "use_diffuse_ramp", PROP_BOOLEAN, PROP_NONE);
 -      RNA_def_property_boolean_sdna(prop, NULL, "mode", MA_RAMP_COL);
 -      RNA_def_property_boolean_funcs(prop, NULL, "rna_Material_use_diffuse_ramp_set");
 -      RNA_def_property_ui_text(prop, "Use Diffuse Ramp", "Toggle diffuse ramp operations");
 -      RNA_def_property_update(prop, 0, "rna_Material_update");
 -
 -      prop = RNA_def_property(srna, "diffuse_ramp", PROP_POINTER, PROP_NONE);
 -      RNA_def_property_pointer_sdna(prop, NULL, "ramp_col");
 -      RNA_def_property_struct_type(prop, "ColorRamp");
 -      RNA_def_property_ui_text(prop, "Diffuse Ramp", "Color ramp used to affect diffuse shading");
 -      RNA_def_property_update(prop, 0, "rna_Material_update");
 -
 -      prop = RNA_def_property(srna, "use_specular_ramp", PROP_BOOLEAN, PROP_NONE);
 -      RNA_def_property_boolean_sdna(prop, NULL, "mode", MA_RAMP_SPEC);
 -      RNA_def_property_boolean_funcs(prop, NULL, "rna_Material_use_specular_ramp_set");
 -      RNA_def_property_ui_text(prop, "Use Specular Ramp", "Toggle specular ramp operations");
 -      RNA_def_property_update(prop, 0, "rna_Material_update");
 -
 -      prop = RNA_def_property(srna, "specular_ramp", PROP_POINTER, PROP_NONE);
 -      RNA_def_property_pointer_sdna(prop, NULL, "ramp_spec");
 -      RNA_def_property_struct_type(prop, "ColorRamp");
 -      RNA_def_property_ui_text(prop, "Specular Ramp", "Color ramp used to affect specular shading");
 -      RNA_def_property_update(prop, 0, "rna_Material_update");
 -
 -      prop = RNA_def_property(srna, "diffuse_ramp_blend", PROP_ENUM, PROP_NONE);
 -      RNA_def_property_enum_sdna(prop, NULL, "rampblend_col");
 -      RNA_def_property_enum_items(prop, rna_enum_ramp_blend_items);
 -      RNA_def_property_ui_text(prop, "Diffuse Ramp Blend", "Blending method of the ramp and the diffuse color");
 -      RNA_def_property_update(prop, 0, "rna_Material_update");
 -
 -      prop = RNA_def_property(srna, "specular_ramp_blend", PROP_ENUM, PROP_NONE);
 -      RNA_def_property_enum_sdna(prop, NULL, "rampblend_spec");
 -      RNA_def_property_enum_items(prop, rna_enum_ramp_blend_items);
 -      RNA_def_property_ui_text(prop, "Specular Ramp Blend", "Blending method of the ramp and the specular color");
 -      RNA_def_property_update(prop, 0, "rna_Material_update");
 -
 -      prop = RNA_def_property(srna, "diffuse_ramp_input", PROP_ENUM, PROP_NONE);
 -      RNA_def_property_enum_sdna(prop, NULL, "rampin_col");
 -      RNA_def_property_enum_items(prop, prop_ramp_input_items);
 -      RNA_def_property_ui_text(prop, "Diffuse Ramp Input", "How the ramp maps on the surface");
 -      RNA_def_property_update(prop, 0, "rna_Material_update");
 -
 -      prop = RNA_def_property(srna, "specular_ramp_input", PROP_ENUM, PROP_NONE);
 -      RNA_def_property_enum_sdna(prop, NULL, "rampin_spec");
 -      RNA_def_property_enum_items(prop, prop_ramp_input_items);
 -      RNA_def_property_ui_text(prop, "Specular Ramp Input", "How the ramp maps on the surface");
 -      RNA_def_property_update(prop, 0, "rna_Material_update");
 -
 -      prop = RNA_def_property(srna, "diffuse_ramp_factor", PROP_FLOAT, PROP_FACTOR);
 -      RNA_def_property_float_sdna(prop, NULL, "rampfac_col");
 -      RNA_def_property_range(prop, 0.0f, 1.0f);
 -      RNA_def_property_ui_text(prop, "Diffuse Ramp Factor", "Blending factor (also uses alpha in Colorband)");
 -      RNA_def_property_update(prop, 0, "rna_Material_update");
 -
 -      prop = RNA_def_property(srna, "specular_ramp_factor", PROP_FLOAT, PROP_FACTOR);
 -      RNA_def_property_float_sdna(prop, NULL, "rampfac_spec");
 -      RNA_def_property_range(prop, 0.0f, 1.0f);
 -      RNA_def_property_ui_text(prop, "Specular Ramp Factor", "Blending factor (also uses alpha in Colorband)");
 -      RNA_def_property_update(prop, 0, "rna_Material_update");
 -
 -      /* Freestyle line color */
 -      prop = RNA_def_property(srna, "line_color", PROP_FLOAT, PROP_COLOR);
 -      RNA_def_property_float_sdna(prop, NULL, "line_col");
 -      RNA_def_property_array(prop, 4);
 -      RNA_def_property_ui_text(prop, "Line Color", "Line color used for Freestyle line rendering");
 -      RNA_def_property_update(prop, 0, "rna_Material_update");
 -
 -      prop = RNA_def_property(srna, "line_priority", PROP_INT, PROP_NONE);
 -      RNA_def_property_int_sdna(prop, NULL, "line_priority");
 -      RNA_def_property_range(prop, 0, 32767);
 -      RNA_def_property_ui_text(prop, "Line Priority",
 -                               "The line color of a higher priority is used at material boundaries");
 -      RNA_def_property_update(prop, 0, "rna_Material_update");
 -}
 -
 -static void rna_def_material_diffuse(StructRNA *srna)
 -{
 -      PropertyRNA *prop;
 -
 -      static const EnumPropertyItem prop_diff_shader_items[] = {
 -              {MA_DIFF_LAMBERT, "LAMBERT", 0, "Lambert", "Use a Lambertian shader"},
 -              {MA_DIFF_ORENNAYAR, "OREN_NAYAR", 0, "Oren-Nayar", "Use an Oren-Nayar shader"},
 -              {MA_DIFF_TOON, "TOON", 0, "Toon", "Use a toon shader"},
 -              {MA_DIFF_MINNAERT, "MINNAERT", 0, "Minnaert", "Use a Minnaert shader"},
 -              {MA_DIFF_FRESNEL, "FRESNEL", 0, "Fresnel", "Use a Fresnel shader"},
 -              {0, NULL, 0, NULL, NULL}
 -      };
 -
 -      prop = RNA_def_property(srna, "diffuse_shader", PROP_ENUM, PROP_NONE);
 -      RNA_def_property_enum_sdna(prop, NULL, "diff_shader");
 -      RNA_def_property_enum_items(prop, prop_diff_shader_items);
 -      RNA_def_property_ui_text(prop, "Diffuse Shader Model", "");
 -      RNA_def_property_update(prop, 0, "rna_Material_update");
 -
 -      prop = RNA_def_property(srna, "diffuse_intensity", PROP_FLOAT, PROP_FACTOR);
 -      RNA_def_property_float_sdna(prop, NULL, "ref");
 -      RNA_def_property_range(prop, 0.0f, 1.0f);
 -      RNA_def_property_ui_text(prop, "Diffuse Intensity", "Amount of diffuse reflection");
 -      RNA_def_property_update(prop, 0, "rna_Material_draw_update");
 -
 -      prop = RNA_def_property(srna, "roughness", PROP_FLOAT, PROP_NONE);
 -      RNA_def_property_range(prop, 0.0f, 3.14f);
 -      RNA_def_property_ui_text(prop, "Roughness", "Oren-Nayar Roughness");
 -      RNA_def_property_update(prop, 0, "rna_Material_update");
 -
 -      prop = RNA_def_property(srna, "diffuse_toon_size", PROP_FLOAT, PROP_NONE);
 -      RNA_def_property_float_sdna(prop, NULL, "param[0]");
 -      RNA_def_property_range(prop, 0.0f, 3.14f);
 -      RNA_def_property_ui_text(prop, "Diffuse Toon Size", "Size of diffuse toon area");
 -      RNA_def_property_update(prop, 0, "rna_Material_update");
 -
 -      prop = RNA_def_property(srna, "diffuse_toon_smooth", PROP_FLOAT, PROP_FACTOR);
 -      RNA_def_property_float_sdna(prop, NULL, "param[1]");
 -      RNA_def_property_range(prop, 0.0f, 1.0f);
 -      RNA_def_property_ui_text(prop, "Diffuse Toon Smooth", "Smoothness of diffuse toon area");
 -      RNA_def_property_update(prop, 0, "rna_Material_update");
 -
 -      prop = RNA_def_property(srna, "diffuse_fresnel", PROP_FLOAT, PROP_NONE);
 -      RNA_def_property_float_sdna(prop, NULL, "param[1]");
 -      RNA_def_property_range(prop, 0.0f, 5.0f);
 -      RNA_def_property_ui_text(prop, "Diffuse Fresnel", "Power of Fresnel");
 -      RNA_def_property_update(prop, 0, "rna_Material_update");
 -
 -      prop = RNA_def_property(srna, "diffuse_fresnel_factor", PROP_FLOAT, PROP_NONE);
 -      RNA_def_property_float_sdna(prop, NULL, "param[0]");
 -      RNA_def_property_range(prop, 0.0f, 5.0f);
 -      RNA_def_property_ui_text(prop, "Diffuse Fresnel Factor", "Blending factor of Fresnel");
 -      RNA_def_property_update(prop, 0, "rna_Material_update");
 -
 -      prop = RNA_def_property(srna, "darkness", PROP_FLOAT, PROP_NONE);
 -      RNA_def_property_range(prop, 0.0f, 2.0f);
 -      RNA_def_property_ui_text(prop, "Darkness", "Minnaert darkness");
 -      RNA_def_property_update(prop, 0, "rna_Material_update");
 -}
 -
 -static void rna_def_material_raymirror(BlenderRNA *brna)
 -{
 -      StructRNA *srna;
 -      PropertyRNA *prop;
 -
 -      static const EnumPropertyItem prop_fadeto_mir_items[] = {
 -              {MA_RAYMIR_FADETOSKY, "FADE_TO_SKY", 0, "Sky", ""},
 -              {MA_RAYMIR_FADETOMAT, "FADE_TO_MATERIAL", 0, "Material", ""},
 -              {0, NULL, 0, NULL, NULL}
 -      };
 -
 -      srna = RNA_def_struct(brna, "MaterialRaytraceMirror", NULL);
 -      RNA_def_struct_sdna(srna, "Material");
 -      RNA_def_struct_nested(brna, srna, "Material");
 -      RNA_def_struct_ui_text(srna, "Material Raytrace Mirror", "Raytraced reflection settings for a Material data-block");
 -
 -      prop = RNA_def_property(srna, "use", PROP_BOOLEAN, PROP_NONE);
 -      RNA_def_property_boolean_sdna(prop, NULL, "mode", MA_RAYMIRROR); /* use bitflags */
 -      RNA_def_property_ui_text(prop, "Enabled", "Enable raytraced reflections");
 -      RNA_def_property_update(prop, 0, "rna_Material_update");
 -
 -      prop = RNA_def_property(srna, "reflect_factor", PROP_FLOAT, PROP_FACTOR);
 -      RNA_def_property_float_sdna(prop, NULL, "ray_mirror");
 -      RNA_def_property_range(prop, 0.0f, 1.0f);
 -      RNA_def_property_ui_text(prop, "Reflectivity", "Amount of mirror reflection for raytrace");
 -      RNA_def_property_update(prop, 0, "rna_Material_update");
 -
 -      prop = RNA_def_property(srna, "fresnel", PROP_FLOAT, PROP_NONE);
 -      RNA_def_property_float_sdna(prop, NULL, "fresnel_mir");
 -      RNA_def_property_range(prop, 0.0f, 5.0f);
 -      RNA_def_property_ui_text(prop, "Fresnel", "Power of Fresnel for mirror reflection");
 -      RNA_def_property_update(prop, 0, "rna_Material_update");
 -
 -      prop = RNA_def_property(srna, "fresnel_factor", PROP_FLOAT, PROP_FACTOR);
 -      RNA_def_property_float_sdna(prop, NULL, "fresnel_mir_i");
 -      RNA_def_property_range(prop, 0.0f, 5.0f);
 -      RNA_def_property_ui_text(prop, "Fresnel Factor", "Blending factor for Fresnel");
 -      RNA_def_property_update(prop, 0, "rna_Material_update");
 -
 -      prop = RNA_def_property(srna, "gloss_factor", PROP_FLOAT, PROP_FACTOR);
 -      RNA_def_property_float_sdna(prop, NULL, "gloss_mir");
 -      RNA_def_property_range(prop, 0.0f, 1.0f);
 -      RNA_def_property_ui_text(prop, "Gloss Amount",
 -                               "The shininess of the reflection (values < 1.0 give diffuse, blurry reflections)");
 -      RNA_def_property_update(prop, 0, "rna_Material_update");
 -
 -      prop = RNA_def_property(srna, "gloss_anisotropic", PROP_FLOAT, PROP_FACTOR);
 -      RNA_def_property_float_sdna(prop, NULL, "aniso_gloss_mir");
 -      RNA_def_property_range(prop, 0.0f, 1.0f);
 -      RNA_def_property_ui_text(prop, "Gloss Anisotropy",
 -                               "The shape of the reflection, from 0.0 (circular) to 1.0 "
 -                               "(fully stretched along the tangent");
 -      RNA_def_property_update(prop, 0, "rna_Material_update");
 -
 -      prop = RNA_def_property(srna, "gloss_samples", PROP_INT, PROP_NONE);
 -      RNA_def_property_int_sdna(prop, NULL, "samp_gloss_mir");
 -      RNA_def_property_range(prop, 0, 1024);
 -      RNA_def_property_ui_text(prop, "Gloss Samples", "Number of cone samples averaged for blurry reflections");
 -      RNA_def_property_update(prop, 0, "rna_Material_update");
 -
 -      prop = RNA_def_property(srna, "gloss_threshold", PROP_FLOAT, PROP_FACTOR);
 -      RNA_def_property_float_sdna(prop, NULL, "adapt_thresh_mir");
 -      RNA_def_property_range(prop, 0.0f, 1.0f);
 -      RNA_def_property_ui_text(prop, "Gloss Threshold",
 -                               "Threshold for adaptive sampling (if a sample contributes less than "
 -                               "this amount [as a percentage], sampling is stopped)");
 -      RNA_def_property_update(prop, 0, "rna_Material_update");
 -
 -      prop = RNA_def_property(srna, "depth", PROP_INT, PROP_UNSIGNED);
 -      RNA_def_property_int_sdna(prop, NULL, "ray_depth");
 -      RNA_def_property_ui_range(prop, 0, 100, 1, 3);
 -      RNA_def_property_ui_text(prop, "Depth", "Maximum allowed number of light inter-reflections");
 -      RNA_def_property_update(prop, 0, "rna_Material_update");
 -
 -      prop = RNA_def_property(srna, "distance", PROP_FLOAT, PROP_DISTANCE);
 -      RNA_def_property_float_sdna(prop, NULL, "dist_mir");
 -      RNA_def_property_range(prop, 0.0f, 10000.0f);
 -      RNA_def_property_ui_text(prop, "Maximum Distance",
 -                               "Maximum distance of reflected rays (reflections further than this "
 -                               "range fade to sky color or material color)");
 -      RNA_def_property_update(prop, 0, "rna_Material_update");
 -
 -      prop = RNA_def_property(srna, "fade_to", PROP_ENUM, PROP_NONE);
 -      RNA_def_property_enum_sdna(prop, NULL, "fadeto_mir");
 -      RNA_def_property_enum_items(prop, prop_fadeto_mir_items);
 -      RNA_def_property_ui_text(prop, "Fade-out Color",
 -                               "The color that rays with no intersection within the Max Distance take "
 -                               "(material color can be best for indoor scenes, sky color for outdoor)");
 -      RNA_def_property_update(prop, 0, "rna_Material_update");
 -}
 -
 -static void rna_def_material_raytra(BlenderRNA *brna)
 -{
 -      StructRNA *srna;
 -      PropertyRNA *prop;
 -
 -      srna = RNA_def_struct(brna, "MaterialRaytraceTransparency", NULL);
 -      RNA_def_struct_sdna(srna, "Material");
 -      RNA_def_struct_nested(brna, srna, "Material");
 -      RNA_def_struct_ui_text(srna, "Material Raytrace Transparency",
 -                             "Raytraced refraction settings for a Material data-block");
 -
 -      prop = RNA_def_property(srna, "ior", PROP_FLOAT, PROP_NONE);
 -      RNA_def_property_float_sdna(prop, NULL, "ang");
 -      RNA_def_property_range(prop, 0.25f, 4.0f);
 -      RNA_def_property_ui_text(prop, "IOR", "Angular index of refraction for raytraced refraction");
 -      RNA_def_property_update(prop, 0, "rna_Material_update");
 -
 -      prop = RNA_def_property(srna, "fresnel", PROP_FLOAT, PROP_NONE);
 -      RNA_def_property_float_sdna(prop, NULL, "fresnel_tra");
 -      RNA_def_property_range(prop, 0.0f, 5.0f);
 -      RNA_def_property_ui_text(prop, "Fresnel", "Power of Fresnel for transparency (Ray or ZTransp)");
 -      RNA_def_property_update(prop, 0, "rna_Material_update");
 -
 -      prop = RNA_def_property(srna, "fresnel_factor", PROP_FLOAT, PROP_FACTOR);
 -      RNA_def_property_float_sdna(prop, NULL, "fresnel_tra_i");
 -      RNA_def_property_range(prop, 1.0f, 5.0f);
 -      RNA_def_property_ui_text(prop, "Fresnel Factor", "Blending factor for Fresnel");
 -      RNA_def_property_update(prop, 0, "rna_Material_update");
 -
 -      prop = RNA_def_property(srna, "gloss_factor", PROP_FLOAT, PROP_FACTOR);
 -      RNA_def_property_float_sdna(prop, NULL, "gloss_tra");
 -      RNA_def_property_range(prop, 0.0f, 1.0f);
 -      RNA_def_property_ui_text(prop, "Gloss Amount",
 -                               "The clarity of the refraction. Values < 1.0 give diffuse, blurry refractions");
 -      RNA_def_property_update(prop, 0, "rna_Material_update");
 -
 -      prop = RNA_def_property(srna, "gloss_samples", PROP_INT, PROP_NONE);
 -      RNA_def_property_int_sdna(prop, NULL, "samp_gloss_tra");
 -      RNA_def_property_range(prop, 0, 1024);
 -      RNA_def_property_ui_text(prop, "Gloss Samples", "Number of cone samples averaged for blurry refractions");
 -      RNA_def_property_update(prop, 0, "rna_Material_update");
 -
 -      prop = RNA_def_property(srna, "gloss_threshold", PROP_FLOAT, PROP_FACTOR);
 -      RNA_def_property_float_sdna(prop, NULL, "adapt_thresh_tra");
 -      RNA_def_property_range(prop, 0.0f, 1.0f);
 -      RNA_def_property_ui_text(prop, "Gloss Threshold",
 -                               "Threshold for adaptive sampling. If a sample contributes less than "
 -                               "this amount (as a percentage), sampling is stopped");
 -      RNA_def_property_update(prop, 0, "rna_Material_update");
 -
 -      prop = RNA_def_property(srna, "depth", PROP_INT, PROP_UNSIGNED);
 -      RNA_def_property_int_sdna(prop, NULL, "ray_depth_tra");
 -      RNA_def_property_ui_range(prop, 0, 100, 1, 3);
 -      RNA_def_property_ui_text(prop, "Depth", "Maximum allowed number of light inter-refractions");
 -      RNA_def_property_update(prop, 0, "rna_Material_update");
 -
 -      prop = RNA_def_property(srna, "filter", PROP_FLOAT, PROP_FACTOR);
 -      RNA_def_property_float_sdna(prop, NULL, "filter");
 -      RNA_def_property_range(prop, 0.0f, 1.0f);
 -      RNA_def_property_ui_text(prop, "Filter",
 -                               "Amount to blend in the material's diffuse color in raytraced "
 -                               "transparency (simulating absorption)");
 -      RNA_def_property_update(prop, 0, "rna_Material_update");
 -
 -      prop = RNA_def_property(srna, "depth_max", PROP_FLOAT, PROP_DISTANCE);
 -      RNA_def_property_float_sdna(prop, NULL, "tx_limit");
 -      RNA_def_property_range(prop, 0.0f, 100.0f);
 -      RNA_def_property_ui_text(prop, "Limit",
 -                               "Maximum depth for light to travel through the transparent material "
 -                               "before becoming fully filtered (0.0 is disabled)");
 -      RNA_def_property_update(prop, 0, "rna_Material_update");
 -
 -      prop = RNA_def_property(srna, "falloff", PROP_FLOAT, PROP_NONE);
 -      RNA_def_property_float_sdna(prop, NULL, "tx_falloff");
 -      RNA_def_property_range(prop, 0.1f, 10.0f);
 -      RNA_def_property_ui_text(prop, "Falloff", "Falloff power for transmissivity filter effect (1.0 is linear)");
 -      RNA_def_property_update(prop, 0, "rna_Material_update");
 -}
 -
 -static void rna_def_material_volume(BlenderRNA *brna)
 -{
 -      StructRNA *srna;
 -      PropertyRNA *prop;
 -
 -      static const EnumPropertyItem prop_lighting_items[] = {
 -              {MA_VOL_SHADE_SHADELESS, "SHADELESS", 0, "Shadeless", "Do not calculate lighting and shadows"},
 -              {MA_VOL_SHADE_SHADOWED, "SHADOWED", 0, "Shadowed", ""},
 -              {MA_VOL_SHADE_SHADED, "SHADED", 0, "Shaded", ""},
 -              {MA_VOL_SHADE_MULTIPLE, "MULTIPLE_SCATTERING", 0, "Multiple Scattering", ""},
 -              {MA_VOL_SHADE_SHADEDPLUSMULTIPLE, "SHADED_PLUS_MULTIPLE_SCATTERING", 0, "Shaded + Multiple Scattering", ""},
 -              {0, NULL, 0, NULL, NULL}
 -      };
 -
 -      static const EnumPropertyItem prop_stepsize_items[] = {
 -              {MA_VOL_STEP_RANDOMIZED, "RANDOMIZED", 0, "Randomized", ""},
 -              {MA_VOL_STEP_CONSTANT, "CONSTANT", 0, "Constant", ""},
 -              /*{MA_VOL_STEP_ADAPTIVE, "ADAPTIVE", 0, "Adaptive", ""}, */
 -              {0, NULL, 0, NULL, NULL}
 -      };
 -
 -      srna = RNA_def_struct(brna, "MaterialVolume", NULL);
 -      RNA_def_struct_sdna(srna, "VolumeSettings");
 -      RNA_def_struct_nested(brna, srna, "Material");
 -      RNA_def_struct_ui_text(srna, "Material Volume", "Volume rendering settings for a Material data-block");
 -
 -      prop = RNA_def_property(srna, "step_method", PROP_ENUM, PROP_NONE);
 -      RNA_def_property_enum_sdna(prop, NULL, "stepsize_type");
 -      RNA_def_property_enum_items(prop, prop_stepsize_items);
 -      RNA_def_property_ui_text(prop, "Step Calculation", "Method of calculating the steps through the volume");
 -      RNA_def_property_update(prop, 0, "rna_Material_update");
 -
 -      prop = RNA_def_property(srna, "step_size", PROP_FLOAT, PROP_NONE);
 -      RNA_def_property_float_sdna(prop, NULL, "stepsize");
 -      RNA_def_property_range(prop, 0.0f, FLT_MAX);
 -      RNA_def_property_ui_range(prop, 0.001f, 1.0f, 1, 3);
 -      RNA_def_property_ui_text(prop, "Step Size", "Distance between subsequent volume depth samples");
 -      RNA_def_property_update(prop, 0, "rna_Material_update");
 -
 -      prop = RNA_def_property(srna, "light_method", PROP_ENUM, PROP_NONE);
 -      RNA_def_property_enum_sdna(prop, NULL, "shade_type");
 -      RNA_def_property_enum_items(prop, prop_lighting_items);
 -      RNA_def_property_ui_text(prop, "Lighting Mode",
 -                               "Method of shading, attenuating, and scattering light through the volume");
 -      RNA_def_property_update(prop, 0, "rna_Material_update");
 -
 -      prop = RNA_def_property(srna, "use_external_shadows", PROP_BOOLEAN, PROP_NONE);
 -      RNA_def_property_boolean_sdna(prop, NULL, "shadeflag", MA_VOL_RECV_EXT_SHADOW); /* use bitflags */
 -      RNA_def_property_ui_text(prop, "External Shadows", "Receive shadows from sources outside the volume (temporary)");
 -      RNA_def_property_update(prop, 0, "rna_Material_update");
 -
 -      prop = RNA_def_property(srna, "use_light_cache", PROP_BOOLEAN, PROP_NONE);
 -      RNA_def_property_boolean_sdna(prop, NULL, "shadeflag", MA_VOL_PRECACHESHADING); /* use bitflags */
 -      RNA_def_property_ui_text(prop, "Light Cache",
 -                               "Pre-calculate the shading information into a voxel grid, "
 -                               "speeds up shading at slightly less accuracy");
 -      RNA_def_property_update(prop, 0, "rna_Material_update");
 -
 -      prop = RNA_def_property(srna, "cache_resolution", PROP_INT, PROP_NONE);
 -      RNA_def_property_int_sdna(prop, NULL, "precache_resolution");
 -      RNA_def_property_range(prop, 1, 1024);
 -      RNA_def_property_ui_text(prop, "Resolution",
 -                               "Resolution of the voxel grid, low resolutions are faster, "
 -                               "high resolutions use more memory");
 -      RNA_def_property_update(prop, 0, "rna_Material_update");
 -
 -      prop = RNA_def_property(srna, "ms_diffusion", PROP_FLOAT, PROP_NONE);
 -      RNA_def_property_float_sdna(prop, NULL, "ms_diff");
 -      RNA_def_property_range(prop, 0.0f, FLT_MAX);
 -      RNA_def_property_ui_text(prop, "Diffusion", "Diffusion factor, the strength of the blurring effect");
 -      RNA_def_property_update(prop, 0, "rna_Material_update");
 -
 -      prop = RNA_def_property(srna, "ms_spread", PROP_FLOAT, PROP_NONE);
 -      RNA_def_property_float_sdna(prop, NULL, "ms_spread");
 -      RNA_def_property_range(prop, 0, FLT_MAX);
 -      RNA_def_property_ui_range(prop, 0.0f, 1.0f, 1, 3);
 -      RNA_def_property_ui_text(prop, "Spread", "Proportional distance over which the light is diffused");
 -      RNA_def_property_update(prop, 0, "rna_Material_update");
 -
 -      prop = RNA_def_property(srna, "ms_intensity", PROP_FLOAT, PROP_NONE);
 -      RNA_def_property_float_sdna(prop, NULL, "ms_intensity");
 -      RNA_def_property_range(prop, 0.0f, FLT_MAX);
 -      RNA_def_property_ui_text(prop, "Intensity", "Multiplier for multiple scattered light energy");
 -      RNA_def_property_update(prop, 0, "rna_Material_update");
 -
 -      prop = RNA_def_property(srna, "depth_threshold", PROP_FLOAT, PROP_NONE);
 -      RNA_def_property_float_sdna(prop, NULL, "depth_cutoff");
 -      RNA_def_property_range(prop, 0.0f, 1.0f);
 -      RNA_def_property_ui_text(prop, "Depth Cutoff",
 -                               "Stop ray marching early if transmission drops below this luminance - "
 -                               "higher values give speedups in dense volumes at the expense of accuracy");
 -      RNA_def_property_update(prop, 0, "rna_Material_update");
 -
 -      prop = RNA_def_property(srna, "density", PROP_FLOAT, PROP_FACTOR);
 -      RNA_def_property_float_sdna(prop, NULL, "density");
 -      RNA_def_property_range(prop, 0.0f, 1.0f);
 -      RNA_def_property_ui_text(prop, "Density", "The base density of the volume");
 -      RNA_def_property_update(prop, 0, "rna_Material_update");
 -
 -      prop = RNA_def_property(srna, "density_scale", PROP_FLOAT, PROP_NONE);
 -      RNA_def_property_float_sdna(prop, NULL, "density_scale");
 -      RNA_def_property_range(prop, 0.0f, FLT_MAX);
 -      RNA_def_property_ui_range(prop, 0.0f, 10.0f, 1, 3);
 -      RNA_def_property_ui_text(prop, "Density Scale", "Multiplier for the material's density");
 -      RNA_def_property_update(prop, 0, "rna_Material_update");
 -
 -      prop = RNA_def_property(srna, "scattering", PROP_FLOAT, PROP_NONE);
 -      RNA_def_property_float_sdna(prop, NULL, "scattering");
 -      RNA_def_property_range(prop, 0.0f, FLT_MAX);
 -      RNA_def_property_ui_range(prop, 0.0f, 10.0f, 1, 3);
 -      RNA_def_property_ui_text(prop, "Scattering",
 -                               "Amount of light that gets scattered out by the volume - "
 -                               "the more out-scattering, the shallower the light will penetrate");
 -      RNA_def_property_update(prop, 0, "rna_Material_update");
 -
 -      prop = RNA_def_property(srna, "transmission_color", PROP_FLOAT, PROP_COLOR);
 -      RNA_def_property_float_sdna(prop, NULL, "transmission_col");
 -      RNA_def_property_array(prop, 3);
 -      RNA_def_property_ui_text(prop, "Transmission Color",
 -                               "Result color of the volume, after other light has been scattered/absorbed");
 -      RNA_def_property_update(prop, 0, "rna_Material_draw_update");
 -
 -      prop = RNA_def_property(srna, "reflection_color", PROP_FLOAT, PROP_COLOR);
 -      RNA_def_property_float_sdna(prop, NULL, "reflection_col");
 -      RNA_def_property_array(prop, 3);
 -      RNA_def_property_ui_text(prop, "Reflection Color",
 -                               "Color of light scattered out of the volume (does not affect transmission)");
 -      RNA_def_property_update(prop, 0, "rna_Material_draw_update");
 -
 -      prop = RNA_def_property(srna, "reflection", PROP_FLOAT, PROP_NONE);
 -      RNA_def_property_float_sdna(prop, NULL, "reflection");
 -      RNA_def_property_range(prop, 0.0f, FLT_MAX);
 -      RNA_def_property_ui_range(prop, 0.0f, 100.0f, 1, 3);
 -      RNA_def_property_ui_text(prop, "Reflection",
 -                               "Multiplier to make out-scattered light brighter or darker (non-physically correct)");
 -      RNA_def_property_update(prop, 0, "rna_Material_update");
 -
 -      prop = RNA_def_property(srna, "emission_color", PROP_FLOAT, PROP_COLOR);
 -      RNA_def_property_float_sdna(prop, NULL, "emission_col");
 -      RNA_def_property_array(prop, 3);
 -      RNA_def_property_ui_text(prop, "Emission Color", "Color of emitted light");
 -      RNA_def_property_update(prop, 0, "rna_Material_draw_update");
 -
 -      prop = RNA_def_property(srna, "emission", PROP_FLOAT, PROP_NONE);
 -      RNA_def_property_float_sdna(prop, NULL, "emission");
 -      RNA_def_property_range(prop, 0.0f, FLT_MAX);
 -      RNA_def_property_ui_range(prop, 0.0f, 10.0f, 1, 3);
 -      RNA_def_property_ui_text(prop, "Emission", "Amount of light that gets emitted by the volume");
 -      RNA_def_property_update(prop, 0, "rna_Material_update");
 -
 -      prop = RNA_def_property(srna, "asymmetry", PROP_FLOAT, PROP_NONE);
 -      RNA_def_property_float_sdna(prop, NULL, "asymmetry");
 -      RNA_def_property_range(prop, -1.0f, 1.0f);
 -      RNA_def_property_ui_text(prop, "Asymmetry",
 -                               "Back scattering (-1.0) to Forward scattering (1.0) and the range in between");
 -      RNA_def_property_update(prop, 0, "rna_Material_update");
 -}
 -
 -
 -static void rna_def_material_halo(BlenderRNA *brna)
 -{
 -      StructRNA *srna;
 -      PropertyRNA *prop;
 -
 -      srna = RNA_def_struct(brna, "MaterialHalo", NULL);
 -      RNA_def_struct_sdna(srna, "Material");
 -      RNA_def_struct_nested(brna, srna, "Material");
 -      RNA_def_struct_ui_text(srna, "Material Halo", "Halo particle effect settings for a Material data-block");
 -
 -      prop = RNA_def_property(srna, "size", PROP_FLOAT, PROP_NONE);
 -      RNA_def_property_float_sdna(prop, NULL, "hasize");
 -      RNA_def_property_range(prop, 0.0f, 100.0f);
 -      RNA_def_property_ui_text(prop, "Size", "Dimension of the halo");
 -      RNA_def_property_update(prop, 0, "rna_Material_update");
 -
 -      prop = RNA_def_property(srna, "hardness", PROP_INT, PROP_NONE);
 -      RNA_def_property_int_sdna(prop, NULL, "har");
 -      RNA_def_property_range(prop, 0, 127);
 -      RNA_def_property_ui_text(prop, "Hardness", "Hardness of the halo");
 -      RNA_def_property_update(prop, 0, "rna_Material_update");
 -
 -      prop = RNA_def_property(srna, "add", PROP_FLOAT, PROP_FACTOR);
 -      RNA_def_property_float_sdna(prop, NULL, "add");
 -      RNA_def_property_range(prop, 0.0f, 1.0f);
 -      RNA_def_property_ui_text(prop, "Add", "Strength of the add effect");
 -      RNA_def_property_update(prop, 0, "rna_Material_update");
 -
 -      prop = RNA_def_property(srna, "ring_count", PROP_INT, PROP_NONE);
 -      RNA_def_property_int_sdna(prop, NULL, "ringc");
 -      RNA_def_property_range(prop, 0, 24);
 -      RNA_def_property_ui_text(prop, "Rings", "Number of rings rendered over the halo");
 -      RNA_def_property_update(prop, 0, "rna_Material_update");
 -
 -      prop = RNA_def_property(srna, "line_count", PROP_INT, PROP_NONE);
 -      RNA_def_property_int_sdna(prop, NULL, "linec");
 -      RNA_def_property_range(prop, 0, 250);
 -      RNA_def_property_ui_text(prop, "Line Number", "Number of star shaped lines rendered over the halo");
 -      RNA_def_property_update(prop, 0, "rna_Material_update");
 -
 -      prop = RNA_def_property(srna, "star_tip_count", PROP_INT, PROP_NONE);
 -      RNA_def_property_int_sdna(prop, NULL, "starc");
 -      RNA_def_property_range(prop, 3, 50);
 -      RNA_def_property_ui_text(prop, "Star Tips", "Number of points on the star shaped halo");
 -      RNA_def_property_update(prop, 0, "rna_Material_update");
 -
 -      prop = RNA_def_property(srna, "seed", PROP_INT, PROP_NONE);
 -      RNA_def_property_int_sdna(prop, NULL, "seed1");
 -      RNA_def_property_range(prop, 0, 255);
 -      RNA_def_property_ui_text(prop, "Seed", "Randomize ring dimension and line location");
 -      RNA_def_property_update(prop, 0, "rna_Material_update");
 -
 -      prop = RNA_def_property(srna, "use_flare_mode", PROP_BOOLEAN, PROP_NONE);
 -      RNA_def_property_boolean_sdna(prop, NULL, "mode", MA_HALO_FLARE); /* use bitflags */
 -      RNA_def_property_ui_text(prop, "Flare", "Render halo as a lens flare");
 -      RNA_def_property_update(prop, 0, "rna_Material_update");
 -
 -      prop = RNA_def_property(srna, "flare_size", PROP_FLOAT, PROP_NONE);
 -      RNA_def_property_float_sdna(prop, NULL, "flaresize");
 -      RNA_def_property_range(prop, 0.1f, 25.0f);
 -      RNA_def_property_ui_text(prop, "Flare Size", "Factor by which the flare is larger than the halo");
 -      RNA_def_property_update(prop, 0, "rna_Material_update");
 -
 -      prop = RNA_def_property(srna, "flare_subflare_size", PROP_FLOAT, PROP_NONE);
 -      RNA_def_property_float_sdna(prop, NULL, "subsize");
 -      RNA_def_property_range(prop, 0.1f, 25.0f);
 -      RNA_def_property_ui_text(prop, "Flare Subsize", "Dimension of the sub-flares, dots and circles");
 -      RNA_def_property_update(prop, 0, "rna_Material_update");
 -
 -      prop = RNA_def_property(srna, "flare_boost", PROP_FLOAT, PROP_NONE);
 -      RNA_def_property_float_sdna(prop, NULL, "flareboost");
 -      RNA_def_property_range(prop, 0.1f, 10.0f);
 -      RNA_def_property_ui_text(prop, "Flare Boost", "Give the flare extra strength");
 -      RNA_def_property_update(prop, 0, "rna_Material_update");
 -
 -      prop = RNA_def_property(srna, "flare_seed", PROP_INT, PROP_NONE);
 -      RNA_def_property_int_sdna(prop, NULL, "seed2");
 -      RNA_def_property_range(prop, 0, 255);
 -      RNA_def_property_ui_text(prop, "Flare Seed", "Offset in the flare seed table");
 -      RNA_def_property_update(prop, 0, "rna_Material_update");
 -
 -      prop = RNA_def_property(srna, "flare_subflare_count", PROP_INT, PROP_NONE);
 -      RNA_def_property_int_sdna(prop, NULL, "flarec");
 -      RNA_def_property_range(prop, 1, 32);
 -      RNA_def_property_ui_text(prop, "Flares Sub", "Number of sub-flares");
 -      RNA_def_property_update(prop, 0, "rna_Material_update");
 -
 -      prop = RNA_def_property(srna, "use_ring", PROP_BOOLEAN, PROP_NONE);
 -      RNA_def_property_boolean_sdna(prop, NULL, "mode", MA_HALO_RINGS);
 -      RNA_def_property_ui_text(prop, "Rings", "Render rings over halo");
 -      RNA_def_property_update(prop, 0, "rna_Material_update");
 -
 -      prop = RNA_def_property(srna, "use_lines", PROP_BOOLEAN, PROP_NONE);
 -      RNA_def_property_boolean_sdna(prop, NULL, "mode", MA_HALO_LINES);
 -      RNA_def_property_ui_text(prop, "Lines", "Render star shaped lines over halo");
 -      RNA_def_property_update(prop, 0, "rna_Material_update");
 -
 -      prop = RNA_def_property(srna, "use_star", PROP_BOOLEAN, PROP_NONE);
 -      RNA_def_property_boolean_sdna(prop, NULL, "mode", MA_STAR);
 -      RNA_def_property_ui_text(prop, "Star", "Render halo as a star");
 -      RNA_def_property_update(prop, 0, "rna_Material_update");
 -
 -      prop = RNA_def_property(srna, "use_texture", PROP_BOOLEAN, PROP_NONE);
 -      RNA_def_property_boolean_sdna(prop, NULL, "mode", MA_HALOTEX);
 -      RNA_def_property_ui_text(prop, "Texture", "Give halo a texture");
 -      RNA_def_property_update(prop, 0, "rna_Material_update");
 -
 -      prop = RNA_def_property(srna, "use_vertex_normal", PROP_BOOLEAN, PROP_NONE);
 -      RNA_def_property_boolean_sdna(prop, NULL, "mode", MA_HALOPUNO);
 -      RNA_def_property_ui_text(prop, "Vertex Normal", "Use the vertex normal to specify the dimension of the halo");
 -      RNA_def_property_update(prop, 0, "rna_Material_update");
 -
 -      prop = RNA_def_property(srna, "use_extreme_alpha", PROP_BOOLEAN, PROP_NONE);
 -      RNA_def_property_boolean_sdna(prop, NULL, "mode", MA_HALO_XALPHA);
 -      RNA_def_property_ui_text(prop, "Extreme Alpha", "Use extreme alpha");
 -      RNA_def_property_update(prop, 0, "rna_Material_update");
 -
 -      prop = RNA_def_property(srna, "use_shaded", PROP_BOOLEAN, PROP_NONE);
 -      RNA_def_property_boolean_sdna(prop, NULL, "mode", MA_HALO_SHADE);
 -      RNA_def_property_ui_text(prop, "Shaded", "Let halo receive light and shadows from external objects");
 -      RNA_def_property_update(prop, 0, "rna_Material_update");
 -
 -      prop = RNA_def_property(srna, "use_soft", PROP_BOOLEAN, PROP_NONE);
 -      RNA_def_property_boolean_sdna(prop, NULL, "mode", MA_HALO_SOFT);
 -      RNA_def_property_ui_text(prop, "Soft", "Soften the edges of halos at intersections with other geometry");
 -      RNA_def_property_update(prop, 0, "rna_Material_update");
 -}
 -
 -static void rna_def_material_sss(BlenderRNA *brna)
 -{
 -      StructRNA *srna;
 -      PropertyRNA *prop;
 -
 -      srna = RNA_def_struct(brna, "MaterialSubsurfaceScattering", NULL);
 -      RNA_def_struct_sdna(srna, "Material");
 -      RNA_def_struct_nested(brna, srna, "Material");
 -      RNA_def_struct_ui_text(srna, "Material Subsurface Scattering",
 -                             "Diffuse subsurface scattering settings for a Material data-block");
 -
 -      prop = RNA_def_property(srna, "radius", PROP_FLOAT, PROP_COLOR | PROP_UNIT_LENGTH);
 -      RNA_def_property_float_sdna(prop, NULL, "sss_radius");
 -      RNA_def_property_range(prop, 0.001, FLT_MAX);
 -      RNA_def_property_ui_range(prop, 0.001, 10000, 1, 3);
 -      RNA_def_property_ui_text(prop, "Radius", "Mean red/green/blue scattering path length");
 -      RNA_def_property_update(prop, 0, "rna_Material_update");
 -
 -      prop = RNA_def_property(srna, "color", PROP_FLOAT, PROP_COLOR);
 -      RNA_def_property_float_sdna(prop, NULL, "sss_col");
 -      RNA_def_property_ui_text(prop, "Color", "Scattering color");
 -      RNA_def_property_update(prop, 0, "rna_Material_update");
 -
 -      prop = RNA_def_property(srna, "error_threshold", PROP_FLOAT, PROP_NONE);
 -      RNA_def_property_float_sdna(prop, NULL, "sss_error");
 -      RNA_def_property_ui_range(prop, 0.0001, 10, 1, 3);
 -      RNA_def_property_ui_text(prop, "Error Tolerance", "Error tolerance (low values are slower and higher quality)");
 -      RNA_def_property_update(prop, 0, "rna_Material_update");
 -
 -      prop = RNA_def_property(srna, "scale", PROP_FLOAT, PROP_NONE);
 -      RNA_def_property_float_sdna(prop, NULL, "sss_scale");
 -      RNA_def_property_ui_range(prop, 0.001, 1000, 1, 3);
 -      RNA_def_property_ui_text(prop, "Scale", "Object scale factor");
 -      RNA_def_property_update(prop, 0, "rna_Material_update");
 -
 -      prop = RNA_def_property(srna, "ior", PROP_FLOAT, PROP_NONE);
 -      RNA_def_property_float_sdna(prop, NULL, "sss_ior");
 -      RNA_def_property_ui_range(prop, 0.1, 2, 1, 3);
 -      RNA_def_property_ui_text(prop, "IOR", "Index of refraction (higher values are denser)");
 -      RNA_def_property_update(prop, 0, "rna_Material_update");
 -
 -      prop = RNA_def_property(srna, "color_factor", PROP_FLOAT, PROP_FACTOR);
 -      RNA_def_property_float_sdna(prop, NULL, "sss_colfac");
 -      RNA_def_property_ui_range(prop, 0, 1, 10, 3);
 -      RNA_def_property_ui_text(prop, "Color Factor", "Blend factor for SSS colors");
 -      RNA_def_property_update(prop, 0, "rna_Material_update");
 -
 -      prop = RNA_def_property(srna, "texture_factor", PROP_FLOAT, PROP_FACTOR);
 -      RNA_def_property_float_sdna(prop, NULL, "sss_texfac");
 -      RNA_def_property_ui_range(prop, 0, 1, 10, 3);
 -      RNA_def_property_ui_text(prop, "Texture Factor", "Texture scattering blend factor");
 -      RNA_def_property_update(prop, 0, "rna_Material_update");
 -
 -      prop = RNA_def_property(srna, "front", PROP_FLOAT, PROP_NONE);
 -      RNA_def_property_float_sdna(prop, NULL, "sss_front");
 -      RNA_def_property_range(prop, 0, 2);
 -      RNA_def_property_ui_text(prop, "Front", "Front scattering weight");
 -      RNA_def_property_update(prop, 0, "rna_Material_update");
 -
 -      prop = RNA_def_property(srna, "back", PROP_FLOAT, PROP_NONE);
 -      RNA_def_property_float_sdna(prop, NULL, "sss_back");
 -      RNA_def_property_range(prop, 0, 10);
 -      RNA_def_property_ui_text(prop, "Back", "Back scattering weight");
 -      RNA_def_property_update(prop, 0, "rna_Material_update");
 -
 -      prop = RNA_def_property(srna, "use", PROP_BOOLEAN, PROP_NONE);
 -      RNA_def_property_boolean_sdna(prop, NULL, "sss_flag", MA_DIFF_SSS);
 -      RNA_def_property_ui_text(prop, "Enabled", "Enable diffuse subsurface scattering effects in a material");
 -      RNA_def_property_update(prop, 0, "rna_Material_update");
 -}
 -
 -static void rna_def_material_specularity(StructRNA *srna)
 -{
 -      PropertyRNA *prop;
 -
 -      static const EnumPropertyItem prop_specular_shader_items[] = {
 -              {MA_SPEC_COOKTORR, "COOKTORR", 0, "CookTorr", "Use a Cook-Torrance shader"},
 -              {MA_SPEC_PHONG, "PHONG", 0, "Phong", "Use a Phong shader"},
 -              {MA_SPEC_BLINN, "BLINN", 0, "Blinn", "Use a Blinn shader"},
 -              {MA_SPEC_TOON, "TOON", 0, "Toon", "Use a toon shader"},
 -              {MA_SPEC_WARDISO, "WARDISO", 0, "WardIso", "Use a Ward anisotropic shader"},
 -              {0, NULL, 0, NULL, NULL}
 -      };
 -
 -      prop = RNA_def_property(srna, "specular_shader", PROP_ENUM, PROP_NONE);
 -      RNA_def_property_enum_sdna(prop, NULL, "spec_shader");
 -      RNA_def_property_enum_items(prop, prop_specular_shader_items);
 -      RNA_def_property_ui_text(prop, "Specular Shader Model", "");
 -      RNA_def_property_update(prop, 0, "rna_Material_update");
 -
 -      prop = RNA_def_property(srna, "specular_intensity", PROP_FLOAT, PROP_FACTOR);
 -      RNA_def_property_float_sdna(prop, NULL, "spec");
 -      RNA_def_property_range(prop, 0, 1);
 -      RNA_def_property_ui_text(prop, "Specular Intensity", "How intense (bright) the specular reflection is");
 -      RNA_def_property_update(prop, 0, "rna_Material_draw_update");
 -
 -      /* NOTE: "har", "param", etc are used for multiple purposes depending on
 -       * settings. This should be fixed in DNA once, for RNA we just expose them
 -       * multiple times, which may give somewhat strange changes in the outliner,
 -       * but in the UI they are never visible at the same time. */
 -
 -      prop = RNA_def_property(srna, "specular_hardness", PROP_INT, PROP_NONE);
 -      RNA_def_property_int_sdna(prop, NULL, "har");
 -      RNA_def_property_range(prop, 1, 511);
 -      RNA_def_property_ui_text(prop, "Specular Hardness", "How hard (sharp) the specular reflection is");
 -      RNA_def_property_update(prop, 0, "rna_Material_draw_update");
 -
 -      prop = RNA_def_property(srna, "specular_ior", PROP_FLOAT, PROP_NONE);
 -      RNA_def_property_float_sdna(prop, NULL, "refrac");
 -      RNA_def_property_range(prop, 1, 10);
 -      RNA_def_property_ui_text(prop, "Specular IOR", "Specular index of refraction");
 -      RNA_def_property_update(prop, 0, "rna_Material_update");
 -
 -      prop = RNA_def_property(srna, "specular_toon_size", PROP_FLOAT, PROP_NONE);
 -      RNA_def_property_float_sdna(prop, NULL, "param[2]");
 -      RNA_def_property_range(prop, 0.0f, 1.53f);
 -      RNA_def_property_ui_text(prop, "Specular Toon Size", "Size of specular toon area");
 -      RNA_def_property_update(prop, 0, "rna_Material_update");
 -
 -      prop = RNA_def_property(srna, "specular_toon_smooth", PROP_FLOAT, PROP_FACTOR);
 -      RNA_def_property_float_sdna(prop, NULL, "param[3]");
 -      RNA_def_property_range(prop, 0.0f, 1.0f);
 -      RNA_def_property_ui_text(prop, "Specular Toon Smooth", "Smoothness of specular toon area");
 -      RNA_def_property_update(prop, 0, "rna_Material_update");
 -
 -      prop = RNA_def_property(srna, "specular_slope", PROP_FLOAT, PROP_FACTOR);
 -      RNA_def_property_float_sdna(prop, NULL, "rms");
 -      RNA_def_property_range(prop, 0, 0.4);
 -      RNA_def_property_ui_text(prop, "Specular Slope", "The standard deviation of surface slope");
 -      RNA_def_property_update(prop, 0, "rna_Material_update");
 -}
 -
 -static void rna_def_material_strand(BlenderRNA *brna)
 -{
 -      StructRNA *srna;
 -      PropertyRNA *prop;
 -
 -      srna = RNA_def_struct(brna, "MaterialStrand", NULL);
 -      RNA_def_struct_sdna(srna, "Material");
 -      RNA_def_struct_nested(brna, srna, "Material");
 -      RNA_def_struct_ui_text(srna, "Material Strand", "Strand settings for a Material data-block");
 -
 -      prop = RNA_def_property(srna, "use_tangent_shading", PROP_BOOLEAN, PROP_NONE);
 -      RNA_def_property_boolean_sdna(prop, NULL, "mode", MA_TANGENT_STR);
 -      RNA_def_property_ui_text(prop, "Tangent Shading", "Use direction of strands as normal for tangent-shading");
 -      RNA_def_property_update(prop, 0, "rna_Material_update");
 -
 -      /* this flag is only set when rendering, not to be edited manually */
 -      prop = RNA_def_property(srna, "use_surface_diffuse", PROP_BOOLEAN, PROP_NONE);
 -      RNA_def_property_boolean_sdna(prop, NULL, "mode", MA_STR_SURFDIFF);
 -      RNA_def_property_clear_flag(prop, PROP_EDITABLE);
 -      RNA_def_property_ui_text(prop, "Surface Diffuse", "Make diffuse shading more similar to shading the surface");
 -      RNA_def_property_update(prop, 0, "rna_Material_update");
 -
 -      prop = RNA_def_property(srna, "blend_distance", PROP_FLOAT, PROP_DISTANCE);
 -      RNA_def_property_float_sdna(prop, NULL, "strand_surfnor");
 -      RNA_def_property_range(prop, 0, 10);
 -      RNA_def_property_ui_text(prop, "Blend Distance", "Worldspace distance over which to blend in the surface normal");
 -      RNA_def_property_update(prop, 0, "rna_Material_update");
 -
 -      prop = RNA_def_property(srna, "use_blender_units", PROP_BOOLEAN, PROP_NONE);
 -      RNA_def_property_boolean_sdna(prop, NULL, "mode", MA_STR_B_UNITS);
 -      RNA_def_property_ui_text(prop, "Blender Units", "Use Blender units for widths instead of pixels");
 -      RNA_def_property_update(prop, 0, "rna_Material_update");
 -
 -      prop = RNA_def_property(srna, "root_size", PROP_FLOAT, PROP_UNSIGNED);
 -      RNA_def_property_float_sdna(prop, NULL, "strand_sta");
 -      RNA_def_property_float_funcs(prop, NULL, NULL, "rna_MaterialStrand_start_size_range");
 -      RNA_def_property_ui_range(prop, 0, 10.0f, 10, 5);
 -      RNA_def_property_ui_text(prop, "Root Size", "Start size of strands in pixels or Blender units");
 -      RNA_def_property_update(prop, 0, "rna_Material_update");
 -
 -      prop = RNA_def_property(srna, "tip_size", PROP_FLOAT, PROP_UNSIGNED);
 -      RNA_def_property_float_sdna(prop, NULL, "strand_end");
 -      RNA_def_property_ui_range(prop, 0, 10.0f, 10, 5);
 -      RNA_def_property_float_funcs(prop, NULL, NULL, "rna_MaterialStrand_end_size_range");
 -      RNA_def_property_ui_text(prop, "Tip Size", "End size of strands in pixels or Blender units");
 -      RNA_def_property_update(prop, 0, "rna_Material_update");
 -
 -      prop = RNA_def_property(srna, "size_min", PROP_FLOAT, PROP_UNSIGNED);
 -      RNA_def_property_float_sdna(prop, NULL, "strand_min");
 -      RNA_def_property_range(prop, 0.001, 10);
 -      RNA_def_property_ui_text(prop, "Minimum Size", "Minimum size of strands in pixels");
 -      RNA_def_property_update(prop, 0, "rna_Material_update");
 -
 -      prop = RNA_def_property(srna, "shape", PROP_FLOAT, PROP_NONE);
 -      RNA_def_property_float_sdna(prop, NULL, "strand_ease");
 -      RNA_def_property_range(prop, -0.9, 0.9);
 -      RNA_def_property_ui_text(prop, "Shape", "Positive values make strands rounder, negative ones make strands spiky");
 -      RNA_def_property_update(prop, 0, "rna_Material_update");
 -
 -      prop = RNA_def_property(srna, "width_fade", PROP_FLOAT, PROP_NONE);
 -      RNA_def_property_float_sdna(prop, NULL, "strand_widthfade");
 -      RNA_def_property_range(prop, 0, 2);
 -      RNA_def_property_ui_text(prop, "Width Fade", "Transparency along the width of the strand");
 -      RNA_def_property_update(prop, 0, "rna_Material_update");
 -
 -      prop = RNA_def_property(srna, "uv_layer", PROP_STRING, PROP_NONE);
 -      RNA_def_property_string_sdna(prop, NULL, "strand_uvname");
 -      RNA_def_property_ui_text(prop, "UV Map", "Name of UV map to override");
 -      RNA_def_property_update(prop, 0, "rna_Material_update");
 -}
 -
 -static void rna_def_material_physics(BlenderRNA *brna)
 -{
 -      StructRNA *srna;
 -      PropertyRNA *prop;
 -
 -      srna = RNA_def_struct(brna, "MaterialPhysics", NULL);
 -      RNA_def_struct_sdna(srna, "Material");
 -      RNA_def_struct_nested(brna, srna, "Material");
 -      RNA_def_struct_ui_text(srna, "Material Physics", "Physics settings for a Material data-block");
 -
 -      prop = RNA_def_property(srna, "friction", PROP_FLOAT, PROP_NONE);
 -      RNA_def_property_float_sdna(prop, NULL, "friction");
 -      RNA_def_property_range(prop, 0, 100);
 -      RNA_def_property_ui_text(prop, "Friction", "Coulomb friction coefficient, when inside the physics distance area");
 -
 -      prop = RNA_def_property(srna, "elasticity", PROP_FLOAT, PROP_NONE);
 -      RNA_def_property_float_sdna(prop, NULL, "reflect");
 -      RNA_def_property_range(prop, 0, 1);
 -      RNA_def_property_ui_text(prop, "Elasticity", "Elasticity of collisions");
 -
 -      /* FH/Force Field Settings */
 -      prop = RNA_def_property(srna, "use_fh_normal", PROP_BOOLEAN, PROP_NONE);
 -      RNA_def_property_boolean_sdna(prop, NULL, "dynamode", MA_FH_NOR);
 -      RNA_def_property_ui_text(prop, "Align to Normal",
 -                               "Align dynamic game objects along the surface normal, "
 -                               "when inside the physics distance area");
 -
 -      prop = RNA_def_property(srna, "fh_force", PROP_FLOAT, PROP_NONE);
 -      RNA_def_property_float_sdna(prop, NULL, "fh");
 -      RNA_def_property_range(prop, 0, 1);
 -      RNA_def_property_ui_range(prop, 0.0, 1.0, 10, 2);
 -      RNA_def_property_ui_text(prop, "Force", "Upward spring force, when inside the physics distance area");
 -
 -      prop = RNA_def_property(srna, "fh_distance", PROP_FLOAT, PROP_NONE);
 -      RNA_def_property_float_sdna(prop, NULL, "fhdist");
 -      RNA_def_property_range(prop, 0, 20);
 -      RNA_def_property_ui_text(prop, "Distance", "Distance of the physics area");
 -
 -      prop = RNA_def_property(srna, "fh_damping", PROP_FLOAT, PROP_NONE);
 -      RNA_def_property_float_sdna(prop, NULL, "xyfrict");
 -      RNA_def_property_range(prop, 0, 1);
 -      RNA_def_property_ui_text(prop, "Damping", "Damping of the spring force, when inside the physics distance area");
 -}
 -
 -void RNA_def_material(BlenderRNA *brna)
 -{
 -      StructRNA *srna;
 -      PropertyRNA *prop;
 -
 -      static const EnumPropertyItem prop_type_items[] = {
 -              {MA_TYPE_SURFACE, "SURFACE", 0, "Surface", "Render object as a surface"},
 -              {MA_TYPE_WIRE, "WIRE", 0, "Wire", "Render the edges of faces as wires (not supported in raytracing)"},
 -              {MA_TYPE_VOLUME, "VOLUME", 0, "Volume", "Render object as a volume"},
 -              {MA_TYPE_HALO, "HALO", 0, "Halo", "Render object as halo particles"},
 -              {0, NULL, 0, NULL, NULL}
 -      };
 -      static const EnumPropertyItem transparency_items[] = {
 -              {0, "MASK", 0, "Mask", "Mask the background"},
 -              {MA_ZTRANSP, "Z_TRANSPARENCY", 0, "Z Transparency", "Use alpha buffer for transparent faces"},
 -              {MA_RAYTRANSP, "RAYTRACE", 0, "Raytrace", "Use raytracing for transparent refraction rendering"},
 -              {0, NULL, 0, NULL, NULL}
 -      };
 -
 -      /* Render Preview Types */
 -      static const EnumPropertyItem preview_type_items[] = {
 -              {MA_FLAT, "FLAT", ICON_MATPLANE, "Flat", "Flat XY plane"},
 -              {MA_SPHERE, "SPHERE", ICON_MATSPHERE, "Sphere", "Sphere"},
 -              {MA_CUBE, "CUBE", ICON_MATCUBE, "Cube", "Cube"},
 -              {MA_MONKEY, "MONKEY", ICON_MONKEY, "Monkey", "Monkey"},
 -              {MA_HAIR, "HAIR", ICON_HAIR, "Hair", "Hair strands"},
 -              {MA_SPHERE_A, "SPHERE_A", ICON_MAT_SPHERE_SKY, "World Sphere", "Large sphere with sky"},
 -              {0, NULL, 0, NULL, NULL}
 -      };
 -
 -      static const EnumPropertyItem prop_shadows_only_items[] = {
 -              {MA_SO_OLD, "SHADOW_ONLY_OLD", 0, "Shadow and Distance", "Old shadow only method"},
 -              {MA_SO_SHADOW, "SHADOW_ONLY", 0, "Shadow Only", "Improved shadow only method"},
 -              {MA_SO_SHADED, "SHADOW_ONLY_SHADED", 0, "Shadow and Shading",
 -               "Improved shadow only method which also renders lightless areas as shadows"},
 -              {0, NULL, 0, NULL, NULL}
 -      };
 -
 -      srna = RNA_def_struct(brna, "Material", "ID");
 -      RNA_def_struct_ui_text(srna, "Material",
 -                             "Material data-block to define the appearance of geometric objects for rendering");
 -      RNA_def_struct_ui_icon(srna, ICON_MATERIAL_DATA);
 -
 -      prop = RNA_def_property(srna, "type", PROP_ENUM, PROP_NONE);
 -      RNA_def_property_enum_sdna(prop, NULL, "material_type");
 -      RNA_def_property_enum_items(prop, prop_type_items);
 -      RNA_def_property_ui_text(prop, "Type", "Material type defining how the object is rendered");
 -      RNA_def_property_enum_funcs(prop, NULL, "rna_Material_type_set", NULL);
 -      RNA_def_property_update(prop, 0, "rna_Material_draw_update");
 -
 -      prop = RNA_def_property(srna, "use_transparency", PROP_BOOLEAN, PROP_NONE);
 -      RNA_def_property_boolean_sdna(prop, NULL, "mode", MA_TRANSP);
 -      RNA_def_property_ui_text(prop, "Transparency", "Render material as transparent");
 -      RNA_def_property_update(prop, 0, "rna_Material_draw_update");
 -
 -      prop = RNA_def_property(srna, "transparency_method", PROP_ENUM, PROP_NONE);
 -      RNA_def_property_enum_bitflag_sdna(prop, NULL, "mode");
 -      RNA_def_property_enum_items(prop, transparency_items);
 -      RNA_def_property_ui_text(prop, "Transparency Method", "Method to use for rendering transparency");
 -      RNA_def_property_update(prop, 0, "rna_Material_update");
 -
 -      /* For Preview Render */
 -      prop = RNA_def_property(srna, "preview_render_type", PROP_ENUM, PROP_NONE);
 -      RNA_def_property_enum_sdna(prop, NULL, "pr_type");
 -      RNA_def_property_enum_items(prop, preview_type_items);
 -      RNA_def_property_ui_text(prop, "Preview render type", "Type of preview render");
 -      RNA_def_property_update(prop, 0, "rna_Material_update_previews");
 -
 -      prop = RNA_def_property(srna, "ambient", PROP_FLOAT, PROP_FACTOR);
 -      RNA_def_property_float_sdna(prop, NULL, "amb");
 -      RNA_def_property_range(prop, 0, 1);
 -      RNA_def_property_ui_text(prop, "Ambient", "Amount of global ambient color the material receives");
 -      RNA_def_property_update(prop, 0, "rna_Material_update");
 -
 -      prop = RNA_def_property(srna, "emit", PROP_FLOAT, PROP_NONE);
 -      RNA_def_property_range(prop, 0, FLT_MAX);
 -      RNA_def_property_ui_range(prop, 0, 2.0f, 1, 2);
 -      RNA_def_property_ui_text(prop, "Emit", "Amount of light to emit");
 -      RNA_def_property_update(prop, 0, "rna_Material_draw_update");
 -
 -      prop = RNA_def_property(srna, "translucency", PROP_FLOAT, PROP_FACTOR);
 -      RNA_def_property_range(prop, 0, 1);
 -      RNA_def_property_ui_text(prop, "Translucency", "Amount of diffuse shading on the back side");
 -      RNA_def_property_update(prop, 0, "rna_Material_update");
 -
 -      prop = RNA_def_property(srna, "use_cubic", PROP_BOOLEAN, PROP_NONE);
 -      RNA_def_property_boolean_sdna(prop, NULL, "shade_flag", MA_CUBIC);
 -      RNA_def_property_ui_text(prop, "Cubic Interpolation",
 -                               "Use cubic interpolation for diffuse values, for smoother transitions");
 -      RNA_def_property_update(prop, 0, "rna_Material_update");
 -
 -      prop = RNA_def_property(srna, "use_object_color", PROP_BOOLEAN, PROP_NONE);
 -      RNA_def_property_boolean_sdna(prop, NULL, "shade_flag", MA_OBCOLOR);
 -      RNA_def_property_ui_text(prop, "Object Color", "Modulate the result with a per-object color");
 -      RNA_def_property_update(prop, 0, "rna_Material_draw_update");
 -
 -      prop = RNA_def_property(srna, "shadow_ray_bias", PROP_FLOAT, PROP_NONE);
 -      RNA_def_property_float_sdna(prop, NULL, "sbias");
 -      RNA_def_property_range(prop, 0, 0.25);
 -      RNA_def_property_ui_text(prop, "Shadow Ray Bias",
 -                               "Shadow raytracing bias to prevent terminator problems on shadow boundary");
 -
 -      prop = RNA_def_property(srna, "shadow_buffer_bias", PROP_FLOAT, PROP_NONE);
 -      RNA_def_property_float_sdna(prop, NULL, "lbias");
 -      RNA_def_property_range(prop, 0, 10);
 -      RNA_def_property_ui_text(prop, "Shadow Buffer Bias", "Factor to multiply shadow buffer bias with (0 is ignore)");
 -
 -      prop = RNA_def_property(srna, "shadow_cast_alpha", PROP_FLOAT, PROP_FACTOR);
 -      RNA_def_property_float_sdna(prop, NULL, "shad_alpha");
 -      RNA_def_property_range(prop, 0.001, 1);
 -      RNA_def_property_ui_text(prop, "Shadow Casting Alpha",
 -                               "Shadow casting alpha, in use for Irregular and Deep shadow buffer");
 -      RNA_def_property_update(prop, 0, "rna_Material_update");
 -
 -      prop = RNA_def_property(srna, "light_group", PROP_POINTER, PROP_NONE);
 -      RNA_def_property_pointer_sdna(prop, NULL, "group");
 -      RNA_def_property_struct_type(prop, "Group");
 -      RNA_def_property_flag(prop, PROP_EDITABLE);
 -      RNA_def_property_ui_text(prop, "Light Group", "Limit lighting to lamps in this Group");
 -      RNA_def_property_update(prop, 0, "rna_Material_update");
 -
 -      prop = RNA_def_property(srna, "pass_index", PROP_INT, PROP_UNSIGNED);
 -      RNA_def_property_int_sdna(prop, NULL, "index");
 -      RNA_def_property_ui_text(prop, "Pass Index", "Index number for the \"Material Index\" render pass");
 -      RNA_def_property_update(prop, NC_OBJECT, "rna_Material_update");
 -
 -      /* flags */
 -
 -      prop = RNA_def_property(srna, "use_light_group_exclusive", PROP_BOOLEAN, PROP_NONE);
 -      RNA_def_property_boolean_sdna(prop, NULL, "mode", MA_GROUP_NOLAY);
 -      RNA_def_property_ui_text(prop, "Light Group Exclusive",
 -                               "Material uses the light group exclusively - these lamps are excluded "
 -                               "from other scene lighting");
 -      RNA_def_property_update(prop, 0, "rna_Material_update");
 -
 -      prop = RNA_def_property(srna, "use_light_group_local", PROP_BOOLEAN, PROP_NONE);
 -      RNA_def_property_boolean_sdna(prop, NULL, "shade_flag", MA_GROUP_LOCAL);
 -      RNA_def_property_ui_text(prop, "Light Group Local", "When linked in, material uses local light group with the same name");
 -      RNA_def_property_update(prop, 0, "rna_Material_update");
 -
 -      prop = RNA_def_property(srna, "use_raytrace", PROP_BOOLEAN, PROP_NONE);
 -      RNA_def_property_boolean_sdna(prop, NULL, "mode", MA_TRACEBLE);
 -      RNA_def_property_ui_text(prop, "Traceable",
 -                               "Include this material and geometry that uses it in raytracing calculations");
 -      RNA_def_property_update(prop, 0, "rna_Material_update");
 -
 -      prop = RNA_def_property(srna, "use_shadows", PROP_BOOLEAN, PROP_NONE);
 -      RNA_def_property_boolean_sdna(prop, NULL, "mode", MA_SHADOW);
 -      RNA_def_property_ui_text(prop, "Shadows", "Allow this material to receive shadows");
 -      RNA_def_property_update(prop, 0, "rna_Material_update");
 -
 -      prop = RNA_def_property(srna, "use_shadeless", PROP_BOOLEAN, PROP_NONE);
 -      RNA_def_property_boolean_sdna(prop, NULL, "mode", MA_SHLESS);
 -      RNA_def_property_ui_text(prop, "Shadeless", "Make this material insensitive to light or shadow");
 -      RNA_def_property_update(prop, 0, "rna_Material_draw_update");
 -
 -      prop = RNA_def_property(srna, "use_vertex_color_light", PROP_BOOLEAN, PROP_NONE);
 -      RNA_def_property_boolean_sdna(prop, NULL, "mode", MA_VERTEXCOL);
 -      RNA_def_property_ui_text(prop, "Vertex Color Light", "Add vertex colors as additional lighting");
 -      RNA_def_property_update(prop, 0, "rna_Material_update");
 -
 -      prop = RNA_def_property(srna, "use_vertex_color_paint", PROP_BOOLEAN, PROP_NONE);
 -      RNA_def_property_boolean_sdna(prop, NULL, "mode", MA_VERTEXCOLP);
 -      RNA_def_property_ui_text(prop, "Vertex Color Paint",
 -                               "Replace object base color with vertex colors (multiply with "
 -                               "'texture face' face assigned textures)");
 -      RNA_def_property_update(prop, 0, "rna_Material_update");
 -
 -      prop = RNA_def_property(srna, "invert_z", PROP_BOOLEAN, PROP_NONE);
 -      RNA_def_property_boolean_sdna(prop, NULL, "mode", MA_ZINV);
 -      RNA_def_property_ui_text(prop, "Invert Z Depth",
 -                               "Render material's faces with an inverted Z buffer (scanline only)");
 -      RNA_def_property_update(prop, 0, "rna_Material_update");
 -
 -      prop = RNA_def_property(srna, "offset_z", PROP_FLOAT, PROP_NONE);
 -      RNA_def_property_float_sdna(prop, NULL, "zoffs");
 -      RNA_def_property_ui_text(prop, "Z Offset", "Give faces an artificial offset in the Z buffer for Z transparency");
 -      RNA_def_property_update(prop, 0, "rna_Material_update");
 -
 -      prop = RNA_def_property(srna, "use_sky", PROP_BOOLEAN, PROP_NONE);
 -      RNA_def_property_boolean_sdna(prop, NULL, "mode", MA_ENV);
 -      RNA_def_property_ui_text(prop, "Sky",
 -                               "Render this material with zero alpha, with sky background in place (scanline only)");
 -      RNA_def_property_update(prop, 0, "rna_Material_update");
 -
 -      prop = RNA_def_property(srna, "use_only_shadow", PROP_BOOLEAN, PROP_NONE);
 -      RNA_def_property_boolean_sdna(prop, NULL, "mode", MA_ONLYSHADOW);
 -      RNA_def_property_ui_text(prop, "Only Shadow",
 -                               "Render shadows as the material's alpha value, making the material "
 -                               "transparent except for shadowed areas");
 -      RNA_def_property_update(prop, 0, "rna_Material_update");
 -
 -      prop = RNA_def_property(srna, "shadow_only_type", PROP_ENUM, PROP_NONE);
 -      RNA_def_property_enum_bitflag_sdna(prop, NULL, "shadowonly_flag");
 -      RNA_def_property_enum_items(prop, prop_shadows_only_items);
 -      RNA_def_property_ui_text(prop, "Shadow Type", "How to draw shadows");
 -      RNA_def_property_update(prop, 0, "rna_Material_update");
 -
 -      prop = RNA_def_property(srna, "use_face_texture", PROP_BOOLEAN, PROP_NONE);
 -      RNA_def_property_boolean_sdna(prop, NULL, "mode", MA_FACETEXTURE);
 -      RNA_def_property_ui_text(prop, "Face Textures",
 -                               "Replace the object's base color with color from UV map image textures");
 -      RNA_def_property_update(prop, 0, "rna_Material_update");
 -
 -      prop = RNA_def_property(srna, "use_face_texture_alpha", PROP_BOOLEAN, PROP_NONE);
 -      RNA_def_property_boolean_sdna(prop, NULL, "mode", MA_FACETEXTURE_ALPHA);
 -      RNA_def_property_ui_text(prop, "Face Textures Alpha",
 -                               "Replace the object's base alpha value with alpha from UV map image textures");
 -      RNA_def_property_update(prop, 0, "rna_Material_update");
 -
 -      prop = RNA_def_property(srna, "use_cast_shadows", PROP_BOOLEAN, PROP_NONE);
 -      RNA_def_property_boolean_sdna(prop, NULL, "mode2", MA_CASTSHADOW);
 -      RNA_def_property_ui_text(prop, "Cast Shadows",
 -                               "Allow this material to cast shadows");
 -      RNA_def_property_update(prop, 0, "rna_Material_update");
 -
 -      prop = RNA_def_property(srna, "use_cast_shadows_only", PROP_BOOLEAN, PROP_NONE);
 -      RNA_def_property_boolean_sdna(prop, NULL, "mode", MA_ONLYCAST);
 -      RNA_def_property_ui_text(prop, "Cast Shadows Only",
 -                               "Make objects with this material appear invisible (not rendered), only casting shadows");
 -      RNA_def_property_update(prop, 0, "rna_Material_update");
 -
 -      prop = RNA_def_property(srna, "use_mist", PROP_BOOLEAN, PROP_NONE);
 -      RNA_def_property_boolean_negative_sdna(prop, NULL, "mode", MA_NOMIST);
 -      RNA_def_property_ui_text(prop, "Use Mist", "Use mist with this material (in world settings)");
 -      RNA_def_property_update(prop, 0, "rna_Material_update");
 -
 -      prop = RNA_def_property(srna, "use_transparent_shadows", PROP_BOOLEAN, PROP_NONE);
 -      RNA_def_property_boolean_sdna(prop, NULL, "mode", MA_SHADOW_TRA);
 -      RNA_def_property_ui_text(prop, "Receive Transparent Shadows",
 -                               "Allow this object to receive transparent shadows cast through other objects");
 -      RNA_def_property_update(prop, 0, "rna_Material_update");
 -
 -      prop = RNA_def_property(srna, "use_ray_shadow_bias", PROP_BOOLEAN, PROP_NONE);
 -      RNA_def_property_boolean_sdna(prop, NULL, "mode", MA_RAYBIAS);
 -      RNA_def_property_ui_text(prop, "Ray Shadow Bias",
 -                               "Prevent raytraced shadow errors on surfaces with smooth shaded normals "
 -                               "(terminator problem)");
 -      RNA_def_property_update(prop, 0, "rna_Material_update");
 -
 -      prop = RNA_def_property(srna, "use_full_oversampling", PROP_BOOLEAN, PROP_NONE);
 -      RNA_def_property_boolean_sdna(prop, NULL, "mode", MA_FULL_OSA);
 -      RNA_def_property_ui_text(prop, "Full Oversampling",
 -                               "Force this material to render full shading/textures for all anti-aliasing samples");
 -      RNA_def_property_update(prop, 0, "rna_Material_update");
 -
 -      prop = RNA_def_property(srna, "use_cast_buffer_shadows", PROP_BOOLEAN, PROP_NONE);
 -      RNA_def_property_boolean_sdna(prop, NULL, "mode", MA_SHADBUF);
 -      RNA_def_property_ui_text(prop, "Cast Buffer Shadows",
 -                               "Allow this material to cast shadows from shadow buffer lamps");
 -      RNA_def_property_update(prop, 0, "rna_Material_update");
 -
 -      prop = RNA_def_property(srna, "use_cast_approximate", PROP_BOOLEAN, PROP_NONE);
 -      RNA_def_property_boolean_sdna(prop, NULL, "shade_flag", MA_APPROX_OCCLUSION);
 -      RNA_def_property_ui_text(prop, "Cast Approximate",
 -                               "Allow this material to cast shadows when using approximate ambient occlusion");
 -      RNA_def_property_update(prop, 0, "rna_Material_update");
 -
 -      prop = RNA_def_property(srna, "use_tangent_shading", PROP_BOOLEAN, PROP_NONE);
 -      RNA_def_property_boolean_sdna(prop, NULL, "mode", MA_TANGENT_V);
 -      RNA_def_property_ui_text(prop, "Tangent Shading",
 -                               "Use the material's tangent vector instead of the normal for shading "
 -                               "- for anisotropic shading effects");
 -      RNA_def_property_update(prop, 0, "rna_Material_update");
 -
 -      prop = RNA_def_property(srna, "use_uv_project", PROP_BOOLEAN, PROP_NONE);
 -      RNA_def_property_boolean_sdna(prop, NULL, "mapflag", MA_MAPFLAG_UVPROJECT);
 -      RNA_def_property_ui_text(prop, "UV Project",
 -                               "Use to ensure UV interpolation is correct for camera projections (use with UV project modifier)");
 -      RNA_def_property_update(prop, 0, "rna_Material_update");
 -
 -      /* nested structs */
 -      prop = RNA_def_property(srna, "raytrace_mirror", PROP_POINTER, PROP_NONE);
 -      RNA_def_property_flag(prop, PROP_NEVER_NULL);
 -      RNA_def_property_struct_type(prop, "MaterialRaytraceMirror");
 -      RNA_def_property_pointer_funcs(prop, "rna_Material_mirror_get", NULL, NULL, NULL);
 -      RNA_def_property_ui_text(prop, "Raytrace Mirror", "Raytraced reflection settings for the material");
 -
 -      prop = RNA_def_property(srna, "raytrace_transparency", PROP_POINTER, PROP_NONE);
 -      RNA_def_property_flag(prop, PROP_NEVER_NULL);
 -      RNA_def_property_struct_type(prop, "MaterialRaytraceTransparency");
 -      RNA_def_property_pointer_funcs(prop, "rna_Material_transp_get", NULL, NULL, NULL);
 -      RNA_def_property_ui_text(prop, "Raytrace Transparency", "Raytraced transparency settings for the material");
 -
 -      prop = RNA_def_property(srna, "volume", PROP_POINTER, PROP_NONE);
 -      RNA_def_property_flag(prop, PROP_NEVER_NULL);
 -      RNA_def_property_pointer_sdna(prop, NULL, "vol");
 -      RNA_def_property_struct_type(prop, "MaterialVolume");
 -      RNA_def_property_ui_text(prop, "Volume", "Volume settings for the material");
 -
 -      prop = RNA_def_property(srna, "halo", PROP_POINTER, PROP_NONE);
 -      RNA_def_property_flag(prop, PROP_NEVER_NULL);
 -      RNA_def_property_struct_type(prop, "MaterialHalo");
 -      RNA_def_property_pointer_funcs(prop, "rna_Material_halo_get", NULL, NULL, NULL);
 -      RNA_def_property_ui_text(prop, "Halo", "Halo settings for the material");
 -
 -      prop = RNA_def_property(srna, "subsurface_scattering", PROP_POINTER, PROP_NONE);
 -      RNA_def_property_flag(prop, PROP_NEVER_NULL);
 -      RNA_def_property_struct_type(prop, "MaterialSubsurfaceScattering");
 -      RNA_def_property_pointer_funcs(prop, "rna_Material_sss_get", NULL, NULL, NULL);
 -      RNA_def_property_ui_text(prop, "Subsurface Scattering", "Subsurface scattering settings for the material");
 -
 -      prop = RNA_def_property(srna, "strand", PROP_POINTER, PROP_NONE);
 -      RNA_def_property_flag(prop, PROP_NEVER_NULL);
 -      RNA_def_property_struct_type(prop, "MaterialStrand");
 -      RNA_def_property_pointer_funcs(prop, "rna_Material_strand_get", NULL, NULL, NULL);
 -      RNA_def_property_ui_text(prop, "Strand", "Strand settings for the material");
 -
 -      prop = RNA_def_property(srna, "physics", PROP_POINTER, PROP_NONE);
 -      RNA_def_property_flag(prop, PROP_NEVER_NULL);
 -      RNA_def_property_struct_type(prop, "MaterialPhysics");
 -      RNA_def_property_pointer_funcs(prop, "rna_Material_physics_get", NULL, NULL, NULL);
 -      RNA_def_property_ui_text(prop, "Physics", "Game physics settings");
 -
 -      /* game settings */
 -      prop = RNA_def_property(srna, "game_settings", PROP_POINTER, PROP_NONE);
 -      RNA_def_property_flag(prop, PROP_NEVER_NULL);
 -      RNA_def_property_pointer_sdna(prop, NULL, "game");
 -      RNA_def_property_struct_type(prop, "MaterialGameSettings");
 -      RNA_def_property_ui_text(prop, "Game Settings", "Game material settings");
 -
 -      /* nodetree */
 -      prop = RNA_def_property(srna, "node_tree", PROP_POINTER, PROP_NONE);
 -      RNA_def_property_pointer_sdna(prop, NULL, "nodetree");
 -      RNA_def_property_ui_text(prop, "Node Tree", "Node tree for node based materials");
 -
 -      prop = RNA_def_property(srna, "use_nodes", PROP_BOOLEAN, PROP_NONE);
 -      RNA_def_property_boolean_sdna(prop, NULL, "use_nodes", 1);
 -      RNA_def_property_clear_flag(prop, PROP_ANIMATABLE);
 -      RNA_def_property_flag(prop, PROP_CONTEXT_UPDATE);
 -      RNA_def_property_ui_text(prop, "Use Nodes", "Use shader nodes to render the material");
 -      RNA_def_property_update(prop, 0, "rna_Material_use_nodes_update");
 -
 -      prop = RNA_def_property(srna, "active_node_material", PROP_POINTER, PROP_NONE);
 -      RNA_def_property_struct_type(prop, "Material");
 -      RNA_def_property_flag(prop, PROP_EDITABLE);
 -      RNA_def_property_pointer_funcs(prop, "rna_Material_active_node_material_get",
 -                                     "rna_Material_active_node_material_set", NULL, NULL);
 -      RNA_def_property_ui_text(prop, "Material", "Active node material");
 -      RNA_def_property_update(prop, NC_MATERIAL, NULL);
 +      prop = RNA_def_property(srna, "use_nodes", PROP_BOOLEAN, PROP_NONE);
 +      RNA_def_property_boolean_sdna(prop, NULL, "use_nodes", 1);
 +      RNA_def_property_clear_flag(prop, PROP_ANIMATABLE);
 +      RNA_def_property_flag(prop, PROP_CONTEXT_UPDATE);
 +      RNA_def_property_ui_text(prop, "Use Nodes", "Use shader nodes to render the material");
 +      RNA_def_property_update(prop, 0, "rna_Material_use_nodes_update");
  
        /* common */
        rna_def_animdata_common(srna);
@@@ -490,11 -2218,10 +490,11 @@@ static void rna_def_tex_slot(BlenderRN
        RNA_def_property_string_sdna(prop, NULL, "uvname");
        RNA_def_property_ui_text(prop, "UV Map", "Name of UV map");
        RNA_def_property_update(prop, NC_GEOM | ND_DATA, "rna_Material_update");
-       
 -      prop = RNA_def_property(srna, "index", PROP_INT, PROP_NONE);
 +      prop = RNA_def_property(srna, "is_valid", PROP_BOOLEAN, PROP_NONE);
 +      RNA_def_property_boolean_sdna(prop, NULL, "valid", 1);
        RNA_def_property_clear_flag(prop, PROP_EDITABLE);
 -      RNA_def_property_ui_text(prop, "Index", "Index of MTex slot in the material");
 +      RNA_def_property_ui_text(prop, "Valid", "Slot has a valid image and UV map");
  }
  
  
@@@ -103,9 -101,9 +103,9 @@@ static void rna_MetaBall_update_data(Ma
        if (mb->id.us > 0) {
                for (ob = bmain->object.first; ob; ob = ob->id.next)
                        if (ob->data == mb)
 -                              BKE_mball_properties_copy(bmain->eval_ctx, scene, ob);
 +                              BKE_mball_properties_copy(scene, ob);
-       
 -              DAG_id_tag_update(&mb->id, 0);
 +              DEG_id_tag_update(&mb->id, 0);
                WM_main_add_notifier(NC_GEOM | ND_DATA, mb);
        }
  }
@@@ -4924,13 -4931,11 +4924,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);
        RNA_def_property_ui_text(prop, "On Cage", "Adjust edit cage to modifier result");
        RNA_def_property_ui_icon(prop, ICON_MESH_DATA, 0);
        RNA_def_property_update(prop, 0, "rna_Modifier_update");
-       
        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);
  
@@@ -4861,15 -4947,15 +4861,15 @@@ static void def_cmp_render_layers(Struc
        RNA_def_property_struct_type(prop, "Scene");
        RNA_def_property_flag(prop, PROP_EDITABLE | PROP_ID_REFCOUNT);
        RNA_def_property_ui_text(prop, "Scene", "");
 -      RNA_def_property_update(prop, NC_NODE | NA_EDITED, "rna_Node_scene_layer_update");
 +      RNA_def_property_update(prop, NC_NODE | NA_EDITED, "rna_Node_view_layer_update");
-       
        prop = RNA_def_property(srna, "layer", PROP_ENUM, PROP_NONE);
        RNA_def_property_enum_sdna(prop, NULL, "custom1");
 -      RNA_def_property_enum_items(prop, prop_scene_layer_items);
 -      RNA_def_property_enum_funcs(prop, NULL, NULL, "rna_Node_scene_layer_itemf");
 +      RNA_def_property_enum_items(prop, prop_view_layer_items);
 +      RNA_def_property_enum_funcs(prop, NULL, NULL, "rna_Node_view_layer_itemf");
        RNA_def_property_flag(prop, PROP_ENUM_NO_TRANSLATE);
        RNA_def_property_ui_text(prop, "Layer", "");
 -      RNA_def_property_update(prop, NC_NODE | NA_EDITED, "rna_Node_scene_layer_update");
 +      RNA_def_property_update(prop, NC_NODE | NA_EDITED, "rna_Node_view_layer_update");
  }
  
  static void rna_def_cmp_output_file_slot_file(BlenderRNA *brna)
@@@ -474,8 -529,8 +474,8 @@@ static const EnumPropertyItem *rna_Obje
  static void rna_Object_dup_group_set(PointerRNA *ptr, PointerRNA value)
  {
        Object *ob = (Object *)ptr->data;
 -      Group *grp = (Group *)value.data;
 +      Collection *grp = (Collection *)value.data;
-       
        /* must not let this be set if the object belongs in this group already,
         * thus causing a cycle/infinite-recursion leading to crashes on load [#25298]
         */
@@@ -1504,49 -1588,6 +1504,49 @@@ static void rna_def_vertex_group(Blende
        RNA_def_function_return(func, parm);
  }
  
-       
 +static void rna_def_face_map(BlenderRNA *brna)
 +{
 +      StructRNA *srna;
 +      PropertyRNA *prop;
 +      FunctionRNA *func;
 +
 +      srna = RNA_def_struct(brna, "FaceMap", NULL);
 +      RNA_def_struct_sdna(srna, "bFaceMap");
 +      RNA_def_struct_ui_text(srna, "Face Map", "Group of faces, each face can only be part of one map");
 +      RNA_def_struct_ui_icon(srna, ICON_MOD_TRIANGULATE);
 +
 +      prop = RNA_def_property(srna, "name", PROP_STRING, PROP_NONE);
 +      RNA_def_property_ui_text(prop, "Name", "Face map name");
 +      RNA_def_struct_name_property(srna, prop);
 +      RNA_def_property_string_funcs(prop, NULL, NULL, "rna_FaceMap_name_set");
 +      /* update data because modifiers may use [#24761] */
 +      RNA_def_property_update(prop, NC_GEOM | ND_DATA | NA_RENAME, "rna_Object_internal_update_data");
++
 +      prop = RNA_def_property(srna, "select", PROP_BOOLEAN, PROP_NONE);
 +      RNA_def_property_boolean_sdna(prop, NULL, "flag", SELECT);
 +      RNA_def_property_ui_text(prop, "Select", "Face-map selection state (for tools to use)");
 +      /* important not to use a notifier here, creates a feedback loop! */
 +
 +      prop = RNA_def_property(srna, "index", PROP_INT, PROP_UNSIGNED);
 +      RNA_def_property_clear_flag(prop, PROP_EDITABLE);
 +      RNA_def_property_int_funcs(prop, "rna_FaceMap_index_get", NULL, NULL);
 +      RNA_def_property_ui_text(prop, "Index", "Index number of the face map");
 +
 +      func = RNA_def_function(srna, "add", "rna_FaceMap_face_add");
 +      RNA_def_function_ui_description(func, "Add vertices to the group");
 +      RNA_def_function_flag(func, FUNC_USE_REPORTS | FUNC_USE_SELF_ID);
 +      /* TODO, see how array size of 0 works, this shouldnt be used */
 +      prop = RNA_def_int_array(func, "index", 1, NULL, 0, 0, "", "Index List", 0, 0);
 +      RNA_def_parameter_flags(prop, PROP_DYNAMIC, PARM_REQUIRED);
 +
 +      func = RNA_def_function(srna, "remove", "rna_FaceMap_face_remove");
 +      RNA_def_function_ui_description(func, "Remove a vertex from the group");
 +      RNA_def_function_flag(func, FUNC_USE_REPORTS | FUNC_USE_SELF_ID);
 +      /* TODO, see how array size of 0 works, this shouldnt be used */
 +      prop = RNA_def_int_array(func, "index", 1, NULL, 0, 0, "", "Index List", 0, 0);
 +      RNA_def_parameter_flags(prop, PROP_DYNAMIC, PARM_REQUIRED);
 +}
 +
  static void rna_def_material_slot(BlenderRNA *brna)
  {
        StructRNA *srna;
@@@ -1773,71 -2117,54 +1773,71 @@@ static void rna_def_object_vertex_group
        RNA_def_function_ui_description(func, "Delete all vertex groups from object");
  }
  
 -
 -static void rna_def_object_lodlevel(BlenderRNA *brna)
 +/* object.face_maps */
 +static void rna_def_object_face_maps(BlenderRNA *brna, PropertyRNA *cprop)
  {
        StructRNA *srna;
-       
++
        PropertyRNA *prop;
  
 -      srna = RNA_def_struct(brna, "LodLevel", NULL);
 -      RNA_def_struct_sdna(srna, "LodLevel");
 -
 -      prop = RNA_def_property(srna, "distance", PROP_FLOAT, PROP_DISTANCE);
 -      RNA_def_property_float_sdna(prop, NULL, "distance");
 -      RNA_def_property_range(prop, 0.0, FLT_MAX);
 -      RNA_def_property_ui_text(prop, "Distance", "Distance to begin using this level of detail");
 -      RNA_def_property_update(prop, NC_OBJECT | ND_LOD, "rna_Object_lod_distance_update");
 -
 -      prop = RNA_def_property(srna, "object_hysteresis_percentage", PROP_INT, PROP_PERCENTAGE);
 -      RNA_def_property_int_sdna(prop, NULL, "obhysteresis");
 -      RNA_def_property_range(prop, 0, 100);
 -      RNA_def_property_ui_range(prop, 0, 100, 10, 1);
 -      RNA_def_property_ui_text(prop, "Hysteresis %",
 -                               "Minimum distance change required to transition to the previous level of detail");
 -      RNA_def_property_update(prop, NC_OBJECT | ND_LOD, NULL);
 -
 -      prop = RNA_def_property(srna, "object", PROP_POINTER, PROP_NONE);
 -      RNA_def_property_pointer_sdna(prop, NULL, "source");
 -      RNA_def_property_struct_type(prop, "Object");
 -      RNA_def_property_flag(prop, PROP_EDITABLE);
 -      RNA_def_property_ui_text(prop, "Object", "Object to use for this level of detail");
 -      RNA_def_property_update(prop, NC_OBJECT | ND_LOD, NULL);
 +      FunctionRNA *func;
 +      PropertyRNA *parm;
  
 -      prop = RNA_def_property(srna, "use_mesh", PROP_BOOLEAN, PROP_NONE);
 -      RNA_def_property_boolean_sdna(prop, NULL, "flags", OB_LOD_USE_MESH);
 -      RNA_def_property_ui_text(prop, "Use Mesh", "Use the mesh from this object at this level of detail");
 -      RNA_def_property_ui_icon(prop, ICON_MESH_DATA, 0);
 -      RNA_def_property_update(prop, NC_OBJECT | ND_LOD, NULL);
 +      RNA_def_property_srna(cprop, "FaceMaps");
 +      srna = RNA_def_struct(brna, "FaceMaps", NULL);
 +      RNA_def_struct_sdna(srna, "Object");
 +      RNA_def_struct_ui_text(srna, "Face Maps", "Collection of face maps");
  
 -      prop = RNA_def_property(srna, "use_material", PROP_BOOLEAN, PROP_NONE);
 -      RNA_def_property_boolean_sdna(prop, NULL, "flags", OB_LOD_USE_MAT);
 -      RNA_def_property_ui_text(prop, "Use Material", "Use the material from this object at this level of detail");
 -      RNA_def_property_ui_icon(prop, ICON_MATERIAL, 0);
 -      RNA_def_property_update(prop, NC_OBJECT | ND_LOD, NULL);
 +      prop = RNA_def_property(srna, "active", PROP_POINTER, PROP_NONE);
 +      RNA_def_property_struct_type(prop, "FaceMap");
 +      RNA_def_property_pointer_funcs(prop, "rna_Object_active_face_map_get",
 +                                     "rna_Object_active_face_map_set", NULL, NULL);
 +      RNA_def_property_ui_text(prop, "Active Face Map", "Face maps of the object");
 +      RNA_def_property_update(prop, NC_GEOM | ND_DATA, "rna_Object_internal_update_data");
  
 -      prop = RNA_def_property(srna, "use_object_hysteresis", PROP_BOOLEAN, PROP_NONE);
 -      RNA_def_property_boolean_sdna(prop, NULL, "flags", OB_LOD_USE_HYST);
 -      RNA_def_property_ui_text(prop, "Hysteresis Override", "Override LoD Hysteresis scene setting for this LoD level");
 -      RNA_def_property_update(prop, NC_OBJECT | ND_LOD, NULL);
 +      prop = RNA_def_property(srna, "active_index", PROP_INT, PROP_UNSIGNED);
 +      RNA_def_property_clear_flag(prop, PROP_ANIMATABLE);
 +      RNA_def_property_int_sdna(prop, NULL, "actfmap");
 +      RNA_def_property_int_funcs(prop, "rna_Object_active_face_map_index_get",
 +                                 "rna_Object_active_face_map_index_set",
 +                                 "rna_Object_active_face_map_index_range");
 +      RNA_def_property_ui_text(prop, "Active Face Map Index", "Active index in face map array");
 +      RNA_def_property_update(prop, NC_GEOM | ND_DATA, "rna_Object_internal_update_data");
-       
++
 +      /* face maps */ /* add_face_map */
 +      func = RNA_def_function(srna, "new", "rna_Object_fmap_new");
 +      RNA_def_function_ui_description(func, "Add face map to object");
 +      RNA_def_string(func, "name", "Map", 0, "", "face map name"); /* optional */
 +      parm = RNA_def_pointer(func, "fmap", "FaceMap", "", "New face map");
 +      RNA_def_function_return(func, parm);
 +
 +      func = RNA_def_function(srna, "remove", "rna_Object_fmap_remove");
 +      RNA_def_function_flag(func, FUNC_USE_REPORTS);
 +      RNA_def_function_ui_description(func, "Delete vertex group from object");
 +      parm = RNA_def_pointer(func, "group", "FaceMap", "", "Face map to remove");
 +      RNA_def_parameter_flags(parm, PROP_NEVER_NULL, PARM_REQUIRED | PARM_RNAPTR);
 +      RNA_def_property_clear_flag(parm, PROP_THICK_WRAP);
 +
 +      func = RNA_def_function(srna, "clear", "rna_Object_fmap_clear");
 +      RNA_def_function_ui_description(func, "Delete all vertex groups from object");
  }
  
 +static void rna_def_object_display(BlenderRNA *brna)
 +{
 +      StructRNA *srna;
 +      PropertyRNA *prop;
 +
 +      srna = RNA_def_struct(brna, "ObjectDisplay", NULL);
 +      RNA_def_struct_ui_text(srna, "Object Display", "Object display settings for 3d viewport");
 +      RNA_def_struct_sdna(srna, "ObjectDisplay");
 +      RNA_def_struct_path_func(srna, "rna_ObjectDisplay_path");
 +
 +      prop = RNA_def_property(srna, "show_shadows", PROP_BOOLEAN, PROP_NONE);
 +      RNA_def_property_boolean_sdna(prop, NULL, "flag", OB_SHOW_SHADOW);
 +      RNA_def_property_boolean_default(prop, true);
 +      RNA_def_property_ui_text(prop, "Shadow", "Object cast shadows in the 3d viewport");
 +      RNA_def_property_update(prop, NC_OBJECT | ND_DRAW, NULL);
 +}
  
  static void rna_def_object(BlenderRNA *brna)
  {
        prop = RNA_def_property(srna, "parent", PROP_POINTER, PROP_NONE);
        RNA_def_property_pointer_funcs(prop, NULL, "rna_Object_parent_set", NULL, NULL);
        RNA_def_property_flag(prop, PROP_EDITABLE | PROP_ID_SELF_CHECK);
 +      RNA_def_property_override_flag(prop, PROPOVERRIDE_OVERRIDABLE_STATIC);
        RNA_def_property_ui_text(prop, "Parent", "Parent Object");
        RNA_def_property_update(prop, NC_OBJECT | ND_DRAW, "rna_Object_dependency_update");
-       
        prop = RNA_def_property(srna, "parent_type", PROP_ENUM, PROP_NONE);
        RNA_def_property_enum_bitflag_sdna(prop, NULL, "partype");
        RNA_def_property_enum_items(prop, parent_type_items);
                                     "rna_Object_rotation_axis_angle_set", NULL);
        RNA_def_property_editable_array_func(prop, "rna_Object_rotation_4d_editable");
        RNA_def_property_float_array_default(prop, default_axisAngle);
 +      RNA_def_property_override_flag(prop, PROPOVERRIDE_OVERRIDABLE_STATIC);
        RNA_def_property_ui_text(prop, "Axis-Angle Rotation", "Angle of Rotation for Axis-Angle rotation representation");
        RNA_def_property_update(prop, NC_OBJECT | ND_TRANSFORM, "rna_Object_internal_update");
-       
        prop = RNA_def_property(srna, "rotation_euler", PROP_FLOAT, PROP_EULER);
        RNA_def_property_float_sdna(prop, NULL, "rot");
        RNA_def_property_editable_array_func(prop, "rna_Object_rotation_euler_editable");
 +      RNA_def_property_override_flag(prop, PROPOVERRIDE_OVERRIDABLE_STATIC);
        RNA_def_property_ui_text(prop, "Euler Rotation", "Rotation in Eulers");
        RNA_def_property_update(prop, NC_OBJECT | ND_TRANSFORM, "rna_Object_internal_update");
-       
        prop = RNA_def_property(srna, "rotation_mode", PROP_ENUM, PROP_NONE);
        RNA_def_property_enum_sdna(prop, NULL, "rotmode");
        RNA_def_property_enum_items(prop, prop_rotmode_items); /* XXX move to using a single define of this someday */
        RNA_def_property_ui_text(prop, "Vertex Groups", "Vertex groups of the object");
        rna_def_object_vertex_groups(brna, prop);
  
-       
++
 +      /* face maps */
 +      prop = RNA_def_property(srna, "face_maps", PROP_COLLECTION, PROP_NONE);
 +      RNA_def_property_collection_sdna(prop, NULL, "fmaps", NULL);
 +      RNA_def_property_struct_type(prop, "FaceMap");
 +      RNA_def_property_ui_text(prop, "Face Maps", "Maps of faces of the object");
 +      rna_def_object_face_maps(brna, prop);
-       
++
        /* empty */
        prop = RNA_def_property(srna, "empty_draw_type", PROP_ENUM, PROP_NONE);
        RNA_def_property_enum_sdna(prop, NULL, "empty_drawtype");
        RNA_def_property_pointer_sdna(prop, NULL, "rigidbody_constraint");
        RNA_def_property_struct_type(prop, "RigidBodyConstraint");
        RNA_def_property_ui_text(prop, "Rigid Body Constraint", "Constraint constraining rigid bodies");
-       
        /* restrict */
 -      prop = RNA_def_property(srna, "hide", PROP_BOOLEAN, PROP_NONE);
 -      RNA_def_property_boolean_sdna(prop, NULL, "restrictflag", OB_RESTRICT_VIEW);
 -      RNA_def_property_ui_text(prop, "Restrict View", "Restrict visibility in the viewport");
 -      RNA_def_property_ui_icon(prop, ICON_RESTRICT_VIEW_OFF, 1);
 -      RNA_def_property_update(prop, NC_OBJECT | ND_DRAW, "rna_Object_hide_update");
 -
 -      prop = RNA_def_property(srna, "hide_select", PROP_BOOLEAN, PROP_NONE);
 -      RNA_def_property_boolean_sdna(prop, NULL, "restrictflag", OB_RESTRICT_SELECT);
 -      RNA_def_property_ui_text(prop, "Restrict Select", "Restrict selection in the viewport");
 -      RNA_def_property_ui_icon(prop, ICON_RESTRICT_SELECT_OFF, 1);
 -      RNA_def_property_update(prop, NC_OBJECT | ND_DRAW, NULL);
 -
        prop = RNA_def_property(srna, "hide_render", PROP_BOOLEAN, PROP_NONE);
        RNA_def_property_boolean_sdna(prop, NULL, "restrictflag", OB_RESTRICT_RENDER);
        RNA_def_property_ui_text(prop, "Restrict Render", "Restrict renderability");
        RNA_def_property_ui_icon(prop, ICON_RESTRICT_RENDER_OFF, 1);
        RNA_def_property_update(prop, NC_OBJECT | ND_DRAW, "rna_Object_hide_update");
  
 +      prop = RNA_def_property(srna, "show_duplicator_for_render", PROP_BOOLEAN, PROP_NONE);
 +      RNA_def_property_boolean_sdna(prop, NULL, "duplicator_visibility_flag", OB_DUPLI_FLAG_RENDER);
 +      RNA_def_property_ui_text(prop, "Render Duplicator", "Make duplicator visible when rendering");
 +
 +      prop = RNA_def_property(srna, "show_duplicator_for_viewport", PROP_BOOLEAN, PROP_NONE);
 +      RNA_def_property_boolean_sdna(prop, NULL, "duplicator_visibility_flag", OB_DUPLI_FLAG_VIEWPORT);
 +      RNA_def_property_ui_text(prop, "Display Duplicator", "Make duplicator visible in the viewport");
 +
 +      prop = RNA_def_property(srna, "is_visible", PROP_BOOLEAN, PROP_NONE);
 +      RNA_def_property_boolean_funcs(prop, "rna_Object_is_visible_get", NULL);
 +      RNA_def_property_ui_text(prop, "Visible", "Visible to camera rays, set only on objects evaluated by depsgraph");
 +      RNA_def_property_clear_flag(prop, PROP_EDITABLE);
 +
        /* anim */
        rna_def_animdata_common(srna);
-       
        rna_def_animviz_common(srna);
        rna_def_motionpath_common(srna);
-       
        /* slow parenting */
        /* XXX: evil old crap */
        prop = RNA_def_property(srna, "use_slow_parent", PROP_BOOLEAN, PROP_NONE);
@@@ -218,8 -236,11 +218,8 @@@ static void rna_Cache_active_point_cach
  {
        Object *ob = ptr->id.data;
        PointCache *cache = ptr->data;
 -      PTCacheID *pid;
 -      ListBase pidlist;
 -
 -      BKE_ptcache_ids_from_object(&pidlist, ob, NULL, 0);
 +      PTCacheID pid = BKE_ptcache_id_find(ob, NULL, cache);
-       
        *min = 0;
        *max = 0;
  
@@@ -246,11 -280,19 +246,11 @@@ static void rna_Cache_active_point_cach
  {
        Object *ob = ptr->id.data;
        PointCache *cache = ptr->data;
 -      PTCacheID *pid;
 -      ListBase pidlist;
 -
 -      BKE_ptcache_ids_from_object(&pidlist, ob, NULL, 0);
 +      PTCacheID pid = BKE_ptcache_id_find(ob, NULL, cache);
-       
 -      for (pid = pidlist.first; pid; pid = pid->next) {
 -              if (pid->cache == cache) {
 -                      *(pid->cache_ptr) = BLI_findlink(pid->ptcaches, value);
 -                      break;
 -              }
 +      if (pid.cache) {
 +              *(pid.cache_ptr) = BLI_findlink(pid.ptcaches, value);
        }
 -
 -      BLI_freelistN(&pidlist);
  }
  
  static void rna_PointCache_frame_step_range(PointerRNA *ptr, int *min, int *max,
@@@ -973,12 -1023,11 +973,12 @@@ static void rna_def_effector_weight(Ble
        RNA_def_property_boolean_sdna(prop, NULL, "flag", EFF_WEIGHT_DO_HAIR);
        RNA_def_property_ui_text(prop, "Use For Growing Hair", "Use force fields when growing hair");
        RNA_def_property_update(prop, 0, "rna_EffectorWeight_update");
-       
        /* General */
        prop = RNA_def_property(srna, "group", PROP_POINTER, PROP_NONE);
 +      RNA_def_property_struct_type(prop, "Collection");
        RNA_def_property_flag(prop, PROP_EDITABLE);
 -      RNA_def_property_ui_text(prop, "Effector Group", "Limit effectors to this Group");
 +      RNA_def_property_ui_text(prop, "Effector Collection", "Limit effectors to this collection");
        RNA_def_property_update(prop, 0, "rna_EffectorWeight_dependency_update");
  
        prop = RNA_def_property(srna, "gravity", PROP_FLOAT, PROP_NONE);
@@@ -1583,9 -1704,9 +1583,9 @@@ static void rna_def_softbody(BlenderRN
        prop = RNA_def_property(srna, "spring_length", PROP_INT, PROP_NONE);
        RNA_def_property_int_sdna(prop, NULL, "springpreload");
        RNA_def_property_range(prop, 0.0f, 200.0f);
 -      RNA_def_property_ui_text(prop, "SL", "Alter spring length to shrink/blow up (unit %) 0 to disable");
 +      RNA_def_property_ui_text(prop, "view_layer", "Alter spring length to shrink/blow up (unit %) 0 to disable");
        RNA_def_property_update(prop, 0, "rna_softbody_update");
-       
        prop = RNA_def_property(srna, "aero", PROP_INT, PROP_NONE);
        RNA_def_property_int_sdna(prop, NULL, "aeroedge");
        RNA_def_property_range(prop, 0.0f, 30000.0f);
@@@ -337,12 -334,19 +337,12 @@@ static void rna_ParticleSystem_co_hair(
  
        part = particlesystem->part;
        pars = particlesystem->particles;
 +      totpart = particlesystem->totcached;
 +      totchild = particlesystem->totchildcache;
  
 -      if (particlesystem->renderdata) {
 -              step_nbr = part->ren_step;
 -              totchild = particlesystem->totchild;
 -      }
 -      else {
 -              step_nbr = part->draw_step;
 -              totchild = (int)((float)particlesystem->totchild * (float)(part->disp) / 100.0f);
 -      }
 -
 -      if (part == NULL || pars == NULL || !psys_check_enabled(object, particlesystem, particlesystem->renderdata != NULL))
 +      if (part == NULL || pars == NULL)
                return;
-       
        if (part->ren_as == PART_DRAW_OB || part->ren_as == PART_DRAW_GR || part->ren_as == PART_DRAW_NOT)
                return;
  
@@@ -717,11 -758,11 +717,11 @@@ static void rna_Particle_target_reset(M
                        else
                                pt->flag &= ~PTARGET_VALID;
                }
-               
                psys->recalc = PSYS_RECALC_RESET;
  
 -              DAG_id_tag_update(&ob->id, OB_RECALC_DATA);
 -              DAG_relations_tag_update(bmain);
 +              DEG_id_tag_update(&ob->id, OB_RECALC_DATA);
 +              DEG_relations_tag_update(bmain);
        }
  
        WM_main_add_notifier(NC_OBJECT | ND_PARTICLE | NA_EDITED, NULL);
@@@ -733,10 -774,10 +733,10 @@@ static void rna_Particle_target_redo(Ma
                Object *ob = (Object *)ptr->id.data;
                ParticleTarget *pt = (ParticleTarget *)ptr->data;
                ParticleSystem *psys = rna_particle_system_for_target(ob, pt);
-               
                psys->recalc = PSYS_RECALC_REDO;
  
 -              DAG_id_tag_update(&ob->id, OB_RECALC_DATA);
 +              DEG_id_tag_update(&ob->id, OB_RECALC_DATA);
                WM_main_add_notifier(NC_OBJECT | ND_PARTICLE | NA_EDITED, NULL);
        }
  }
@@@ -239,13 -234,13 +239,13 @@@ static void rna_Pose_ik_solver_update(M
        bPose *pose = ptr->data;
  
        BKE_pose_tag_recalc(bmain, pose);  /* checks & sorts pose channels */
 -      DAG_relations_tag_update(bmain);
 +      DEG_relations_tag_update(bmain);
-       
        BKE_pose_update_constraint_flags(pose);
-       
        object_test_constraints(bmain, ob);
  
 -      DAG_id_tag_update(&ob->id, OB_RECALC_DATA | OB_RECALC_OB);
 +      DEG_id_tag_update(&ob->id, OB_RECALC_DATA | OB_RECALC_OB);
  }
  
  /* rotation - axis-angle */
@@@ -890,10 -833,9 +890,10 @@@ static void rna_def_pose_channel(Blende
  
        prop = RNA_def_property(srna, "child", PROP_POINTER, PROP_NONE);
        RNA_def_property_struct_type(prop, "PoseBone");
 +      RNA_def_property_flag(prop, PROP_PTR_NO_OWNERSHIP);
        RNA_def_property_clear_flag(prop, PROP_EDITABLE);
        RNA_def_property_ui_text(prop, "Child", "Child of this pose bone");
-       
        /* Transformation settings */
        prop = RNA_def_property(srna, "location", PROP_FLOAT, PROP_TRANSLATION);
        RNA_def_property_float_sdna(prop, NULL, "loc");
        RNA_def_property_float_array_default(prop, default_axisAngle);
        RNA_def_property_ui_text(prop, "Axis-Angle Rotation", "Angle of Rotation for Axis-Angle rotation representation");
        RNA_def_property_update(prop, NC_OBJECT | ND_POSE, "rna_Pose_update");
-       
        prop = RNA_def_property(srna, "rotation_euler", PROP_FLOAT, PROP_EULER);
        RNA_def_property_float_sdna(prop, NULL, "eul");
 +      RNA_def_property_override_flag(prop, PROPOVERRIDE_OVERRIDABLE_STATIC);
        RNA_def_property_editable_array_func(prop, "rna_PoseChannel_rotation_euler_editable");
        RNA_def_property_ui_text(prop, "Euler Rotation", "Rotation in Eulers");
        RNA_def_property_update(prop, NC_OBJECT | ND_POSE, "rna_Pose_update");
@@@ -737,20 -738,20 +737,20 @@@ static void rna_def_rigidbody_world(Ble
        RNA_def_struct_sdna(srna, "RigidBodyWorld");
        RNA_def_struct_ui_text(srna, "Rigid Body World", "Self-contained rigid body simulation environment and settings");
        RNA_def_struct_path_func(srna, "rna_RigidBodyWorld_path");
-       
        /* groups */
        prop = RNA_def_property(srna, "group", PROP_POINTER, PROP_NONE);
 -      RNA_def_property_struct_type(prop, "Group");
 +      RNA_def_property_struct_type(prop, "Collection");
        RNA_def_property_flag(prop, PROP_EDITABLE | PROP_ID_SELF_CHECK);
 -      RNA_def_property_ui_text(prop, "Group", "Group containing objects participating in this simulation");
 +      RNA_def_property_ui_text(prop, "Collection", "Collection containing objects participating in this simulation");
        RNA_def_property_update(prop, NC_SCENE, "rna_RigidBodyWorld_reset");
  
        prop = RNA_def_property(srna, "constraints", PROP_POINTER, PROP_NONE);
 -      RNA_def_property_struct_type(prop, "Group");
 +      RNA_def_property_struct_type(prop, "Collection");
        RNA_def_property_flag(prop, PROP_EDITABLE | PROP_ID_SELF_CHECK);
 -      RNA_def_property_ui_text(prop, "Constraints", "Group containing rigid body constraint objects");
 +      RNA_def_property_ui_text(prop, "Constraints", "Collection containing rigid body constraint objects");
        RNA_def_property_update(prop, NC_SCENE, "rna_RigidBodyWorld_reset");
-       
        /* booleans */
        prop = RNA_def_property(srna, "enabled", PROP_BOOLEAN, PROP_NONE);
        RNA_def_property_boolean_negative_sdna(prop, NULL, "flag", RBW_FLAG_MUTED);
@@@ -434,38 -427,11 +434,38 @@@ static const EnumPropertyItem rna_enum_
        {GP_IPO_BACK, "BACK", ICON_IPO_BACK, "Back", "Cubic easing with overshoot and settle"},
        {GP_IPO_BOUNCE, "BOUNCE", ICON_IPO_BOUNCE, "Bounce", "Exponentially decaying parabolic bounce, like when objects collide"},
        {GP_IPO_ELASTIC, "ELASTIC", ICON_IPO_ELASTIC, "Elastic", "Exponentially decaying sine wave, like an elastic band"},
-       
        {0, NULL, 0, NULL, NULL}
  };
 +
  #endif
  
 +const EnumPropertyItem rna_enum_transform_pivot_items_full[] = {
 +      {V3D_AROUND_CENTER_BOUNDS, "BOUNDING_BOX_CENTER", ICON_ROTATE, "Bounding Box Center",
 +                   "Pivot around bounding box center of selected object(s)"},
 +      {V3D_AROUND_CURSOR, "CURSOR", ICON_CURSOR, "3D Cursor", "Pivot around the 3D cursor"},
 +      {V3D_AROUND_LOCAL_ORIGINS, "INDIVIDUAL_ORIGINS", ICON_ROTATECOLLECTION,
 +                  "Individual Origins", "Pivot around each object's own origin"},
 +      {V3D_AROUND_CENTER_MEAN, "MEDIAN_POINT", ICON_ROTATECENTER, "Median Point",
 +                     "Pivot around the median point of selected objects"},
 +      {V3D_AROUND_ACTIVE, "ACTIVE_ELEMENT", ICON_ROTACTIVE, "Active Element", "Pivot around active object"},
 +      {0, NULL, 0, NULL, NULL}
 +};
 +
 +/* Icons could be made a consistent set of images. */
 +static const EnumPropertyItem transform_orientation_items[] = {
 +      {V3D_MANIP_GLOBAL, "GLOBAL", ICON_SCENE_DATA, "Global", "Align the transformation axes to world space"},
 +      {V3D_MANIP_LOCAL, "LOCAL", ICON_MANIPUL, "Local", "Align the transformation axes to the selected objects' local space"},
 +      {V3D_MANIP_NORMAL, "NORMAL", ICON_SNAP_NORMAL, "Normal",
 +                         "Align the transformation axes to average normal of selected elements "
 +                         "(bone Y axis for pose mode)"},
 +      {V3D_MANIP_GIMBAL, "GIMBAL", ICON_NDOF_DOM, "Gimbal", "Align each axis to the Euler rotation axis as used for input"},
 +      {V3D_MANIP_VIEW, "VIEW", ICON_VISIBLE_IPO_ON, "View", "Align the transformation axes to the window"},
 +      {V3D_MANIP_CURSOR, "CURSOR", ICON_CURSOR, "Cursor", "Align the transformation axes to the 3D cursor"},
 +      // {V3D_MANIP_CUSTOM, "CUSTOM", 0, "Custom", "Use a custom transform orientation"},
 +      {0, NULL, 0, NULL, NULL}
 +};
 +
  #ifdef RNA_RUNTIME
  
  #include "DNA_anim_types.h"
@@@ -1592,12 -1731,12 +1592,12 @@@ static void object_simplify_update(Obje
  
        for (psys = ob->particlesystem.first; psys; psys = psys->next)
                psys->recalc |= PSYS_RECALC_CHILD;
-       
        if (ob->dup_group) {
 -              GroupObject *gob;
 +              CollectionObject *cob;
  
 -              for (gob = ob->dup_group->gobject.first; gob; gob = gob->next)
 -                      object_simplify_update(gob->ob);
 +              for (cob = ob->dup_group->gobject.first; cob; cob = cob->next)
 +                      object_simplify_update(cob->ob);
        }
  }
  
@@@ -1608,21 -1747,14 +1608,21 @@@ static void rna_Scene_use_simplify_upda
        Base *base;
  
        BKE_main_id_tag_listbase(&bmain->object, LIB_TAG_DOIT, true);
 -      for (SETLOOPER(sce, sce_iter, base))
 +      FOREACH_SCENE_OBJECT_BEGIN(sce, ob)
 +      {
 +              object_simplify_update(ob);
 +      }
 +      FOREACH_SCENE_OBJECT_END;
 +
 +      for (SETLOOPER_SET_ONLY(sce, sce_iter, base)) {
                object_simplify_update(base->object);
-       
 +      }
        WM_main_add_notifier(NC_GEOM | ND_DATA, NULL);
 -      DAG_id_tag_update(&scene->id, 0);
 +      DEG_id_tag_update(&sce->id, 0);
  }
  
 -static void rna_Scene_simplify_update(Main *bmain, Scene *UNUSED(scene), PointerRNA *ptr)
 +static void rna_Scene_simplify_update(Main *bmain, Scene *scene, PointerRNA *ptr)
  {
        Scene *sce = ptr->id.data;
  
@@@ -2004,123 -2164,34 +2004,123 @@@ static void rna_Stereo3dFormat_update(M
  
  static int rna_gpu_is_hq_supported_get(PointerRNA *UNUSED(ptr))
  {
 -      return GPU_instanced_drawing_support() && GPU_geometry_shader_support();
 +      return true;
  }
  
 -#else
 -
 -/* Grease Pencil Interpolation tool settings */
 -static void rna_def_gpencil_interpolate(BlenderRNA *brna)
 +static ViewLayer *rna_ViewLayer_new(
 +        ID *id, Scene *UNUSED(sce), Main *bmain, const char *name)
  {
 -      StructRNA *srna;
 -      PropertyRNA *prop;
 +      Scene *scene = (Scene *)id;
 +      ViewLayer *view_layer = BKE_view_layer_add(scene, name);
  
 -      srna = RNA_def_struct(brna, "GPencilInterpolateSettings", NULL);
 -      RNA_def_struct_sdna(srna, "GP_Interpolate_Settings");
 -      RNA_def_struct_path_func(srna, "rna_GPencilInterpolateSettings_path");
 -      RNA_def_struct_ui_text(srna, "Grease Pencil Interpolate Settings",
 -                             "Settings for Grease Pencil interpolation tools");
 +      DEG_id_tag_update(&scene->id, 0);
 +      DEG_relations_tag_update(bmain);
 +      WM_main_add_notifier(NC_SCENE | ND_LAYER, NULL);
  
 -      /* flags */
 -      prop = RNA_def_property(srna, "interpolate_all_layers", PROP_BOOLEAN, PROP_NONE);
 -      RNA_def_property_boolean_sdna(prop, NULL, "flag", GP_TOOLFLAG_INTERPOLATE_ALL_LAYERS);
 -      RNA_def_property_ui_text(prop, "Interpolate All Layers", "Interpolate all layers, not only active");
 -      RNA_def_property_update(prop, NC_SCENE | ND_TOOLSETTINGS, NULL);
 +      return view_layer;
 +}
  
 -      prop = RNA_def_property(srna, "interpolate_selected_only", PROP_BOOLEAN, PROP_NONE);
 -      RNA_def_property_boolean_sdna(prop, NULL, "flag", GP_TOOLFLAG_INTERPOLATE_ONLY_SELECTED);
 +static void rna_ViewLayer_remove(
 +        ID *id, Scene *UNUSED(sce), Main *bmain, ReportList *reports, PointerRNA *sl_ptr)
 +{
 +      Scene *scene = (Scene *)id;
 +      ViewLayer *view_layer = sl_ptr->data;
 +
 +      if (ED_scene_view_layer_delete(bmain, scene, view_layer, reports)) {
 +              RNA_POINTER_INVALIDATE(sl_ptr);
 +      }
 +}
 +
 +static int rna_Scene_transform_orientation_get(PointerRNA *ptr)
 +{
 +      Scene *scene = ptr->data;
 +      /* convert to enum value */
 +      return (scene->orientation_type == V3D_MANIP_CUSTOM) ?
 +                  (scene->orientation_type + scene->orientation_index_custom) : scene->orientation_type;
 +}
 +
 +void rna_Scene_transform_orientation_set(PointerRNA *ptr, int value)
 +{
 +      Scene *scene = ptr->data;
 +      BIF_selectTransformOrientationValue(scene, value);
 +}
 +
 +static PointerRNA rna_Scene_current_orientation_get(PointerRNA *ptr)
 +{
 +      Scene *scene = ptr->data;
 +      TransformOrientation *orientation;
 +
 +      if (scene->orientation_type < V3D_MANIP_CUSTOM) {
 +              orientation = NULL;
 +      }
 +      else {
 +              orientation = BKE_scene_transform_orientation_find(scene, scene->orientation_index_custom);
 +      }
 +
 +      return rna_pointer_inherit_refine(ptr, &RNA_TransformOrientation, orientation);
 +}
 +
 +const EnumPropertyItem *rna_TransformOrientation_itemf(
 +        bContext *C, PointerRNA *ptr, PropertyRNA *UNUSED(prop), bool *r_free)
 +{
 +      EnumPropertyItem tmp = {0, "", 0, "", ""};
 +      EnumPropertyItem *item = NULL;
 +      int i = V3D_MANIP_CUSTOM, totitem = 0;
 +
 +      RNA_enum_items_add(&item, &totitem, transform_orientation_items);
 +
 +      Scene *scene;
 +      if (ptr->type == &RNA_Scene) {
 +              scene = ptr->data;
 +      }
 +      else {
 +              scene = CTX_data_scene(C);
 +      }
 +      const ListBase *transform_orientations = scene ? &scene->transform_spaces : NULL;
 +
 +      if (transform_orientations && (BLI_listbase_is_empty(transform_orientations) == false)) {
 +              RNA_enum_item_add_separator(&item, &totitem);
 +
 +              for (TransformOrientation *ts = transform_orientations->first; ts; ts = ts->next) {
 +                      tmp.identifier = ts->name;
 +                      tmp.name = ts->name;
 +                      tmp.value = i++;
 +                      RNA_enum_item_add(&item, &totitem, &tmp);
 +              }
 +      }
 +
 +      RNA_enum_item_end(&item, &totitem);
 +      *r_free = true;
 +
 +      return item;
 +}
 +
 +
 +#else
 +
 +/* Grease Pencil Interpolation tool settings */
 +static void rna_def_gpencil_interpolate(BlenderRNA *brna)
 +{
 +      StructRNA *srna;
 +      PropertyRNA *prop;
-       
++
 +      srna = RNA_def_struct(brna, "GPencilInterpolateSettings", NULL);
 +      RNA_def_struct_sdna(srna, "GP_Interpolate_Settings");
 +      RNA_def_struct_path_func(srna, "rna_GPencilInterpolateSettings_path");
 +      RNA_def_struct_ui_text(srna, "Grease Pencil Interpolate Settings",
 +                             "Settings for Grease Pencil interpolation tools");
-       
++
 +      /* flags */
 +      prop = RNA_def_property(srna, "interpolate_all_layers", PROP_BOOLEAN, PROP_NONE);
 +      RNA_def_property_boolean_sdna(prop, NULL, "flag", GP_TOOLFLAG_INTERPOLATE_ALL_LAYERS);
 +      RNA_def_property_ui_text(prop, "Interpolate All Layers", "Interpolate all layers, not only active");
 +      RNA_def_property_update(prop, NC_SCENE | ND_TOOLSETTINGS, NULL);
 +
 +      prop = RNA_def_property(srna, "interpolate_selected_only", PROP_BOOLEAN, PROP_NONE);
 +      RNA_def_property_boolean_sdna(prop, NULL, "flag", GP_TOOLFLAG_INTERPOLATE_ONLY_SELECTED);
        RNA_def_property_ui_text(prop, "Interpolate Selected Strokes", "Interpolate only selected strokes in the original frame");
        RNA_def_property_update(prop, NC_SCENE | ND_TOOLSETTINGS, NULL);
-       
        /* interpolation type */
        prop = RNA_def_property(srna, "type", PROP_ENUM, PROP_NONE);
        RNA_def_property_enum_sdna(prop, NULL, "type");
@@@ -2455,9 -2542,8 +2455,9 @@@ static void rna_def_tool_settings(Blend
        prop = RNA_def_property(srna, "sculpt", PROP_POINTER, PROP_NONE);
        RNA_def_property_struct_type(prop, "Sculpt");
        RNA_def_property_ui_text(prop, "Sculpt", "");
-       
        prop = RNA_def_property(srna, "use_auto_normalize", PROP_BOOLEAN, PROP_NONE);
 +      RNA_def_property_flag(prop, PROP_CONTEXT_UPDATE);
        RNA_def_property_boolean_sdna(prop, NULL, "auto_normalize", 1);
        RNA_def_property_ui_text(prop, "WPaint Auto-Normalize",
                                 "Ensure all bone-deforming vertex groups add up "
        RNA_def_property_float_sdna(prop, NULL, "proportional_size");
        RNA_def_property_ui_text(prop, "Proportional Size", "Display size for proportional editing circle");
        RNA_def_property_range(prop, 0.00001, 5000.0);
-       
 -      prop = RNA_def_property(srna, "normal_size", PROP_FLOAT, PROP_DISTANCE);
 -      RNA_def_property_float_sdna(prop, NULL, "normalsize");
 -      RNA_def_property_ui_text(prop, "Normal Size", "Display size for normals in the 3D view");
 -      RNA_def_property_range(prop, 0.00001, 1000.0);
 -      RNA_def_property_ui_range(prop, 0.01, 10.0, 10.0, 2);
 -      RNA_def_property_update(prop, NC_GEOM | ND_DATA, NULL);
 -
        prop = RNA_def_property(srna, "double_threshold", PROP_FLOAT, PROP_DISTANCE);
        RNA_def_property_float_sdna(prop, NULL, "doublimit");
        RNA_def_property_ui_text(prop, "Double Threshold", "Limit for removing duplicates and 'Auto Merge'");
        RNA_def_property_ui_icon(prop, ICON_SNAP_GRID, 0);
        RNA_def_property_update(prop, NC_SCENE | ND_TOOLSETTINGS, NULL); /* header redraw */
  
 -      prop = RNA_def_property(srna, "snap_element", PROP_ENUM, PROP_NONE);
 -      RNA_def_property_enum_sdna(prop, NULL, "snap_mode");
 +      prop = RNA_def_property(srna, "snap_elements", PROP_ENUM, PROP_NONE);
 +      RNA_def_property_enum_bitflag_sdna(prop, NULL, "snap_mode");
        RNA_def_property_enum_items(prop, rna_enum_snap_element_items);
 +      RNA_def_property_flag(prop, PROP_ENUM_FLAG);
        RNA_def_property_ui_text(prop, "Snap Element", "Type of element to snap to");
        RNA_def_property_update(prop, NC_SCENE | ND_TOOLSETTINGS, NULL); /* header redraw */
-       
        /* node editor uses own set of snap modes */
        prop = RNA_def_property(srna, "snap_node_element", PROP_ENUM, PROP_NONE);
 -      RNA_def_property_enum_sdna(prop, NULL, "snap_node_mode");
 +      RNA_def_property_enum_bitflag_sdna(prop, NULL, "snap_node_mode");
        RNA_def_property_enum_items(prop, rna_enum_snap_node_element_items);
        RNA_def_property_ui_text(prop, "Snap Node Element", "Type of element to snap to");
        RNA_def_property_update(prop, NC_SCENE | ND_TOOLSETTINGS, NULL); /* header redraw */
-       
        /* image editor uses own set of snap modes */
        prop = RNA_def_property(srna, "snap_uv_element", PROP_ENUM, PROP_NONE);
 -      RNA_def_property_enum_sdna(prop, NULL, "snap_uv_mode");
 +      RNA_def_property_enum_bitflag_sdna(prop, NULL, "snap_uv_mode");
        RNA_def_property_enum_items(prop, snap_uv_element_items);
        RNA_def_property_ui_text(prop, "Snap UV Element", "Type of element to snap to");
        RNA_def_property_update(prop, NC_SCENE | ND_TOOLSETTINGS, NULL); /* header redraw */
@@@ -3282,9 -3466,9 +3282,9 @@@ void rna_def_view_layer_common(StructRN
        prop = RNA_def_property(srna, "use_pass_z", PROP_BOOLEAN, PROP_NONE);
        RNA_def_property_boolean_sdna(prop, NULL, "passflag", SCE_PASS_Z);
        RNA_def_property_ui_text(prop, "Z", "Deliver Z values pass");
 -      if (scene) RNA_def_property_update(prop, NC_SCENE | ND_RENDER_OPTIONS, "rna_SceneRenderLayer_pass_update");
 +      if (scene) RNA_def_property_update(prop, NC_SCENE | ND_RENDER_OPTIONS, "rna_ViewLayer_pass_update");
        else RNA_def_property_clear_flag(prop, PROP_EDITABLE);
-       
        prop = RNA_def_property(srna, "use_pass_vector", PROP_BOOLEAN, PROP_NONE);
        RNA_def_property_boolean_sdna(prop, NULL, "passflag", SCE_PASS_VECTOR);
        RNA_def_property_ui_text(prop, "Vector", "Deliver speed vector pass");
        prop = RNA_def_property(srna, "use_pass_ambient_occlusion", PROP_BOOLEAN, PROP_NONE);
        RNA_def_property_boolean_sdna(prop, NULL, "passflag", SCE_PASS_AO);
        RNA_def_property_ui_text(prop, "AO", "Deliver AO pass");
 -      if (scene) RNA_def_property_update(prop, NC_SCENE | ND_RENDER_OPTIONS, "rna_SceneRenderLayer_pass_update");
 -      else RNA_def_property_clear_flag(prop, PROP_EDITABLE);
 -
 -      prop = RNA_def_property(srna, "use_pass_reflection", PROP_BOOLEAN, PROP_NONE);
 -      RNA_def_property_boolean_sdna(prop, NULL, "passflag", SCE_PASS_REFLECT);
 -      RNA_def_property_ui_text(prop, "Reflection", "Deliver raytraced reflection pass");
 -      if (scene) RNA_def_property_update(prop, NC_SCENE | ND_RENDER_OPTIONS, "rna_SceneRenderLayer_pass_update");
 -      else RNA_def_property_clear_flag(prop, PROP_EDITABLE);
 -
 -      prop = RNA_def_property(srna, "use_pass_refraction", PROP_BOOLEAN, PROP_NONE);
 -      RNA_def_property_boolean_sdna(prop, NULL, "passflag", SCE_PASS_REFRACT);
 -      RNA_def_property_ui_text(prop, "Refraction", "Deliver raytraced refraction pass");
 -      if (scene) RNA_def_property_update(prop, NC_SCENE | ND_RENDER_OPTIONS, "rna_SceneRenderLayer_pass_update");
 +      if (scene) RNA_def_property_update(prop, NC_SCENE | ND_RENDER_OPTIONS, "rna_ViewLayer_pass_update");
        else RNA_def_property_clear_flag(prop, PROP_EDITABLE);
-       
        prop = RNA_def_property(srna, "use_pass_emit", PROP_BOOLEAN, PROP_NONE);
        RNA_def_property_boolean_sdna(prop, NULL, "passflag", SCE_PASS_EMIT);
        RNA_def_property_ui_text(prop, "Emit", "Deliver emission pass");
        prop = RNA_def_property(srna, "use_pass_transmission_color", PROP_BOOLEAN, PROP_NONE);
        RNA_def_property_boolean_sdna(prop, NULL, "passflag", SCE_PASS_TRANSM_COLOR);
        RNA_def_property_ui_text(prop, "Transmission Color", "Deliver transmission color pass");
 -      if (scene) RNA_def_property_update(prop, NC_SCENE | ND_RENDER_OPTIONS, "rna_SceneRenderLayer_pass_update");
 +      if (scene) RNA_def_property_update(prop, NC_SCENE | ND_RENDER_OPTIONS, "rna_ViewLayer_pass_update");
        else RNA_def_property_clear_flag(prop, PROP_EDITABLE);
-       
        prop = RNA_def_property(srna, "use_pass_subsurface_direct", PROP_BOOLEAN, PROP_NONE);
        RNA_def_property_boolean_sdna(prop, NULL, "passflag", SCE_PASS_SUBSURFACE_DIRECT);
        RNA_def_property_ui_text(prop, "Subsurface Direct", "Deliver subsurface direct pass");
@@@ -4751,7 -5664,18 +4751,7 @@@ static void rna_def_scene_render_data(B
  {
        StructRNA *srna;
        PropertyRNA *prop;
-       
 -      static const EnumPropertyItem pixel_filter_items[] = {
 -              {R_FILTER_BOX, "BOX", 0, "Box", "Use a box filter for anti-aliasing"},
 -              {R_FILTER_TENT, "TENT", 0, "Tent", "Use a tent filter for anti-aliasing"},
 -              {R_FILTER_QUAD, "QUADRATIC", 0, "Quadratic", "Use a quadratic filter for anti-aliasing"},
 -              {R_FILTER_CUBIC, "CUBIC", 0, "Cubic", "Use a cubic filter for anti-aliasing"},
 -              {R_FILTER_CATROM, "CATMULLROM", 0, "Catmull-Rom", "Use a Catmull-Rom filter for anti-aliasing"},
 -              {R_FILTER_GAUSS, "GAUSSIAN", 0, "Gaussian", "Use a Gaussian filter for anti-aliasing"},
 -              {R_FILTER_MITCH, "MITCHELL", 0, "Mitchell-Netravali", "Use a Mitchell-Netravali filter for anti-aliasing"},
 -              {0, NULL, 0, NULL, NULL}
 -      };
 -
        static const EnumPropertyItem alpha_mode_items[] = {
                {R_ADDSKY, "SKY", 0, "Sky", "Transparent pixels are filled with sky color"},
                {R_ALPHAPREMUL, "TRANSPARENT", 0, "Transparent", "World background is transparent with premultiplied alpha"},
        RNA_def_property_ui_text(prop, "Anti-Aliasing Samples", "Amount of anti-aliasing samples per pixel");
        RNA_def_property_update(prop, NC_SCENE | ND_RENDER_OPTIONS, NULL);
  
-       
 -      prop = RNA_def_property(srna, "use_fields", PROP_BOOLEAN, PROP_NONE);
 -      RNA_def_property_boolean_sdna(prop, NULL, "mode", R_FIELDS);
 -      RNA_def_property_ui_text(prop, "Fields", "Render image to two fields per frame, for interlaced TV output");
 -      RNA_def_property_update(prop, NC_SCENE | ND_RENDER_OPTIONS, NULL);
 -
 -      prop = RNA_def_property(srna, "field_order", PROP_ENUM, PROP_NONE);
 -      RNA_def_property_enum_bitflag_sdna(prop, NULL, "mode");
 -      RNA_def_property_enum_items(prop, field_order_items);
 -      RNA_def_property_ui_text(prop, "Field Order",
 -                               "Order of video fields (select which lines get rendered first, "
 -                               "to create smooth motion for TV output)");
 -      RNA_def_property_update(prop, NC_SCENE | ND_RENDER_OPTIONS, NULL);
 -
 -      prop = RNA_def_property(srna, "use_fields_still", PROP_BOOLEAN, PROP_NONE);
 -      RNA_def_property_boolean_sdna(prop, NULL, "mode", R_FIELDSTILL);
 -      RNA_def_property_ui_text(prop, "Fields Still", "Disable the time difference between fields");
 -      RNA_def_property_update(prop, NC_SCENE | ND_RENDER_OPTIONS, NULL);
 -
 -      /* rendering features */
 -      prop = RNA_def_property(srna, "use_shadows", PROP_BOOLEAN, PROP_NONE);
 -      RNA_def_property_boolean_sdna(prop, NULL, "mode", R_SHADOW);
 -      RNA_def_property_ui_text(prop, "Shadows", "Calculate shadows while rendering");
 -      RNA_def_property_update(prop, NC_SCENE | ND_RENDER_OPTIONS, "rna_Scene_glsl_update");
 -
 -      prop = RNA_def_property(srna, "use_envmaps", PROP_BOOLEAN, PROP_NONE);
 -      RNA_def_property_boolean_sdna(prop, NULL, "mode", R_ENVMAP);
 -      RNA_def_property_ui_text(prop, "Environment Maps", "Calculate environment maps while rendering");
 -      RNA_def_property_update(prop, NC_SCENE | ND_RENDER_OPTIONS, "rna_Scene_glsl_update");
 -
 -      prop = RNA_def_property(srna, "use_sss", PROP_BOOLEAN, PROP_NONE);
 -      RNA_def_property_boolean_sdna(prop, NULL, "mode", R_SSS);
 -      RNA_def_property_ui_text(prop, "Subsurface Scattering", "Calculate sub-surface scattering in materials rendering");
 -      RNA_def_property_update(prop, NC_SCENE | ND_RENDER_OPTIONS, "rna_Scene_glsl_update");
 -
 -      prop = RNA_def_property(srna, "use_world_space_shading", PROP_BOOLEAN, PROP_NONE);
 -      RNA_def_property_boolean_sdna(prop, NULL, "mode", R_USE_WS_SHADING);
 -      RNA_def_property_ui_text(prop, "World Space Shading", "Use world space interpretation of lighting data for node materials");
 -      RNA_def_property_update(prop, NC_SCENE | ND_RENDER_OPTIONS, "rna_Scene_glsl_update");
 -
 -      prop = RNA_def_property(srna, "use_raytrace", PROP_BOOLEAN, PROP_NONE);
 -      RNA_def_property_boolean_sdna(prop, NULL, "mode", R_RAYTRACE);
 -      RNA_def_property_ui_text(prop, "Raytracing",
 -                               "Pre-calculate the raytrace accelerator and render raytracing effects");
 -      RNA_def_property_update(prop, NC_SCENE | ND_RENDER_OPTIONS, "rna_Scene_glsl_update");
 -
 -      prop = RNA_def_property(srna, "use_textures", PROP_BOOLEAN, PROP_NONE);
 -      RNA_def_property_boolean_negative_sdna(prop, NULL, "scemode", R_NO_TEX);
 -      RNA_def_property_ui_text(prop, "Textures", "Use textures to affect material properties");
 -      RNA_def_property_update(prop, NC_SCENE | ND_RENDER_OPTIONS, "rna_Scene_glsl_update");
 -
 -      prop = RNA_def_property(srna, "use_edge_enhance", PROP_BOOLEAN, PROP_NONE);
 -      RNA_def_property_boolean_sdna(prop, NULL, "mode", R_EDGE);
 -      RNA_def_property_ui_text(prop, "Edge", "Create a toon outline around the edges of geometry");
 -      RNA_def_property_update(prop, NC_SCENE | ND_RENDER_OPTIONS, "rna_Scene_glsl_update");
 -
 -      prop = RNA_def_property(srna, "edge_threshold", PROP_INT, PROP_NONE);
 -      RNA_def_property_int_sdna(prop, NULL, "edgeint");
 -      RNA_def_property_range(prop, 0, 255);
 -      RNA_def_property_ui_text(prop, "Edge Threshold", "Threshold for drawing outlines on geometry edges");
 -      RNA_def_property_update(prop, NC_SCENE | ND_RENDER_OPTIONS, "rna_Scene_glsl_update");
 -
 -      prop = RNA_def_property(srna, "edge_color", PROP_FLOAT, PROP_COLOR);
 -      RNA_def_property_float_sdna(prop, NULL, "edgeR");
 -      RNA_def_property_array(prop, 3);
 -      RNA_def_property_ui_text(prop, "Edge Color", "Edge color");
 -      RNA_def_property_update(prop, NC_SCENE | ND_RENDER_OPTIONS, "rna_Scene_glsl_update");
        prop = RNA_def_property(srna, "use_freestyle", PROP_BOOLEAN, PROP_NONE);
        RNA_def_property_clear_flag(prop, PROP_ANIMATABLE);
        RNA_def_property_boolean_sdna(prop, NULL, "mode", R_EDGE_FRS);
        RNA_def_property_ui_text(prop, "Motion Blur", "Use multi-sampled 3D scene motion blur");
        RNA_def_property_clear_flag(prop, PROP_ANIMATABLE);
        RNA_def_property_update(prop, NC_SCENE | ND_RENDER_OPTIONS, "rna_Scene_glsl_update");
-       
 -      prop = RNA_def_property(srna, "motion_blur_samples", PROP_INT, PROP_NONE);
 -      RNA_def_property_int_sdna(prop, NULL, "mblur_samples");
 -      RNA_def_property_range(prop, 1, 32);
 -      RNA_def_property_ui_text(prop, "Motion Samples", "Number of scene samples to take with motion blur");
 -      RNA_def_property_clear_flag(prop, PROP_ANIMATABLE);
 -      RNA_def_property_update(prop, NC_SCENE | ND_RENDER_OPTIONS, "rna_Scene_glsl_update");
 -
        prop = RNA_def_property(srna, "motion_blur_shutter", PROP_FLOAT, PROP_UNSIGNED);
        RNA_def_property_float_sdna(prop, NULL, "blurfac");
        RNA_def_property_ui_range(prop, 0.01f, 2.0f, 1, 2);
        prop = RNA_def_property(srna, "use_border", PROP_BOOLEAN, PROP_NONE);
        RNA_def_property_boolean_sdna(prop, NULL, "mode", R_BORDER);
        RNA_def_property_clear_flag(prop, PROP_ANIMATABLE);
 -      RNA_def_property_ui_text(prop, "Border",
 -                               "Render a user-defined border region, within the frame size "
 -                               "(note that this disables save_buffers and full_sample)");
 +      RNA_def_property_ui_text(prop, "Border", "Render a user-defined border region, within the frame size ");
        RNA_def_property_update(prop, NC_SCENE | ND_RENDER_OPTIONS, NULL);
-       
 -
 -
        prop = RNA_def_property(srna, "border_min_x", PROP_FLOAT, PROP_NONE);
        RNA_def_property_float_sdna(prop, NULL, "border.xmin");
        RNA_def_property_range(prop, 0.0f, 1.0f);
@@@ -6292,19 -6990,17 +6292,19 @@@ void RNA_def_scene(BlenderRNA *brna
        RNA_def_property_int_sdna(prop, NULL, "r.sfra");
        RNA_def_property_int_funcs(prop, NULL, "rna_Scene_start_frame_set", NULL);
        RNA_def_property_range(prop, MINFRAME, MAXFRAME);
 +      RNA_def_property_int_default(prop, 1);
        RNA_def_property_ui_text(prop, "Start Frame", "First frame of the playback/rendering range");
        RNA_def_property_update(prop, NC_SCENE | ND_FRAME_RANGE, NULL);
-       
        prop = RNA_def_property(srna, "frame_end", PROP_INT, PROP_TIME);
        RNA_def_property_clear_flag(prop, PROP_ANIMATABLE);
        RNA_def_property_int_sdna(prop, NULL, "r.efra");
        RNA_def_property_int_funcs(prop, NULL, "rna_Scene_end_frame_set", NULL);
        RNA_def_property_range(prop, MINFRAME, MAXFRAME);
 +      RNA_def_property_int_default(prop, 250);
        RNA_def_property_ui_text(prop, "End Frame", "Final frame of the playback/rendering range");
        RNA_def_property_update(prop, NC_SCENE | ND_FRAME_RANGE, NULL);
-       
        prop = RNA_def_property(srna, "frame_step", PROP_INT, PROP_TIME);
        RNA_def_property_clear_flag(prop, PROP_ANIMATABLE);
        RNA_def_property_int_sdna(prop, NULL, "r.frame_step");
        RNA_def_property_ui_text(prop, "NLA TweakMode",
                                 "Whether there is any action referenced by NLA being edited (strictly read-only)");
        RNA_def_property_update(prop, NC_SPACE | ND_SPACE_GRAPH, NULL);
-       
        /* Frame dropping flag for playback and sync enum */
 +#if 0 /* XXX: Is this actually needed? */
        prop = RNA_def_property(srna, "use_frame_drop", PROP_BOOLEAN, PROP_NONE);
        RNA_def_property_boolean_sdna(prop, NULL, "flag", SCE_FRAME_DROP);
        RNA_def_property_ui_text(prop, "Frame Dropping", "Play back dropping frames if frame display is too slow");
        RNA_def_property_ui_text(prop, "Timeline Markers", "Markers used in all timelines for the current scene");
        rna_def_timeline_markers(brna, prop);
  
-       
 +      /* Orientations */
 +      prop = RNA_def_property(srna, "transform_orientation", PROP_ENUM, PROP_NONE);
 +      RNA_def_property_enum_sdna(prop, NULL, "orientation_type");
 +      RNA_def_property_enum_items(prop, transform_orientation_items);
 +      RNA_def_property_enum_funcs(prop, "rna_Scene_transform_orientation_get", "rna_Scene_transform_orientation_set",
 +                                  "rna_TransformOrientation_itemf");
 +      RNA_def_property_ui_text(prop, "Transform Orientation", "Transformation orientation");
 +      RNA_def_property_update(prop, NC_SPACE | ND_SPACE_VIEW3D, NULL);
 +
 +      prop = RNA_def_property(srna, "current_orientation", PROP_POINTER, PROP_NONE);
 +      RNA_def_property_struct_type(prop, "TransformOrientation");
 +      RNA_def_property_pointer_funcs(prop, "rna_Scene_current_orientation_get", NULL, NULL, NULL);
 +      RNA_def_property_ui_text(prop, "Current Transform Orientation", "Current transformation orientation");
++
        /* Audio Settings */
        prop = RNA_def_property(srna, "use_audio", PROP_BOOLEAN, PROP_NONE);
        RNA_def_property_boolean_funcs(prop, "rna_Scene_use_audio_get", "rna_Scene_use_audio_set");
        RNA_def_property_update(prop, NC_SCENE, NULL);
        RNA_def_property_float_funcs(prop, NULL, "rna_Scene_volume_set", NULL);
  
 -      /* Game Settings */
 -      prop = RNA_def_property(srna, "game_settings", PROP_POINTER, PROP_NONE);
 -      RNA_def_property_flag(prop, PROP_NEVER_NULL);
 -      RNA_def_property_pointer_sdna(prop, NULL, "gm");
 -      RNA_def_property_struct_type(prop, "SceneGameData");
 -      RNA_def_property_ui_text(prop, "Game Data", "");
 -
        /* Statistics */
        func = RNA_def_function(srna, "statistics", "ED_info_stats_string");
 +      parm = RNA_def_pointer(func, "view_layer", "ViewLayer", "", "Active layer");
 +      RNA_def_parameter_flags(parm, PROP_NEVER_NULL, PARM_REQUIRED);
        parm = RNA_def_string(func, "statistics", NULL, 0, "Statistics", "");
        RNA_def_function_return(func, parm);
-       
        /* Grease Pencil */
        prop = RNA_def_property(srna, "grease_pencil", PROP_POINTER, PROP_NONE);
        RNA_def_property_pointer_sdna(prop, NULL, "gpd");
@@@ -103,9 -99,9 +103,9 @@@ static void rna_Scene_frame_set(Scene *
         * redrawing while the data is being modified for render */
        if (!G.is_rendering) {
                /* cant use NC_SCENE|ND_FRAME because this causes wm_event_do_notifiers to call
 -               * BKE_scene_update_for_newframe which will loose any un-keyed changes [#24690] */
 +               * BKE_scene_graph_update_for_newframe which will loose any un-keyed changes [#24690] */
                /* WM_main_add_notifier(NC_SCENE|ND_FRAME, scene); */
-               
                /* instead just redraw the views */
                WM_main_add_notifier(NC_WINDOW, NULL);
        }
@@@ -183,12 -172,12 +183,12 @@@ static void rna_ParticleEdit_update(bCo
  static void rna_ParticleEdit_tool_set(PointerRNA *ptr, int value)
  {
        ParticleEditSettings *pset = (ParticleEditSettings *)ptr->data;
-       
        /* redraw hair completely if weight brush is/was used */
 -      if ((pset->brushtype == PE_BRUSH_WEIGHT || value == PE_BRUSH_WEIGHT) && pset->scene) {
 -              Object *ob = (pset->scene->basact) ? pset->scene->basact->object : NULL;
 +      if ((pset->brushtype == PE_BRUSH_WEIGHT || value == PE_BRUSH_WEIGHT) && pset->object) {
 +              Object *ob = pset->object;
                if (ob) {
 -                      DAG_id_tag_update(&ob->id, OB_RECALC_DATA);
 +                      DEG_id_tag_update(&ob->id, OB_RECALC_DATA);
                        WM_main_add_notifier(NC_OBJECT | ND_PARTICLE | NA_EDITED, NULL);
                }
        }
@@@ -393,32 -373,29 +393,32 @@@ static void rna_ImaPaint_stencil_update
        }
  }
  
 -static void rna_ImaPaint_canvas_update(Main *bmain, Scene *scene, PointerRNA *UNUSED(ptr))
 +static void rna_ImaPaint_canvas_update(bContext *C, PointerRNA *UNUSED(ptr))
  {
 -      Object *ob = OBACT;
 +      Main *bmain = CTX_data_main(C);
 +      Scene *scene = CTX_data_scene(C);
 +      ViewLayer *view_layer = CTX_data_view_layer(C);
 +      Object *ob = OBACT(view_layer);
 +      Object *obedit = OBEDIT_FROM_OBACT(ob);
        bScreen *sc;
        Image *ima = scene->toolsettings->imapaint.canvas;
-       
        for (sc = bmain->screen.first; sc; sc = sc->id.next) {
                ScrArea *sa;
                for (sa = sc->areabase.first; sa; sa = sa->next) {
 -                      SpaceLink *sl;
 -                      for (sl = sa->spacedata.first; sl; sl = sl->next) {
 -                              if (sl->spacetype == SPACE_IMAGE) {
 -                                      SpaceImage *sima = (SpaceImage *)sl;
 +                      SpaceLink *slink;
 +                      for (slink = sa->spacedata.first; slink; slink = slink->next) {
 +                              if (slink->spacetype == SPACE_IMAGE) {
 +                                      SpaceImage *sima = (SpaceImage *)slink;
-                                       
                                        if (!sima->pin)
 -                                              ED_space_image_set(bmain, sima, scene, scene->obedit, ima);
 +                                              ED_space_image_set(sima, scene, obedit, ima);
                                }
                        }
                }
        }
-       
        if (ob && ob->type == OB_MESH) {
 -              GPU_drawobject_free(ob->derivedFinal);
                BKE_paint_proj_mesh_data_check(scene, ob, NULL, NULL, NULL, NULL);
                WM_main_add_notifier(NC_OBJECT | ND_DRAW, NULL);
        }
@@@ -793,10 -766,10 +793,10 @@@ static void rna_def_image_paint(Blender
        RNA_def_property_update(prop, NC_SCENE | ND_TOOLSETTINGS, "rna_ImaPaint_stencil_update");
  
        prop = RNA_def_property(srna, "canvas", PROP_POINTER, PROP_NONE);
 -      RNA_def_property_flag(prop, PROP_EDITABLE);
 +      RNA_def_property_flag(prop, PROP_EDITABLE | PROP_CONTEXT_UPDATE);
        RNA_def_property_ui_text(prop, "Canvas", "Image used as canvas");
        RNA_def_property_update(prop, NC_SCENE | ND_TOOLSETTINGS, "rna_ImaPaint_canvas_update");
-       
        prop = RNA_def_property(srna, "clone_image", PROP_POINTER, PROP_NONE);
        RNA_def_property_pointer_sdna(prop, NULL, "clone");
        RNA_def_property_flag(prop, PROP_EDITABLE);
        prop = RNA_def_int_array(srna, "screen_grab_size", 2, NULL, 0, 0, "screen_grab_size",
                                 "Size to capture the image for re-projecting", 0, 0);
        RNA_def_property_range(prop, 512, 16384);
-       
        prop = RNA_def_property(srna, "mode", PROP_ENUM, PROP_NONE);
 +      RNA_def_property_flag(prop, PROP_CONTEXT_UPDATE);
        RNA_def_property_enum_items(prop, paint_type_items);
        RNA_def_property_ui_text(prop, "Mode", "Mode of operation for projection painting");
        RNA_def_property_update(prop, NC_SCENE | ND_TOOLSETTINGS, "rna_ImaPaint_mode_update");
@@@ -1447,25 -1380,7 +1447,25 @@@ static void rna_SpaceDopeSheetEditor_mo
                else
                        saction->action = NULL;
        }
-       
 +      /* Collapse summary channel and hide channel list for timeline */
 +      if (saction->mode == SACTCONT_TIMELINE) {
 +              saction->ads.flag |= ADS_FLAG_SUMMARY_COLLAPSED;
 +      }
-       
++
 +      if (sa && sa->spacedata.first == saction) {
 +              ARegion *channels_region = BKE_area_find_region_type(sa, RGN_TYPE_CHANNELS);
 +              if (channels_region) {
 +                      if (saction->mode == SACTCONT_TIMELINE) {
 +                              channels_region->flag |= RGN_FLAG_HIDDEN;
 +                      }
 +                      else {
 +                              channels_region->flag &= ~RGN_FLAG_HIDDEN;
 +                      }
 +                      ED_region_visibility_change_update(C, channels_region);
 +              }
 +      }
-       
++
        /* recalculate extents of channel list */
        saction->flag |= SACTION_TEMP_NEEDCHANSYNC;
  }
@@@ -3637,42 -3498,6 +3637,42 @@@ static void rna_def_space_dopesheet(Ble
        RNA_def_property_enum_items(prop, autosnap_items);
        RNA_def_property_ui_text(prop, "Auto Snap", "Automatic time snapping settings for transformations");
        RNA_def_property_update(prop, NC_SPACE | ND_SPACE_DOPESHEET, NULL);
-       
++
 +      /* displaying cache status */
 +      prop = RNA_def_property(srna, "show_cache", PROP_BOOLEAN, PROP_NONE);
 +      RNA_def_property_boolean_sdna(prop, NULL, "cache_display", TIME_CACHE_DISPLAY);
 +      RNA_def_property_ui_text(prop, "Show Cache", "Show the status of cached frames in the timeline");
 +      RNA_def_property_update(prop, NC_SPACE | ND_SPACE_TIME, NULL);
 +
 +      prop = RNA_def_property(srna, "cache_softbody", PROP_BOOLEAN, PROP_NONE);
 +      RNA_def_property_boolean_sdna(prop, NULL, "cache_display", TIME_CACHE_SOFTBODY);
 +      RNA_def_property_ui_text(prop, "Softbody", "Show the active object's softbody point cache");
 +      RNA_def_property_update(prop, NC_SPACE | ND_SPACE_TIME, NULL);
 +
 +      prop = RNA_def_property(srna, "cache_particles", PROP_BOOLEAN, PROP_NONE);
 +      RNA_def_property_boolean_sdna(prop, NULL, "cache_display", TIME_CACHE_PARTICLES);
 +      RNA_def_property_ui_text(prop, "Particles", "Show the active object's particle point cache");
 +      RNA_def_property_update(prop, NC_SPACE | ND_SPACE_TIME, NULL);
 +
 +      prop = RNA_def_property(srna, "cache_cloth", PROP_BOOLEAN, PROP_NONE);
 +      RNA_def_property_boolean_sdna(prop, NULL, "cache_display", TIME_CACHE_CLOTH);
 +      RNA_def_property_ui_text(prop, "Cloth", "Show the active object's cloth point cache");
 +      RNA_def_property_update(prop, NC_SPACE | ND_SPACE_TIME, NULL);
 +
 +      prop = RNA_def_property(srna, "cache_smoke", PROP_BOOLEAN, PROP_NONE);
 +      RNA_def_property_boolean_sdna(prop, NULL, "cache_display", TIME_CACHE_SMOKE);
 +      RNA_def_property_ui_text(prop, "Smoke", "Show the active object's smoke cache");
 +      RNA_def_property_update(prop, NC_SPACE | ND_SPACE_TIME, NULL);
 +
 +      prop = RNA_def_property(srna, "cache_dynamicpaint", PROP_BOOLEAN, PROP_NONE);
 +      RNA_def_property_boolean_sdna(prop, NULL, "cache_display", TIME_CACHE_DYNAMICPAINT);
 +      RNA_def_property_ui_text(prop, "Dynamic Paint", "Show the active object's Dynamic Paint cache");
 +      RNA_def_property_update(prop, NC_SPACE | ND_SPACE_TIME, NULL);
 +
 +      prop = RNA_def_property(srna, "cache_rigidbody", PROP_BOOLEAN, PROP_NONE);
 +      RNA_def_property_boolean_sdna(prop, NULL, "cache_display", TIME_CACHE_RIGIDBODY);
 +      RNA_def_property_ui_text(prop, "Rigid Body", "Show the active object's Rigid Body cache");
 +      RNA_def_property_update(prop, NC_SPACE | ND_SPACE_TIME, NULL);
  }
  
  static void rna_def_space_graph(BlenderRNA *brna)
@@@ -669,8 -737,8 +669,8 @@@ static void rna_def_filter_common(Struc
        RNA_def_property_enum_items(prop, texture_filter_items);
        RNA_def_property_ui_text(prop, "Filter", "Texture filter to use for sampling image");
        RNA_def_property_update(prop, 0, "rna_Texture_update");
-       
 -      prop = RNA_def_property(srna, "filter_probes", PROP_INT, PROP_NONE);
 +      prop = RNA_def_property(srna, "filter_lightprobes", PROP_INT, PROP_NONE);
        RNA_def_property_int_sdna(prop, NULL, "afmax");
        RNA_def_property_range(prop, 1, 256);
        RNA_def_property_ui_text(prop, "Filter Probes",
@@@ -246,12 -236,7 +246,12 @@@ static StructRNA *rna_Panel_register
        if (!RNA_struct_bl_idname_ok_or_report(reports, dummypt.idname, "_PT_")) {
                return NULL;
        }
-       
 +      if (dummypt.parent_id[0] && !parent) {
 +              BKE_reportf(reports, RPT_ERROR, "Registering panel class: parent '%s' for '%s' not found",
 +                          dummypt.parent_id, dummypt.idname);
 +              return NULL;
 +      }
        /* create a new panel type */
        pt = MEM_callocN(sizeof(PanelType), "python buttons panel");
        memcpy(pt, &dummypt, sizeof(dummypt));
        else
                BLI_addtail(&art->paneltypes, pt);
  
 +      if (parent) {
 +              pt->parent = parent;
 +              BLI_addtail(&parent->children, BLI_genericNodeN(pt));
 +      }
 +
 +      {
 +              const char *owner_id = RNA_struct_state_owner_get();
 +              if (owner_id) {
 +                      BLI_strncpy(pt->owner_id, owner_id, sizeof(pt->owner_id));
 +              }
 +      }
 +
        /* update while blender is running */
        WM_main_add_notifier(NC_WINDOW, NULL);
-       
        return pt->ext.srna;
  }
  
@@@ -588,9 -561,9 +588,9 @@@ static void rna_Header_unregister(Main 
  
        if (!ht)
                return;
 -      if (!(art = region_type_find(NULL, ht->space_type, RGN_TYPE_HEADER)))
 +      if (!(art = region_type_find(NULL, ht->space_type, ht->region_type)))
                return;
-       
        RNA_struct_free_extension(type, &ht->ext);
        RNA_struct_free(&BLENDER_RNA, type);
  
@@@ -958,15 -903,7 +958,15 @@@ static void rna_def_ui_layout(BlenderRN
                {UI_LAYOUT_ALIGN_RIGHT, "RIGHT", 0, "Right", ""},
                {0, NULL, 0, NULL, NULL}
        };
-       
 +      static const EnumPropertyItem emboss_items[] = {
 +              {UI_EMBOSS, "NORMAL", 0, "Normal", "Draw standard button emboss style"},
 +              {UI_EMBOSS_NONE, "NONE", 0, "None", "Draw only text and icons"},
 +              {UI_EMBOSS_PULLDOWN, "PULLDOWN_MENU", 0, "Pulldown Menu", "Draw pulldown menu style"},
 +              {UI_EMBOSS_RADIAL, "RADIAL_MENU", 0, "Radial Menu", "Draw radial menu style"},
 +              {0, NULL, 0, NULL, NULL}
 +      };
 +
        /* layout */
  
        srna = RNA_def_struct(brna, "UILayout", NULL);
        RNA_def_property_float_funcs(prop, "rna_UILayout_scale_y_get", "rna_UILayout_scale_y_set", NULL);
        RNA_def_property_ui_text(prop, "Scale Y", "Scale factor along the Y for items in this (sub)layout");
        RNA_api_ui_layout(srna);
-       
 +
 +      prop = RNA_def_property(srna, "emboss", PROP_ENUM, PROP_NONE);
 +      RNA_def_property_enum_items(prop, emboss_items);
 +      RNA_def_property_enum_funcs(prop, "rna_UILayout_emboss_get", "rna_UILayout_emboss_set", NULL);
++
 +      prop = RNA_def_property(srna, "use_property_split", PROP_BOOLEAN, PROP_NONE);
 +      RNA_def_property_boolean_funcs(prop, "rna_UILayout_property_split_get", "rna_UILayout_property_split_set");
  }
  
  static void rna_def_panel(BlenderRNA *brna)
@@@ -268,31 -275,9 +275,32 @@@ static void rna_uiItemM
        uiItemM(layout, C, menuname, name, icon);
  }
  
- static void rna_uiTemplateAnyID(uiLayout *layout, PointerRNA *ptr, const char *propname, const char *proptypename,
-                                 const char *name, const char *text_ctxt, int translate)
 +static void rna_uiItemPopoverPanel(
 +        uiLayout *layout, bContext *C,
 +        int space_type, int region_type, const char *panel_type,
 +        const char *name, const char *text_ctxt,
 +        int translate, int icon, int icon_value)
 +{
 +      /* Get translated name (label). */
 +      name = rna_translate_ui_text(name, text_ctxt, NULL, NULL, translate);
 +
 +      if (icon_value && !icon) {
 +              icon = icon_value;
 +      }
 +
 +      uiItemPopoverPanel(layout, C, space_type, region_type, panel_type, name, icon);
 +}
 +
 +static void rna_uiItemPopoverPanelFromGroup(
 +        uiLayout *layout, bContext *C,
 +        int space_id, int region_id, const char *context, const char *category)
 +{
 +      uiItemPopoverPanelFromGroup(layout, C, space_id, region_id, context, category);
 +}
 +
+ static void rna_uiTemplateAnyID(
+         uiLayout *layout, PointerRNA *ptr, const char *propname, const char *proptypename,
+         const char *name, const char *text_ctxt, int translate)
  {
        PropertyRNA *prop = RNA_struct_find_property(ptr, propname);
  
@@@ -647,130 -679,6 +647,130 @@@ static StructRNA *rna_AddonPref_refine(
        return (ptr->type) ? ptr->type : &RNA_AddonPreferences;
  }
  
- {     
 +static float rna_ThemeUI_roundness_get(PointerRNA *ptr)
 +{
 +      /* Remap from relative radius to 0..1 range. */
 +      uiWidgetColors *tui = (uiWidgetColors *)ptr->data;
 +      return tui->roundness * 2.0f;
 +}
 +
 +static void rna_ThemeUI_roundness_set(PointerRNA *ptr, float value)
 +{
 +      uiWidgetColors *tui = (uiWidgetColors *)ptr->data;
 +      tui->roundness = value * 0.5f;
 +}
 +
 +/* Studio Light */
 +static void rna_UserDef_studiolight_begin(CollectionPropertyIterator *iter, PointerRNA *UNUSED(ptr))
 +{
 +      rna_iterator_listbase_begin(iter, BKE_studiolight_listbase(), NULL);
 +}
 +
 +static void rna_UserDef_studiolight_refresh(UserDef *UNUSED(userdef))
 +{
 +      BKE_studiolight_refresh();
 +}
 +
 +/* StudioLight.name */
 +static void rna_UserDef_studiolight_name_get(PointerRNA *ptr, char *value)
 +{
 +      StudioLight *sl = (StudioLight *)ptr->data;
 +      BLI_strncpy(value, sl->name, FILE_MAXFILE);
 +}
 +
 +static int rna_UserDef_studiolight_name_length(PointerRNA *ptr)
 +{
 +      StudioLight *sl = (StudioLight *)ptr->data;
 +      return strlen(sl->name);
 +}
 +
 +/* StudioLight.path */
 +static void rna_UserDef_studiolight_path_get(PointerRNA *ptr, char *value)
 +{
 +      StudioLight *sl = (StudioLight *)ptr->data;
 +      BLI_strncpy(value, sl->path, FILE_MAX);
 +}
 +
 +static int rna_UserDef_studiolight_path_length(PointerRNA *ptr)
 +{
 +      StudioLight *sl = (StudioLight *)ptr->data;
 +      return strlen(sl->path);
 +}
 +
 +/* StudioLight.index */
 +static int rna_UserDef_studiolight_index_get(PointerRNA *ptr)
 +{
 +      StudioLight *sl = (StudioLight *)ptr->data;
 +      return sl->index;
 +}
 +
 +/* StudioLight.icon_id */
 +static int rna_UserDef_studiolight_icon_id_get(PointerRNA *ptr)
 +{
 +      StudioLight *sl = (StudioLight *)ptr->data;
 +      if (sl->flag & (STUDIOLIGHT_ORIENTATION_VIEWNORMAL | STUDIOLIGHT_ORIENTATION_CAMERA)) {
 +              return 1;
 +      }
 +      return 0;
 +}
 +
 +static const EnumPropertyItem *rna_UserDef_studiolight_icon_id_itemf(
 +        bContext *UNUSED(C), PointerRNA *ptr,
 +        PropertyRNA *UNUSED(prop), bool *r_free)
 +{
 +      EnumPropertyItem *item = NULL;
 +      int totitem = 0;
 +      StudioLight *sl = (StudioLight *)ptr->data;
 +
 +      if ((sl->flag & (STUDIOLIGHT_ORIENTATION_VIEWNORMAL | STUDIOLIGHT_ORIENTATION_CAMERA)) == 0)
 +      {
 +              EnumPropertyItem tmp = {0, sl->name, sl->radiance_icon_id, sl->name, ""};
 +              RNA_enum_item_add(&item, &totitem, &tmp);
 +      }
 +      {
 +              EnumPropertyItem tmp = {1, sl->name, sl->irradiance_icon_id, sl->name, ""};
 +              RNA_enum_item_add(&item, &totitem, &tmp);
 +      }
 +      RNA_enum_item_end(&item, &totitem);
 +      *r_free = true;
 +      return item;
 +}
 +
 +/* StudioLight.is_user_defined */
 +static int rna_UserDef_studiolight_is_user_defined_get(PointerRNA *ptr)
 +{
 +      StudioLight *sl = (StudioLight *)ptr->data;
 +      return (sl->flag & STUDIOLIGHT_USER_DEFINED) > 0;
 +}
 +
 +/* StudioLight.show_expanded */
 +static int rna_UserDef_studiolight_show_expanded_get(PointerRNA *ptr)
 +{
 +      StudioLight *sl = (StudioLight *)ptr->data;
 +      return (sl->flag & STUDIOLIGHT_UI_EXPANDED) > 0;
 +}
 +
 +static void rna_UserDef_studiolight_show_expanded_set(PointerRNA *ptr, const bool value)
++{
 +      StudioLight *sl = (StudioLight *)ptr->data;
 +      sl->flag ^= STUDIOLIGHT_UI_EXPANDED;
 +      sl->flag |= value?STUDIOLIGHT_UI_EXPANDED: 0;
 +}
 +
 +
 +/* StudioLight.orientation */
 +
 +static int rna_UserDef_studiolight_orientation_get(PointerRNA *ptr)
 +{
 +      StudioLight *sl = (StudioLight *)ptr->data;
 +      return sl->flag & STUDIOLIGHT_FLAG_ORIENTATIONS;
 +}
 +
 +static void rna_UserDef_studiolight_orientation_set(PointerRNA *UNUSED(ptr), const int UNUSED(value))
 +{
 +}
 +
 +
  #else
  
  /* TODO(sergey): This technically belongs to blenlib, but we don't link
@@@ -1021,10 -914,6 +1021,10 @@@ static void rna_def_userdef_theme_ui_pa
        RNA_def_property_ui_text(prop, "Background", "");
        RNA_def_property_update(prop, 0, "rna_userdef_update");
  
-       
 +      prop = RNA_def_property(srna, "sub_back", PROP_FLOAT, PROP_COLOR_GAMMA);
 +      RNA_def_property_ui_text(prop, "Sub Background", "");
 +      RNA_def_property_update(prop, 0, "rna_userdef_update");
++
        prop = RNA_def_property(srna, "show_header", PROP_BOOLEAN, PROP_NONE);
        RNA_def_property_ui_text(prop, "Show Header", "");
        RNA_def_property_update(prop, 0, "rna_userdef_update");
@@@ -1085,11 -974,6 +1085,11 @@@ static void rna_def_userdef_theme_ui(Bl
        RNA_def_property_ui_text(prop, "Tool Widget Colors", "");
        RNA_def_property_update(prop, 0, "rna_userdef_update");
  
-       
 +      prop = RNA_def_property(srna, "wcol_toolbar_item", PROP_POINTER, PROP_NONE);
 +      RNA_def_property_flag(prop, PROP_NEVER_NULL);
 +      RNA_def_property_ui_text(prop, "Toolbar Item Widget Colors", "");
 +      RNA_def_property_update(prop, 0, "rna_userdef_update");
++
        prop = RNA_def_property(srna, "wcol_radio", PROP_POINTER, PROP_NONE);
        RNA_def_property_flag(prop, PROP_NEVER_NULL);
        RNA_def_property_ui_text(prop, "Radio Widget Colors", "");
        RNA_def_property_ui_text(prop, "Icon Alpha", "Transparency of icons in the interface, to reduce contrast");
        RNA_def_property_update(prop, 0, "rna_userdef_update");
  
-       
 +      prop = RNA_def_property(srna, "icon_saturation", PROP_FLOAT, PROP_FACTOR);
 +      RNA_def_property_ui_text(prop, "Icon Saturation", "Saturation of icons in the interface");
 +      RNA_def_property_update(prop, 0, "rna_userdef_update");
++
        prop = RNA_def_property(srna, "widget_emboss", PROP_FLOAT, PROP_COLOR_GAMMA);
        RNA_def_property_float_sdna(prop, NULL, "widget_emboss");
        RNA_def_property_array(prop, 4);
@@@ -3736,21 -3565,8 +3736,21 @@@ static void rna_def_userdef_view(Blende
        RNA_def_property_ui_text(prop, "Manipulator", "Use 3D transform manipulator");
        RNA_def_property_update(prop, 0, "rna_userdef_show_manipulator_update");
  
-       
 +      prop = RNA_def_property(srna, "show_manipulator_navigate", PROP_BOOLEAN, PROP_NONE);
 +      RNA_def_property_boolean_sdna(prop, NULL, "manipulator_flag", USER_MANIPULATOR_DRAW_NAVIGATE);
 +      RNA_def_property_ui_text(prop, "Navigate Manipulator", "Use 3D navigation manipulator");
 +      RNA_def_property_update(prop, 0, "rna_userdef_show_manipulator_update");
++
 +      /* TODO, expose once it's working. */
 +#if 0
 +      prop = RNA_def_property(srna, "show_manipulator_shaded", PROP_BOOLEAN, PROP_NONE);
 +      RNA_def_property_boolean_sdna(prop, NULL, "manipulator_flag", USER_MANIPULATOR_SHADED);
 +      RNA_def_property_ui_text(prop, "Manipulator Shaded", "Use 3D transform manipulator");
 +      RNA_def_property_update(prop, 0, "rna_userdef_update");
 +#endif
 +
        prop = RNA_def_property(srna, "manipulator_size", PROP_INT, PROP_PIXEL);
 -      RNA_def_property_int_sdna(prop, NULL, "tw_size");
 +      RNA_def_property_int_sdna(prop, NULL, "manipulator_size");
        RNA_def_property_range(prop, 10, 200);
        RNA_def_property_int_default(prop, 75);
        RNA_def_property_ui_text(prop, "Manipulator Size", "Diameter of the manipulator");
@@@ -4952,9 -4792,8 +4952,9 @@@ void RNA_def_userdef(BlenderRNA *brna
        rna_def_userdef_system(brna);
        rna_def_userdef_addon(brna);
        rna_def_userdef_addon_pref(brna);
 +      rna_def_userdef_studiolight(brna);
        rna_def_userdef_pathcompare(brna);
-       
  }
  
  #endif
@@@ -143,11 -388,11 +143,11 @@@ static void rna_def_world_mist(BlenderR
  {
        StructRNA *srna;
        PropertyRNA *prop;
-       
        static const EnumPropertyItem falloff_items[] = {
 -              {0, "QUADRATIC", 0, "Quadratic", "Use quadratic progression"},
 -              {1, "LINEAR", 0, "Linear", "Use linear progression"},
 -              {2, "INVERSE_QUADRATIC", 0, "Inverse Quadratic", "Use inverse quadratic progression"},
 +              {WO_MIST_QUADRATIC, "QUADRATIC", 0, "Quadratic", "Use quadratic progression"},
 +              {WO_MIST_LINEAR, "LINEAR", 0, "Linear", "Use linear progression"},
 +              {WO_MIST_INVERSE_QUADRATIC, "INVERSE_QUADRATIC", 0, "Inverse Quadratic", "Use inverse quadratic progression"},
                {0, NULL, 0, NULL, NULL}
        };
  
@@@ -214,7 -462,48 +214,7 @@@ void RNA_def_world(BlenderRNA *brna
        /* RNA_def_property_update(prop, 0, "rna_World_update"); */
        /* render-only uses this */
        RNA_def_property_update(prop, 0, "rna_World_draw_update");
-       
 -      prop = RNA_def_property(srna, "zenith_color", PROP_FLOAT, PROP_COLOR);
 -      RNA_def_property_float_sdna(prop, NULL, "zenr");
 -      RNA_def_property_array(prop, 3);
 -      RNA_def_property_ui_text(prop, "Zenith Color", "Color at the zenith");
 -      RNA_def_property_update(prop, 0, "rna_World_draw_update");
 -
 -      prop = RNA_def_property(srna, "ambient_color", PROP_FLOAT, PROP_COLOR);
 -      RNA_def_property_float_sdna(prop, NULL, "ambr");
 -      RNA_def_property_array(prop, 3);
 -      RNA_def_property_ui_text(prop, "Ambient Color", "Ambient color of the world");
 -      RNA_def_property_update(prop, 0, "rna_World_draw_update");
 -
 -      /* exp, range */
 -      prop = RNA_def_property(srna, "exposure", PROP_FLOAT, PROP_NONE);
 -      RNA_def_property_float_sdna(prop, NULL, "exp");
 -      RNA_def_property_range(prop, 0.0, 1.0);
 -      RNA_def_property_ui_text(prop, "Exposure", "Amount of exponential color correction for light");
 -      RNA_def_property_update(prop, 0, "rna_World_update");
 -
 -      prop = RNA_def_property(srna, "color_range", PROP_FLOAT, PROP_NONE);
 -      RNA_def_property_float_sdna(prop, NULL, "range");
 -      RNA_def_property_range(prop, 0.2, 5.0);
 -      RNA_def_property_ui_text(prop, "Range", "The color range that will be mapped to 0-1");
 -      RNA_def_property_update(prop, 0, "rna_World_update");
 -
 -      /* sky type */
 -      prop = RNA_def_property(srna, "use_sky_blend", PROP_BOOLEAN, PROP_NONE);
 -      RNA_def_property_boolean_sdna(prop, NULL, "skytype", WO_SKYBLEND);
 -      RNA_def_property_ui_text(prop, "Blend Sky", "Render background with natural progression from horizon to zenith");
 -      RNA_def_property_update(prop, NC_WORLD | ND_WORLD_DRAW, "rna_World_update");
 -
 -      prop = RNA_def_property(srna, "use_sky_paper", PROP_BOOLEAN, PROP_NONE);
 -      RNA_def_property_boolean_sdna(prop, NULL, "skytype", WO_SKYPAPER);
 -      RNA_def_property_ui_text(prop, "Paper Sky", "Flatten blend or texture coordinates");
 -      RNA_def_property_update(prop, NC_WORLD | ND_WORLD_DRAW, "rna_World_update");
 -
 -      prop = RNA_def_property(srna, "use_sky_real", PROP_BOOLEAN, PROP_NONE);
 -      RNA_def_property_boolean_sdna(prop, NULL, "skytype", WO_SKYREAL);
 -      RNA_def_property_ui_text(prop, "Real Sky", "Render background with a real horizon, relative to the camera angle");
 -      RNA_def_property_update(prop, NC_WORLD | ND_WORLD_DRAW, "rna_World_update");
 -
        /* nested structs */
        prop = RNA_def_property(srna, "light_settings", PROP_POINTER, PROP_NONE);
        RNA_def_property_flag(prop, PROP_NEVER_NULL);