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.c69
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.");