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:
Diffstat (limited to 'source/blender/blenloader/intern/writefile.c')
-rw-r--r--source/blender/blenloader/intern/writefile.c138
1 files changed, 73 insertions, 65 deletions
diff --git a/source/blender/blenloader/intern/writefile.c b/source/blender/blenloader/intern/writefile.c
index e06e7eb2d85..96611b6fa9d 100644
--- a/source/blender/blenloader/intern/writefile.c
+++ b/source/blender/blenloader/intern/writefile.c
@@ -1,7 +1,4 @@
-/* writefile.c
- *
- * .blend file writing
- *
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -23,9 +20,8 @@
* The Original Code is Copyright (C) 2001-2002 by NaN Holding BV.
* All rights reserved.
*
- * The Original Code is: all of this file.
*
- * Contributor(s): none yet.
+ * Contributor(s): Blender Foundation
*
* ***** END GPL LICENSE BLOCK *****
*/
@@ -71,10 +67,6 @@ Any case: direct data is ALWAYS after the lib block
- write USER if filename is ~/.B.blend
*/
-/* for version 2.2+
-Important to know is that 'streaming' has been added to files, for Blender Publisher
-*/
-
#ifdef HAVE_CONFIG_H
#include <config.h>
@@ -97,8 +89,6 @@ Important to know is that 'streaming' has been added to files, for Blender Publi
#include <string.h>
#include <stdlib.h>
-#include "nla.h" // __NLA is defined
-
#include "DNA_armature_types.h"
#include "DNA_action_types.h"
#include "DNA_actuator_types.h"
@@ -111,6 +101,7 @@ Important to know is that 'streaming' has been added to files, for Blender Publi
#include "DNA_curve_types.h"
#include "DNA_customdata_types.h"
#include "DNA_effect_types.h"
+#include "DNA_genfile.h"
#include "DNA_group_types.h"
#include "DNA_gpencil_types.h"
#include "DNA_image_types.h"
@@ -146,13 +137,13 @@ Important to know is that 'streaming' has been added to files, for Blender Publi
#include "DNA_vfont_types.h"
#include "DNA_userdef_types.h"
#include "DNA_world_types.h"
+#include "DNA_windowmanager_types.h"
#include "MEM_guardedalloc.h" // MEM_freeN
#include "BLI_blenlib.h"
#include "BLI_linklist.h"
#include "BKE_action.h"
-#include "BKE_bad_level_calls.h" // build_seqar (from WHILE_SEQ) free_oops error
#include "BKE_blender.h"
#include "BKE_cloth.h"
#include "BKE_curve.h"
@@ -171,7 +162,7 @@ Important to know is that 'streaming' has been added to files, for Blender Publi
#include "BKE_idprop.h"
#ifdef WITH_VERSE
#include "BKE_verse.h"
-#include "BIF_verse.h"
+//XXX #include "BIF_verse.h"
#endif
#include "BLO_writefile.h"
@@ -179,7 +170,6 @@ Important to know is that 'streaming' has been added to files, for Blender Publi
#include "BLO_undofile.h"
#include "readfile.h"
-#include "genfile.h"
#include <errno.h>
@@ -200,9 +190,6 @@ typedef struct {
static WriteData *writedata_new(int file)
{
- extern unsigned char DNAstr[]; /* DNA.c */
- extern int DNAlen;
-
WriteData *wd= MEM_callocN(sizeof(*wd), "writedata");
/* XXX, see note about this in readfile.c, remove
@@ -211,7 +198,7 @@ static WriteData *writedata_new(int file)
if (wd == NULL) return NULL;
- wd->sdna= dna_sdna_from_data(DNAstr, DNAlen, 0);
+ wd->sdna= DNA_sdna_from_data(DNAstr, DNAlen, 0);
wd->file= file;
@@ -238,7 +225,7 @@ static void writedata_do_write(WriteData *wd, void *mem, int memlen)
static void writedata_free(WriteData *wd)
{
- dna_freestructDNA(wd->sdna);
+ DNA_sdna_free(wd->sdna);
MEM_freeN(wd->buf);
MEM_freeN(wd);
@@ -356,7 +343,7 @@ static void writestruct(WriteData *wd, int filecode, char *structname, int nr, v
bh.old= adr;
bh.nr= nr;
- bh.SDNAnr= dna_findstruct_nr(wd->sdna, structname);
+ bh.SDNAnr= DNA_struct_find_nr(wd->sdna, structname);
if(bh.SDNAnr== -1) {
printf("error: can't find SDNA code <%s>\n", structname);
return;
@@ -491,14 +478,14 @@ static void write_scriptlink(WriteData *wd, ScriptLink *slink)
writedata(wd, DATA, sizeof(short)*slink->totscript, slink->flag);
}
-static void write_renderinfo(WriteData *wd) /* for renderdeamon */
+static void write_renderinfo(bContext *C, WriteData *wd) /* for renderdeamon */
{
Scene *sce;
int data[8];
sce= G.main->scene.first;
while(sce) {
- if(sce->id.lib==0 && ( sce==G.scene || (sce->r.scemode & R_BG_RENDER)) ) {
+ if(sce->id.lib==0 && ( sce==C->scene || (sce->r.scemode & R_BG_RENDER)) ) {
data[0]= sce->r.sfra;
data[1]= sce->r.efra;
@@ -1181,7 +1168,7 @@ static void write_meshs(WriteData *wd, ListBase *idbase)
struct VNode *vnode = (VNode*)mesh->vnode;
if(vnode) {
/* mesh has to be created from verse geometry node*/
- create_meshdata_from_geom_node(mesh, vnode);
+ //XXX create_meshdata_from_geom_node(mesh, vnode);
/* pointer at verse node can't be stored in file */
mesh->vnode = NULL;
}
@@ -1483,13 +1470,14 @@ static void write_scenes(WriteData *wd, ListBase *scebase)
writestruct(wd, DATA, "Editing", 1, ed);
/* reset write flags too */
- WHILE_SEQ(&ed->seqbase) {
+
+ WHILE_SEQ(&ed->seqbase) { //XXX todo replace WHILE_SEQ
if(seq->strip) seq->strip->done= 0;
writestruct(wd, DATA, "Sequence", 1, seq);
}
END_SEQ
- WHILE_SEQ(&ed->seqbase) {
+ WHILE_SEQ(&ed->seqbase) { //XXX todo replace WHILE_SEQ
if(seq->strip && seq->strip->done==0) {
/* write strip with 'done' at 0 because readfile */
@@ -1608,6 +1596,19 @@ static void write_gpencil(WriteData *wd, bGPdata *gpd)
}
}
+static void write_windowmanagers(WriteData *wd, ListBase *lb)
+{
+ wmWindowManager *wm;
+ wmWindow *win;
+
+ for(wm= lb->first; wm; wm= wm->id.next) {
+ writestruct(wd, ID_WM, "wmWindowManager", 1, wm);
+
+ for(win= wm->windows.first; win; win= win->next)
+ writestruct(wd, DATA, "wmWindow", 1, win);
+ }
+}
+
static void write_screens(WriteData *wd, ListBase *scrbase)
{
bScreen *sc;
@@ -1617,35 +1618,32 @@ static void write_screens(WriteData *wd, ListBase *scrbase)
sc= scrbase->first;
while(sc) {
+
/* write LibData */
- writestruct(wd, ID_SCR, "Screen", 1, sc);
- if (sc->id.properties) IDP_WriteProperty(sc->id.properties, wd);
+ /* 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);
/* direct data */
- sv= sc->vertbase.first;
- while(sv) {
+ for(sv= sc->vertbase.first; sv; sv= sv->next)
writestruct(wd, DATA, "ScrVert", 1, sv);
- sv= sv->next;
- }
- se= sc->edgebase.first;
- while(se) {
+ for(se= sc->edgebase.first; se; se= se->next)
writestruct(wd, DATA, "ScrEdge", 1, se);
- se= se->next;
- }
- sa= sc->areabase.first;
- while(sa) {
+ for(sa= sc->areabase.first; sa; sa= sa->next) {
SpaceLink *sl;
Panel *pa;
+ ARegion *ar;
writestruct(wd, DATA, "ScrArea", 1, sa);
- pa= sa->panels.first;
- while(pa) {
+ for(pa= sa->panels.first; pa; pa= pa->next)
writestruct(wd, DATA, "Panel", 1, pa);
- pa= pa->next;
- }
+
+ for(ar= sa->regionbase.first; ar; ar= ar->next)
+ writestruct(wd, DATA, "ARegion", 1, ar);
/* space handler scriptlinks */
write_scriptlink(wd, &sa->scriptlink);
@@ -1684,7 +1682,7 @@ static void write_screens(WriteData *wd, ListBase *scrbase)
Oops *oopsn= oops->next;
if(oops->id==0) {
BLI_remlink(&so->oops, oops);
- free_oops(oops);
+// XXX free_oops(oops);
}
oops= oopsn;
}
@@ -1743,8 +1741,6 @@ static void write_screens(WriteData *wd, ListBase *scrbase)
}
sl= sl->next;
}
-
- sa= sa->next;
}
sc= sc->id.next;
@@ -2014,13 +2010,17 @@ static void write_scripts(WriteData *wd, ListBase *idbase)
}
}
-static void write_global(WriteData *wd)
+/* 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 */
+/* XXX still remap G */
+static void write_global(bContext *C, WriteData *wd)
{
FileGlobal fg;
char subvstr[8];
- fg.curscreen= G.curscreen;
- fg.curscene= G.scene;
+ fg.curscreen= C->screen;
+ fg.curscene= C->scene;
fg.displaymode= G.displaymode;
fg.winpos= G.winpos;
fg.fileflags= (G.fileflags & ~G_FILE_NO_UI); // prevent to save this, is not good convention, and feature with concerns...
@@ -2037,7 +2037,8 @@ static void write_global(WriteData *wd)
}
/* if MemFile * there's filesave to memory */
-static int write_file_handle(int handle, MemFile *compare, MemFile *current, int write_user_block, int write_flags)
+static int write_file_handle(bContext *C, int handle, MemFile *compare, MemFile *current,
+ int write_user_block, int write_flags)
{
BHead bhead;
ListBase mainlist;
@@ -2051,11 +2052,14 @@ static int write_file_handle(int handle, MemFile *compare, MemFile *current, int
sprintf(buf, "BLENDER%c%c%.3d", (sizeof(void*)==8)?'-':'_', (G.order==B_ENDIAN)?'V':'v', G.version);
mywrite(wd, buf, 12);
- write_renderinfo(wd);
- write_global(wd);
+ write_renderinfo(C, wd);
+ write_global(C, wd);
- if(current==NULL)
- write_screens (wd, &G.main->screen); /* no UI save in undo */
+ /* no UI save in undo */
+ if(current==NULL) {
+ write_windowmanagers(wd, &G.main->wm);
+ write_screens (wd, &G.main->screen);
+ }
write_scenes (wd, &G.main->scene);
write_curves (wd, &G.main->curve);
write_mballs (wd, &G.main->mball);
@@ -2086,7 +2090,7 @@ static int write_file_handle(int handle, MemFile *compare, MemFile *current, int
if (write_user_block) {
write_userdef(wd);
}
-
+
/* dna as last, because (to be implemented) test for which structs are written */
writedata(wd, DNA1, wd->sdna->datalen, wd->sdna->data);
@@ -2102,7 +2106,7 @@ static int write_file_handle(int handle, MemFile *compare, MemFile *current, int
}
/* return: success (1) */
-int BLO_write_file(char *dir, int write_flags, char **error_r)
+int BLO_write_file(bContext *C, char *dir, int write_flags, char **error_r)
{
char userfilename[FILE_MAXDIR+FILE_MAXFILE];
char tempname[FILE_MAXDIR+FILE_MAXFILE];
@@ -2120,7 +2124,7 @@ int BLO_write_file(char *dir, int write_flags, char **error_r)
write_user_block= BLI_streq(dir, userfilename);
- err= write_file_handle(file, NULL,NULL, write_user_block, write_flags);
+ err= write_file_handle(C, file, NULL,NULL, write_user_block, write_flags);
close(file);
if(!err) {
@@ -2157,11 +2161,11 @@ int BLO_write_file(char *dir, int write_flags, char **error_r)
}
/* return: success (1) */
-int BLO_write_file_mem(MemFile *compare, MemFile *current, int write_flags, char **error_r)
+int BLO_write_file_mem(bContext *C, MemFile *compare, MemFile *current, int write_flags, char **error_r)
{
int err;
- err= write_file_handle(0, compare, current, 0, write_flags);
+ err= write_file_handle(C, 0, compare, current, 0, write_flags);
if(err==0) return 1;
return 0;
@@ -2259,7 +2263,8 @@ cleanup:
return 1;
}
-void BLO_write_runtime(char *file, char *exename) {
+void BLO_write_runtime(bContext *C, char *file, char *exename)
+{
char gamename[FILE_MAXDIR+FILE_MAXFILE];
int outfd = -1;
char *cause= NULL;
@@ -2277,7 +2282,7 @@ void BLO_write_runtime(char *file, char *exename) {
outfd= open(gamename, O_BINARY|O_WRONLY|O_CREAT|O_TRUNC, 0777);
if (outfd != -1) {
- write_file_handle(outfd, NULL,NULL, 0, G.fileflags);
+ write_file_handle(C, outfd, NULL,NULL, 0, G.fileflags);
if (write(outfd, " ", 1) != 1) {
cause= "Unable to write to output file";
@@ -2297,7 +2302,8 @@ cleanup:
#else /* !__APPLE__ */
-static int handle_append_runtime(int handle, char *exename, char **cause_r) {
+static int handle_append_runtime(int handle, char *exename, char **cause_r)
+{
char *cause= NULL, *runtime= get_runtime_path(exename);
unsigned char buf[1024];
int count, progfd= -1;
@@ -2333,7 +2339,8 @@ cleanup:
return 1;
}
-static int handle_write_msb_int(int handle, int i) {
+static int handle_write_msb_int(int handle, int i)
+{
unsigned char buf[4];
buf[0]= (i>>24)&0xFF;
buf[1]= (i>>16)&0xFF;
@@ -2343,7 +2350,8 @@ static int handle_write_msb_int(int handle, int i) {
return (write(handle, buf, 4)==4);
}
-void BLO_write_runtime(char *file, char *exename) {
+void BLO_write_runtime(bContext *C, char *file, char *exename)
+{
int outfd= open(file, O_BINARY|O_WRONLY|O_CREAT|O_TRUNC, 0777);
char *cause= NULL;
int datastart;
@@ -2357,7 +2365,7 @@ void BLO_write_runtime(char *file, char *exename) {
datastart= lseek(outfd, 0, SEEK_CUR);
- write_file_handle(outfd, NULL,NULL, 0, G.fileflags);
+ write_file_handle(C, outfd, NULL,NULL, 0, G.fileflags);
if (!handle_write_msb_int(outfd, datastart) || (write(outfd, "BRUNTIME", 8)!=8)) {
cause= "Unable to write to output file";
@@ -2369,7 +2377,7 @@ cleanup:
close(outfd);
if (cause)
- error("Unable to make runtime: %s", cause);
+ ; //XXX error("Unable to make runtime: %s", cause);
}
#endif /* !__APPLE__ */