Merge branch 'blender2.7'
authorBrecht Van Lommel <brechtvanlommel@gmail.com>
Tue, 26 Feb 2019 19:07:36 +0000 (20:07 +0100)
committerBrecht Van Lommel <brechtvanlommel@gmail.com>
Tue, 26 Feb 2019 19:07:36 +0000 (20:07 +0100)
1  2 
source/blender/blenloader/intern/readfile.c
source/blender/makesdna/DNA_ID.h

@@@ -9520,13 -8744,13 +9520,13 @@@ BlendFileData *blo_read_file_internal(F
                                /* Always adds to the most recently loaded ID_LI block, see direct_link_library.
                                 * This is part of the file format definition. */
                                if (fd->skip_flags & BLO_READ_SKIP_DATA) {
 -                                      bhead = blo_nextbhead(fd, bhead);
 +                                      bhead = blo_bhead_next(fd, bhead);
                                }
                                else {
-                                       bhead = read_libblock(fd, mainlist.last, bhead, LIB_TAG_READ | LIB_TAG_EXTERN, NULL);
+                                       bhead = read_libblock(fd, mainlist.last, bhead, LIB_TAG_ID_ID | LIB_TAG_EXTERN, NULL);
                                }
                                break;
 -                              /* in 2.50+ files, the file identifier for screens is patched, forward compatibility */
 +                      /* in 2.50+ files, the file identifier for screens is patched, forward compatibility */
                        case ID_SCRN:
                                bhead->code = ID_SCR;
                                /* pass on to default */
@@@ -9788,14 -8990,9 +9788,14 @@@ static void expand_doit_library(void *f
                        }
                }
                else {
 +                      /* in 2.50+ file identifier for screens is patched, forward compatibility */
 +                      if (bhead->code == ID_SCRN) {
 +                              bhead->code = ID_SCR;
 +                      }
 +
                        id = is_yet_read(fd, mainvar, bhead);
                        if (id == NULL) {
-                               read_libblock(fd, mainvar, bhead, LIB_TAG_TESTIND, NULL);
+                               read_libblock(fd, mainvar, bhead, LIB_TAG_NEED_EXPAND | LIB_TAG_INDIRECT, NULL);
                        }
                        else {
                                /* this is actually only needed on UI call? when ID was already read before, and another append
@@@ -11286,13 -10494,9 +11287,13 @@@ void *BLO_library_read_struct(FileData 
        return read_struct(fd, bh, blockname);
  }
  
 -/* ************* READ LIBRARY ************** */
 +/** \} */
 +
 +/* -------------------------------------------------------------------- */
 +/** \name Library Reading
 + * \{ */
  
- static int mainvar_id_tag_any_check(Main *mainvar, const short tag)
+ static int mainvar_id_tag_any_check(Main *mainvar, const int tag)
  {
        ListBase *lbarray[MAX_LIBARRAY];
        int a;
@@@ -513,92 -346,22 +511,92 @@@ enum 
        /* RESET_AFTER_USE tag existing data before linking so we know what is new. */
        LIB_TAG_PRE_EXISTING    = 1 << 11,
  
 -      /* RESET_NEVER tag datablock for freeing etc. behavior (usually set when copying real one into temp/runtime one). */
 -      LIB_TAG_NO_MAIN          = 1 << 12,  /* Datablock is not listed in Main database. */
 -      LIB_TAG_NO_USER_REFCOUNT = 1 << 13,  /* Datablock does not refcount usages of other IDs. */
 +      /* The datablock is a copy-on-write/localized version. */
 +      LIB_TAG_COPIED_ON_WRITE               = 1 << 12,
 +      LIB_TAG_COPIED_ON_WRITE_EVAL_RESULT   = 1 << 13,
 +      LIB_TAG_LOCALIZED = 1 << 14,
 +
 +      /* RESET_NEVER tag datablock for freeing etc. behavior
 +       * (usually set when copying real one into temp/runtime one). */
 +      LIB_TAG_NO_MAIN          = 1 << 15,  /* Datablock is not listed in Main database. */
 +      LIB_TAG_NO_USER_REFCOUNT = 1 << 16,  /* Datablock does not refcount usages of other IDs. */
        /* Datablock was not allocated by standard system (BKE_libblock_alloc), do not free its memory
         * (usual type-specific freeing is called though). */
-       LIB_TAG_NOT_ALLOCATED     = 1 << 17,
 -      LIB_TAG_NOT_ALLOCATED     = 1 << 14,
++      LIB_TAG_NOT_ALLOCATED     = 1 << 18,
  };
  
 -enum {
 -      /* RESET_AFTER_USE, used by update code (depsgraph). */
 -      ID_RECALC_NONE  = 0,
 -      ID_RECALC       = 1 << 0,
 -      ID_RECALC_DATA  = 1 << 1,
 -      ID_RECALC_SKIP_ANIM_TAG  = 1 << 2,
 -      ID_RECALC_ALL   = (ID_RECALC | ID_RECALC_DATA),
 -};
 +/* Tag given ID for an update in all the dependency graphs. */
 +typedef enum IDRecalcFlag {
 +      /* Individual update tags, this is what ID gets tagged for update with. */
 +
 +      /* ** Object transformation changed. ** */
 +      ID_RECALC_TRANSFORM   = (1 << 0),
 +
 +      /* ** Object geometry changed. **
 +       *
 +       * When object of armature type gets tagged with this flag, it's pose is
 +       * re-evaluated.
 +       * When object of other type is tagged with this flag it makes the modifier
 +       * stack to be re-evaluated.
 +       * When object data type (mesh, curve, ...) gets tagged with this flag it
 +       * makes all objects which shares this datablock to be updated. */
 +      ID_RECALC_GEOMETRY    = (1 << 1),
 +
 +      /* ** Animation or time changed and animation is to be re-evaluated. ** */
 +      ID_RECALC_ANIMATION   = (1 << 2),
 +
 +      /* ** Particle system changed. ** */
 +      /* Only do pathcache etc. */
 +      ID_RECALC_PSYS_REDO   = (1 << 3),
 +      /* Reset everything including pointcache. */
 +      ID_RECALC_PSYS_RESET  = (1 << 4),
 +      /* Only child settings changed. */
 +      ID_RECALC_PSYS_CHILD  = (1 << 5),
 +      /* Physics type changed. */
 +      ID_RECALC_PSYS_PHYS   = (1 << 6),
 +
 +      /* ** Material and shading ** */
 +
 +      /* For materials and node trees this means that topology of the shader tree
 +       * changed, and the shader is to be recompiled.
 +       * For objects it means that the draw batch cache is to be redone. */
 +      ID_RECALC_SHADING             = (1 << 7),
 +      /* TODO(sergey): Consider adding an explicit ID_RECALC_SHADING_PARAMATERS
 +       * which can be used for cases when only socket value changed, to speed up
 +       * redraw update in that case. */
 +
 +      /* Selection of the ID itself or its components (for example, vertices) did
 +       * change, and all the drawing data is to eb updated. */
 +      ID_RECALC_SELECT        = (1 << 9),
 +      /* Flags on the base did change, and is to be compied onto all the copies of
 +       * corresponding objects. */
 +      ID_RECALC_BASE_FLAGS    = (1 << 10),
 +      ID_RECALC_POINT_CACHE   = (1 << 11),
 +      /* Only inform editors about the change. Is used to force update of editors
 +       * when datablock which is not a part of dependency graph did change.
 +       *
 +       * For example, brush texture did change and the preview is to be
 +       * re-rendered. */
 +      ID_RECALC_EDITORS       = (1 << 12),
 +
 +      /* ** Update copy on write component. **
 +       * This is most generic tag which should only be used when nothing else
 +       * matches.
 +       */
 +      ID_RECALC_COPY_ON_WRITE = (1 << 13),
 +
 +      /* Aggregate flags, use only for checks on runtime.
 +       * Do NOT use those for tagging. */
 +
 +      /* Identifies that SOMETHING has been changed in this ID. */
 +      ID_RECALC_ALL = ~(0),
 +      /* Identifies that something in particle system did change. */
 +      ID_RECALC_PSYS_ALL    = (ID_RECALC_PSYS_REDO |
 +                               ID_RECALC_PSYS_RESET |
 +                               ID_RECALC_PSYS_CHILD |
 +                               ID_RECALC_PSYS_PHYS),
 +
 +} IDRecalcFlag;
  
  /* To filter ID types (filter_id) */
  /* XXX We cannot put all needed IDs inside an enum...