Commit: 24b1371b361355bcbb5d329c9c743c7f04215c3b
Author: Bastien Montagne
Date:   Mon Jul 17 15:21:57 2017 +0200
Branches: id_override_static
https://developer.blender.org/rB24b1371b361355bcbb5d329c9c743c7f04215c3b

Merge branch 'id_copy_refactor' into id_override_static

Conflicts:
        source/blender/blenkernel/intern/library.c
        source/blender/blenloader/intern/writefile.c

===================================================================



===================================================================

diff --cc source/blender/blenkernel/intern/library.c
index 4f8c417d403,18e4f332dc2..11315455a16
--- a/source/blender/blenkernel/intern/library.c
+++ b/source/blender/blenkernel/intern/library.c
@@@ -1275,24 -1301,18 +1365,27 @@@ void BKE_libblock_copy_ex(Main *bmain, 
                memcpy(cpn + id_offset, cp + id_offset, id_len - id_offset);
        }
  
-       /* TODO we can remove that one later and bring its code here. */
-       BKE_libblock_copy_data(bmain, idn, id, flag);
- 
-       if ((flag & LIB_ID_COPY_NO_MAIN) != 0) {
-               idn->tag |= LIB_TAG_FREE_NO_MAIN;
-       }
-       if ((flag & LIB_ID_COPY_NO_USER_REFCOUNT) != 0) {
-               idn->tag |= LIB_TAG_FREE_NO_USER_REFCOUNT;
+       if (id->properties) {
+               new_id->properties = IDP_CopyProperty_ex(id->properties, flag);
        }
-       if ((flag & LIB_ID_COPY_NO_ALLOCATE) != 0) {
-               idn->tag |= LIB_TAG_FREE_NOT_ALLOCATED;
+ 
++      /* XXX Again... We need a way to control what we copy in a much more 
refined way.
++       * We cannot always copy this, some internal copying will die on it! */
++      /* For now, upper level code will have to do that itself when required. 
*/
++#if 0
++      if (id->override != NULL) {
++              BKE_override_copy(new_id, id);
 +      }
++#endif
++
+       /* the duplicate should get a copy of the animdata */
+       id_copy_animdata(bmain, new_id, (flag & LIB_ID_COPY_ACTIONS) != 0 && 
(flag & LIB_ID_CREATE_NO_MAIN) == 0);
  
-       if ((flag & LIB_ID_COPY_NO_DEG_TAG) == 0 && (flag & 
LIB_ID_COPY_NO_MAIN) == 0) {
-               DAG_id_type_tag(bmain, GS(idn->name));
+       if ((flag & LIB_ID_CREATE_NO_DEG_TAG) == 0 && (flag & 
LIB_ID_CREATE_NO_MAIN) == 0) {
+               DAG_id_type_tag(bmain, GS(new_id->name));
        }
  
-       *r_newid = idn;
+       *r_newid = new_id;
  }
  
  /* used everywhere in blenkernel */
diff --cc source/blender/blenloader/intern/writefile.c
index 72036d068f5,6c5bfb01829..b93422014bc
--- a/source/blender/blenloader/intern/writefile.c
+++ b/source/blender/blenloader/intern/writefile.c
@@@ -3853,151 -3831,131 +3853,151 @@@ static bool write_file_handle
         * avoid thumbnail detecting changes because of this. */
        mywrite_flush(wd);
  
 -      ListBase *lbarray[MAX_LIBARRAY];
 -      int a = set_listbasepointers(mainvar, lbarray);
 -      while (a--) {
 -              ID *id = lbarray[a]->first;
 +      OverrideStorage *override_storage = !wd->current ? 
BKE_override_operations_store_initialize() : NULL;
  
 -              if (id && GS(id->name) == ID_LI) {
 -                      continue;  /* Libraries are handled separately below. */
 -              }
 +      /* This outer loop allows to save first datablocks from real mainvar, 
then the temp ones from override process,
 +       * if needed, without duplicating whole code. */
 +      Main *main = mainvar;
 +      do {
 +              ListBase *lbarray[MAX_LIBARRAY];
 +              int a = set_listbasepointers(main, lbarray);
 +              while (a--) {
 +                      ID *id = lbarray[a]->first;
  
 -              for (; id; id = id->next) {
 -                      /* We should never attempt to write non-regular IDs 
(i.e. all kind of temp/runtime ones). */
 -                      BLI_assert((id->tag & (LIB_TAG_NO_MAIN | 
LIB_TAG_NO_USER_REFCOUNT | LIB_TAG_NOT_ALLOCATED)) == 0);
 +                      if (id && GS(id->name) == ID_LI) {
 +                              continue;  /* Libraries are handled separately 
below. */
 +                      }
  
 -                      switch ((ID_Type)GS(id->name)) {
 -                              case ID_WM:
 -                                      write_windowmanager(wd, 
(wmWindowManager *)id);
 -                                      break;
 -                              case ID_SCR:
 -                                      write_screen(wd, (bScreen *)id);
 -                                      break;
 -                              case ID_MC:
 -                                      write_movieclip(wd, (MovieClip *)id);
 -                                      break;
 -                              case ID_MSK:
 -                                      write_mask(wd, (Mask *)id);
 -                                      break;
 -                              case ID_SCE:
 -                                      write_scene(wd, (Scene *)id);
 -                                      break;
 -                              case ID_CU:
 -                                      write_curve(wd, (Curve *)id);
 -                                      break;
 -                              case ID_MB:
 -                                      write_mball(wd, (MetaBall *)id);
 -                                      break;
 -                              case ID_IM:
 -                                      write_image(wd, (Image *)id);
 -                                      break;
 -                              case ID_CA:
 -                                      write_camera(wd, (Camera *)id);
 -                                      break;
 -                              case ID_LA:
 -                                      write_lamp(wd, (Lamp *)id);
 -                                      break;
 -                              case ID_LT:
 -                                      write_lattice(wd, (Lattice *)id);
 -                                      break;
 -                              case ID_VF:
 -                                      write_vfont(wd, (VFont *)id);
 -                                      break;
 -                              case ID_KE:
 -                                      write_key(wd, (Key *)id);
 -                                      break;
 -                              case ID_WO:
 -                                      write_world(wd, (World *)id);
 -                                      break;
 -                              case ID_TXT:
 -                                      write_text(wd, (Text *)id);
 -                                      break;
 -                              case ID_SPK:
 -                                      write_speaker(wd, (Speaker *)id);
 -                                      break;
 -                              case ID_SO:
 -                                      write_sound(wd, (bSound *)id);
 -                                      break;
 -                              case ID_GR:
 -                                      write_group(wd, (Group *)id);
 -                                      break;
 -                              case ID_AR:
 -                                      write_armature(wd, (bArmature *)id);
 -                                      break;
 -                              case ID_AC:
 -                                      write_action(wd, (bAction *)id);
 -                                      break;
 -                              case ID_OB:
 -                                      write_object(wd, (Object *)id);
 -                                      break;
 -                              case ID_MA:
 -                                      write_material(wd, (Material *)id);
 -                                      break;
 -                              case ID_TE:
 -                                      write_texture(wd, (Tex *)id);
 -                                      break;
 -                              case ID_ME:
 -                                      write_mesh(wd, (Mesh *)id);
 -                                      break;
 -                              case ID_PA:
 -                                      write_particlesettings(wd, 
(ParticleSettings *)id);
 -                                      break;
 -                              case ID_NT:
 -                                      write_nodetree(wd, (bNodeTree *)id);
 -                                      break;
 -                              case ID_BR:
 -                                      write_brush(wd, (Brush *)id);
 -                                      break;
 -                              case ID_PAL:
 -                                      write_palette(wd, (Palette *)id);
 -                                      break;
 -                              case ID_PC:
 -                                      write_paintcurve(wd, (PaintCurve *)id);
 -                                      break;
 -                              case ID_GD:
 -                                      write_gpencil(wd, (bGPdata *)id);
 -                                      break;
 -                              case ID_LS:
 -                                      write_linestyle(wd, (FreestyleLineStyle 
*)id);
 -                                      break;
 -                              case ID_CF:
 -                                      write_cachefile(wd, (CacheFile *)id);
 -                                      break;
 -                              case ID_LI:
 -                                      /* Do nothing, handled below - and 
should never be reached. */
 -                                      BLI_assert(0);
 -                                      break;
 -                              case ID_IP:
 -                                      /* Do nothing, deprecated. */
 -                                      break;
 -                              default:
 -                                      /* Should never be reached. */
 -                                      BLI_assert(0);
 -                                      break;
 +                      for (; id; id = id->next) {
 +                              /* We should never attempt to write non-regular 
IDs (i.e. all kind of temp/runtime ones). */
-                               BLI_assert((id->tag & (LIB_TAG_FREE_NO_MAIN | 
LIB_TAG_FREE_NO_USER_REFCOUNT | LIB_TAG_FREE_NOT_ALLOCATED)) == 0);
++                              BLI_assert((id->tag & (LIB_TAG_NO_MAIN | 
LIB_TAG_NO_USER_REFCOUNT | LIB_TAG_NOT_ALLOCATED)) == 0);
 +
 +                              if (!ELEM(override_storage, NULL, main) && 
id->override) {
 +                                      
BKE_override_operations_store_start(override_storage, id);
 +                              }
 +
 +                              switch ((ID_Type)GS(id->name)) {
 +                                      case ID_WM:
 +                                              write_windowmanager(wd, 
(wmWindowManager *)id);
 +                                              break;
 +                                      case ID_SCR:
 +                                              write_screen(wd, (bScreen *)id);
 +                                              break;
 +                                      case ID_MC:
 +                                              write_movieclip(wd, (MovieClip 
*)id);
 +                                              break;
 +                                      case ID_MSK:
 +                                              write_mask(wd, (Mask *)id);
 +                                              break;
 +                                      case ID_SCE:
 +                                              write_scene(wd, (Scene *)id);
 +                                              break;
 +                                      case ID_CU:
 +                                              write_curve(wd,(Curve *)id);
 +                                              break;
 +                                      case ID_MB:
 +                                              write_mball(wd, (MetaBall *)id);
 +                                              break;
 +                                      case ID_IM:
 +                                              write_image(wd, (Image *)id);
 +                                              break;
 +                                      case ID_CA:
 +                                              write_camera(wd, (Camera *)id);
 +                                              break;
 +                                      case ID_LA:
 +                                              write_lamp(wd, (Lamp *)id);
 +                                              break;
 +                                      case ID_LT:
 +                                              write_lattice(wd, (Lattice 
*)id);
 +                                              break;
 +                                      case ID_VF:
 +                                              write_vfont(wd, (VFont *)id);
 +                                              break;
 +                                      case ID_KE:
 +                                              write_key(wd, (Key *)id);
 +                                              break;
 +                                      case ID_WO:
 +                                              write_world(wd, (World *)id);
 +                                              break;
 +                                      case ID_TXT:
 +                                              write_text(wd, (Text *)id);
 +                                              break;
 +                                      case ID_SPK:
 +                                              write_speaker(wd, (Speaker 
*)id);
 +                                              break;
 +                                      case ID_SO:
 +                                              write_sound(wd, (bSound *)id);
 +                                              break;
 +                                      case ID_GR:
 +                                              write_group(wd, (Group *)id);
 +                                              break;
 +                                      case ID_AR:
 +                                              write_armature(wd, (bArmature 
*)id);
 +                                              break;
 +                                      case ID_AC:
 +                                              write_action(wd, (bAction *)id);
 +                                              break;
 +                                      case ID_OB:
 +                                              write_object(wd, (Object *)id);
 +                                              break;
 +                                      case ID_MA:
 +                                              write_material(wd, (Material 
*)id);
 +                                              break;
 +                                      case ID_TE:
 +                                              write_texture(wd, (Tex *)id);
 +                                              break;
 +                                      case ID_ME:
 +                                              write_mesh(wd, (Mesh *)id);
 +                                              break;
 +                                      case ID_PA:
 +                                              write_particlesettings(wd, 
(ParticleSettings *)id);
 +                                              break;
 +                                      case ID_NT:
 +                                              write_nodetree(wd, (bNodeTree 
*)id);
 +                                              break;
 +                                      case ID_BR:
 +                                              write_brush(wd, (Brush *)id);
 +                                              break;
 +                                      case ID_PAL:
 +                                              write_palette(wd, (Palette 
*)id);
 +                                              break;
 +                                      case ID_PC:
 +                                              write_paintcurve(wd, 
(PaintCurve *)id);
 +                                              break;
 +                                      case ID_GD:
 +                                              write_gpencil(wd, (bGPdata 
*)id);
 +                                              break;
 +                                      case ID_LS:
 +                                              write_linestyle(wd, 
(FreestyleLineStyle *)id);
 +                                              break;
 +                                      case ID_CF:
 +                                              write_cachefile(wd, (CacheFile 
*)id);
 +                                              break;
 +                                      case ID_LI:
 +                                              /* Do nothing, handled below - 
and should never be reached. */
 +                                              BLI_assert(0);
 +                                              break;
 +                                      case ID_IP:
 +                                              /* Do nothing, deprecated. */
 +                                              break;
 +                                      default:
 +                                              /* Should never be reached. */
 +                                              BLI_assert(0);
 +                                              break;
 +                              }
 +
 +                              if (!ELEM(override_storage, NULL, main) && 
id->override) {
 +                                      
BKE_override_operations_store_end(override_storage, id);
 +                              }
                        }
 +
 +                      mywrite_flush(wd);
                }
 +      } while ((main != override_storage) && (main = override_storage));
  
 -              mywrite_flush(wd);
 +      if (override_storage) {
 +              BKE_override_operations_store_finalize(override_storage);
 +              override_storage = NULL;
        }
  
        /* Special handling, operating over split Mains... */

_______________________________________________
Bf-blender-cvs mailing list
[email protected]
https://lists.blender.org/mailman/listinfo/bf-blender-cvs

Reply via email to