3D Audio GSoC:
[blender-staging.git] / source / blender / blenkernel / intern / scene.c
index 95f39db9d6fe9956e5e9ee3740777c016415badd..12e81e8296e26a2f5d1716b2bda6cdfb7c1a4926 100644 (file)
  * ***** END GPL LICENSE BLOCK *****
  */
 
+/** \file blender/blenkernel/intern/scene.c
+ *  \ingroup bke
+ */
+
+
 #include <stddef.h>
 #include <stdio.h>
 #include <string.h>
@@ -171,7 +176,7 @@ Scene *copy_scene(Scene *sce, int type)
                BKE_keyingsets_copy(&(scen->keyingsets), &(sce->keyingsets));
 
                if(sce->nodetree) {
-                       scen->nodetree= ntreeCopyTree(sce->nodetree, 0); /* copies actions */
+                       scen->nodetree= ntreeCopyTree(sce->nodetree); /* copies actions */
                        ntreeSwitchID(scen->nodetree, &sce->id, &scen->id);
                }
 
@@ -463,15 +468,17 @@ Scene *add_scene(const char *name)
 
        sce->r.ffcodecdata.audio_mixrate = 44100;
        sce->r.ffcodecdata.audio_volume = 1.0f;
+       sce->r.ffcodecdata.audio_bitrate = 192;
+       sce->r.ffcodecdata.audio_channels = 2;
 
        BLI_strncpy(sce->r.engine, "BLENDER_RENDER", sizeof(sce->r.engine));
 
-       sce->audio.distance_model = 2.0;
-       sce->audio.doppler_factor = 1.0;
-       sce->audio.speed_of_sound = 343.3;
+       sce->audio.distance_model = 2.0f;
+       sce->audio.doppler_factor = 1.0f;
+       sce->audio.speed_of_sound = 343.3f;
+       sce->audio.volume = 1.0f;
 
-       strcpy(sce->r.backbuf, "//backbuf");
-       strcpy(sce->r.pic, U.renderdir);
+       BLI_strncpy(sce->r.pic, U.renderdir, sizeof(sce->r.pic));
 
        BLI_init_rctf(&sce->r.safety, 0.1f, 0.9f, 0.1f, 0.9f);
        sce->r.osa= 8;
@@ -581,7 +588,7 @@ void set_scene_bg(Main *bmain, Scene *scene)
 }
 
 /* called from creator.c */
-Scene *set_scene_name(Main *bmain, char *name)
+Scene *set_scene_name(Main *bmain, const char *name)
 {
        Scene *sce= (Scene *)find_id("SC", name);
        if(sce) {
@@ -827,54 +834,6 @@ char *scene_find_last_marker_name(Scene *scene, int frame)
        return best_marker ? best_marker->name : NULL;
 }
 
-/* markers need transforming from different parts of the code so have
- * a generic function to do this */
-int scene_marker_tfm_translate(Scene *scene, int delta, int flag)
-{
-       TimeMarker *marker;
-       int tot= 0;
-
-       for (marker= scene->markers.first; marker; marker= marker->next) {
-               if ((marker->flag & flag) == flag) {
-                       marker->frame += delta;
-                       tot++;
-               }
-       }
-
-       return tot;
-}
-
-int scene_marker_tfm_extend(Scene *scene, int delta, int flag, int frame, char side)
-{
-       TimeMarker *marker;
-       int tot= 0;
-
-       for (marker= scene->markers.first; marker; marker= marker->next) {
-               if ((marker->flag & flag) == flag) {
-                       if((side=='L' && marker->frame < frame) || (side=='R' && marker->frame >= frame)) {
-                               marker->frame += delta;
-                               tot++;
-                       }
-               }
-       }
-
-       return tot;
-}
-
-int scene_marker_tfm_scale(struct Scene *scene, float value, int flag)
-{
-       TimeMarker *marker;
-       int tot= 0;
-
-       for (marker= scene->markers.first; marker; marker= marker->next) {
-               if ((marker->flag & flag) == flag) {
-                       marker->frame= CFRA + (int)floorf(((float)(marker->frame - CFRA) * value) + 0.5f);
-                       tot++;
-               }
-       }
-
-       return tot;
-}
 
 Base *scene_add_base(Scene *sce, Object *ob)
 {
@@ -957,7 +916,7 @@ static void scene_update_drivers(Main *UNUSED(bmain), Scene *scene)
        
        /* scene itself */
        if (scene->adt && scene->adt->drivers.first) {
-               BKE_animsys_evaluate_animdata(&scene->id, scene->adt, ctime, ADT_RECALC_DRIVERS);
+               BKE_animsys_evaluate_animdata(scene, &scene->id, scene->adt, ctime, ADT_RECALC_DRIVERS);
        }
        
        /* world */
@@ -967,7 +926,7 @@ static void scene_update_drivers(Main *UNUSED(bmain), Scene *scene)
                AnimData *adt= BKE_animdata_from_id(wid);
                
                if (adt && adt->drivers.first)
-                       BKE_animsys_evaluate_animdata(wid, adt, ctime, ADT_RECALC_DRIVERS);
+                       BKE_animsys_evaluate_animdata(scene, wid, adt, ctime, ADT_RECALC_DRIVERS);
        }
        
        /* nodes */
@@ -976,7 +935,7 @@ static void scene_update_drivers(Main *UNUSED(bmain), Scene *scene)
                AnimData *adt= BKE_animdata_from_id(nid);
                
                if (adt && adt->drivers.first)
-                       BKE_animsys_evaluate_animdata(nid, adt, ctime, ADT_RECALC_DRIVERS);
+                       BKE_animsys_evaluate_animdata(scene, nid, adt, ctime, ADT_RECALC_DRIVERS);
        }
 }
 
@@ -1007,6 +966,9 @@ static void scene_update_tagged_recursive(Main *bmain, Scene *scene, Scene *scen
        
        /* scene drivers... */
        scene_update_drivers(bmain, scene);
+
+       /* update sound system animation */
+       sound_update_scene(bmain, scene);
 }
 
 /* this is called in main loop, doing tagged updates before redraw */
@@ -1027,7 +989,7 @@ void scene_update_tagged(Main *bmain, Scene *scene)
                float ctime = BKE_curframe(scene);
                
                if (adt && (adt->recalc & ADT_RECALC_ANIM))
-                       BKE_animsys_evaluate_animdata(&scene->id, adt, ctime, 0);
+                       BKE_animsys_evaluate_animdata(scene, &scene->id, adt, ctime, 0);
        }
        
        if (scene->physics_settings.quick_cache_step)
@@ -1042,6 +1004,8 @@ void scene_update_for_newframe(Main *bmain, Scene *sce, unsigned int lay)
 {
        float ctime = BKE_curframe(sce);
        Scene *sce_iter;
+
+       sound_set_cfra(sce->r.cfra);
        
        /* clear animation overrides */
        // XXX TODO...
@@ -1062,7 +1026,7 @@ void scene_update_for_newframe(Main *bmain, Scene *sce, unsigned int lay)
         * can be overridden by settings from Scene, which owns the Texture through a hierarchy
         * such as Scene->World->MTex/Texture) can still get correctly overridden.
         */
-       BKE_animsys_evaluate_all_animation(bmain, ctime);
+       BKE_animsys_evaluate_all_animation(bmain, sce, ctime);
        /*...done with recusrive funcs */
 
        /* object_handle_update() on all objects, groups and sets */
@@ -1123,23 +1087,23 @@ float get_render_aosss_error(RenderData *r, float error)
 /* helper function for the SETLOOPER macro */
 Base *_setlooper_base_step(Scene **sce_iter, Base *base)
 {
-    if(base && base->next) {
-        /* common case, step to the next */
-        return base->next;
-    }
+       if(base && base->next) {
+               /* common case, step to the next */
+               return base->next;
+       }
        else if(base==NULL && (*sce_iter)->base.first) {
-        /* first time looping, return the scenes first base */
+               /* first time looping, return the scenes first base */
                return (Base *)(*sce_iter)->base.first;
-    }
-    else {
-        /* reached the end, get the next base in the set */
+       }
+       else {
+               /* reached the end, get the next base in the set */
                while((*sce_iter= (*sce_iter)->set)) {
                        base= (Base *)(*sce_iter)->base.first;
-            if(base) {
-                return base;
-            }
-        }
-    }
+                       if(base) {
+                               return base;
+                       }
+               }
+       }
 
-    return NULL;
+       return NULL;
 }