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/blenkernel/intern/scene.c')
-rw-r--r--source/blender/blenkernel/intern/scene.c104
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;