Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLukas Tönne <lukas.toenne@gmail.com>2016-06-16 10:18:40 +0300
committerLukas Tönne <lukas.toenne@gmail.com>2016-06-16 10:18:40 +0300
commite197ce618b2c8b063776e79d8f9304a7e65aec02 (patch)
tree61e3da1abfb5b1c80ab9cf478cf561983ddc28c7 /source/blender/blenloader/intern/writefile.c
parent926819d82f7ab63d03c65197fd59f14259fc08fa (diff)
parent57cff46cec9599e5897de72f45ce735da79db0ff (diff)
Merge branch 'master' into object_nodes
Diffstat (limited to 'source/blender/blenloader/intern/writefile.c')
-rw-r--r--source/blender/blenloader/intern/writefile.c235
1 files changed, 120 insertions, 115 deletions
diff --git a/source/blender/blenloader/intern/writefile.c b/source/blender/blenloader/intern/writefile.c
index 60a546ec3ee..45f4e59f86d 100644
--- a/source/blender/blenloader/intern/writefile.c
+++ b/source/blender/blenloader/intern/writefile.c
@@ -588,6 +588,14 @@ void IDP_WriteProperty(IDProperty *prop, void *wd)
IDP_WriteProperty_OnlyData(prop, wd);
}
+static void write_iddata(void *wd, ID *id)
+{
+ /* ID_WM's id->properties are considered runtime only, and never written in .blend file. */
+ if (id->properties && !ELEM(GS(id->name), ID_WM)) {
+ IDP_WriteProperty(id->properties, wd);
+ }
+}
+
static void write_previews(WriteData *wd, PreviewImage *prv)
{
/* Never write previews when doing memsave (i.e. undo/redo)! */
@@ -716,8 +724,8 @@ static void write_actions(WriteData *wd, ListBase *idbase)
for (act=idbase->first; act; act= act->id.next) {
if (act->id.us>0 || wd->current) {
writestruct(wd, ID_AC, "bAction", 1, act);
- if (act->id.properties) IDP_WriteProperty(act->id.properties, wd);
-
+ write_iddata(wd, &act->id);
+
write_fcurves(wd, &act->curves);
for (grp=act->groups.first; grp; grp=grp->next) {
@@ -1153,7 +1161,8 @@ static void write_particlesettings(WriteData *wd, ListBase *idbase)
if (part->id.us>0 || wd->current) {
/* write LibData */
writestruct(wd, ID_PA, "ParticleSettings", 1, part);
- if (part->id.properties) IDP_WriteProperty(part->id.properties, wd);
+ write_iddata(wd, &part->id);
+
if (part->adt) write_animdata(wd, part->adt);
writestruct(wd, DATA, "PartDeflect", 1, part->pd);
writestruct(wd, DATA, "PartDeflect", 1, part->pd2);
@@ -1666,11 +1675,8 @@ static void write_objects(WriteData *wd, ListBase *idbase)
if (ob->id.us>0 || wd->current) {
/* write LibData */
writestruct(wd, ID_OB, "Object", 1, ob);
-
- /* Write ID Properties -- and copy this comment EXACTLY for easy finding
- * of library blocks that implement this.*/
- if (ob->id.properties) IDP_WriteProperty(ob->id.properties, wd);
-
+ write_iddata(wd, &ob->id);
+
if (ob->adt) write_animdata(wd, ob->adt);
/* direct data */
@@ -1741,7 +1747,7 @@ static void write_vfonts(WriteData *wd, ListBase *idbase)
if (vf->id.us>0 || wd->current) {
/* write LibData */
writestruct(wd, ID_VF, "VFont", 1, vf);
- if (vf->id.properties) IDP_WriteProperty(vf->id.properties, wd);
+ write_iddata(wd, &vf->id);
/* direct data */
@@ -1767,8 +1773,8 @@ static void write_keys(WriteData *wd, ListBase *idbase)
if (key->id.us>0 || wd->current) {
/* write LibData */
writestruct(wd, ID_KE, "Key", 1, key);
- if (key->id.properties) IDP_WriteProperty(key->id.properties, wd);
-
+ write_iddata(wd, &key->id);
+
if (key->adt) write_animdata(wd, key->adt);
/* direct data */
@@ -1795,8 +1801,8 @@ static void write_cameras(WriteData *wd, ListBase *idbase)
if (cam->id.us>0 || wd->current) {
/* write LibData */
writestruct(wd, ID_CA, "Camera", 1, cam);
- if (cam->id.properties) IDP_WriteProperty(cam->id.properties, wd);
-
+ write_iddata(wd, &cam->id);
+
if (cam->adt) write_animdata(wd, cam->adt);
}
@@ -1814,7 +1820,7 @@ static void write_mballs(WriteData *wd, ListBase *idbase)
if (mb->id.us>0 || wd->current) {
/* write LibData */
writestruct(wd, ID_MB, "MetaBall", 1, mb);
- if (mb->id.properties) IDP_WriteProperty(mb->id.properties, wd);
+ write_iddata(wd, &mb->id);
/* direct data */
writedata(wd, DATA, sizeof(void *)*mb->totcol, mb->mat);
@@ -1840,10 +1846,10 @@ static void write_curves(WriteData *wd, ListBase *idbase)
if (cu->id.us>0 || wd->current) {
/* write LibData */
writestruct(wd, ID_CU, "Curve", 1, cu);
-
+ write_iddata(wd, &cu->id);
+
/* direct data */
writedata(wd, DATA, sizeof(void *)*cu->totcol, cu->mat);
- if (cu->id.properties) IDP_WriteProperty(cu->id.properties, wd);
if (cu->adt) write_animdata(wd, cu->adt);
if (cu->vfont) {
@@ -2035,9 +2041,9 @@ static void write_meshes(WriteData *wd, ListBase *idbase)
CustomData_file_write_prepare(&mesh->pdata, &players, players_buff, ARRAY_SIZE(players_buff));
writestruct_at_address(wd, ID_ME, "Mesh", 1, old_mesh, mesh);
+ write_iddata(wd, &mesh->id);
/* direct data */
- if (mesh->id.properties) IDP_WriteProperty(mesh->id.properties, wd);
if (mesh->adt) write_animdata(wd, mesh->adt);
writedata(wd, DATA, sizeof(void *)*mesh->totcol, mesh->mat);
@@ -2093,9 +2099,9 @@ static void write_meshes(WriteData *wd, ListBase *idbase)
#endif
writestruct_at_address(wd, ID_ME, "Mesh", 1, old_mesh, mesh);
+ write_iddata(wd, &mesh->id);
/* direct data */
- if (mesh->id.properties) IDP_WriteProperty(mesh->id.properties, wd);
if (mesh->adt) write_animdata(wd, mesh->adt);
writedata(wd, DATA, sizeof(void *)*mesh->totcol, mesh->mat);
@@ -2148,8 +2154,8 @@ static void write_lattices(WriteData *wd, ListBase *idbase)
if (lt->id.us>0 || wd->current) {
/* write LibData */
writestruct(wd, ID_LT, "Lattice", 1, lt);
- if (lt->id.properties) IDP_WriteProperty(lt->id.properties, wd);
-
+ write_iddata(wd, &lt->id);
+
/* write animdata */
if (lt->adt) write_animdata(wd, lt->adt);
@@ -2182,7 +2188,7 @@ static void write_images(WriteData *wd, ListBase *idbase)
/* write LibData */
writestruct(wd, ID_IM, "Image", 1, ima);
- if (ima->id.properties) IDP_WriteProperty(ima->id.properties, wd);
+ write_iddata(wd, &ima->id);
for (imapf = ima->packedfiles.first; imapf; imapf = imapf->next) {
writestruct(wd, DATA, "ImagePackedFile", 1, imapf);
@@ -2216,7 +2222,7 @@ static void write_textures(WriteData *wd, ListBase *idbase)
if (tex->id.us>0 || wd->current) {
/* write LibData */
writestruct(wd, ID_TE, "Tex", 1, tex);
- if (tex->id.properties) IDP_WriteProperty(tex->id.properties, wd);
+ write_iddata(wd, &tex->id);
if (tex->adt) write_animdata(wd, tex->adt);
@@ -2256,13 +2262,8 @@ static void write_materials(WriteData *wd, ListBase *idbase)
if (ma->id.us>0 || wd->current) {
/* write LibData */
writestruct(wd, ID_MA, "Material", 1, ma);
-
- /* Write ID Properties -- and copy this comment EXACTLY for easy finding
- * of library blocks that implement this.*/
- /* manually set head group property to IDP_GROUP, just in case it hadn't been
- * set yet :) */
- if (ma->id.properties) IDP_WriteProperty(ma->id.properties, wd);
-
+ write_iddata(wd, &ma->id);
+
if (ma->adt) write_animdata(wd, ma->adt);
for (a=0; a<MAX_MTEX; a++) {
@@ -2294,8 +2295,8 @@ static void write_worlds(WriteData *wd, ListBase *idbase)
if (wrld->id.us>0 || wd->current) {
/* write LibData */
writestruct(wd, ID_WO, "World", 1, wrld);
- if (wrld->id.properties) IDP_WriteProperty(wrld->id.properties, wd);
-
+ write_iddata(wd, &wrld->id);
+
if (wrld->adt) write_animdata(wd, wrld->adt);
for (a=0; a<MAX_MTEX; a++) {
@@ -2324,8 +2325,8 @@ static void write_lamps(WriteData *wd, ListBase *idbase)
if (la->id.us>0 || wd->current) {
/* write LibData */
writestruct(wd, ID_LA, "Lamp", 1, la);
- if (la->id.properties) IDP_WriteProperty(la->id.properties, wd);
-
+ write_iddata(wd, &la->id);
+
if (la->adt) write_animdata(wd, la->adt);
/* direct data */
@@ -2409,8 +2410,8 @@ static void write_scenes(WriteData *wd, ListBase *scebase)
while (sce) {
/* write LibData */
writestruct(wd, ID_SCE, "Scene", 1, sce);
- if (sce->id.properties) IDP_WriteProperty(sce->id.properties, wd);
-
+ write_iddata(wd, &sce->id);
+
if (sce->adt) write_animdata(wd, sce->adt);
write_keyingsets(wd, &sce->keyingsets);
@@ -2591,7 +2592,8 @@ static void write_gpencils(WriteData *wd, ListBase *lb)
if (gpd->id.us>0 || wd->current) {
/* write gpd data block to file */
writestruct(wd, ID_GD, "bGPdata", 1, gpd);
-
+ write_iddata(wd, &gpd->id);
+
if (gpd->adt) write_animdata(wd, gpd->adt);
/* write grease-pencil layers to file */
@@ -2620,7 +2622,8 @@ static void write_windowmanagers(WriteData *wd, ListBase *lb)
for (wm= lb->first; wm; wm= wm->id.next) {
writestruct(wd, ID_WM, "wmWindowManager", 1, wm);
-
+ write_iddata(wd, &wm->id);
+
for (win= wm->windows.first; win; win= win->next) {
writestruct(wd, DATA, "wmWindow", 1, win);
writestruct(wd, DATA, "Stereo3dFormat", 1, win->stereo3d_format);
@@ -2720,9 +2723,8 @@ static void write_screens(WriteData *wd, ListBase *scrbase)
/* write LibData */
/* in 2.50+ files, the file identifier for screens is patched, forward compatibility */
writestruct(wd, ID_SCRN, "Screen", 1, sc);
- if (sc->id.properties)
- IDP_WriteProperty(sc->id.properties, wd);
-
+ write_iddata(wd, &sc->id);
+
/* direct data */
for (sv= sc->vertbase.first; sv; sv= sv->next)
writestruct(wd, DATA, "ScrVert", 1, sv);
@@ -2877,63 +2879,6 @@ static void write_screens(WriteData *wd, ListBase *scrbase)
mywrite(wd, MYWRITE_FLUSH, 0);
}
-static void write_libraries(WriteData *wd, Main *main)
-{
- ListBase *lbarray[MAX_LIBARRAY];
- ID *id;
- int a, tot;
- bool found_one;
-
- for (; main; main= main->next) {
-
- a=tot= set_listbasepointers(main, lbarray);
-
- /* test: is lib being used */
- if (main->curlib && main->curlib->packedfile)
- found_one = true;
- else {
- found_one = false;
- while (tot--) {
- for (id= lbarray[tot]->first; id; id= id->next) {
- if (id->us > 0 && (id->tag & LIB_TAG_EXTERN)) {
- found_one = true;
- break;
- }
- }
- if (found_one) break;
- }
- }
-
- /* to be able to restore quit.blend and temp saves, the packed blend has to be in undo buffers... */
- /* XXX needs rethink, just like save UI in undo files now - would be nice to append things only for the]
- * quit.blend and temp saves */
- if (found_one) {
- writestruct(wd, ID_LI, "Library", 1, main->curlib);
-
- if (main->curlib->packedfile) {
- PackedFile *pf = main->curlib->packedfile;
- writestruct(wd, DATA, "PackedFile", 1, pf);
- writedata(wd, DATA, pf->size, pf->data);
- if (wd->current == NULL)
- printf("write packed .blend: %s\n", main->curlib->name);
- }
-
- while (a--) {
- for (id= lbarray[a]->first; id; id= id->next) {
- if (id->us > 0 && (id->tag & LIB_TAG_EXTERN)) {
- if (!BKE_idcode_is_linkable(GS(id->name))) {
- printf("ERROR: write file: datablock '%s' from lib '%s' is not linkable "
- "but is flagged as directly linked", id->name, main->curlib->filepath);
- BLI_assert(0);
- }
- writestruct(wd, ID_ID, "ID", 1, id);
- }
- }
- }
- }
- }
-}
-
static void write_bone(WriteData *wd, Bone *bone)
{
Bone* cbone;
@@ -2966,7 +2911,7 @@ static void write_armatures(WriteData *wd, ListBase *idbase)
while (arm) {
if (arm->id.us>0 || wd->current) {
writestruct(wd, ID_AR, "bArmature", 1, arm);
- if (arm->id.properties) IDP_WriteProperty(arm->id.properties, wd);
+ write_iddata(wd, &arm->id);
if (arm->adt) write_animdata(wd, arm->adt);
@@ -2995,8 +2940,9 @@ static void write_texts(WriteData *wd, ListBase *idbase)
/* write LibData */
writestruct(wd, ID_TXT, "Text", 1, text);
+ write_iddata(wd, &text->id);
+
if (text->name) writedata(wd, DATA, strlen(text->name)+1, text->name);
- if (text->id.properties) IDP_WriteProperty(text->id.properties, wd);
if (!(text->flags & TXT_ISEXT)) {
/* now write the text data, in two steps for optimization in the readfunction */
@@ -3030,7 +2976,7 @@ static void write_speakers(WriteData *wd, ListBase *idbase)
if (spk->id.us>0 || wd->current) {
/* write LibData */
writestruct(wd, ID_SPK, "Speaker", 1, spk);
- if (spk->id.properties) IDP_WriteProperty(spk->id.properties, wd);
+ write_iddata(wd, &spk->id);
if (spk->adt) write_animdata(wd, spk->adt);
}
@@ -3049,7 +2995,7 @@ static void write_sounds(WriteData *wd, ListBase *idbase)
if (sound->id.us>0 || wd->current) {
/* write LibData */
writestruct(wd, ID_SO, "bSound", 1, sound);
- if (sound->id.properties) IDP_WriteProperty(sound->id.properties, wd);
+ write_iddata(wd, &sound->id);
if (sound->packedfile) {
pf = sound->packedfile;
@@ -3073,7 +3019,7 @@ static void write_groups(WriteData *wd, ListBase *idbase)
if (group->id.us>0 || wd->current) {
/* write LibData */
writestruct(wd, ID_GR, "Group", 1, group);
- if (group->id.properties) IDP_WriteProperty(group->id.properties, wd);
+ write_iddata(wd, &group->id);
write_previews(wd, group->preview);
@@ -3093,11 +3039,11 @@ static void write_nodetrees(WriteData *wd, ListBase *idbase)
for (ntree=idbase->first; ntree; ntree= ntree->id.next) {
if (ntree->id.us>0 || wd->current) {
writestruct(wd, ID_NT, "bNodeTree", 1, ntree);
+ /* Note that trees directly used by other IDs (materials etc.) are not 'real' ID, they cannot
+ * be linked, etc., so we write actual id data here only, for 'real' ID trees. */
+ write_iddata(wd, &ntree->id);
+
write_nodetree(wd, ntree);
-
- if (ntree->id.properties) IDP_WriteProperty(ntree->id.properties, wd);
-
- if (ntree->adt) write_animdata(wd, ntree->adt);
}
}
}
@@ -3176,8 +3122,8 @@ static void write_brushes(WriteData *wd, ListBase *idbase)
for (brush=idbase->first; brush; brush= brush->id.next) {
if (brush->id.us>0 || wd->current) {
writestruct(wd, ID_BR, "Brush", 1, brush);
- if (brush->id.properties) IDP_WriteProperty(brush->id.properties, wd);
-
+ write_iddata(wd, &brush->id);
+
if (brush->curve)
write_curvemapping(wd, brush->curve);
if (brush->gradient)
@@ -3194,7 +3140,7 @@ static void write_palettes(WriteData *wd, ListBase *idbase)
if (palette->id.us > 0 || wd->current) {
PaletteColor *color;
writestruct(wd, ID_PAL, "Palette", 1, palette);
- if (palette->id.properties) IDP_WriteProperty(palette->id.properties, wd);
+ write_iddata(wd, &palette->id);
for (color = palette->colors.first; color; color= color->next)
writestruct(wd, DATA, "PaletteColor", 1, color);
@@ -3209,9 +3155,9 @@ static void write_paintcurves(WriteData *wd, ListBase *idbase)
for (pc = idbase->first; pc; pc = pc->id.next) {
if (pc->id.us > 0 || wd->current) {
writestruct(wd, ID_PC, "PaintCurve", 1, pc);
+ write_iddata(wd, &pc->id);
writestruct(wd, DATA, "PaintCurvePoint", pc->tot_points, pc->points);
- if (pc->id.properties) IDP_WriteProperty(pc->id.properties, wd);
}
}
}
@@ -3261,10 +3207,9 @@ static void write_movieclips(WriteData *wd, ListBase *idbase)
if (clip->id.us>0 || wd->current) {
MovieTracking *tracking= &clip->tracking;
MovieTrackingObject *object;
- writestruct(wd, ID_MC, "MovieClip", 1, clip);
- if (clip->id.properties)
- IDP_WriteProperty(clip->id.properties, wd);
+ writestruct(wd, ID_MC, "MovieClip", 1, clip);
+ write_iddata(wd, &clip->id);
if (clip->adt)
write_animdata(wd, clip->adt);
@@ -3302,6 +3247,7 @@ static void write_masks(WriteData *wd, ListBase *idbase)
MaskLayer *masklay;
writestruct(wd, ID_MSK, "Mask", 1, mask);
+ write_iddata(wd, &mask->id);
if (mask->adt)
write_animdata(wd, mask->adt);
@@ -3607,8 +3553,8 @@ static void write_linestyles(WriteData *wd, ListBase *idbase)
for (linestyle = idbase->first; linestyle; linestyle = linestyle->id.next) {
if (linestyle->id.us>0 || wd->current) {
writestruct(wd, ID_LS, "FreestyleLineStyle", 1, linestyle);
- if (linestyle->id.properties)
- IDP_WriteProperty(linestyle->id.properties, wd);
+ write_iddata(wd, &linestyle->id);
+
if (linestyle->adt)
write_animdata(wd, linestyle->adt);
write_linestyle_color_modifiers(wd, &linestyle->color_modifiers);
@@ -3626,6 +3572,65 @@ static void write_linestyles(WriteData *wd, ListBase *idbase)
}
}
+/* Keep it last of write_foodata functions. */
+static void write_libraries(WriteData *wd, Main *main)
+{
+ ListBase *lbarray[MAX_LIBARRAY];
+ ID *id;
+ int a, tot;
+ bool found_one;
+
+ for (; main; main= main->next) {
+
+ a=tot= set_listbasepointers(main, lbarray);
+
+ /* test: is lib being used */
+ if (main->curlib && main->curlib->packedfile)
+ found_one = true;
+ else {
+ found_one = false;
+ while (tot--) {
+ for (id= lbarray[tot]->first; id; id= id->next) {
+ if (id->us > 0 && (id->tag & LIB_TAG_EXTERN)) {
+ found_one = true;
+ break;
+ }
+ }
+ if (found_one) break;
+ }
+ }
+
+ /* to be able to restore quit.blend and temp saves, the packed blend has to be in undo buffers... */
+ /* XXX needs rethink, just like save UI in undo files now - would be nice to append things only for the]
+ * quit.blend and temp saves */
+ if (found_one) {
+ writestruct(wd, ID_LI, "Library", 1, main->curlib);
+ write_iddata(wd, &main->curlib->id);
+
+ if (main->curlib->packedfile) {
+ PackedFile *pf = main->curlib->packedfile;
+ writestruct(wd, DATA, "PackedFile", 1, pf);
+ writedata(wd, DATA, pf->size, pf->data);
+ if (wd->current == NULL)
+ printf("write packed .blend: %s\n", main->curlib->name);
+ }
+
+ while (a--) {
+ for (id= lbarray[a]->first; id; id= id->next) {
+ if (id->us > 0 && (id->tag & LIB_TAG_EXTERN)) {
+ if (!BKE_idcode_is_linkable(GS(id->name))) {
+ printf("ERROR: write file: datablock '%s' from lib '%s' is not linkable "
+ "but is flagged as directly linked", id->name, main->curlib->filepath);
+ BLI_assert(0);
+ }
+ writestruct(wd, ID_ID, "ID", 1, id);
+ }
+ }
+ }
+ }
+ }
+}
+
/* context is usually defined by WM, two cases where no WM is available:
* - for forward compatibility, curscreen has to be saved
* - for undofile, curscene needs to be saved */