Merge branch 'master' into blender2.8
authorBastien Montagne <montagne29@wanadoo.fr>
Sat, 6 Aug 2016 10:25:24 +0000 (12:25 +0200)
committerBastien Montagne <montagne29@wanadoo.fr>
Sat, 6 Aug 2016 10:45:03 +0000 (12:45 +0200)
Conflicts:
release/scripts/startup/bl_ui/properties_particle.py
release/scripts/startup/bl_ui/properties_physics_cloth.py
release/scripts/startup/bl_ui/properties_physics_dynamicpaint.py
release/scripts/startup/bl_ui/properties_physics_softbody.py
source/blender/blenkernel/BKE_library.h
source/blender/blenkernel/BKE_particle.h
source/blender/blenkernel/intern/cloth.c
source/blender/blenkernel/intern/library.c
source/blender/blenkernel/intern/library_query.c
source/blender/blenkernel/intern/particle_system.c
source/blender/blenkernel/intern/scene.c
source/blender/blenkernel/intern/softbody.c
source/blender/blenloader/intern/readfile.c
source/blender/blenloader/intern/versioning_270.c
source/blender/editors/space_file/filesel.c
source/blender/editors/space_outliner/outliner_intern.h
source/blender/makesdna/DNA_ID.h
source/blender/makesdna/DNA_object_force.h
source/blender/makesdna/DNA_particle_types.h
source/blender/makesrna/intern/rna_particle.c
source/blender/makesrna/intern/rna_sculpt_paint.c
source/blender/makesrna/intern/rna_smoke.c
source/blender/makesrna/intern/rna_space.c

90 files changed:
1  2 
intern/cycles/blender/addon/properties.py
intern/cycles/blender/addon/ui.py
intern/cycles/blender/blender_object.cpp
intern/cycles/blender/blender_util.h
intern/ghost/intern/GHOST_WindowCocoa.mm
intern/ghost/intern/GHOST_WindowX11.cpp
release/scripts/startup/bl_ui/properties_data_modifier.py
release/scripts/startup/bl_ui/properties_physics_cloth.py
release/scripts/startup/bl_ui/properties_physics_common.py
release/scripts/startup/bl_ui/properties_physics_dynamicpaint.py
release/scripts/startup/bl_ui/properties_physics_smoke.py
release/scripts/startup/bl_ui/properties_physics_softbody.py
release/scripts/startup/bl_ui/space_dopesheet.py
release/scripts/startup/bl_ui/space_view3d.py
release/scripts/startup/bl_ui/space_view3d_toolbar.py
source/blender/CMakeLists.txt
source/blender/blenkernel/BKE_cloth.h
source/blender/blenkernel/BKE_context.h
source/blender/blenkernel/BKE_library.h
source/blender/blenkernel/BKE_main.h
source/blender/blenkernel/CMakeLists.txt
source/blender/blenkernel/intern/anim_sys.c
source/blender/blenkernel/intern/bpath.c
source/blender/blenkernel/intern/cloth.c
source/blender/blenkernel/intern/context.c
source/blender/blenkernel/intern/depsgraph.c
source/blender/blenkernel/intern/idcode.c
source/blender/blenkernel/intern/library.c
source/blender/blenkernel/intern/library_query.c
source/blender/blenkernel/intern/library_remap.c
source/blender/blenkernel/intern/object_dupli.c
source/blender/blenkernel/intern/scene.c
source/blender/blenkernel/intern/smoke.c
source/blender/blenkernel/intern/softbody.c
source/blender/blenloader/intern/readfile.c
source/blender/blenloader/intern/versioning_270.c
source/blender/blenloader/intern/versioning_defaults.c
source/blender/blenloader/intern/writefile.c
source/blender/blentranslation/BLT_translation.h
source/blender/depsgraph/intern/builder/deg_builder_nodes.cc
source/blender/depsgraph/intern/builder/deg_builder_relations.cc
source/blender/editors/animation/anim_channels_defines.c
source/blender/editors/animation/anim_channels_edit.c
source/blender/editors/animation/anim_filter.c
source/blender/editors/include/ED_anim_api.h
source/blender/editors/interface/interface_icons.c
source/blender/editors/interface/interface_templates.c
source/blender/editors/object/object_add.c
source/blender/editors/object/object_relations.c
source/blender/editors/screen/screen_context.c
source/blender/editors/space_file/filesel.c
source/blender/editors/space_nla/nla_buttons.c
source/blender/editors/space_nla/nla_channels.c
source/blender/editors/space_outliner/outliner_draw.c
source/blender/editors/space_outliner/outliner_intern.h
source/blender/editors/space_outliner/outliner_tree.c
source/blender/editors/space_time/space_time.c
source/blender/editors/space_view3d/drawobject.c
source/blender/editors/space_view3d/view3d_edit.c
source/blender/editors/transform/transform.c
source/blender/editors/transform/transform.h
source/blender/editors/transform/transform_conversions.c
source/blender/editors/transform/transform_generics.c
source/blender/editors/transform/transform_manipulator.c
source/blender/editors/transform/transform_snap.c
source/blender/makesdna/DNA_ID.h
source/blender/makesdna/DNA_modifier_types.h
source/blender/makesdna/DNA_object_force.h
source/blender/makesdna/DNA_scene_types.h
source/blender/makesdna/DNA_space_types.h
source/blender/makesdna/intern/makesdna.c
source/blender/makesrna/RNA_access.h
source/blender/makesrna/RNA_enum_types.h
source/blender/makesrna/intern/CMakeLists.txt
source/blender/makesrna/intern/makesrna.c
source/blender/makesrna/intern/rna_ID.c
source/blender/makesrna/intern/rna_color.c
source/blender/makesrna/intern/rna_internal.h
source/blender/makesrna/intern/rna_main.c
source/blender/makesrna/intern/rna_main_api.c
source/blender/makesrna/intern/rna_modifier.c
source/blender/makesrna/intern/rna_object_force.c
source/blender/makesrna/intern/rna_scene.c
source/blender/makesrna/intern/rna_sculpt_paint.c
source/blender/makesrna/intern/rna_space.c
source/blender/modifiers/CMakeLists.txt
source/blender/modifiers/MOD_modifiertypes.h
source/blender/modifiers/intern/MOD_util.c
source/blender/render/intern/source/pipeline.c
source/blenderplayer/bad_level_call_stubs/stubs.c

@@@ -1093,7 -1129,9 +1086,8 @@@ def register()
      bpy.utils.register_class(CyclesWorldSettings)
      bpy.utils.register_class(CyclesVisibilitySettings)
      bpy.utils.register_class(CyclesMeshSettings)
+     bpy.utils.register_class(CyclesObjectSettings)
      bpy.utils.register_class(CyclesCurveRenderSettings)
 -    bpy.utils.register_class(CyclesCurveSettings)
  
  
  def unregister():
      bpy.utils.unregister_class(CyclesLampSettings)
      bpy.utils.unregister_class(CyclesWorldSettings)
      bpy.utils.unregister_class(CyclesMeshSettings)
+     bpy.utils.unregister_class(CyclesObjectSettings)
      bpy.utils.unregister_class(CyclesVisibilitySettings)
      bpy.utils.unregister_class(CyclesCurveRenderSettings)
 -    bpy.utils.unregister_class(CyclesCurveSettings)
Simple merge
Simple merge
@@@ -25,6 -26,10 +25,11 @@@ from bl_ui.properties_physics_common im
          )
  
  
 -    return md.point_cache.is_baked is False
+ def cloth_panel_enabled(md):
++    return True
++    #return md.point_cache.is_baked is False
  class CLOTH_MT_presets(Menu):
      bl_label = "Cloth Presets"
      preset_subdir = "cloth"
@@@ -54,12 -60,12 +60,14 @@@ class PHYSICS_PT_cloth(PhysicButtonsPan
          ob = context.object
          cloth = md.settings
  
-         split = layout.split()
+         layout.active = cloth_panel_enabled(md)
+         split = layout.split(percentage=0.25)
  
-         col.label(text="Presets:")
-         sub = col.row(align=True)
 +        col = split.column()
 +
+         split.label(text="Presets:")
+         sub = split.row(align=True)
          sub.menu("CLOTH_MT_presets", text=bpy.types.CLOTH_MT_presets.bl_label)
          sub.operator("cloth.preset_add", text="", icon='ZOOMIN')
          sub.operator("cloth.preset_add", text="", icon='ZOOMOUT').remove_active = True
          key = ob.data.shape_keys
  
          if key:
-             col.label(text="Rest Shape Key:")
-             col.prop_search(cloth, "rest_shape_key", key, "key_blocks", text="")
+             sub = col.column()
+             sub.active = not cloth.use_dynamic_mesh
+             sub.label(text="Rest Shape Key:")
+             sub.prop_search(cloth, "rest_shape_key", key, "key_blocks", text="")
  
  
 -class PHYSICS_PT_cloth_cache(PhysicButtonsPanel, Panel):
 -    bl_label = "Cloth Cache"
 -    bl_options = {'DEFAULT_CLOSED'}
 -    COMPAT_ENGINES = {'BLENDER_RENDER'}
 -
 -    def draw(self, context):
 -        md = context.cloth
 -        point_cache_ui(self, context, md.point_cache, cloth_panel_enabled(md), 'CLOTH')
 -
 -
  class PHYSICS_PT_cloth_collision(PhysicButtonsPanel, Panel):
      bl_label = "Cloth Collision"
      bl_options = {'DEFAULT_CLOSED'}
@@@ -385,8 -393,32 +390,9 @@@ class PHYSICS_PT_dp_effects(PhysicButto
              row.prop(surface, "shrink_speed")
  
  
 -class PHYSICS_PT_dp_cache(PhysicButtonsPanel, Panel):
 -    bl_label = "Dynamic Paint Cache"
 -    bl_options = {'DEFAULT_CLOSED'}
 -    COMPAT_ENGINES = {'BLENDER_RENDER'}
 -
 -    @classmethod
 -    def poll(cls, context):
 -        md = context.dynamic_paint
 -        rd = context.scene.render
 -        return (md and
 -                md.ui_type == 'CANVAS' and
 -                md.canvas_settings and
 -                md.canvas_settings.canvas_surfaces.active and
 -                md.canvas_settings.canvas_surfaces.active.is_cache_user and
 -                (rd.engine in cls.COMPAT_ENGINES))
 -
 -    def draw(self, context):
 -        surface = context.dynamic_paint.canvas_settings.canvas_surfaces.active
 -        cache = surface.point_cache
 -
 -        point_cache_ui(self, context, cache, (cache.is_baked is False), 'DYNAMIC_PAINT')
 -
 -
  class PHYSICS_PT_dp_brush_source(PhysicButtonsPanel, Panel):
      bl_label = "Dynamic Paint Source"
+     COMPAT_ENGINES = {'BLENDER_RENDER'}
  
      @classmethod
      def poll(cls, context):
@@@ -25,6 -26,10 +25,11 @@@ from bl_ui.properties_physics_common im
          )
  
  
 -    return (md.point_cache.is_baked is False)
+ def softbody_panel_enabled(md):
++    return True
++    #return (md.point_cache.is_baked is False)
  class PhysicButtonsPanel:
      bl_space_type = 'PROPERTIES'
      bl_region_type = 'WINDOW'
@@@ -61,7 -68,19 +68,9 @@@ class PHYSICS_PT_softbody(PhysicButtons
          col.label(text="Simulation:")
          col.prop(softbody, "speed")
  
+         layout.prop(softbody, "collision_group")
  
 -class PHYSICS_PT_softbody_cache(PhysicButtonsPanel, Panel):
 -    bl_label = "Soft Body Cache"
 -    bl_options = {'DEFAULT_CLOSED'}
 -    COMPAT_ENGINES = {'BLENDER_RENDER'}
 -
 -    def draw(self, context):
 -        md = context.soft_body
 -        point_cache_ui(self, context, md.point_cache, softbody_panel_enabled(md), 'SOFTBODY')
 -
 -
  class PHYSICS_PT_softbody_goal(PhysicButtonsPanel, Panel):
      bl_label = "Soft Body Goal"
      bl_options = {'DEFAULT_CLOSED'}
@@@ -29,7 -29,9 +29,8 @@@ set(SRC_DNA_IN
        ${CMAKE_CURRENT_SOURCE_DIR}/makesdna/DNA_actuator_types.h
        ${CMAKE_CURRENT_SOURCE_DIR}/makesdna/DNA_anim_types.h
        ${CMAKE_CURRENT_SOURCE_DIR}/makesdna/DNA_armature_types.h
 -      ${CMAKE_CURRENT_SOURCE_DIR}/makesdna/DNA_boid_types.h
        ${CMAKE_CURRENT_SOURCE_DIR}/makesdna/DNA_brush_types.h
+       ${CMAKE_CURRENT_SOURCE_DIR}/makesdna/DNA_cachefile_types.h
        ${CMAKE_CURRENT_SOURCE_DIR}/makesdna/DNA_camera_types.h
        ${CMAKE_CURRENT_SOURCE_DIR}/makesdna/DNA_cloth_types.h
        ${CMAKE_CURRENT_SOURCE_DIR}/makesdna/DNA_color_types.h
Simple merge
@@@ -94,7 -94,7 +94,7 @@@ void id_clear_lib_data_ex(struct Main *
  
  struct ListBase *which_libbase(struct Main *mainlib, short type);
  
- #define MAX_LIBARRAY    33
 -#define MAX_LIBARRAY    35
++#define MAX_LIBARRAY    34
  int set_listbasepointers(struct Main *main, struct ListBase *lb[MAX_LIBARRAY]);
  
  /* Main API */
Simple merge
@@@ -343,8 -368,11 +345,11 @@@ static int do_step_cloth(Object *ob, Cl
                mul_m4_v3(ob->obmat, verts->xconst);
        }
  
 -      effectors = pdInitEffectors(clmd->scene, ob, NULL, clmd->sim_parms->effector_weights, true);
 +      effectors = pdInitEffectors(clmd->scene, ob, clmd->sim_parms->effector_weights, true);
  
+       if (clmd->sim_parms->flags & CLOTH_SIMSETTINGS_FLAG_DYNAMIC_BASEMESH )
+               cloth_update_verts ( ob, clmd, result );
        /* Support for dynamic vertex groups, changing from frame to frame */
        cloth_apply_vgroup ( clmd, result );
  
   ************************************************/
  void clothModifier_do(ClothModifierData *clmd, Scene *scene, Object *ob, DerivedMesh *dm, float (*vertexCos)[3])
  {
 -      PointCache *cache;
 -      PTCacheID pid;
 -      float timescale;
 -      int framenr, startframe, endframe;
 -      int cache_result;
 +      int framenr = scene->r.cfra, startframe = scene->r.sfra, endframe = scene->r.efra;
  
        clmd->scene= scene;     /* nice to pass on later :) */
 -      framenr= (int)scene->r.cfra;
 -      cache= clmd->point_cache;
  
-       clmd->sim_parms->timescale= 1.0f;
 -      BKE_ptcache_id_from_cloth(&pid, ob, clmd);
 -      BKE_ptcache_id_time(&pid, scene, framenr, &startframe, &endframe, &timescale);
 -      clmd->sim_parms->timescale= timescale * clmd->sim_parms->time_scale;
++      clmd->sim_parms->timescale = 1.0f;
  
        if (clmd->sim_parms->reset || (clmd->clothObject && dm->getNumVerts(dm) != clmd->clothObject->mvert_num)) {
                clmd->sim_parms->reset = 0;
  #include "BKE_main.h"
  #include "BKE_mball.h"
  #include "BKE_mask.h"
+ #include "BKE_movieclip.h"
  #include "BKE_node.h"
  #include "BKE_object.h"
 -#include "BKE_particle.h"
+ #include "BKE_paint.h"
  #include "BKE_packedFile.h"
  #include "BKE_sound.h"
  #include "BKE_speaker.h"
@@@ -408,8 -407,9 +406,6 @@@ bool id_make_local(Main *bmain, ID *id
                case ID_BR:
                        if (!test) BKE_brush_make_local(bmain, (Brush *)id, lib_local);
                        return true;
-               case ID_WM:
-                       return false; /* can't be linked */
 -              case ID_PA:
 -                      if (!test) BKE_particlesettings_make_local(bmain, (ParticleSettings *)id, lib_local);
 -                      return true;
                case ID_GD:
                        if (!test) BKE_gpencil_make_local(bmain, (bGPdata *)id, lib_local);
                        return true;
@@@ -507,10 -514,14 +510,11 @@@ bool id_copy(Main *bmain, ID *id, ID **
                case ID_BR:
                        if (!test) *newid = (ID *)BKE_brush_copy(bmain, (Brush *)id);
                        return true;
-               case ID_WM:
-                       return false;  /* can't be copied from here */
 -              case ID_PA:
 -                      if (!test) *newid = (ID *)BKE_particlesettings_copy(bmain, (ParticleSettings *)id);
 -                      return true;
                case ID_GD:
-                       if (!test) *newid = (ID *)gpencil_data_duplicate(bmain, (bGPdata *)id, false);
+                       if (!test) *newid = (ID *)BKE_gpencil_data_duplicate(bmain, (bGPdata *)id, false);
+                       return true;
+               case ID_MC:
+                       if (!test) *newid = (ID *)BKE_movieclip_copy(bmain, (MovieClip *)id);
                        return true;
                case ID_MSK:
                        if (!test) *newid = (ID *)BKE_mask_copy(bmain, (Mask *)id);
@@@ -480,6 -495,18 +480,14 @@@ void BKE_library_foreach_ID_link(ID *id
                                modifiers_foreachIDLink(object, library_foreach_modifiersForeachIDLink, &data);
                                BKE_constraints_id_loop(&object->constraints, library_foreach_constraintObjectLooper, &data);
  
 -                              for (psys = object->particlesystem.first; psys; psys = psys->next) {
 -                                      BKE_particlesystem_id_loop(psys, library_foreach_particlesystemsObjectLooper, &data);
 -                              }
 -
+                               if (object->soft) {
+                                       CALLBACK_INVOKE(object->soft->collision_group, IDWALK_NOP);
+                                       if (object->soft->effector_weights) {
+                                               CALLBACK_INVOKE(object->soft->effector_weights->group, IDWALK_NOP);
+                                       }
+                               }
                                BKE_sca_sensors_id_loop(&object->sensors, library_foreach_sensorsObjectLooper, &data);
                                BKE_sca_controllers_id_loop(&object->controllers, library_foreach_controllersObjectLooper, &data);
                                BKE_sca_actuators_id_loop(&object->actuators, library_foreach_actuatorsObjectLooper, &data);
@@@ -285,6 -287,14 +287,13 @@@ Scene *BKE_scene_copy(Main *bmain, Scen
                BKE_paint_copy(&ts->imapaint.paint, &ts->imapaint.paint);
                ts->imapaint.paintcursor = NULL;
                id_us_plus((ID *)ts->imapaint.stencil);
 -              ts->particle.paintcursor = NULL;
+               /* duplicate Grease Pencil Drawing Brushes */
+               BLI_listbase_clear(&ts->gp_brushes);
+               for (bGPDbrush *brush = sce->toolsettings->gp_brushes.first; brush; brush = brush->next) {
+                       bGPDbrush *newbrush = BKE_gpencil_brush_duplicate(brush);
+                       BLI_addtail(&ts->gp_brushes, newbrush);
+               }
        }
        
        /* make a private copy of the avicodecdata */
@@@ -63,7 -63,7 +63,8 @@@ variables on the UI for no
  #include "DNA_curve_types.h"
  #include "DNA_mesh_types.h"
  #include "DNA_meshdata_types.h"
 +#include "DNA_object_force.h"
+ #include "DNA_group_types.h"
  
  #include "BLI_math.h"
  #include "BLI_utildefines.h"
@@@ -3591,10 -3645,19 +3641,8 @@@ static void softbody_step(Scene *scene
  void sbObjectStep(Scene *scene, Object *ob, float cfra, float (*vertexCos)[3], int numVerts)
  {
        SoftBody *sb= ob->soft;
 -      PointCache *cache;
 -      PTCacheID pid;
 -      float dtime, timescale;
 -      int framedelta, framenr, startframe, endframe;
 -      int cache_result;
 -
 -      cache= sb->pointcache;
 -
 -      framenr= (int)cfra;
 -      framedelta= framenr - cache->simframe;
 -
 -      BKE_ptcache_id_from_softbody(&pid, ob, sb);
 -      BKE_ptcache_id_time(&pid, scene, framenr, &startframe, &endframe, &timescale);
 +      float dtime, timescale = 1.0f;
-       int framedelta, framenr = (int)cfra, startframe = scene->r.sfra, endframe = scene->r.efra;
-       framedelta = 1;
++      int framedelta = 1, framenr = (int)cfra, startframe = scene->r.sfra, endframe = scene->r.efra;
  
        /* check for changes in mesh, should only happen in case the mesh
         * structure changes during an animation */
@@@ -4554,9 -4924,13 +4586,12 @@@ static void lib_link_object(FileData *f
                        if (ob->pd)
                                lib_link_partdeflect(fd, &ob->id, ob->pd);
                        
-                       if (ob->soft)
+                       if (ob->soft) {
+                               ob->soft->collision_group = newlibadr(fd, ob->id.lib, ob->soft->collision_group);
                                ob->soft->effector_weights->group = newlibadr(fd, ob->id.lib, ob->soft->effector_weights->group);
+                       }
                        
 -                      lib_link_particlesystems(fd, ob, &ob->id, &ob->particlesystem);
                        lib_link_modifiers(fd, ob);
  
                        if (ob->rigidbody_constraint) {
@@@ -8797,7 -9306,10 +8860,7 @@@ static void expand_object(FileData *fd
                expand_doit(fd, mainvar, ob->proxy);
        if (ob->proxy_group)
                expand_doit(fd, mainvar, ob->proxy_group);
--      
 -      for (psys = ob->particlesystem.first; psys; psys = psys->next)
 -              expand_doit(fd, mainvar, psys->part);
        for (sens = ob->sensors.first; sens; sens = sens->next) {
                if (sens->type == SENS_MESSAGE) {
                        bMessageSensor *ms = sens->data;
@@@ -993,15 -1067,15 +994,6 @@@ void blo_do_versions_270(FileData *fd, 
        }
  
        if (!MAIN_VERSION_ATLEAST(main, 277, 1)) {
-               /* init grease pencil smooth level iterations */
-               for (bGPdata *gpd = main->gpencil.first; gpd; gpd = gpd->id.next) {
-                       for (bGPDlayer *gpl = gpd->layers.first; gpl; gpl = gpl->next) {
-                               if (gpl->draw_smoothlvl == 0) {
-                                       gpl->draw_smoothlvl = 1;
 -              for (Scene *scene = main->scene.first; scene; scene = scene->id.next) {
 -                      ParticleEditSettings *pset = &scene->toolsettings->particle;
 -                      for (int a = 0; a < PE_TOT_BRUSH; a++) {
 -                              if (pset->brush[a].strength > 1.0f) {
 -                                      pset->brush[a].strength *= 0.01f;
--                              }
--                      }
--              }
--
                for (bScreen *screen = main->screen.first; screen; screen = screen->id.next) {
                        for (ScrArea *sa = screen->areabase.first; sa; sa = sa->next) {
                                for (SpaceLink *sl = sa->spacedata.first; sl; sl = sl->next) {
                                br->flag |= BRUSH_ACCUMULATE;
                        }
                }
 -                                      else if (md->type == eModifierType_ParticleSystem) {
 -                                              ParticleSystemModifierData *pmd = (ParticleSystemModifierData *)md;
 -                                              if (pmd->psys->clmd) {
 -                                                      pmd->psys->clmd->sim_parms->time_scale = 1.0f;
 -                                              }
 -                                      }
+               if (!DNA_struct_elem_find(fd->filesdna, "ClothSimSettings", "float", "time_scale")) {
+                       Object *ob;
+                       ModifierData *md;
+                       for (ob = main->object.first; ob; ob = ob->id.next) {
+                               for (md = ob->modifiers.first; md; md = md->next) {
+                                       if (md->type == eModifierType_Cloth) {
+                                               ClothModifierData *clmd = (ClothModifierData *)md;
+                                               clmd->sim_parms->time_scale = 1.0f;
+                                       }
+                               }
+                       }
+               }
        }
+       if (!MAIN_VERSION_ATLEAST(main, 277, 3)) {
+               /* ------- init of grease pencil initialization --------------- */
+               if (!DNA_struct_elem_find(fd->filesdna, "bGPDstroke", "bGPDpalettecolor", "palcolor")) {
+                       for (Scene *scene = main->scene.first; scene; scene = scene->id.next) {
+                               ToolSettings *ts = scene->toolsettings;
+                               /* initialize use position for sculpt brushes */
+                               ts->gp_sculpt.flag |= GP_BRUSHEDIT_FLAG_APPLY_POSITION;
+                               /* initialize  selected vertices alpha factor */
+                               ts->gp_sculpt.alpha = 1.0f;
+                               /* new strength sculpt brush */
+                               if (ts->gp_sculpt.brush[0].size >= 11) {
+                                       GP_BrushEdit_Settings *gset = &ts->gp_sculpt;
+                                       GP_EditBrush_Data *brush;
+                                       brush = &gset->brush[GP_EDITBRUSH_TYPE_STRENGTH];
+                                       brush->size = 25;
+                                       brush->strength = 0.5f;
+                                       brush->flag = GP_EDITBRUSH_FLAG_USE_FALLOFF;
+                               }
+                       }
+                       /* create a default grease pencil drawing brushes set */
+                       if (!BLI_listbase_is_empty(&main->gpencil)) {
+                               for (Scene *scene = main->scene.first; scene; scene = scene->id.next) {
+                                       ToolSettings *ts = scene->toolsettings;
+                                       if (BLI_listbase_is_empty(&ts->gp_brushes)) {
+                                               BKE_gpencil_brush_init_presets(ts);
+                                       }
+                               }
+                       }
+                       /* Convert Grease Pencil to new palettes/brushes
+                        * Loop all strokes and create the palette and all colors
+                        */
+                       for (bGPdata *gpd = main->gpencil.first; gpd; gpd = gpd->id.next) {
+                               if (BLI_listbase_is_empty(&gpd->palettes)) {
+                                       /* create palette */
+                                       bGPDpalette *palette = BKE_gpencil_palette_addnew(gpd, "GP_Palette", true);
+                                       for (bGPDlayer *gpl = gpd->layers.first; gpl; gpl = gpl->next) {
+                                               /* create color using layer name */
+                                               bGPDpalettecolor *palcolor = BKE_gpencil_palettecolor_addnew(palette, gpl->info, true);
+                                               if (palcolor != NULL) {
+                                                       /* set color attributes */
+                                                       copy_v4_v4(palcolor->color, gpl->color);
+                                                       copy_v4_v4(palcolor->fill, gpl->fill);
+                                                       palcolor->flag = gpl->flag;
+                                                       /* set layer opacity to 1 */
+                                                       gpl->opacity = 1.0f;
+                                                       /* set tint color */
+                                                       ARRAY_SET_ITEMS(gpl->tintcolor, 0.0f, 0.0f, 0.0f, 0.0f);
+                                                       for (bGPDframe *gpf = gpl->frames.first; gpf; gpf = gpf->next) {
+                                                               for (bGPDstroke *gps = gpf->strokes.first; gps; gps = gps->next) {
+                                                                       /* set stroke to palette and force recalculation */
+                                                                       strcpy(gps->colorname, gpl->info);
+                                                                       gps->palcolor = NULL;
+                                                                       gps->flag |= GP_STROKE_RECALC_COLOR;
+                                                                       gps->thickness = gpl->thickness;
+                                                                       /* set alpha strength to 1 */
+                                                                       for (int i = 0; i < gps->totpoints; i++) {
+                                                                               gps->points[i].strength = 1.0f;
+                                                                       }
+                                                               }
+                                                       }
+                                               }
+                                               /* set thickness to 0 (now it is a factor to override stroke thickness) */
+                                               gpl->thickness = 0.0f;
+                                       }
+                                       /* set first color as active */
+                                       if (palette->colors.first)
+                                               BKE_gpencil_palettecolor_setactive(palette, palette->colors.first);
+                               }
+                       }
+               }
+               /* ------- end of grease pencil initialization --------------- */
+       }
  }
  
  #include "DNA_anim_types.h"
  #include "DNA_armature_types.h"
+ #include "DNA_cachefile_types.h"
  #include "DNA_camera_types.h"
  #include "DNA_object_types.h"
 -#include "DNA_particle_types.h"
  #include "DNA_screen_types.h"
  #include "DNA_scene_types.h"
  #include "DNA_space_types.h"
@@@ -274,7 -276,9 +275,8 @@@ typedef enum eAnimFilter_Flags 
  #define FILTER_MAT_OBJD(ma)     (CHECK_TYPE_INLINE(ma, Material *), ((ma->flag & MA_DS_EXPAND)))
  #define FILTER_LAM_OBJD(la)     (CHECK_TYPE_INLINE(la, Lamp *), ((la->flag & LA_DS_EXPAND)))
  #define FILTER_CAM_OBJD(ca)     (CHECK_TYPE_INLINE(ca, Camera *), ((ca->flag & CAM_DS_EXPAND)))
+ #define FILTER_CACHEFILE_OBJD(cf)     (CHECK_TYPE_INLINE(cf, CacheFile *), ((cf->flag & CACHEFILE_DS_EXPAND)))
  #define FILTER_CUR_OBJD(cu)     (CHECK_TYPE_INLINE(cu, Curve *), ((cu->flag & CU_DS_EXPAND)))
 -#define FILTER_PART_OBJD(part)  (CHECK_TYPE_INLINE(part, ParticleSettings *), ((part->flag & PART_DS_EXPAND)))
  #define FILTER_MBALL_OBJD(mb)   (CHECK_TYPE_INLINE(mb, MetaBall *), ((mb->flag2 & MB_DS_EXPAND)))
  #define FILTER_ARM_OBJD(arm)    (CHECK_TYPE_INLINE(arm, bArmature *), ((arm->flag & ARM_DS_EXPAND)))
  #define FILTER_MESH_OBJD(me)    (CHECK_TYPE_INLINE(me, Mesh *), ((me->flag & ME_DS_EXPAND)))
@@@ -212,8 -214,8 +214,8 @@@ short ED_fileselect_set_params(SpaceFil
                params->filter_id = FILTER_ID_AC | FILTER_ID_AR | FILTER_ID_BR | FILTER_ID_CA | FILTER_ID_CU | FILTER_ID_GD |
                                    FILTER_ID_GR | FILTER_ID_IM | FILTER_ID_LA | FILTER_ID_LS | FILTER_ID_LT | FILTER_ID_MA |
                                    FILTER_ID_MB | FILTER_ID_MC | FILTER_ID_ME | FILTER_ID_MSK | FILTER_ID_NT | FILTER_ID_OB |
 -                                  FILTER_ID_PA | FILTER_ID_PAL | FILTER_ID_PC | FILTER_ID_SCE | FILTER_ID_SPK | FILTER_ID_SO |
 +                                  FILTER_ID_PAL | FILTER_ID_PC | FILTER_ID_SCE | FILTER_ID_SPK | FILTER_ID_SO |
-                                   FILTER_ID_TE | FILTER_ID_TXT | FILTER_ID_VF | FILTER_ID_WO;
+                                   FILTER_ID_TE | FILTER_ID_TXT | FILTER_ID_VF | FILTER_ID_WO | FILTER_ID_CF;
  
                if (U.uiflag & USER_HIDE_DOT) {
                        params->flag |= FILE_HIDE_DOT;
@@@ -61,8 -61,8 +61,8 @@@ typedef struct TreeElement 
  
  #define TREESTORE_ID_TYPE(_id) \
        (ELEM(GS((_id)->name), ID_SCE, ID_LI, ID_OB, ID_ME, ID_CU, ID_MB, ID_NT, ID_MA, ID_TE, ID_IM, ID_LT, ID_LA, ID_CA) || \
 -       ELEM(GS((_id)->name), ID_KE, ID_WO, ID_SPK, ID_GR, ID_AR, ID_AC, ID_BR, ID_PA, ID_GD, ID_LS) || \
 +       ELEM(GS((_id)->name), ID_KE, ID_WO, ID_SPK, ID_GR, ID_AR, ID_AC, ID_BR, ID_GD, ID_LS) || \
-        ELEM(GS((_id)->name), ID_SCR, ID_WM, ID_TXT, ID_VF, ID_SO))  /* Only in 'blendfile' mode ... :/ */
+        ELEM(GS((_id)->name), ID_SCR, ID_WM, ID_TXT, ID_VF, ID_SO, ID_CF))  /* Only in 'blendfile' mode ... :/ */
  
  /* TreeElement->flag */
  #define TE_ACTIVE       1
  #include "BLI_dlrbTree.h"
  #include "BLI_utildefines.h"
  
+ #include "BKE_constraint.h"
  #include "BKE_context.h"
+ #include "BKE_main.h"
+ #include "BKE_modifier.h"
  #include "BKE_screen.h"
 -#include "BKE_pointcache.h"
  
  #include "ED_anim_api.h"
  #include "ED_keyframes_draw.h"
  #include "BKE_context.h"
  #include "BKE_curve.h"
  #include "BKE_global.h"
 -#include "BKE_particle.h"
 -#include "BKE_pointcache.h"
  #include "BKE_editmesh.h"
  #include "BKE_lattice.h"
+ #include "BKE_gpencil.h"
  
  #include "BIF_gl.h"
  
@@@ -65,7 -67,9 +66,8 @@@
  
  #include "ED_armature.h"
  #include "ED_curve.h"
 -#include "ED_particle.h"
  #include "ED_view3d.h"
+ #include "ED_gpencil.h"
  
  #include "UI_resources.h"
  
@@@ -213,42 -213,50 +213,49 @@@ typedef struct PreviewImage 
   * Written to #BHead.code (for file IO)
   * and the first 2 bytes of #ID.name (for runtime checks, see #GS macro).
   */
- #define ID_SCE                MAKE_ID2('S', 'C') /* Scene */
- #define ID_LI         MAKE_ID2('L', 'I') /* Library */
- #define ID_OB         MAKE_ID2('O', 'B') /* Object */
- #define ID_ME         MAKE_ID2('M', 'E') /* Mesh */
- #define ID_CU         MAKE_ID2('C', 'U') /* Curve */
- #define ID_MB         MAKE_ID2('M', 'B') /* MetaBall */
- #define ID_MA         MAKE_ID2('M', 'A') /* Material */
- #define ID_TE         MAKE_ID2('T', 'E') /* Tex (Texture) */
- #define ID_IM         MAKE_ID2('I', 'M') /* Image */
- #define ID_LT         MAKE_ID2('L', 'T') /* Lattice */
- #define ID_LA         MAKE_ID2('L', 'A') /* Lamp */
- #define ID_CA         MAKE_ID2('C', 'A') /* Camera */
- #define ID_IP         MAKE_ID2('I', 'P') /* Ipo (depreciated, replaced by FCurves) */
- #define ID_KE         MAKE_ID2('K', 'E') /* Key (shape key) */
- #define ID_WO         MAKE_ID2('W', 'O') /* World */
- #define ID_SCR                MAKE_ID2('S', 'R') /* Screen */
- #define ID_SCRN               MAKE_ID2('S', 'N') /* (depreciated?) */
- #define ID_VF         MAKE_ID2('V', 'F') /* VFont (Vector Font) */
- #define ID_TXT                MAKE_ID2('T', 'X') /* Text */
- #define ID_SPK                MAKE_ID2('S', 'K') /* Speaker */
- #define ID_SO         MAKE_ID2('S', 'O') /* Sound */
- #define ID_GR         MAKE_ID2('G', 'R') /* Group */
- #define ID_ID         MAKE_ID2('I', 'D') /* (internal use only) */
- #define ID_AR         MAKE_ID2('A', 'R') /* bArmature */
- #define ID_AC         MAKE_ID2('A', 'C') /* bAction */
- #define ID_NT         MAKE_ID2('N', 'T') /* bNodeTree */
- #define ID_BR         MAKE_ID2('B', 'R') /* Brush */
- #define ID_GD         MAKE_ID2('G', 'D') /* bGPdata, (Grease Pencil) */
- #define ID_WM         MAKE_ID2('W', 'M') /* WindowManager */
- #define ID_MC         MAKE_ID2('M', 'C') /* MovieClip */
- #define ID_MSK                MAKE_ID2('M', 'S') /* Mask */
- #define ID_LS         MAKE_ID2('L', 'S') /* FreestyleLineStyle */
- #define ID_PAL                MAKE_ID2('P', 'L') /* Palette */
- #define ID_PC         MAKE_ID2('P', 'C') /* PaintCurve  */
-       /* NOTE! Fake IDs, needed for g.sipo->blocktype or outliner */
+ typedef enum ID_Type {
+       ID_SCE  = MAKE_ID2('S', 'C'), /* Scene */
+       ID_LI   = MAKE_ID2('L', 'I'), /* Library */
+       ID_OB   = MAKE_ID2('O', 'B'), /* Object */
+       ID_ME   = MAKE_ID2('M', 'E'), /* Mesh */
+       ID_CU   = MAKE_ID2('C', 'U'), /* Curve */
+       ID_MB   = MAKE_ID2('M', 'B'), /* MetaBall */
+       ID_MA   = MAKE_ID2('M', 'A'), /* Material */
+       ID_TE   = MAKE_ID2('T', 'E'), /* Tex (Texture) */
+       ID_IM   = MAKE_ID2('I', 'M'), /* Image */
+       ID_LT   = MAKE_ID2('L', 'T'), /* Lattice */
+       ID_LA   = MAKE_ID2('L', 'A'), /* Lamp */
+       ID_CA   = MAKE_ID2('C', 'A'), /* Camera */
+       ID_IP   = MAKE_ID2('I', 'P'), /* Ipo (depreciated, replaced by FCurves) */
+       ID_KE   = MAKE_ID2('K', 'E'), /* Key (shape key) */
+       ID_WO   = MAKE_ID2('W', 'O'), /* World */
+       ID_SCR  = MAKE_ID2('S', 'R'), /* Screen */
+       ID_VF   = MAKE_ID2('V', 'F'), /* VFont (Vector Font) */
+       ID_TXT  = MAKE_ID2('T', 'X'), /* Text */
+       ID_SPK  = MAKE_ID2('S', 'K'), /* Speaker */
+       ID_SO   = MAKE_ID2('S', 'O'), /* Sound */
+       ID_GR   = MAKE_ID2('G', 'R'), /* Group */
+       ID_AR   = MAKE_ID2('A', 'R'), /* bArmature */
+       ID_AC   = MAKE_ID2('A', 'C'), /* bAction */
+       ID_NT   = MAKE_ID2('N', 'T'), /* bNodeTree */
+       ID_BR   = MAKE_ID2('B', 'R'), /* Brush */
 -      ID_PA   = MAKE_ID2('P', 'A'), /* ParticleSettings */
+       ID_GD   = MAKE_ID2('G', 'D'), /* bGPdata, (Grease Pencil) */
+       ID_WM   = MAKE_ID2('W', 'M'), /* WindowManager */
+       ID_MC   = MAKE_ID2('M', 'C'), /* MovieClip */
+       ID_MSK  = MAKE_ID2('M', 'S'), /* Mask */
+       ID_LS   = MAKE_ID2('L', 'S'), /* FreestyleLineStyle */
+       ID_PAL  = MAKE_ID2('P', 'L'), /* Palette */
+       ID_PC   = MAKE_ID2('P', 'C'), /* PaintCurve  */
+       ID_CF   = MAKE_ID2('C', 'F'), /* CacheFile */
+ } ID_Type;
+ /* Only used as 'placeholder' in .blend files for directly linked datablocks. */
+ #define ID_ID       MAKE_ID2('I', 'D') /* (internal use only) */
+ /* Deprecated. */
+ #define ID_SCRN           MAKE_ID2('S', 'N')
+ /* NOTE! Fake IDs, needed for g.sipo->blocktype or outliner */
  #define ID_SEQ                MAKE_ID2('S', 'Q')
                        /* constraint */
  #define ID_CO         MAKE_ID2('C', 'O')
@@@ -369,6 -377,8 +376,7 @@@ enum 
        FILTER_ID_TXT       = (1 << 24),
        FILTER_ID_VF        = (1 << 25),
        FILTER_ID_WO        = (1 << 26),
 -      FILTER_ID_PA        = (1 << 27),
 -      FILTER_ID_CF        = (1 << 28),
++      FILTER_ID_CF        = (1 << 27),
  };
  
  #ifdef __cplusplus
@@@ -255,6 -336,11 +255,8 @@@ typedef struct SoftBody 
        float shearstiff;
        float inpush;
  
 -      struct PointCache *pointcache;
 -      struct ListBase ptcaches;
 -
+       struct Group *collision_group;
        struct EffectorWeights *effector_weights;
        /* reverse esimated obmatrix .. no need to store in blend file .. how ever who cares */ 
        float lcom[3];
Simple merge
@@@ -36,7 -36,9 +36,8 @@@ set(DEFSR
        rna_animation.c
        rna_animviz.c
        rna_armature.c
 -      rna_boid.c
        rna_brush.c
+       rna_cachefile.c
        rna_camera.c
        rna_cloth.c
        rna_color.c
@@@ -3299,7 -3299,9 +3299,8 @@@ static RNAProcessItem PROCESS_ITEMS[] 
        {"rna_animviz.c", NULL, RNA_def_animviz},
        {"rna_actuator.c", "rna_actuator_api.c", RNA_def_actuator},
        {"rna_armature.c", "rna_armature_api.c", RNA_def_armature},
 -      {"rna_boid.c", NULL, RNA_def_boid},
        {"rna_brush.c", NULL, RNA_def_brush},
+       {"rna_cachefile.c", NULL, RNA_def_cachefile},
        {"rna_camera.c", "rna_camera_api.c", RNA_def_camera},
        {"rna_cloth.c", NULL, RNA_def_cloth},
        {"rna_color.c", NULL, RNA_def_color},
@@@ -283,7 -289,12 +286,11 @@@ EnumPropertyItem rna_enum_axis_flag_xyz
  #include "BKE_library.h"
  #include "BKE_modifier.h"
  #include "BKE_object.h"
 -#include "BKE_particle.h"
  
+ #ifdef WITH_ALEMBIC
+ #  include "ABC_alembic.h"
+ #endif
  static void rna_UVProject_projectors_begin(CollectionPropertyIterator *iter, PointerRNA *ptr)
  {
        UVProjectModifierData *uvp = (UVProjectModifierData *)ptr->data;
@@@ -85,6 -99,130 +86,11 @@@ EnumPropertyItem rna_enum_symmetrize_di
  
  #include "GPU_buffers.h"
  
 -#include "ED_particle.h"
 -
+ static void rna_GPencil_update(Main *UNUSED(bmain), Scene *UNUSED(scene), PointerRNA *UNUSED(ptr))
+ {
+       WM_main_add_notifier(NC_GPENCIL | NA_EDITED, NULL);
+ }
 -static EnumPropertyItem particle_edit_disconnected_hair_brush_items[] = {
 -      {PE_BRUSH_NONE, "NONE", 0, "None", "Don't use any brush"},
 -      {PE_BRUSH_COMB, "COMB", 0, "Comb", "Comb hairs"},
 -      {PE_BRUSH_SMOOTH, "SMOOTH", 0, "Smooth", "Smooth hairs"},
 -      {PE_BRUSH_LENGTH, "LENGTH", 0, "Length", "Make hairs longer or shorter"},
 -      {PE_BRUSH_CUT, "CUT", 0, "Cut", "Cut hairs"},
 -      {PE_BRUSH_WEIGHT, "WEIGHT", 0, "Weight", "Weight hair particles"},
 -      {0, NULL, 0, NULL, NULL}
 -};
 -
 -static EnumPropertyItem particle_edit_cache_brush_items[] = {
 -      {PE_BRUSH_NONE, "NONE", 0, "None", "Don't use any brush"},
 -      {PE_BRUSH_COMB, "COMB", 0, "Comb", "Comb paths"},
 -      {PE_BRUSH_SMOOTH, "SMOOTH", 0, "Smooth", "Smooth paths"},
 -      {PE_BRUSH_LENGTH, "LENGTH", 0, "Length", "Make paths longer or shorter"},
 -      {0, NULL, 0, NULL, NULL}
 -};
 -
 -static PointerRNA rna_ParticleEdit_brush_get(PointerRNA *ptr)
 -{
 -      ParticleEditSettings *pset = (ParticleEditSettings *)ptr->data;
 -      ParticleBrushData *brush = NULL;
 -
 -      if (pset->brushtype != PE_BRUSH_NONE)
 -              brush = &pset->brush[pset->brushtype];
 -
 -      return rna_pointer_inherit_refine(ptr, &RNA_ParticleBrush, brush);
 -}
 -
 -static PointerRNA rna_ParticleBrush_curve_get(PointerRNA *ptr)
 -{
 -      return rna_pointer_inherit_refine(ptr, &RNA_CurveMapping, NULL);
 -}
 -
 -static void rna_ParticleEdit_redo(Main *UNUSED(bmain), Scene *scene, PointerRNA *UNUSED(ptr))
 -{
 -      Object *ob = (scene->basact) ? scene->basact->object : NULL;
 -      PTCacheEdit *edit = PE_get_current(scene, ob);
 -
 -      if (!edit)
 -              return;
 -
 -      psys_free_path_cache(edit->psys, edit);
 -}
 -
 -static void rna_ParticleEdit_update(Main *UNUSED(bmain), Scene *scene, PointerRNA *UNUSED(ptr))
 -{
 -      Object *ob = (scene->basact) ? scene->basact->object : NULL;
 -
 -      if (ob) DAG_id_tag_update(&ob->id, OB_RECALC_DATA);
 -}
 -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 (ob) {
 -                      DAG_id_tag_update(&ob->id, OB_RECALC_DATA);
 -                      WM_main_add_notifier(NC_OBJECT | ND_PARTICLE | NA_EDITED, NULL);
 -              }
 -      }
 -
 -      pset->brushtype = value;
 -}
 -static EnumPropertyItem *rna_ParticleEdit_tool_itemf(bContext *C, PointerRNA *UNUSED(ptr),
 -                                                     PropertyRNA *UNUSED(prop), bool *UNUSED(r_free))
 -{
 -      Scene *scene = CTX_data_scene(C);
 -      Object *ob = (scene->basact) ? scene->basact->object : NULL;
 -#if 0
 -      PTCacheEdit *edit = PE_get_current(scene, ob);
 -      ParticleSystem *psys = edit ? edit->psys : NULL;
 -#else
 -      /* use this rather than PE_get_current() - because the editing cache is
 -       * dependent on the cache being updated which can happen after this UI
 -       * draws causing a glitch [#28883] */
 -      ParticleSystem *psys = psys_get_current(ob);
 -#endif
 -
 -      if (psys) {
 -              if (psys->flag & PSYS_GLOBAL_HAIR) {
 -                      return particle_edit_disconnected_hair_brush_items;
 -              }
 -              else {
 -                      return particle_edit_hair_brush_items;
 -              }
 -      }
 -
 -      return particle_edit_cache_brush_items;
 -}
 -
 -static int rna_ParticleEdit_editable_get(PointerRNA *ptr)
 -{
 -      ParticleEditSettings *pset = (ParticleEditSettings *)ptr->data;
 -
 -      return (pset->object && pset->scene && PE_get_current(pset->scene, pset->object));
 -}
 -static int rna_ParticleEdit_hair_get(PointerRNA *ptr)
 -{
 -      ParticleEditSettings *pset = (ParticleEditSettings *)ptr->data;
 -
 -      if (pset->scene) {
 -              PTCacheEdit *edit = PE_get_current(pset->scene, pset->object);
 -
 -              return (edit && edit->psys);
 -      }
 -      
 -      return 0;
 -}
 -
 -static char *rna_ParticleEdit_path(PointerRNA *UNUSED(ptr))
 -{
 -      return BLI_strdup("tool_settings.particle_edit");
 -}
 -
  static int rna_Brush_mode_poll(PointerRNA *ptr, PointerRNA value)
  {
        Scene *scene = (Scene *)ptr->id.data;
@@@ -3827,7 -3846,7 +3829,7 @@@ static void rna_def_fileselect_params(B
             "IMAGE", ICON_IMAGE_DATA, "Images & Sounds", "Show/hide images, movie clips, sounds and masks"},
                {FILTER_ID_CA | FILTER_ID_LA | FILTER_ID_SPK | FILTER_ID_WO,
             "ENVIRONMENT", ICON_WORLD_DATA, "Environment", "Show/hide worlds, lamps, cameras and speakers"},
-               {FILTER_ID_BR | FILTER_ID_GD | FILTER_ID_PAL | FILTER_ID_PC | FILTER_ID_TXT | FILTER_ID_VF,
 -              {FILTER_ID_BR | FILTER_ID_GD | FILTER_ID_PA | FILTER_ID_PAL | FILTER_ID_PC | FILTER_ID_TXT | FILTER_ID_VF | FILTER_ID_CF,
++              {FILTER_ID_BR | FILTER_ID_GD | FILTER_ID_PAL | FILTER_ID_PC | FILTER_ID_TXT | FILTER_ID_VF | FILTER_ID_CF,
             "MISC", ICON_GREASEPENCIL, "Miscellaneous", "Show/hide other data types"},
            {0, NULL, 0, NULL, NULL}
        };