diff options
Diffstat (limited to 'source/blender/blenloader/intern/writefile.c')
-rw-r--r-- | source/blender/blenloader/intern/writefile.c | 69 |
1 files changed, 46 insertions, 23 deletions
diff --git a/source/blender/blenloader/intern/writefile.c b/source/blender/blenloader/intern/writefile.c index 356d5e5d4f2..590a331c426 100644 --- a/source/blender/blenloader/intern/writefile.c +++ b/source/blender/blenloader/intern/writefile.c @@ -62,16 +62,13 @@ Any case: direct data is ALWAYS after the lib block - write library block - per LibBlock - write the ID of LibBlock +- write TEST (128x128, blend file preview, optional) - write FileGlobal (some global vars) - write SDNA - write USER if filename is ~/.B.blend */ -#ifdef HAVE_CONFIG_H -#include <config.h> -#endif - #include <math.h> #include <fcntl.h> #include <stdio.h> @@ -614,11 +611,11 @@ static void write_pointcaches(WriteData *wd, ListBase *ptcaches) for(; pm; pm=pm->next) { writestruct(wd, DATA, "PTCacheMem", 1, pm); if(pm->index_array) - writedata(wd, DATA, sizeof(int) * pm->totpoint, pm->index_array); + writedata(wd, DATA, MEM_allocN_len(pm->index_array), pm->index_array); for(i=0; i<BPHYS_TOT_DATA; i++) { if(pm->data[i] && pm->data_types & (1<<i)) - writedata(wd, DATA, BKE_ptcache_data_size(i) * pm->totpoint, pm->data[i]); + writedata(wd, DATA, MEM_allocN_len(pm->data[i]), pm->data[i]); } } } @@ -652,6 +649,9 @@ static void write_particlesettings(WriteData *wd, ListBase *idbase) for(; state; state=state->next) write_boid_state(wd, state); } + if(part->fluid && part->phystype == PART_PHYS_FLUID){ + writestruct(wd, DATA, "SPHFluidSettings", 1, part->fluid); + } } part= part->id.next; } @@ -1232,10 +1232,10 @@ static void write_modifiers(WriteData *wd, ListBase *modbase) MeshDeformModifierData *mmd = (MeshDeformModifierData*) md; int size = mmd->dyngridsize; - writedata(wd, DATA, sizeof(float)*mmd->totvert*mmd->totcagevert, - mmd->bindweights); + writestruct(wd, DATA, "MDefInfluence", mmd->totinfluence, mmd->bindinfluences); + writedata(wd, DATA, sizeof(int)*(mmd->totvert+1), mmd->bindoffsets); writedata(wd, DATA, sizeof(float)*3*mmd->totcagevert, - mmd->bindcos); + mmd->bindcagecos); writestruct(wd, DATA, "MDefCell", size*size*size, mmd->dyngrid); writestruct(wd, DATA, "MDefInfluence", mmd->totinfluence, mmd->dyninfluences); writedata(wd, DATA, sizeof(int)*mmd->totvert, mmd->dynverts); @@ -1267,6 +1267,14 @@ static void write_objects(WriteData *wd, ListBase *idbase) write_sensors(wd, &ob->sensors); write_controllers(wd, &ob->controllers); write_actuators(wd, &ob->actuators); + + if (ob->type == OB_ARMATURE) { + bArmature *arm = ob->data; + if (arm && ob->pose && arm->act_bone) { + strcpy(ob->pose->proxy_act_bone, arm->act_bone->name); + } + } + write_pose(wd, ob->pose); write_defgroups(wd, &ob->defbase); write_constraints(wd, &ob->constraints); @@ -1627,10 +1635,6 @@ static void write_images(WriteData *wd, ListBase *idbase) } write_previews(wd, ima->preview); - - /* exception: render text only saved in undo files (wd->current) */ - if (ima->render_text && wd->current) - writedata(wd, DATA, IMA_RW_MAXTEXT, ima->render_text); } ima= ima->id.next; } @@ -2115,7 +2119,15 @@ static void write_screens(WriteData *wd, ListBase *scrbase) writestruct(wd, DATA, "SpaceLogic", 1, sl); } else if(sl->spacetype==SPACE_CONSOLE) { + SpaceConsole *con = (SpaceConsole*)sl; + ConsoleLine *cl; + + for (cl=con->history.first; cl; cl=cl->next) { + writestruct(wd, DATA, "ConsoleLine", 1, cl); + writedata(wd, DATA, cl->len+1, cl->line); + } writestruct(wd, DATA, "SpaceConsole", 1, sl); + } else if(sl->spacetype==SPACE_USERPREF) { writestruct(wd, DATA, "SpaceUserPref", 1, sl); @@ -2381,9 +2393,19 @@ static void write_global(WriteData *wd, int fileflags, Main *mainvar) writestruct(wd, GLOB, "FileGlobal", 1, &fg); } +/* preview image, first 2 values are width and height + * second are an RGBA image (unsigned char) + * note, this uses 'TEST' since new types will segfault on file load for older blender versions. + */ +static void write_thumb(WriteData *wd, int *img) +{ + if(img) + writedata(wd, TEST, (2 + img[0] * img[1]) * sizeof(int), img); +} + /* if MemFile * there's filesave to memory */ static int write_file_handle(Main *mainvar, int handle, MemFile *compare, MemFile *current, - int write_user_block, int write_flags) + int write_user_block, int write_flags, int *thumb) { BHead bhead; ListBase mainlist; @@ -2398,6 +2420,7 @@ static int write_file_handle(Main *mainvar, int handle, MemFile *compare, MemFil mywrite(wd, buf, 12); write_renderinfo(wd, mainvar); + write_thumb(wd, thumb); write_global(wd, write_flags, mainvar); /* no UI save in undo */ @@ -2449,7 +2472,7 @@ static int write_file_handle(Main *mainvar, int handle, MemFile *compare, MemFil } /* return: success (1) */ -int BLO_write_file(Main *mainvar, char *dir, int write_flags, ReportList *reports) +int BLO_write_file(Main *mainvar, char *dir, int write_flags, ReportList *reports, int *thumb) { char userfilename[FILE_MAXDIR+FILE_MAXFILE]; char tempname[FILE_MAXDIR+FILE_MAXFILE+1]; @@ -2460,7 +2483,7 @@ int BLO_write_file(Main *mainvar, char *dir, int write_flags, ReportList *report file = open(tempname,O_BINARY+O_WRONLY+O_CREAT+O_TRUNC, 0666); if(file == -1) { - BKE_report(reports, RPT_ERROR, "Unable to open file for writing."); + BKE_reportf(reports, RPT_ERROR, "Can't open file %s for writing: %s.", tempname, strerror(errno)); return 0; } @@ -2468,8 +2491,8 @@ int BLO_write_file(Main *mainvar, char *dir, int write_flags, ReportList *report if(write_flags & G_FILE_RELATIVE_REMAP) { char dir1[FILE_MAXDIR+FILE_MAXFILE]; char dir2[FILE_MAXDIR+FILE_MAXFILE]; - BLI_split_dirfile_basic(dir, dir1, NULL); - BLI_split_dirfile_basic(mainvar->name, dir2, NULL); + BLI_split_dirfile(dir, dir1, NULL); + BLI_split_dirfile(mainvar->name, dir2, NULL); /* just incase there is some subtle difference */ BLI_cleanup_dir(mainvar->name, dir1); @@ -2481,14 +2504,14 @@ int BLO_write_file(Main *mainvar, char *dir, int write_flags, ReportList *report makeFilesAbsolute(G.sce, NULL); } - BLI_make_file_string(G.sce, userfilename, BLI_gethome(), ".B25.blend"); + BLI_make_file_string(G.sce, userfilename, BLI_get_folder_create(BLENDER_USER_CONFIG, NULL), BLENDER_STARTUP_FILE); write_user_block= BLI_streq(dir, userfilename); if(write_flags & G_FILE_RELATIVE_REMAP) makeFilesRelative(dir, NULL); /* note, making relative to something OTHER then G.sce */ /* actual file writing */ - err= write_file_handle(mainvar, file, NULL,NULL, write_user_block, write_flags); + err= write_file_handle(mainvar, file, NULL,NULL, write_user_block, write_flags, thumb); close(file); /* rename/compress */ @@ -2541,7 +2564,7 @@ int BLO_write_file_mem(Main *mainvar, MemFile *compare, MemFile *current, int wr { int err; - err= write_file_handle(mainvar, 0, compare, current, 0, write_flags); + err= write_file_handle(mainvar, 0, compare, current, 0, write_flags, NULL); if(err==0) return 1; return 0; @@ -2637,7 +2660,7 @@ int BLO_write_runtime(Main *mainvar, char *file, char *exename, ReportList *repo outfd= open(gamename, O_BINARY|O_WRONLY|O_CREAT|O_TRUNC, 0777); if (outfd != -1) { - write_file_handle(mainvar, outfd, NULL,NULL, 0, G.fileflags); + write_file_handle(mainvar, outfd, NULL,NULL, 0, G.fileflags, NULL); if (write(outfd, " ", 1) != 1) { BKE_report(reports, RPT_ERROR, "Unable to write to output file."); @@ -2723,7 +2746,7 @@ int BLO_write_runtime(Main *mainvar, char *file, char *exename, ReportList *repo datastart= lseek(outfd, 0, SEEK_CUR); - write_file_handle(mainvar, outfd, NULL,NULL, 0, G.fileflags); + write_file_handle(mainvar, outfd, NULL,NULL, 0, G.fileflags, NULL); if (!handle_write_msb_int(outfd, datastart) || (write(outfd, "BRUNTIME", 8)!=8)) { BKE_report(reports, RPT_ERROR, "Unable to write to output file."); |