diff options
Diffstat (limited to 'source/blender/blenloader')
-rw-r--r-- | source/blender/blenloader/intern/readfile.c | 184 | ||||
-rw-r--r-- | source/blender/blenloader/intern/writefile.c | 19 |
2 files changed, 196 insertions, 7 deletions
diff --git a/source/blender/blenloader/intern/readfile.c b/source/blender/blenloader/intern/readfile.c index df7e1f80cbd..4a86de51d9c 100644 --- a/source/blender/blenloader/intern/readfile.c +++ b/source/blender/blenloader/intern/readfile.c @@ -85,6 +85,7 @@ #include "DNA_scene_types.h" #include "DNA_sequence_types.h" #include "DNA_smoke_types.h" +#include "DNA_speaker_types.h" #include "DNA_sound_types.h" #include "DNA_space_types.h" #include "DNA_vfont_types.h" @@ -4472,7 +4473,7 @@ static void lib_link_scene(FileData *fd, Main *main) #endif if(sce->ed) - seq_update_muting(sce, sce->ed); + seq_update_muting(sce->ed); if(sce->nodetree) { lib_link_ntree(fd, &sce->id, sce->nodetree); @@ -5571,12 +5572,51 @@ static void fix_relpaths_library(const char *basepath, Main *main) } } +/* ************ READ SPEAKER ***************** */ + +static void lib_link_speaker(FileData *fd, Main *main) +{ + Speaker *spk; + + spk= main->speaker.first; + while(spk) { + if(spk->id.flag & LIB_NEEDLINK) { + if (spk->adt) lib_link_animdata(fd, &spk->id, spk->adt); + + spk->sound= newlibadr(fd, spk->id.lib, spk->sound); + if (spk->sound) { + spk->sound->id.us++; + } + + spk->id.flag -= LIB_NEEDLINK; + } + spk= spk->id.next; + } +} + +static void direct_link_speaker(FileData *fd, Speaker *spk) +{ + spk->adt= newdataadr(fd, spk->adt); + direct_link_animdata(fd, spk->adt); + + /*spk->sound= newdataadr(fd, spk->sound); + direct_link_sound(fd, spk->sound);*/ +} + /* ************** READ SOUND ******************* */ static void direct_link_sound(FileData *fd, bSound *sound) { sound->handle = NULL; sound->playback_handle = NULL; + sound->waveform = NULL; + + // versioning stuff, if there was a cache, then we enable caching: + if(sound->cache) + { + sound->flags |= SOUND_FLAGS_CACHING; + sound->cache = NULL; + } sound->packedfile = direct_link_packedfile(fd, sound->packedfile); sound->newpackedfile = direct_link_packedfile(fd, sound->newpackedfile); @@ -5593,9 +5633,6 @@ static void lib_link_sound(FileData *fd, Main *main) sound->ipo= newlibadr_us(fd, sound->id.lib, sound->ipo); // XXX depreceated - old animation system sound_load(main, sound); - - if(sound->cache) - sound_cache(sound, 1); } sound= sound->id.next; } @@ -5666,6 +5703,7 @@ static const char *dataname(short id_code) case ID_SCR: return "Data from SCR"; case ID_VF: return "Data from VF"; case ID_TXT : return "Data from TXT"; + case ID_SPK: return "Data from SPK"; case ID_SO: return "Data from SO"; case ID_NT: return "Data from NT"; case ID_BR: return "Data from BR"; @@ -5810,6 +5848,9 @@ static BHead *read_libblock(FileData *fd, Main *main, BHead *bhead, int flag, ID case ID_CA: direct_link_camera(fd, (Camera *)id); break; + case ID_SPK: + direct_link_speaker(fd, (Speaker *)id); + break; case ID_SO: direct_link_sound(fd, (bSound *)id); break; @@ -11702,13 +11743,130 @@ static void do_versions(FileData *fd, Library *lib, Main *main) } } } - + + if (main->versionfile < 259 || (main->versionfile == 259 && main->subversionfile < 1)){ + { + Scene *scene; + Sequence *seq; + + for (scene=main->scene.first; scene; scene=scene->id.next) + { + scene->r.ffcodecdata.audio_channels = 2; + scene->audio.volume = 1.0f; + SEQ_BEGIN(scene->ed, seq) { + seq->pitch = 1.0f; + } + SEQ_END + } + } + { + bScreen *screen; + for(screen= main->screen.first; screen; screen= screen->id.next) { + ScrArea *sa; + /* add regions */ + for(sa= screen->areabase.first; sa; sa= sa->next) { + SpaceLink *sl= sa->spacedata.first; + if(sl->spacetype==SPACE_SEQ) { + ARegion *ar; + for (ar=sa->regionbase.first; ar; ar= ar->next) { + if(ar->regiontype == RGN_TYPE_WINDOW) { + if(ar->v2d.min[1] == 4.0f) + ar->v2d.min[1]= 0.5f; + } + } + } + for (sl= sa->spacedata.first; sl; sl= sl->next) { + if(sl->spacetype==SPACE_SEQ) { + ARegion *ar; + for (ar=sl->regionbase.first; ar; ar= ar->next) { + if(ar->regiontype == RGN_TYPE_WINDOW) { + if(ar->v2d.min[1] == 4.0f) + ar->v2d.min[1]= 0.5f; + } + } + } + } + } + } + } + { + /* Make "auto-clamped" handles a per-keyframe setting instead of per-FCurve + * + * We're only patching F-Curves in Actions here, since it is assumed that most + * drivers out there won't be using this (and if they are, they're in the minority). + * While we should aim to fix everything ideally, in practice it's far too hard + * to get to every animdata block, not to mention the performance hit that'd have + */ + bAction *act; + FCurve *fcu; + + for (act = main->action.first; act; act = act->id.next) { + for (fcu = act->curves.first; fcu; fcu = fcu->next) { + BezTriple *bezt; + unsigned int i = 0; + + /* only need to touch curves that had this flag set */ + if ((fcu->flag & FCURVE_AUTO_HANDLES) == 0) + continue; + if ((fcu->totvert == 0) || (fcu->bezt == NULL)) + continue; + + /* only change auto-handles to auto-clamped */ + for (bezt=fcu->bezt; i < fcu->totvert; i++, bezt++) { + if (bezt->h1 == HD_AUTO) bezt->h1 = HD_AUTO_ANIM; + if (bezt->h2 == HD_AUTO) bezt->h2 = HD_AUTO_ANIM; + } + + fcu->flag &= ~FCURVE_AUTO_HANDLES; + } + } + } + { + /* convert fcurve and shape action actuators to action actuators */ + Object *ob; + bActuator *act; + bIpoActuator *ia; + bActionActuator *aa; + + for (ob= main->object.first; ob; ob= ob->id.next) { + for (act= ob->actuators.first; act; act= act->next) { + if (act->type == ACT_IPO) { + // Create the new actuator + ia= act->data; + aa= MEM_callocN(sizeof(bActionActuator), "fcurve -> action actuator do_version"); + + // Copy values + aa->type = ia->type; + aa->flag = ia->flag; + aa->sta = ia->sta; + aa->end = ia->end; + strcpy(aa->name, ia->name); + strcpy(aa->frameProp, ia->frameProp); + if (ob->adt) + aa->act = ob->adt->action; + + // Get rid of the old actuator + MEM_freeN(ia); + + // Assign the new actuator + act->data = aa; + act->type= act->otype= ACT_ACTION; + + } + else if (act->type == ACT_SHAPEACTION) { + act->type = act->otype = ACT_ACTION; + } + } + } + } + } + /* put compatibility code here until next subversion bump */ { - + } - + /* WATCH IT!!!: pointers from libdata have not been converted yet here! */ /* WATCH IT 2!: Userdef struct init has to be in editors/interface/resources.c! */ @@ -11744,6 +11902,7 @@ static void lib_link_all(FileData *fd, Main *main) lib_link_latt(fd, main); lib_link_text(fd, main); lib_link_camera(fd, main); + lib_link_speaker(fd, main); lib_link_sound(fd, main); lib_link_group(fd, main); lib_link_armature(fd, main); @@ -12684,6 +12843,14 @@ static void expand_camera(FileData *fd, Main *mainvar, Camera *ca) expand_animdata(fd, mainvar, ca->adt); } +static void expand_speaker(FileData *fd, Main *mainvar, Speaker *spk) +{ + expand_doit(fd, mainvar, spk->sound); + + if (spk->adt) + expand_animdata(fd, mainvar, spk->adt); +} + static void expand_sound(FileData *fd, Main *mainvar, bSound *snd) { expand_doit(fd, mainvar, snd->ipo); // XXX depreceated - old animation system @@ -12746,6 +12913,9 @@ static void expand_main(FileData *fd, Main *mainvar) case ID_CA: expand_camera(fd, mainvar, (Camera *)id); break; + case ID_SPK: + expand_speaker(fd, mainvar,(Speaker *)id); + break; case ID_SO: expand_sound(fd, mainvar, (bSound *)id); break; diff --git a/source/blender/blenloader/intern/writefile.c b/source/blender/blenloader/intern/writefile.c index 5b7fcc0e935..406a9bdc02e 100644 --- a/source/blender/blenloader/intern/writefile.c +++ b/source/blender/blenloader/intern/writefile.c @@ -123,6 +123,7 @@ Any case: direct data is ALWAYS after the lib block #include "DNA_smoke_types.h" #include "DNA_space_types.h" #include "DNA_screen_types.h" +#include "DNA_speaker_types.h" #include "DNA_sound_types.h" #include "DNA_text_types.h" #include "DNA_view3d_types.h" @@ -2342,6 +2343,23 @@ static void write_texts(WriteData *wd, ListBase *idbase) mywrite(wd, MYWRITE_FLUSH, 0); } +static void write_speakers(WriteData *wd, ListBase *idbase) +{ + Speaker *spk; + + spk= idbase->first; + while(spk) { + if(spk->id.us>0 || wd->current) { + /* write LibData */ + writestruct(wd, ID_SPK, "Speaker", 1, spk); + if (spk->id.properties) IDP_WriteProperty(spk->id.properties, wd); + + if (spk->adt) write_animdata(wd, spk->adt); + } + spk= spk->id.next; + } +} + static void write_sounds(WriteData *wd, ListBase *idbase) { bSound *sound; @@ -2520,6 +2538,7 @@ static int write_file_handle(Main *mainvar, int handle, MemFile *compare, MemFil write_keys (wd, &mainvar->key); write_worlds (wd, &mainvar->world); write_texts (wd, &mainvar->text); + write_speakers (wd, &mainvar->speaker); write_sounds (wd, &mainvar->sound); write_groups (wd, &mainvar->group); write_armatures(wd, &mainvar->armature); |