[Bf-blender-cvs] [2ad0ae8dadb] master: Tweak write code to allow cleaning up runtime data before write.

Bastien Montagne noreply at git.blender.org
Wed Apr 1 09:47:31 CEST 2020


Commit: 2ad0ae8dadb7eb1e956b6d6c4583f1fa1f7fba4f
Author: Bastien Montagne
Date:   Wed Apr 1 09:40:11 2020 +0200
Branches: master
https://developer.blender.org/rB2ad0ae8dadb7eb1e956b6d6c4583f1fa1f7fba4f

Tweak write code to allow cleaning up runtime data before write.

This basically generalizes what was being done in `write_mesh`,
since we need to clean up ID tags anyway, it's easier to do it for all IDs.

Then ID write funcs themsleves can do whatever they want on the passed
struct, without risking interferring with regular Blender operations.

Note that Text write function is doing a suspicious change on one of its
flags, but this seems to be by-passed anyway by read code currently, so
think it's OK to not do that on orig data-block.

Reviewed By: brecht

Differential Revision: https://developer.blender.org/D7294

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

M	source/blender/blenloader/intern/writefile.c

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

diff --git a/source/blender/blenloader/intern/writefile.c b/source/blender/blenloader/intern/writefile.c
index 2c0dcd83cea..1ca8e7d5ade 100644
--- a/source/blender/blenloader/intern/writefile.c
+++ b/source/blender/blenloader/intern/writefile.c
@@ -854,10 +854,10 @@ static void write_fcurves(WriteData *wd, ListBase *fcurves)
   }
 }
 
-static void write_action(WriteData *wd, bAction *act)
+static void write_action(WriteData *wd, bAction *act, const void *id_address)
 {
   if (act->id.us > 0 || wd->use_memfile) {
-    writestruct(wd, ID_AC, bAction, 1, act);
+    writestruct_at_address(wd, ID_AC, bAction, 1, id_address, act);
     write_iddata(wd, &act->id);
 
     write_fcurves(wd, &act->curves);
@@ -1391,11 +1391,11 @@ static void write_pointcaches(WriteData *wd, ListBase *ptcaches)
   }
 }
 
-static void write_particlesettings(WriteData *wd, ParticleSettings *part)
+static void write_particlesettings(WriteData *wd, ParticleSettings *part, const void *id_address)
 {
   if (part->id.us > 0 || wd->use_memfile) {
     /* write LibData */
-    writestruct(wd, ID_PA, ParticleSettings, 1, part);
+    writestruct_at_address(wd, ID_PA, ParticleSettings, 1, id_address, part);
     write_iddata(wd, &part->id);
 
     if (part->adt) {
@@ -1900,11 +1900,11 @@ static void write_shaderfxs(WriteData *wd, ListBase *fxbase)
   }
 }
 
-static void write_object(WriteData *wd, Object *ob)
+static void write_object(WriteData *wd, Object *ob, const void *id_address)
 {
   if (ob->id.us > 0 || wd->use_memfile) {
     /* write LibData */
-    writestruct(wd, ID_OB, Object, 1, ob);
+    writestruct_at_address(wd, ID_OB, Object, 1, id_address, ob);
     write_iddata(wd, &ob->id);
 
     if (ob->adt) {
@@ -1965,11 +1965,11 @@ static void write_object(WriteData *wd, Object *ob)
   }
 }
 
-static void write_vfont(WriteData *wd, VFont *vf)
+static void write_vfont(WriteData *wd, VFont *vf, const void *id_address)
 {
   if (vf->id.us > 0 || wd->use_memfile) {
     /* write LibData */
-    writestruct(wd, ID_VF, VFont, 1, vf);
+    writestruct_at_address(wd, ID_VF, VFont, 1, id_address, vf);
     write_iddata(wd, &vf->id);
 
     /* direct data */
@@ -1981,11 +1981,11 @@ static void write_vfont(WriteData *wd, VFont *vf)
   }
 }
 
-static void write_key(WriteData *wd, Key *key)
+static void write_key(WriteData *wd, Key *key, const void *id_address)
 {
   if (key->id.us > 0 || wd->use_memfile) {
     /* write LibData */
-    writestruct(wd, ID_KE, Key, 1, key);
+    writestruct_at_address(wd, ID_KE, Key, 1, id_address, key);
     write_iddata(wd, &key->id);
 
     if (key->adt) {
@@ -2002,11 +2002,11 @@ static void write_key(WriteData *wd, Key *key)
   }
 }
 
-static void write_camera(WriteData *wd, Camera *cam)
+static void write_camera(WriteData *wd, Camera *cam, const void *id_address)
 {
   if (cam->id.us > 0 || wd->use_memfile) {
     /* write LibData */
-    writestruct(wd, ID_CA, Camera, 1, cam);
+    writestruct_at_address(wd, ID_CA, Camera, 1, id_address, cam);
     write_iddata(wd, &cam->id);
 
     if (cam->adt) {
@@ -2019,11 +2019,11 @@ static void write_camera(WriteData *wd, Camera *cam)
   }
 }
 
-static void write_mball(WriteData *wd, MetaBall *mb)
+static void write_mball(WriteData *wd, MetaBall *mb, const void *id_address)
 {
   if (mb->id.us > 0 || wd->use_memfile) {
     /* write LibData */
-    writestruct(wd, ID_MB, MetaBall, 1, mb);
+    writestruct_at_address(wd, ID_MB, MetaBall, 1, id_address, mb);
     write_iddata(wd, &mb->id);
 
     /* direct data */
@@ -2038,11 +2038,11 @@ static void write_mball(WriteData *wd, MetaBall *mb)
   }
 }
 
-static void write_curve(WriteData *wd, Curve *cu)
+static void write_curve(WriteData *wd, Curve *cu, const void *id_address)
 {
   if (cu->id.us > 0 || wd->use_memfile) {
     /* write LibData */
-    writestruct(wd, ID_CU, Curve, 1, cu);
+    writestruct_at_address(wd, ID_CU, Curve, 1, id_address, cu);
     write_iddata(wd, &cu->id);
 
     /* direct data */
@@ -2195,15 +2195,9 @@ static void write_customdata(WriteData *wd,
   }
 }
 
-static void write_mesh(WriteData *wd, Mesh *mesh)
+static void write_mesh(WriteData *wd, Mesh *mesh, const void *id_address)
 {
   if (mesh->id.us > 0 || wd->use_memfile) {
-    /* Write a copy of the mesh with possibly reduced number of data layers.
-     * Don't edit the original since other threads might be reading it. */
-    Mesh *old_mesh = mesh;
-    Mesh copy_mesh = *mesh;
-    mesh = &copy_mesh;
-
     /* cache only - don't write */
     mesh->mface = NULL;
     mesh->totface = 0;
@@ -2225,7 +2219,7 @@ static void write_mesh(WriteData *wd, Mesh *mesh)
     CustomData_file_write_prepare(&mesh->ldata, &llayers, llayers_buff, ARRAY_SIZE(llayers_buff));
     CustomData_file_write_prepare(&mesh->pdata, &players, players_buff, ARRAY_SIZE(players_buff));
 
-    writestruct_at_address(wd, ID_ME, Mesh, 1, old_mesh, mesh);
+    writestruct_at_address(wd, ID_ME, Mesh, 1, id_address, mesh);
     write_iddata(wd, &mesh->id);
 
     /* direct data */
@@ -2243,9 +2237,6 @@ static void write_mesh(WriteData *wd, Mesh *mesh)
     write_customdata(wd, &mesh->id, mesh->totloop, &mesh->ldata, llayers, CD_MASK_MESH.lmask);
     write_customdata(wd, &mesh->id, mesh->totpoly, &mesh->pdata, players, CD_MASK_MESH.pmask);
 
-    /* restore pointer */
-    mesh = old_mesh;
-
     /* free temporary data */
     if (vlayers && vlayers != vlayers_buff) {
       MEM_freeN(vlayers);
@@ -2265,11 +2256,11 @@ static void write_mesh(WriteData *wd, Mesh *mesh)
   }
 }
 
-static void write_lattice(WriteData *wd, Lattice *lt)
+static void write_lattice(WriteData *wd, Lattice *lt, const void *id_address)
 {
   if (lt->id.us > 0 || wd->use_memfile) {
     /* write LibData */
-    writestruct(wd, ID_LT, Lattice, 1, lt);
+    writestruct_at_address(wd, ID_LT, Lattice, 1, id_address, lt);
     write_iddata(wd, &lt->id);
 
     /* write animdata */
@@ -2284,7 +2275,7 @@ static void write_lattice(WriteData *wd, Lattice *lt)
   }
 }
 
-static void write_image(WriteData *wd, Image *ima)
+static void write_image(WriteData *wd, Image *ima, const void *id_address)
 {
   if (ima->id.us > 0 || wd->use_memfile) {
     ImagePackedFile *imapf;
@@ -2297,7 +2288,7 @@ static void write_image(WriteData *wd, Image *ima)
     }
 
     /* write LibData */
-    writestruct(wd, ID_IM, Image, 1, ima);
+    writestruct_at_address(wd, ID_IM, Image, 1, id_address, ima);
     write_iddata(wd, &ima->id);
 
     for (imapf = ima->packedfiles.first; imapf; imapf = imapf->next) {
@@ -2324,11 +2315,11 @@ static void write_image(WriteData *wd, Image *ima)
   }
 }
 
-static void write_texture(WriteData *wd, Tex *tex)
+static void write_texture(WriteData *wd, Tex *tex, const void *id_address)
 {
   if (tex->id.us > 0 || wd->use_memfile) {
     /* write LibData */
-    writestruct(wd, ID_TE, Tex, 1, tex);
+    writestruct_at_address(wd, ID_TE, Tex, 1, id_address, tex);
     write_iddata(wd, &tex->id);
 
     if (tex->adt) {
@@ -2350,11 +2341,11 @@ static void write_texture(WriteData *wd, Tex *tex)
   }
 }
 
-static void write_material(WriteData *wd, Material *ma)
+static void write_material(WriteData *wd, Material *ma, const void *id_address)
 {
   if (ma->id.us > 0 || wd->use_memfile) {
     /* write LibData */
-    writestruct(wd, ID_MA, Material, 1, ma);
+    writestruct_at_address(wd, ID_MA, Material, 1, id_address, ma);
     write_iddata(wd, &ma->id);
 
     if (ma->adt) {
@@ -2376,11 +2367,11 @@ static void write_material(WriteData *wd, Material *ma)
   }
 }
 
-static void write_world(WriteData *wd, World *wrld)
+static void write_world(WriteData *wd, World *wrld, const void *id_address)
 {
   if (wrld->id.us > 0 || wd->use_memfile) {
     /* write LibData */
-    writestruct(wd, ID_WO, World, 1, wrld);
+    writestruct_at_address(wd, ID_WO, World, 1, id_address, wrld);
     write_iddata(wd, &wrld->id);
 
     if (wrld->adt) {
@@ -2397,11 +2388,11 @@ static void write_world(WriteData *wd, World *wrld)
   }
 }
 
-static void write_light(WriteData *wd, Light *la)
+static void write_light(WriteData *wd, Light *la, const void *id_address)
 {
   if (la->id.us > 0 || wd->use_memfile) {
     /* write LibData */
-    writestruct(wd, ID_LA, Light, 1, la);
+    writestruct_at_address(wd, ID_LA, Light, 1, id_address, la);
     write_iddata(wd, &la->id);
 
     if (la->adt) {
@@ -2441,11 +2432,11 @@ static void write_collection_nolib(WriteData *wd, Collection *collection)
   }
 }
 
-static void write_collection(WriteData *wd, Collection *collection)
+static void write_collection(WriteData *wd, Collection *collection, const void *id_address)
 {
   if (collection->id.us > 0 || wd->use_memfile) {
     /* write LibData */
-    writestruct(wd, ID_GR, Collection, 1, collection);
+    writestruct_at_address(wd, ID_GR, Collection, 1, id_address, collection);
     write_iddata(wd, &collection->id);
 
     write_collection_nolib(wd, collection);
@@ -2560,10 +2551,10 @@ static void write_lightcache(WriteData *wd, LightCache *cache)
   writestruct(wd, DATA, LightProbeCache, cache->cube_len, cache->cube_data);
 }
 
-static void write_scene(WriteData *wd, Scene *sce)
+static void write_scene(WriteData *wd, Scene *sce, const void *id_address)
 {
   /* write LibData */
-  writestruct(wd, ID_SCE, Scene, 1, sce);
+  writestruct_at_address(wd, ID_SCE, Scene, 1, id_address, sce);
   write_iddata(wd, &sce->id);
 
   if (sce->adt) {
@@ -2786,11 +2777,11 @@ static void write_scene(WriteData *wd, Scene *sce)
   BLI_assert(sce->layer_properties == NULL);
 }
 
-static void write_gpencil(WriteData *wd, bGPdata *gpd)
+static void write_gpencil(WriteData *wd, bGPdata *gpd, const void *id_address)
 {
   if (gpd->id.us > 0 || wd->use_memfile) {
     /* write gpd data block to file */
-    writestruct(wd, ID_GD, bGPdata, 1, gpd);
+    writestruct_at_address(wd, ID_GD, bGPdata, 1, id_address, gpd);
     write_iddata(wd, &gpd->id);
 
     if (gpd->adt) {
@@ -3066,9 +3057,9 @@ static void write_area_map(WriteData *wd, ScrAreaMap *area_map)
   }
 }
 
-static void write_windowmanager(WriteData *wd, wmWindowManager *wm)
+static void write_windowmanager(WriteData *wd, wmWindowManager *wm, const void *id_address)
 {
-  writestruct(wd, ID_WM, wmWindowManager, 1, wm);
+  writestruct_at_address(wd, ID_W

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list