diff options
Diffstat (limited to 'source/blender/blenloader/intern/writefile.c')
-rw-r--r-- | source/blender/blenloader/intern/writefile.c | 569 |
1 files changed, 313 insertions, 256 deletions
diff --git a/source/blender/blenloader/intern/writefile.c b/source/blender/blenloader/intern/writefile.c index cd5e31cc1d4..2f8feb9b9da 100644 --- a/source/blender/blenloader/intern/writefile.c +++ b/source/blender/blenloader/intern/writefile.c @@ -129,6 +129,7 @@ Any case: direct data is ALWAYS after the lib block #include "BLI_blenlib.h" #include "BLI_linklist.h" #include "BLI_bpath.h" +#include "BLI_utildefines.h" #include "BKE_action.h" #include "BKE_blender.h" @@ -140,9 +141,10 @@ Any case: direct data is ALWAYS after the lib block #include "BKE_node.h" #include "BKE_report.h" #include "BKE_sequencer.h" -#include "BKE_utildefines.h" // for defines +#include "BKE_utildefines.h" #include "BKE_modifier.h" #include "BKE_fcurve.h" +#include "BKE_pointcache.h" #include "BLO_writefile.h" #include "BLO_readfile.h" @@ -212,8 +214,6 @@ static void writedata_free(WriteData *wd) /***/ -int mywfile; - /** * Low level WRITE(2) wrapper that buffers data * @param adr Pointer to new chunk of data @@ -273,7 +273,7 @@ static void mywrite( WriteData *wd, void *adr, int len) * @param write_flags Write parameters * @warning Talks to other functions with global parameters */ -static WriteData *bgnwrite(int file, MemFile *compare, MemFile *current, int write_flags) +static WriteData *bgnwrite(int file, MemFile *compare, MemFile *current) { WriteData *wd= writedata_new(file); @@ -310,7 +310,7 @@ static int endwrite(WriteData *wd) /* ********** WRITE FILE ****************** */ -static void writestruct(WriteData *wd, int filecode, char *structname, int nr, void *adr) +static void writestruct(WriteData *wd, int filecode, const char *structname, int nr, void *adr) { BHead bh; short *sp; @@ -341,7 +341,7 @@ static void writedata(WriteData *wd, int filecode, int len, void *adr) /* do not { BHead bh; - if(adr==0) return; + if(adr==NULL) return; if(len==0) return; len+= 3; @@ -362,7 +362,6 @@ static void writedata(WriteData *wd, int filecode, int len, void *adr) /* do not /*These functions are used by blender's .blend system for file saving/loading.*/ void IDP_WriteProperty_OnlyData(IDProperty *prop, void *wd); void IDP_WriteProperty(IDProperty *prop, void *wd); -static void write_animdata(WriteData *wd, AnimData *adt); // XXX code needs reshuffling, but not before NLA SoC is merged back into 2.5 static void IDP_WriteArray(IDProperty *prop, void *wd) { @@ -434,6 +433,200 @@ void IDP_WriteProperty(IDProperty *prop, void *wd) IDP_WriteProperty_OnlyData(prop, wd); } +static void write_fmodifiers(WriteData *wd, ListBase *fmodifiers) +{ + FModifier *fcm; + + /* Modifiers */ + for (fcm= fmodifiers->first; fcm; fcm= fcm->next) { + FModifierTypeInfo *fmi= fmodifier_get_typeinfo(fcm); + + /* Write the specific data */ + if (fmi && fcm->data) { + /* firstly, just write the plain fmi->data struct */ + writestruct(wd, DATA, fmi->structName, 1, fcm->data); + + /* do any modifier specific stuff */ + switch (fcm->type) { + case FMODIFIER_TYPE_GENERATOR: + { + FMod_Generator *data= (FMod_Generator *)fcm->data; + + /* write coefficients array */ + if (data->coefficients) + writedata(wd, DATA, sizeof(float)*(data->arraysize), data->coefficients); + } + break; + case FMODIFIER_TYPE_ENVELOPE: + { + FMod_Envelope *data= (FMod_Envelope *)fcm->data; + + /* write envelope data */ + if (data->data) + writedata(wd, DATA, sizeof(FCM_EnvelopeData)*(data->totvert), data->data); + } + break; + case FMODIFIER_TYPE_PYTHON: + { + FMod_Python *data = (FMod_Python *)fcm->data; + + /* Write ID Properties -- and copy this comment EXACTLY for easy finding + of library blocks that implement this.*/ + IDP_WriteProperty(data->prop, wd); + } + break; + } + } + + /* Write the modifier */ + writestruct(wd, DATA, "FModifier", 1, fcm); + } +} + +static void write_fcurves(WriteData *wd, ListBase *fcurves) +{ + FCurve *fcu; + + for (fcu=fcurves->first; fcu; fcu=fcu->next) { + /* F-Curve */ + writestruct(wd, DATA, "FCurve", 1, fcu); + + /* curve data */ + if (fcu->bezt) + writestruct(wd, DATA, "BezTriple", fcu->totvert, fcu->bezt); + if (fcu->fpt) + writestruct(wd, DATA, "FPoint", fcu->totvert, fcu->fpt); + + if (fcu->rna_path) + writedata(wd, DATA, strlen(fcu->rna_path)+1, fcu->rna_path); + + /* driver data */ + if (fcu->driver) { + ChannelDriver *driver= fcu->driver; + DriverVar *dvar; + + writestruct(wd, DATA, "ChannelDriver", 1, driver); + + /* variables */ + for (dvar= driver->variables.first; dvar; dvar= dvar->next) { + writestruct(wd, DATA, "DriverVar", 1, dvar); + + DRIVER_TARGETS_USED_LOOPER(dvar) + { + if (dtar->rna_path) + writedata(wd, DATA, strlen(dtar->rna_path)+1, dtar->rna_path); + } + DRIVER_TARGETS_LOOPER_END + } + } + + /* write F-Modifiers */ + write_fmodifiers(wd, &fcu->modifiers); + } +} + +static void write_actions(WriteData *wd, ListBase *idbase) +{ + bAction *act; + bActionGroup *grp; + TimeMarker *marker; + + 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_fcurves(wd, &act->curves); + + for (grp=act->groups.first; grp; grp=grp->next) { + writestruct(wd, DATA, "bActionGroup", 1, grp); + } + + for (marker=act->markers.first; marker; marker=marker->next) { + writestruct(wd, DATA, "TimeMarker", 1, marker); + } + } + } + + /* flush helps the compression for undo-save */ + mywrite(wd, MYWRITE_FLUSH, 0); +} + +static void write_keyingsets(WriteData *wd, ListBase *list) +{ + KeyingSet *ks; + KS_Path *ksp; + + for (ks= list->first; ks; ks= ks->next) { + /* KeyingSet */ + writestruct(wd, DATA, "KeyingSet", 1, ks); + + /* Paths */ + for (ksp= ks->paths.first; ksp; ksp= ksp->next) { + /* Path */ + writestruct(wd, DATA, "KS_Path", 1, ksp); + + if (ksp->rna_path) + writedata(wd, DATA, strlen(ksp->rna_path)+1, ksp->rna_path); + } + } +} + +static void write_nlastrips(WriteData *wd, ListBase *strips) +{ + NlaStrip *strip; + + for (strip= strips->first; strip; strip= strip->next) { + /* write the strip first */ + writestruct(wd, DATA, "NlaStrip", 1, strip); + + /* write the strip's F-Curves and modifiers */ + write_fcurves(wd, &strip->fcurves); + write_fmodifiers(wd, &strip->modifiers); + + /* write the strip's children */ + write_nlastrips(wd, &strip->strips); + } +} + +static void write_nladata(WriteData *wd, ListBase *nlabase) +{ + NlaTrack *nlt; + + /* write all the tracks */ + for (nlt= nlabase->first; nlt; nlt= nlt->next) { + /* write the track first */ + writestruct(wd, DATA, "NlaTrack", 1, nlt); + + /* write the track's strips */ + write_nlastrips(wd, &nlt->strips); + } +} + +static void write_animdata(WriteData *wd, AnimData *adt) +{ + AnimOverride *aor; + + /* firstly, just write the AnimData block */ + writestruct(wd, DATA, "AnimData", 1, adt); + + /* write drivers */ + write_fcurves(wd, &adt->drivers); + + /* write overrides */ + // FIXME: are these needed? + for (aor= adt->overrides.first; aor; aor= aor->next) { + /* overrides consist of base data + rna_path */ + writestruct(wd, DATA, "AnimOverride", 1, aor); + writedata(wd, DATA, strlen(aor->rna_path)+1, aor->rna_path); + } + + // TODO write the remaps (if they are needed) + + /* write NLA data */ + write_nladata(wd, &adt->nla_tracks); +} + static void write_curvemapping(WriteData *wd, CurveMapping *cumap) { int a; @@ -477,6 +670,12 @@ static void write_nodetree(WriteData *wd, bNodeTree *ntree) for(link= ntree->links.first; link; link= link->next) writestruct(wd, DATA, "bNodeLink", 1, link); + + /* external sockets */ + for(sock= ntree->inputs.first; sock; sock= sock->next) + writestruct(wd, DATA, "bNodeSocket", 1, sock); + for(sock= ntree->outputs.first; sock; sock= sock->next) + writestruct(wd, DATA, "bNodeSocket", 1, sock); } static void current_screen_compat(Main *mainvar, bScreen **screen) @@ -506,7 +705,7 @@ static void write_renderinfo(WriteData *wd, Main *mainvar) /* for renderdeamon data[1]= sce->r.efra; memset(data+2, 0, sizeof(int)*6); - strncpy((char *)(data+2), sce->id.name+2, 21); + BLI_strncpy((char *)(data+2), sce->id.name+2, sizeof(sce->id.name)-2); writedata(wd, REND, 32, data); } @@ -573,9 +772,22 @@ static void write_boid_state(WriteData *wd, BoidState *state) //for(; cond; cond=cond->next) // writestruct(wd, DATA, "BoidCondition", 1, cond); } -/* TODO: replace *cache with *cachelist once it's coded */ -#define PTCACHE_WRITE_PSYS 0 -#define PTCACHE_WRITE_CLOTH 1 + +/* update this also to readfile.c */ +static const char *ptcache_data_struct[] = { + "", // BPHYS_DATA_INDEX + "", // BPHYS_DATA_LOCATION + "", // BPHYS_DATA_VELOCITY + "", // BPHYS_DATA_ROTATION + "", // BPHYS_DATA_AVELOCITY / BPHYS_DATA_XCONST */ + "", // BPHYS_DATA_SIZE: + "", // BPHYS_DATA_TIMES: + "BoidData" // case BPHYS_DATA_BOIDS: +}; +static const char *ptcache_extra_struct[] = { + "", + "ParticleSpring" +}; static void write_pointcaches(WriteData *wd, ListBase *ptcaches) { PointCache *cache = ptcaches->first; @@ -588,13 +800,24 @@ static void write_pointcaches(WriteData *wd, ListBase *ptcaches) PTCacheMem *pm = cache->mem_cache.first; for(; pm; pm=pm->next) { + PTCacheExtra *extra = pm->extradata.first; + writestruct(wd, DATA, "PTCacheMem", 1, pm); - if(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, MEM_allocN_len(pm->data[i]), pm->data[i]); + if(pm->data[i] && pm->data_types & (1<<i)) { + if(strcmp(ptcache_data_struct[i], "")==0) + writedata(wd, DATA, MEM_allocN_len(pm->data[i]), pm->data[i]); + else + writestruct(wd, DATA, ptcache_data_struct[i], pm->totpoint, pm->data[i]); + } + } + + for(; extra; extra=extra->next) { + if(strcmp(ptcache_extra_struct[extra->type], "")==0) + continue; + writestruct(wd, DATA, "PTCacheExtra", 1, extra); + writestruct(wd, DATA, ptcache_extra_struct[extra->type], extra->totdata, extra->data); } } } @@ -604,6 +827,7 @@ static void write_particlesettings(WriteData *wd, ListBase *idbase) { ParticleSettings *part; ParticleDupliWeight *dw; + int a; part= idbase->first; while(part) { @@ -631,6 +855,10 @@ static void write_particlesettings(WriteData *wd, ListBase *idbase) if(part->fluid && part->phystype == PART_PHYS_FLUID){ writestruct(wd, DATA, "SPHFluidSettings", 1, part->fluid); } + + for(a=0; a<MAX_MTEX; a++) { + if(part->mtex[a]) writestruct(wd, DATA, "MTex", 1, part->mtex[a]); + } } part= part->id.next; } @@ -656,6 +884,9 @@ static void write_particlesystems(WriteData *wd, ListBase *particles) if(psys->particles->boid && psys->part->phystype == PART_PHYS_BOIDS) writestruct(wd, DATA, "BoidParticle", psys->totpart, psys->particles->boid); + + if(psys->part->fluid && psys->part->phystype == PART_PHYS_FLUID && (psys->part->fluid->flag & SPH_VISCOELASTIC_SPRINGS)) + writestruct(wd, DATA, "ParticleSpring", psys->tot_fluidsprings, psys->fluid_springs); } pt = psys->targets.first; for(; pt; pt=pt->next) @@ -846,200 +1077,6 @@ static void write_actuators(WriteData *wd, ListBase *lb) } } -static void write_fmodifiers(WriteData *wd, ListBase *fmodifiers) -{ - FModifier *fcm; - - /* Modifiers */ - for (fcm= fmodifiers->first; fcm; fcm= fcm->next) { - FModifierTypeInfo *fmi= fmodifier_get_typeinfo(fcm); - - /* Write the specific data */ - if (fmi && fcm->data) { - /* firstly, just write the plain fmi->data struct */ - writestruct(wd, DATA, fmi->structName, 1, fcm->data); - - /* do any modifier specific stuff */ - switch (fcm->type) { - case FMODIFIER_TYPE_GENERATOR: - { - FMod_Generator *data= (FMod_Generator *)fcm->data; - - /* write coefficients array */ - if (data->coefficients) - writedata(wd, DATA, sizeof(float)*(data->arraysize), data->coefficients); - } - break; - case FMODIFIER_TYPE_ENVELOPE: - { - FMod_Envelope *data= (FMod_Envelope *)fcm->data; - - /* write envelope data */ - if (data->data) - writedata(wd, DATA, sizeof(FCM_EnvelopeData)*(data->totvert), data->data); - } - break; - case FMODIFIER_TYPE_PYTHON: - { - FMod_Python *data = (FMod_Python *)fcm->data; - - /* Write ID Properties -- and copy this comment EXACTLY for easy finding - of library blocks that implement this.*/ - IDP_WriteProperty(data->prop, wd); - } - break; - } - } - - /* Write the modifier */ - writestruct(wd, DATA, "FModifier", 1, fcm); - } -} - -static void write_fcurves(WriteData *wd, ListBase *fcurves) -{ - FCurve *fcu; - - for (fcu=fcurves->first; fcu; fcu=fcu->next) { - /* F-Curve */ - writestruct(wd, DATA, "FCurve", 1, fcu); - - /* curve data */ - if (fcu->bezt) - writestruct(wd, DATA, "BezTriple", fcu->totvert, fcu->bezt); - if (fcu->fpt) - writestruct(wd, DATA, "FPoint", fcu->totvert, fcu->fpt); - - if (fcu->rna_path) - writedata(wd, DATA, strlen(fcu->rna_path)+1, fcu->rna_path); - - /* driver data */ - if (fcu->driver) { - ChannelDriver *driver= fcu->driver; - DriverVar *dvar; - - writestruct(wd, DATA, "ChannelDriver", 1, driver); - - /* variables */ - for (dvar= driver->variables.first; dvar; dvar= dvar->next) { - writestruct(wd, DATA, "DriverVar", 1, dvar); - - DRIVER_TARGETS_USED_LOOPER(dvar) - { - if (dtar->rna_path) - writedata(wd, DATA, strlen(dtar->rna_path)+1, dtar->rna_path); - } - DRIVER_TARGETS_LOOPER_END - } - } - - /* write F-Modifiers */ - write_fmodifiers(wd, &fcu->modifiers); - } -} - -static void write_actions(WriteData *wd, ListBase *idbase) -{ - bAction *act; - bActionGroup *grp; - TimeMarker *marker; - - 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_fcurves(wd, &act->curves); - - for (grp=act->groups.first; grp; grp=grp->next) { - writestruct(wd, DATA, "bActionGroup", 1, grp); - } - - for (marker=act->markers.first; marker; marker=marker->next) { - writestruct(wd, DATA, "TimeMarker", 1, marker); - } - } - } - - /* flush helps the compression for undo-save */ - mywrite(wd, MYWRITE_FLUSH, 0); -} - -static void write_keyingsets(WriteData *wd, ListBase *list) -{ - KeyingSet *ks; - KS_Path *ksp; - - for (ks= list->first; ks; ks= ks->next) { - /* KeyingSet */ - writestruct(wd, DATA, "KeyingSet", 1, ks); - - /* Paths */ - for (ksp= ks->paths.first; ksp; ksp= ksp->next) { - /* Path */ - writestruct(wd, DATA, "KS_Path", 1, ksp); - - if (ksp->rna_path) - writedata(wd, DATA, strlen(ksp->rna_path)+1, ksp->rna_path); - } - } -} - -static void write_nlastrips(WriteData *wd, ListBase *strips) -{ - NlaStrip *strip; - - for (strip= strips->first; strip; strip= strip->next) { - /* write the strip first */ - writestruct(wd, DATA, "NlaStrip", 1, strip); - - /* write the strip's F-Curves and modifiers */ - write_fcurves(wd, &strip->fcurves); - write_fmodifiers(wd, &strip->modifiers); - - /* write the strip's children */ - write_nlastrips(wd, &strip->strips); - } -} - -static void write_nladata(WriteData *wd, ListBase *nlabase) -{ - NlaTrack *nlt; - - /* write all the tracks */ - for (nlt= nlabase->first; nlt; nlt= nlt->next) { - /* write the track first */ - writestruct(wd, DATA, "NlaTrack", 1, nlt); - - /* write the track's strips */ - write_nlastrips(wd, &nlt->strips); - } -} - -static void write_animdata(WriteData *wd, AnimData *adt) -{ - AnimOverride *aor; - - /* firstly, just write the AnimData block */ - writestruct(wd, DATA, "AnimData", 1, adt); - - /* write drivers */ - write_fcurves(wd, &adt->drivers); - - /* write overrides */ - // FIXME: are these needed? - for (aor= adt->overrides.first; aor; aor= aor->next) { - /* overrides consist of base data + rna_path */ - writestruct(wd, DATA, "AnimOverride", 1, aor); - writedata(wd, DATA, strlen(aor->rna_path)+1, aor->rna_path); - } - - // TODO write the remaps (if they are needed) - - /* write NLA data */ - write_nladata(wd, &adt->nla_tracks); -} - static void write_motionpath(WriteData *wd, bMotionPath *mpath) { /* sanity checks */ @@ -1177,19 +1214,32 @@ static void write_modifiers(WriteData *wd, ListBase *modbase) if(smd->type & MOD_SMOKE_TYPE_DOMAIN) { + if(smd->domain) + { + write_pointcaches(wd, &(smd->domain->ptcaches[0])); + + /* create fake pointcache so that old blender versions can read it */ + smd->domain->point_cache[1] = BKE_ptcache_add(&smd->domain->ptcaches[1]); + smd->domain->point_cache[1]->flag |= PTCACHE_DISK_CACHE|PTCACHE_FAKE_SMOKE; + smd->domain->point_cache[1]->step = 1; + + write_pointcaches(wd, &(smd->domain->ptcaches[1])); + } + writestruct(wd, DATA, "SmokeDomainSettings", 1, smd->domain); - writestruct(wd, DATA, "EffectorWeights", 1, smd->domain->effector_weights); + + if(smd->domain) { + /* cleanup the fake pointcache */ + BKE_ptcache_free_list(&smd->domain->ptcaches[1]); + smd->domain->point_cache[1] = NULL; + + writestruct(wd, DATA, "EffectorWeights", 1, smd->domain->effector_weights); + } } else if(smd->type & MOD_SMOKE_TYPE_FLOW) writestruct(wd, DATA, "SmokeFlowSettings", 1, smd->flow); else if(smd->type & MOD_SMOKE_TYPE_COLL) writestruct(wd, DATA, "SmokeCollSettings", 1, smd->coll); - - if((smd->type & MOD_SMOKE_TYPE_DOMAIN) && smd->domain) - { - write_pointcaches(wd, &(smd->domain->ptcaches[0])); - write_pointcaches(wd, &(smd->domain->ptcaches[1])); - } } else if(md->type==eModifierType_Fluidsim) { FluidsimModifierData *fluidmd = (FluidsimModifierData*) md; @@ -1250,7 +1300,7 @@ static void write_objects(WriteData *wd, ListBase *idbase) 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); + BLI_strncpy(ob->pose->proxy_act_bone, arm->act_bone->name, sizeof(ob->pose->proxy_act_bone)); } } @@ -1475,7 +1525,7 @@ static void write_customdata(WriteData *wd, ID *id, int count, CustomData *data, for (i=0; i<data->totlayer; i++) { CustomDataLayer *layer= &data->layers[i]; - char *structname; + const char *structname; int structnum, datasize; if (layer->type == CD_MDEFORMVERT) { @@ -1559,7 +1609,10 @@ static void write_lattices(WriteData *wd, ListBase *idbase) /* write LibData */ writestruct(wd, ID_LT, "Lattice", 1, lt); if (lt->id.properties) IDP_WriteProperty(lt->id.properties, wd); - + + /* write animdata */ + if (lt->adt) write_animdata(wd, lt->adt); + /* direct data */ writestruct(wd, DATA, "BPoint", lt->pntsu*lt->pntsv*lt->pntsw, lt->def); @@ -1906,21 +1959,23 @@ static void write_gpencils(WriteData *wd, ListBase *lb) bGPDstroke *gps; for (gpd= lb->first; gpd; gpd= gpd->id.next) { - /* write gpd data block to file */ - writestruct(wd, ID_GD, "bGPdata", 1, gpd); - - /* write grease-pencil layers to file */ - for (gpl= gpd->layers.first; gpl; gpl= gpl->next) { - writestruct(wd, DATA, "bGPDlayer", 1, gpl); + if (gpd->id.us>0 || wd->current) { + /* write gpd data block to file */ + writestruct(wd, ID_GD, "bGPdata", 1, gpd); - /* write this layer's frames to file */ - for (gpf= gpl->frames.first; gpf; gpf= gpf->next) { - writestruct(wd, DATA, "bGPDframe", 1, gpf); + /* write grease-pencil layers to file */ + for (gpl= gpd->layers.first; gpl; gpl= gpl->next) { + writestruct(wd, DATA, "bGPDlayer", 1, gpl); - /* write strokes */ - for (gps= gpf->strokes.first; gps; gps= gps->next) { - writestruct(wd, DATA, "bGPDstroke", 1, gps); - writestruct(wd, DATA, "bGPDspoint", gps->totpoints, gps->points); + /* write this layer's frames to file */ + for (gpf= gpl->frames.first; gpf; gpf= gpf->next) { + writestruct(wd, DATA, "bGPDframe", 1, gpf); + + /* write strokes */ + for (gps= gpf->strokes.first; gps; gps= gps->next) { + writestruct(wd, DATA, "bGPDstroke", 1, gps); + writestruct(wd, DATA, "bGPDspoint", gps->totpoints, gps->points); + } } } } @@ -2095,6 +2150,7 @@ static void write_screens(WriteData *wd, ListBase *scrbase) ConsoleLine *cl; for (cl=con->history.first; cl; cl=cl->next) { + /* 'len_alloc' is invalid on write, set from 'len' on read */ writestruct(wd, DATA, "ConsoleLine", 1, cl); writedata(wd, DATA, cl->len+1, cl->line); } @@ -2344,6 +2400,10 @@ static void write_global(WriteData *wd, int fileflags, Main *mainvar) bScreen *screen; char subvstr[8]; + /* prevent mem checkers from complaining */ + fg.pads= fg.pad= 0; + memset(fg.filename, 0, sizeof(fg.filename)); + current_screen_compat(mainvar, &screen); /* XXX still remap G */ @@ -2351,7 +2411,7 @@ static void write_global(WriteData *wd, int fileflags, Main *mainvar) fg.curscene= screen->scene; fg.displaymode= G.displaymode; fg.winpos= G.winpos; - fg.fileflags= (fileflags & ~G_FILE_NO_UI); // prevent to save this, is not good convention, and feature with concerns... + fg.fileflags= (fileflags & ~(G_FILE_NO_UI|G_FILE_RELATIVE_REMAP)); // prevent to save this, is not good convention, and feature with concerns... fg.globalf= G.f; BLI_strncpy(fg.filename, mainvar->name, sizeof(fg.filename)); @@ -2361,7 +2421,14 @@ static void write_global(WriteData *wd, int fileflags, Main *mainvar) fg.subversion= BLENDER_SUBVERSION; fg.minversion= BLENDER_MINVERSION; fg.minsubversion= BLENDER_MINSUBVERSION; - fg.pads= 0; /* prevent mem checkers from complaining */ +#ifdef NAN_BUILDINFO + { + extern char build_rev[]; + fg.revision= atoi(build_rev); + } +#else + fg.revision= 0; +#endif writestruct(wd, GLOB, "FileGlobal", 1, &fg); } @@ -2386,7 +2453,7 @@ static int write_file_handle(Main *mainvar, int handle, MemFile *compare, MemFil blo_split_main(&mainlist, mainvar); - wd= bgnwrite(handle, compare, current, write_flags); + wd= bgnwrite(handle, compare, current); sprintf(buf, "BLENDER%c%c%.3d", (sizeof(void*)==8)?'-':'_', (ENDIAN_ORDER==B_ENDIAN)?'V':'v', BLENDER_VERSION); mywrite(wd, buf, 12); @@ -2473,14 +2540,14 @@ int BLO_write_file(Main *mainvar, char *dir, int write_flags, ReportList *report if(strcmp(dir1, dir2)==0) write_flags &= ~G_FILE_RELATIVE_REMAP; else - makeFilesAbsolute(G.sce, NULL); + makeFilesAbsolute(mainvar, G.main->name, NULL); } - BLI_make_file_string(G.sce, userfilename, BLI_get_folder_create(BLENDER_USER_CONFIG, NULL), BLENDER_STARTUP_FILE); + BLI_make_file_string(G.main->name, 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 */ + makeFilesRelative(mainvar, dir, NULL); /* note, making relative to something OTHER then G.main->name */ /* actual file writing */ err= write_file_handle(mainvar, file, NULL,NULL, write_user_block, write_flags, thumb); @@ -2532,7 +2599,7 @@ int BLO_write_file(Main *mainvar, char *dir, int write_flags, ReportList *report } /* return: success (1) */ -int BLO_write_file_mem(Main *mainvar, MemFile *compare, MemFile *current, int write_flags, ReportList *reports) +int BLO_write_file_mem(Main *mainvar, MemFile *compare, MemFile *current, int write_flags) { int err; @@ -2545,29 +2612,20 @@ int BLO_write_file_mem(Main *mainvar, MemFile *compare, MemFile *current, int wr /* Runtime writing */ -#ifdef WIN32 -#define PATHSEPERATOR "\\" -#else -#define PATHSEPERATOR "/" -#endif - static char *get_runtime_path(char *exename) { char *installpath= get_install_dir(); if (!installpath) { return NULL; - } else { - char *path= MEM_mallocN(strlen(installpath)+strlen(PATHSEPERATOR)+strlen(exename)+1, "runtimepath"); + } + else { + char *path= BLI_sprintfN("%s%c%s", installpath, SEP, exename); if (path == NULL) { MEM_freeN(installpath); return NULL; } - strcpy(path, installpath); - strcat(path, PATHSEPERATOR); - strcat(path, exename); - MEM_freeN(installpath); return path; @@ -2576,7 +2634,7 @@ static char *get_runtime_path(char *exename) { #ifdef __APPLE__ -static int recursive_copy_runtime(char *outname, char *exename, ReportList *reports) +static int recursive_copy_runtime(const char *outname, char *exename, ReportList *reports) { char *runtime = get_runtime_path(exename); char command[2 * (FILE_MAXDIR+FILE_MAXFILE) + 32]; @@ -2612,7 +2670,7 @@ cleanup: return !error; } -int BLO_write_runtime(Main *mainvar, char *file, char *exename, ReportList *reports) +int BLO_write_runtime(Main *mainvar, const char *file, char *exename, ReportList *reports) { char gamename[FILE_MAXDIR+FILE_MAXFILE]; int outfd = -1, error= 0; @@ -2626,8 +2684,7 @@ int BLO_write_runtime(Main *mainvar, char *file, char *exename, ReportList *repo goto cleanup; } - strcpy(gamename, file); - strcat(gamename, "/Contents/Resources/game.blend"); + BLI_snprintf(gamename, sizeof(gamename), "%s/Contents/Resources/game.blend", file); //printf("gamename %s\n", gamename); outfd= open(gamename, O_BINARY|O_WRONLY|O_CREAT|O_TRUNC, 0777); if (outfd != -1) { @@ -2701,7 +2758,7 @@ static int handle_write_msb_int(int handle, int i) return (write(handle, buf, 4)==4); } -int BLO_write_runtime(Main *mainvar, char *file, char *exename, ReportList *reports) +int BLO_write_runtime(Main *mainvar, const char *file, char *exename, ReportList *reports) { int outfd= open(file, O_BINARY|O_WRONLY|O_CREAT|O_TRUNC, 0777); int datastart, error= 0; |