diff options
Diffstat (limited to 'source/blender/blenkernel/intern/scene.c')
-rw-r--r-- | source/blender/blenkernel/intern/scene.c | 104 |
1 files changed, 74 insertions, 30 deletions
diff --git a/source/blender/blenkernel/intern/scene.c b/source/blender/blenkernel/intern/scene.c index f17d11c40ce..77b1202aa20 100644 --- a/source/blender/blenkernel/intern/scene.c +++ b/source/blender/blenkernel/intern/scene.c @@ -17,7 +17,7 @@ * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software Foundation, - * Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. * * The Original Code is Copyright (C) 2001-2002 by NaN Holding BV. * All rights reserved. @@ -83,6 +83,7 @@ #include "BKE_sequencer.h" #include "BKE_world.h" #include "BKE_utildefines.h" +#include "BKE_sound.h" //XXX #include "BIF_previewrender.h" //XXX #include "BIF_editseq.h" @@ -158,6 +159,7 @@ Scene *copy_scene(Main *bmain, Scene *sce, int type) scen->obedit= NULL; scen->toolsettings= MEM_dupallocN(sce->toolsettings); scen->stats= NULL; + scen->fps_info= NULL; ts= scen->toolsettings; if(ts) { @@ -233,6 +235,8 @@ Scene *copy_scene(Main *bmain, Scene *sce, int type) } } + sound_create_scene(scen); + return scen; } @@ -315,6 +319,10 @@ void free_scene(Scene *sce) if(sce->stats) MEM_freeN(sce->stats); + if(sce->fps_info) + MEM_freeN(sce->fps_info); + + sound_destroy_scene(sce); } Scene *add_scene(char *name) @@ -356,6 +364,7 @@ Scene *add_scene(char *name) sce->r.scemode= R_DOCOMP|R_DOSEQ|R_EXTENSION; sce->r.stamp= R_STAMP_TIME|R_STAMP_FRAME|R_STAMP_DATE|R_STAMP_SCENE|R_STAMP_CAMERA|R_STAMP_RENDERTIME; + sce->r.stamp_font_id= 12; sce->r.threads= 1; @@ -367,6 +376,11 @@ Scene *add_scene(char *name) sce->r.cineonblack= 95; sce->r.cineonwhite= 685; sce->r.cineongamma= 1.7f; + + sce->r.border.xmin= 0.0f; + sce->r.border.ymin= 0.0f; + sce->r.border.xmax= 1.0f; + sce->r.border.ymax= 1.0f; sce->toolsettings = MEM_callocN(sizeof(struct ToolSettings),"Tool Settings Struct"); sce->toolsettings->cornertype=1; @@ -475,6 +489,8 @@ Scene *add_scene(char *name) sce->gm.flag = GAME_DISPLAY_LISTS; sce->gm.matmode = GAME_MAT_MULTITEX; + sound_create_scene(sce); + return sce; } @@ -714,7 +730,7 @@ Object *scene_find_camera_switch(Scene *scene) Object *camera= NULL; for (m= scene->markers.first; m; m= m->next) { - if(m->camera && (m->frame <= cfra) && (m->frame > frame)) { + if(m->camera && (m->camera->restrictflag & OB_RESTRICT_RENDER)==0 && (m->frame <= cfra) && (m->frame > frame)) { camera= m->camera; frame= m->frame; @@ -727,26 +743,47 @@ Object *scene_find_camera_switch(Scene *scene) } #endif -static char *get_cfra_marker_name(Scene *scene) +char *scene_find_marker_name(Scene *scene, int frame) { ListBase *markers= &scene->markers; TimeMarker *m1, *m2; /* search through markers for match */ for (m1=markers->first, m2=markers->last; m1 && m2; m1=m1->next, m2=m2->prev) { - if (m1->frame==CFRA) + if (m1->frame==frame) return m1->name; if (m1 == m2) break; - if (m2->frame==CFRA) + if (m2->frame==frame) return m2->name; } return NULL; } +/* return the current marker for this frame, +we can have more then 1 marker per frame, this just returns the first :/ */ +char *scene_find_last_marker_name(Scene *scene, int frame) +{ + TimeMarker *marker, *best_marker = NULL; + int best_frame = -MAXFRAME*2; + for (marker= scene->markers.first; marker; marker= marker->next) { + if (marker->frame==frame) { + return marker->name; + } + + if ( marker->frame > best_frame && marker->frame < frame) { + best_marker = marker; + best_frame = marker->frame; + } + } + + return best_marker ? best_marker->name : NULL; +} + + Base *scene_add_base(Scene *sce, Object *ob) { Base *b= MEM_callocN(sizeof(*b), "scene_add_base"); @@ -826,20 +863,6 @@ static void scene_update_newframe(Scene *sce, unsigned int lay) { Base *base; Object *ob; - float ctime = frame_to_float(sce, sce->r.cfra); - - if(sce->theDag==NULL) - DAG_scene_sort(sce); - - DAG_scene_update_flags(sce, lay); // only stuff that moves or needs display still - - /* All 'standard' (i.e. without any dependencies) animation is handled here, - * with an 'local' to 'macro' order of evaluation. This should ensure that - * settings stored nestled within a hierarchy (i.e. settings in a Texture block - * 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(G.main, ctime); for(base= sce->base.first; base; base= base->next) { ob= base->object; @@ -892,16 +915,37 @@ void scene_update_tagged(Scene *scene) /* applies changes right away, does all sets too */ void scene_update_for_newframe(Scene *sce, unsigned int lay) { - Scene *scene= sce; + float ctime = frame_to_float(sce, sce->r.cfra); + Scene *sce_iter; /* clear animation overrides */ // XXX TODO... - + + for(sce_iter= sce; sce_iter; sce_iter= sce_iter->set) { + if(sce_iter->theDag==NULL) + DAG_scene_sort(sce_iter); + } + + + /* Following 2 functions are recursive + * so dont call within 'scene_update_newframe' */ + DAG_scene_update_flags(sce, lay); // only stuff that moves or needs display still + + /* All 'standard' (i.e. without any dependencies) animation is handled here, + * with an 'local' to 'macro' order of evaluation. This should ensure that + * settings stored nestled within a hierarchy (i.e. settings in a Texture block + * 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(G.main, ctime); + /*...done with recusrive funcs */ + + /* sets first, we allow per definition current scene to have dependencies on sets */ - for(sce= sce->set; sce; sce= sce->set) - scene_update_newframe(sce, lay); + for(sce_iter= sce->set; sce_iter; sce_iter= sce_iter->set) + scene_update_newframe(sce_iter, lay); - scene_update_newframe(scene, lay); + scene_update_newframe(sce, lay); } /* return default layer, also used to patch old files */ @@ -911,8 +955,8 @@ void scene_add_render_layer(Scene *sce) // int tot= 1 + BLI_countlist(&sce->r.layers); srl= MEM_callocN(sizeof(SceneRenderLayer), "new render layer"); - sprintf(srl->name, "RenderLayer"); - BLI_uniquename(&sce->r.layers, srl, "RenderLayer", '.', offsetof(SceneRenderLayer, name), 32); + strcpy(srl->name, "RenderLayer"); + BLI_uniquename(&sce->r.layers, srl, "RenderLayer", '.', offsetof(SceneRenderLayer, name), sizeof(srl->name)); BLI_addtail(&sce->r.layers, srl); /* note, this is also in render, pipeline.c, to make layer when scenedata doesnt have it */ @@ -925,7 +969,7 @@ void scene_add_render_layer(Scene *sce) int get_render_subsurf_level(RenderData *r, int lvl) { - if(G.rt == 1 && (r->mode & R_SIMPLIFY)) + if(r->mode & R_SIMPLIFY) return MIN2(r->simplify_subsurf, lvl); else return lvl; @@ -933,7 +977,7 @@ int get_render_subsurf_level(RenderData *r, int lvl) int get_render_child_particle_number(RenderData *r, int num) { - if(G.rt == 1 && (r->mode & R_SIMPLIFY)) + if(r->mode & R_SIMPLIFY) return (int)(r->simplify_particles*num); else return num; @@ -941,7 +985,7 @@ int get_render_child_particle_number(RenderData *r, int num) int get_render_shadow_samples(RenderData *r, int samples) { - if(G.rt == 1 && (r->mode & R_SIMPLIFY) && samples > 0) + if((r->mode & R_SIMPLIFY) && samples > 0) return MIN2(r->simplify_shadowsamples, samples); else return samples; @@ -949,7 +993,7 @@ int get_render_shadow_samples(RenderData *r, int samples) float get_render_aosss_error(RenderData *r, float error) { - if(G.rt == 1 && (r->mode & R_SIMPLIFY)) + if(r->mode & R_SIMPLIFY) return ((1.0f-r->simplify_aosss)*10.0f + 1.0f)*error; else return error; |