diff options
Diffstat (limited to 'source/blender/blenloader/intern/writefile.c')
-rw-r--r-- | source/blender/blenloader/intern/writefile.c | 138 |
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__ */ |