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:
-rw-r--r--source/blender/blenkernel/BKE_node.h1
-rw-r--r--source/blender/blenkernel/intern/depsgraph.c7
-rw-r--r--source/blender/blenkernel/intern/node_composite.c49
-rw-r--r--source/blender/blenkernel/intern/scene.c6
-rw-r--r--source/blender/python/api2_2x/Scene.c4
-rw-r--r--source/blender/render/extern/include/RE_pipeline.h1
-rw-r--r--source/blender/render/intern/source/convertblender.c19
-rw-r--r--source/blender/render/intern/source/pipeline.c117
-rw-r--r--source/blender/src/drawnode.c78
-rw-r--r--source/blender/src/drawscene.c4
-rw-r--r--source/blender/src/editnode.c1
-rw-r--r--source/blender/src/interface.c5
-rw-r--r--source/blender/src/renderwin.c29
-rw-r--r--source/blender/src/sequence.c2
-rw-r--r--source/blender/src/space.c4
15 files changed, 242 insertions, 85 deletions
diff --git a/source/blender/blenkernel/BKE_node.h b/source/blender/blenkernel/BKE_node.h
index 353389fde38..71b5c126ec3 100644
--- a/source/blender/blenkernel/BKE_node.h
+++ b/source/blender/blenkernel/BKE_node.h
@@ -223,7 +223,6 @@ extern bNodeType *node_all_composit[];
/* API */
struct CompBuf;
-int ntreeCompositNeedsRender(struct bNodeTree *ntree);
void ntreeCompositTagRender(struct bNodeTree *ntree);
void ntreeCompositTagAnimated(struct bNodeTree *ntree);
diff --git a/source/blender/blenkernel/intern/depsgraph.c b/source/blender/blenkernel/intern/depsgraph.c
index 9a4a8f62600..51701c19ca0 100644
--- a/source/blender/blenkernel/intern/depsgraph.c
+++ b/source/blender/blenkernel/intern/depsgraph.c
@@ -1624,7 +1624,12 @@ static void dag_object_time_update_flags(Object *ob)
ob->shapeflag &= ~OB_SHAPE_TEMPLOCK;
}
}
- break;
+ break;
+ case OB_FONT:
+ cu= ob->data;
+ if(cu->nurb.first==NULL && cu->str && cu->vfont)
+ ob->recalc |= OB_RECALC_DATA;
+ break;
case OB_LATTICE:
lt= ob->data;
if(lt->key) {
diff --git a/source/blender/blenkernel/intern/node_composite.c b/source/blender/blenkernel/intern/node_composite.c
index 60cf84c7f92..8a04f37bb3a 100644
--- a/source/blender/blenkernel/intern/node_composite.c
+++ b/source/blender/blenkernel/intern/node_composite.c
@@ -832,8 +832,13 @@ static CompBuf *compbuf_from_pass(RenderLayer *rl, int rectx, int recty, int pas
static void node_composit_exec_rresult(void *data, bNode *node, bNodeStack **in, bNodeStack **out)
{
- RenderResult *rr= RE_GetResult(RE_GetRender("Render"));
+ RenderResult *rr;
+ if(node->id && node->id!=&G.scene->id)
+ rr= RE_GetResult(RE_GetRender(node->id->name+2));
+ else
+ rr= RE_GetResult(RE_GetRender("Render"));
+
if(rr) {
RenderLayer *rl= BLI_findlink(&rr->layers, node->custom1);
if(rl) {
@@ -1406,18 +1411,31 @@ static bNodeSocketType cmp_node_alphaover_out[]= {
{ -1, 0, "" }
};
-static void do_alphaover(bNode *node, float *out, float *src, float *dest)
+static void do_alphaover(bNode *node, float *out, float *src, float *over)
{
- float mul= 1.0f - dest[3];
- if(mul<=0.0f) {
- QUATCOPY(out, dest);
+ if(over[3]<=0.0f) {
+ QUATCOPY(out, src);
+ }
+ else if(over[3]>=1.0f) {
+ QUATCOPY(out, over);
}
else {
- out[0]= (mul*src[0]) + dest[0];
- out[1]= (mul*src[1]) + dest[1];
- out[2]= (mul*src[2]) + dest[2];
- out[3]= (mul*src[3]) + dest[3];
+ float mul= 1.0f - over[3];
+
+ /* handle case where backdrop has no alpha, but still color */
+ if(src[0]==0.0f) {
+ out[0]= over[0];
+ out[1]= (mul*src[1]) + over[1];
+ out[2]= (mul*src[2]) + over[2];
+ out[3]= (mul*src[3]) + over[3];
+ }
+ else {
+ out[0]= (mul*src[0]) + over[0];
+ out[1]= (mul*src[1]) + over[1];
+ out[2]= (mul*src[2]) + over[2];
+ out[3]= (mul*src[3]) + over[3];
+ }
}
}
@@ -2177,19 +2195,6 @@ bNodeType *node_all_composit[]= {
/* ******************* parse ************ */
-/* helper call to detect if theres a render-result node */
-int ntreeCompositNeedsRender(bNodeTree *ntree)
-{
- bNode *node;
-
- if(ntree==NULL) return 1;
-
- for(node= ntree->nodes.first; node; node= node->next) {
- if(node->type==CMP_NODE_R_RESULT)
- return 1;
- }
- return 0;
-}
/* called from render pipeline, to tag render input and output */
void ntreeCompositTagRender(bNodeTree *ntree)
diff --git a/source/blender/blenkernel/intern/scene.c b/source/blender/blenkernel/intern/scene.c
index 9c927c80c7e..df8a6042a0f 100644
--- a/source/blender/blenkernel/intern/scene.c
+++ b/source/blender/blenkernel/intern/scene.c
@@ -291,13 +291,13 @@ void set_scene_bg(Scene *sce)
ob->ctime= -1234567.0; /* force ipo to be calculated later */
base= base->next;
}
- // full animation update
- scene_update_for_newframe(sce, sce->lay);
+ /* no full animation update, this to enable render code to work (render code calls own animation updates) */
/* do we need FRAMECHANGED in set_scene? */
// if (G.f & G_DOSCRIPTLINKS) BPY_do_all_scripts(SCRIPT_FRAMECHANGED);
}
+/* called from creator.c */
void set_scene_name(char *name)
{
Scene *sce;
@@ -468,7 +468,7 @@ void scene_update_for_newframe(Scene *sce, unsigned int lay)
if(sce->theDag==NULL)
DAG_scene_sort(sce);
- DAG_scene_update_flags(sce, lay); // only stuff that moves
+ DAG_scene_update_flags(sce, lay); // only stuff that moves or needs display still
for(base= sce->base.first; base; base= base->next) {
ob= base->object;
diff --git a/source/blender/python/api2_2x/Scene.c b/source/blender/python/api2_2x/Scene.c
index 4f1ce26778d..4f986e51555 100644
--- a/source/blender/python/api2_2x/Scene.c
+++ b/source/blender/python/api2_2x/Scene.c
@@ -688,8 +688,10 @@ static PyObject *Scene_makeCurrent( BPy_Scene * self )
{
Scene *scene = self->scene;
- if( scene )
+ if( scene ) {
set_scene( scene );
+ scene_update_for_newframe(scene, scene->lay);
+ }
Py_INCREF( Py_None );
return Py_None;
diff --git a/source/blender/render/extern/include/RE_pipeline.h b/source/blender/render/extern/include/RE_pipeline.h
index 07d0b0a1315..dc19862e1a9 100644
--- a/source/blender/render/extern/include/RE_pipeline.h
+++ b/source/blender/render/extern/include/RE_pipeline.h
@@ -110,6 +110,7 @@ typedef struct RenderStats {
int totface, totvert, tothalo, totlamp, totpart;
short curfield, curblur, curpart, partsdone, convertdone;
double starttime, lastframetime;
+ char *infostr;
} RenderStats;
diff --git a/source/blender/render/intern/source/convertblender.c b/source/blender/render/intern/source/convertblender.c
index 0c5970384bb..926470c4b0d 100644
--- a/source/blender/render/intern/source/convertblender.c
+++ b/source/blender/render/intern/source/convertblender.c
@@ -2747,6 +2747,9 @@ void RE_Database_FromScene(Render *re, Scene *scene, int use_camera_view)
unsigned int lay;
re->scene= scene;
+
+ re->i.infostr= "Preparing Scene data";
+ re->stats_draw(&re->i);
/* XXX add test if dbase was filled already? */
@@ -2895,6 +2898,9 @@ void RE_Database_FromScene(Render *re, Scene *scene, int use_camera_view)
check_non_flat_quads(re);
set_normalflags(re);
+ re->i.infostr= "Creating Shadowbuffers";
+ re->stats_draw(&re->i);
+
/* SHADOW BUFFER */
for(go=re->lights.first; go; go= go->next) {
LampRen *lar= go->lampren;
@@ -2903,7 +2909,6 @@ void RE_Database_FromScene(Render *re, Scene *scene, int use_camera_view)
if(lar->shb) {
makeshadowbuf(re, lar);
}
- re->stats_draw(&re->i);
}
/* yafray: 'direct' radiosity, environment maps and octree init not needed for yafray render */
@@ -2914,9 +2919,13 @@ void RE_Database_FromScene(Render *re, Scene *scene, int use_camera_view)
if(re->r.mode & R_RADIO) do_radio_render(re);
/* octree */
- if(!re->test_break())
- if(re->r.mode & R_RAYTRACE) makeoctree(re);
-
+ if(!re->test_break()) {
+ if(re->r.mode & R_RAYTRACE) {
+ re->i.infostr= "Filling Octree";
+ re->stats_draw(&re->i);
+ makeoctree(re);
+ }
+ }
/* ENVIRONMENT MAPS */
if(!re->test_break())
make_envmaps(re);
@@ -2931,6 +2940,8 @@ void RE_Database_FromScene(Render *re, Scene *scene, int use_camera_view)
else
re->i.convertdone= 1;
+ re->i.infostr= NULL;
+ re->stats_draw(&re->i);
}
static void database_fromscene_vectors(Render *re, Scene *scene)
diff --git a/source/blender/render/intern/source/pipeline.c b/source/blender/render/intern/source/pipeline.c
index 83c0f88ae71..7119dccdc65 100644
--- a/source/blender/render/intern/source/pipeline.c
+++ b/source/blender/render/intern/source/pipeline.c
@@ -32,6 +32,7 @@
#include <stdlib.h>
#include "DNA_group_types.h"
+#include "DNA_node_types.h"
#include "DNA_object_types.h"
#include "DNA_scene_types.h"
@@ -225,6 +226,7 @@ static RenderResult *new_render_result(Render *re, rcti *partrct, int crop)
/* check renderdata for amount of layers */
for(srl= re->r.layers.first; srl; srl= srl->next) {
+
rl= RE_callocN(sizeof(RenderLayer), "new render layer");
BLI_addtail(&rr->layers, rl);
@@ -268,6 +270,9 @@ static RenderResult *new_render_result(Render *re, rcti *partrct, int crop)
rl->passflag= SCE_PASS_COMBINED;
}
+ /* display active layer */
+ rr->renlay= BLI_findlink(&rr->layers, re->r.actlay);
+
return rr;
}
@@ -836,16 +841,91 @@ static void do_render_fields(Render *re)
}
+static void do_render_scene_node(Render *re, Scene *sce)
+{
+ Render *resc= RE_NewRender(sce->id.name+2);
+
+ /* makes render result etc */
+ RE_InitState(resc, &sce->r, re->winx, re->winy, &re->disprect);
+
+ /* now use renderdata and camera to set viewplane */
+ RE_SetCamera(resc, sce->camera);
+
+ /* still unsure entity this... */
+ resc->scene= sce;
+
+ /* ensure scene has depsgraph, base flags etc OK. Warning... also sets G.scene */
+ set_scene_bg(sce);
+
+ /* copy callbacks */
+ resc->display_draw= re->display_draw;
+ resc->test_break= re->test_break;
+ resc->stats_draw= re->stats_draw;
+
+ if(resc->r.mode & R_FIELDS)
+ do_render_fields(resc);
+ else if(resc->r.mode & R_MBLUR)
+ do_render_blurred(resc, resc->r.cfra);
+ else
+ render_one_frame(resc);
+
+}
+
static void ntree_render_scenes(Render *re)
{
- SceneRenderLayer *srl;
+ bNode *node;
+
+ if(re->scene->nodetree==NULL) return;
+
+ /* check for render-result nodes using other scenes, we tag them LIB_DOIT */
+ for(node= re->scene->nodetree->nodes.first; node; node= node->next) {
+ if(node->type==CMP_NODE_R_RESULT) {
+ if(node->id) {
+ if(node->id != (ID *)re->scene)
+ node->id->flag |= LIB_DOIT;
+ else
+ node->id->flag &= ~LIB_DOIT;
+ }
+ }
+ }
- for(srl= re->r.layers.first; srl; srl= srl->next) {
-
+ /* now foreach render-result node tagged we do a full render */
+ /* results are stored in a way compisitor will find it */
+ for(node= re->scene->nodetree->nodes.first; node; node= node->next) {
+ if(node->type==CMP_NODE_R_RESULT) {
+ if(node->id && node->id != (ID *)re->scene) {
+ if(node->id->flag & LIB_DOIT) {
+ do_render_scene_node(re, (Scene *)node->id);
+ node->id->flag &= ~LIB_DOIT;
+ }
+ }
+ }
}
+
+ /* still the global... */
+ if(G.scene!=re->scene)
+ set_scene_bg(re->scene);
+
}
-static void do_render_final(Render *re, Scene *scene)
+/* helper call to detect if theres a render-result node */
+int composite_needs_render(Scene *sce)
+{
+ bNodeTree *ntree= sce->nodetree;
+ bNode *node;
+
+ if(ntree==NULL) return 1;
+ if(sce->use_nodes==0) return 1;
+
+ for(node= ntree->nodes.first; node; node= node->next) {
+ if(node->type==CMP_NODE_R_RESULT)
+ if(node->id==NULL || node->id!=&sce->id)
+ return 1;
+ }
+ return 0;
+}
+
+static void do_render_final(Render *re)
{
/* we set start time here, for main Blender loops */
re->i.starttime= PIL_check_seconds_timer();
@@ -856,14 +936,8 @@ static void do_render_final(Render *re, Scene *scene)
do_render_seq(re->result);
}
else {
- /* first check if theres nodetree with render result */
- int do_render= ntreeCompositNeedsRender(scene->nodetree);
- /* but.. do we use nodes? */
- if(scene->use_nodes==0) do_render= 1;
- re->scene= scene;
-
- if(do_render) {
+ if(composite_needs_render(re->scene)) {
/* now use renderdata and camera to set viewplane */
RE_SetCamera(re, re->scene->camera);
@@ -875,15 +949,16 @@ static void do_render_final(Render *re, Scene *scene)
render_one_frame(re);
}
- if(!re->test_break()) {
- /* checks if there are layer nodes that need scene */
- ntree_render_scenes(re);
-
- ntreeCompositTagRender(scene->nodetree);
- ntreeCompositTagAnimated(scene->nodetree);
+ if(!re->test_break() && re->scene->nodetree) {
+ ntreeCompositTagRender(re->scene->nodetree);
+ ntreeCompositTagAnimated(re->scene->nodetree);
- if(re->r.scemode & R_DOCOMP)
- ntreeCompositExecTree(scene->nodetree, &re->r, G.background==0);
+ if(re->r.scemode & R_DOCOMP) {
+ /* checks if there are render-result nodes that need scene */
+ ntree_render_scenes(re);
+
+ ntreeCompositExecTree(re->scene->nodetree, &re->r, G.background==0);
+ }
}
}
@@ -999,7 +1074,7 @@ void RE_BlenderFrame(Render *re, Scene *scene, int frame)
G.rendering= 1;
if(render_initialize_from_scene(re, scene)) {
- do_render_final(re, scene);
+ do_render_final(re);
}
}
@@ -1025,7 +1100,7 @@ void RE_BlenderAnim(Render *re, Scene *scene, int sfra, int efra)
for(scene->r.cfra= sfra; scene->r.cfra<=efra; scene->r.cfra++) {
re->r.cfra= scene->r.cfra; /* weak.... */
- do_render_final(re, scene);
+ do_render_final(re);
/* write image or movie */
if(re->test_break()==0) {
diff --git a/source/blender/src/drawnode.c b/source/blender/src/drawnode.c
index ed8f6d81ba9..c510c34c9a1 100644
--- a/source/blender/src/drawnode.c
+++ b/source/blender/src/drawnode.c
@@ -663,22 +663,77 @@ static int node_composit_buts_image(uiBlock *block, bNodeTree *ntree, bNode *nod
return 19;
}
-static char *scene_layer_menu(void)
+/* if we use render result from other scene, we make a nice title */
+static void set_render_result_title(void *node_v, void *unused)
{
+ bNode *node= node_v;
+ Scene *sce;
SceneRenderLayer *srl;
- int len= 32 + 32*BLI_countlist(&G.scene->r.layers);
+ char str[64];
+
+ if(node->id) {
+ BLI_strncpy(str, node->id->name+2, 21);
+ strcat(str, "|");
+ sce= (Scene *)node->id;
+ }
+ else {
+ str[0]= 0;
+ sce= G.scene;
+ }
+ srl= BLI_findlink(&sce->r.layers, node->custom1);
+ if(srl==NULL) {
+ node->custom1= 0;
+ srl= sce->r.layers.first;
+ }
+
+ strcat(str, srl->name);
+ BLI_strncpy(node->name, str, 32);
+}
+
+static char *scene_layer_menu(Scene *sce)
+{
+ SceneRenderLayer *srl;
+ int len= 32 + 32*BLI_countlist(&sce->r.layers);
short a, nr;
char *str= MEM_callocN(len, "menu layers");
strcpy(str, "Active Layer %t");
a= strlen(str);
- for(nr=0, srl= G.scene->r.layers.first; srl; srl= srl->next, nr++) {
+ for(nr=0, srl= sce->r.layers.first; srl; srl= srl->next, nr++) {
a+= sprintf(str+a, "|%s %%x%d", srl->name, nr);
}
return str;
}
+static void node_browse_scene_cb(void *ntree_v, void *node_v)
+{
+ bNodeTree *ntree= ntree_v;
+ bNode *node= node_v;
+ Scene *sce;
+
+ if(node->menunr<1) return;
+
+ if(node->id) {
+ node->id->us--;
+ node->id= NULL;
+ }
+ sce= BLI_findlink(&G.main->scene, node->menunr-1);
+ if(sce!=G.scene) {
+ node->id= &sce->id;
+ id_us_plus(node->id);
+ }
+
+ set_render_result_title(node, NULL);
+ nodeSetActive(ntree, node);
+
+ allqueue(REDRAWBUTSSHADING, 0);
+ allqueue(REDRAWNODE, 0);
+ NodeTagChanged(ntree, node);
+
+ node->menunr= 0;
+}
+
static int node_composit_buts_renderresult(uiBlock *block, bNodeTree *ntree, bNode *node, rctf *butr)
{
@@ -686,11 +741,22 @@ static int node_composit_buts_renderresult(uiBlock *block, bNodeTree *ntree, bNo
uiBut *bt;
char *strp;
- strp= scene_layer_menu();
+ /* browse button scene */
+ uiBlockBeginAlign(block);
+ IDnames_to_pupstring(&strp, NULL, "", &(G.main->scene), NULL, NULL);
+ node->menunr= 0;
+ bt= uiDefButS(block, MENU, B_NOP, strp,
+ butr->xmin, butr->ymin, 20, 19,
+ &node->menunr, 0, 0, 0, 0, "Browse Scene to use RenderLayer from");
+ uiButSetFunc(bt, node_browse_scene_cb, ntree, node);
+ if(strp) MEM_freeN(strp);
+
+ /* browse button layer */
+ strp= scene_layer_menu(node->id?(Scene *)node->id:G.scene);
bt= uiDefButS(block, MENU, B_NODE_EXEC+node->nr, strp,
- butr->xmin, butr->ymin, (butr->xmax-butr->xmin), 19,
+ butr->xmin+20, butr->ymin, (butr->xmax-butr->xmin)-20, 19,
&node->custom1, 0, 0, 0, 0, "Choose Render Layer");
- uiButSetFunc(bt, node_but_title_cb, node, bt);
+ uiButSetFunc(bt, set_render_result_title, node, NULL);
MEM_freeN(strp);
}
return 19;
diff --git a/source/blender/src/drawscene.c b/source/blender/src/drawscene.c
index 2bf3eb7bae7..4528c2125f4 100644
--- a/source/blender/src/drawscene.c
+++ b/source/blender/src/drawscene.c
@@ -128,7 +128,9 @@ void set_scene(Scene *sce) /* also see scene.c: set_scene_bg() */
sc= sc->id.next;
}
- set_scene_bg(G.scene);
+ set_scene_bg(G.scene);
+ scene_update_for_newframe(G.scene, G.scene->lay);
+
set_radglobal();
/* complete redraw */
diff --git a/source/blender/src/editnode.c b/source/blender/src/editnode.c
index 5330531d32a..2aca3e7d4bc 100644
--- a/source/blender/src/editnode.c
+++ b/source/blender/src/editnode.c
@@ -1603,7 +1603,6 @@ static int node_uiDoBlocks(SpaceNode *snode, ListBase *lb, short event)
lb->first= lb->last= node->block;
retval= uiDoBlocks(lb, event);
-
((struct Link *)node->block)->prev= prev;
break;
diff --git a/source/blender/src/interface.c b/source/blender/src/interface.c
index 3d534744ed3..24995f22422 100644
--- a/source/blender/src/interface.c
+++ b/source/blender/src/interface.c
@@ -1263,9 +1263,12 @@ static int ui_do_but_MENU(uiBut *but)
ui_check_but(but);
/* no draw of button now, for floating panels the matrix now is invalid...
the button still is active, and will be redrawn in main loop to de-activate it */
+ /* but, if no hilites, we send redraw to queue */
+ if(but->flag & UI_NO_HILITE)
+ addqueue(but->block->winq, REDRAW, 1);
uibut_do_func(but);
-
+
/* return no existing event, because the menu sends events instead */
return -1;
}
diff --git a/source/blender/src/renderwin.c b/source/blender/src/renderwin.c
index 8b2c0093b3e..5d98753fdae 100644
--- a/source/blender/src/renderwin.c
+++ b/source/blender/src/renderwin.c
@@ -643,7 +643,7 @@ void calc_renderwin_rectangle(int rectx, int recty, int posmask, int renderpos_r
/* init renderwin, alloc/open/resize */
static void renderwin_init_display_cb(RenderResult *rr)
{
- if (G.afbreek == 0) {
+ if (G.afbreek != 1) {
int rendersize[2], renderpos[2], imagesize[2];
calc_renderwin_rectangle(rr->rectx, rr->recty, G.winpos, renderpos, rendersize);
@@ -808,6 +808,9 @@ static void printrenderinfo_cb(RenderStats *rs)
BLI_timestr(rs->lastframetime, info_time_str);
spos+= sprintf(spos, " Time:%s ", info_time_str);
+ if(rs->infostr)
+ spos+= sprintf(spos, " | %s", rs->infostr);
+
if(render_win) {
if(render_win->render_text) MEM_freeN(render_win->render_text);
render_win->render_text= BLI_strdup(str);
@@ -1026,28 +1029,12 @@ void BIF_do_render(int anim)
}
}
- /* if start render in 3d win, use layer from window (e.g also local view) */
- if(curarea && curarea->spacetype==SPACE_VIEW3D) {
- int lay= G.scene->lay;
- /*
- * if view is defined (might not be if called form script), check
- * and set layers
- */
- if(G.vd) {
- if(G.vd->lay & 0xFF000000) // localview
- G.scene->lay |= G.vd->lay;
- else
- G.scene->lay= G.vd->lay;
- }
-
- do_render(anim);
-
- G.scene->lay= lay;
- }
- else do_render(anim);
+ do_render(anim);
- if(G.scene->use_nodes)
+ if(G.scene->use_nodes) {
allqueue(REDRAWNODE, 1);
+ allqueue(REDRAWIMAGE, 1);
+ }
if (slink_flag) G.f |= G_DOSCRIPTLINKS;
if (G.f & G_DOSCRIPTLINKS) BPY_do_all_scripts(SCRIPT_POSTRENDER);
}
diff --git a/source/blender/src/sequence.c b/source/blender/src/sequence.c
index cc39294231f..65446317a3f 100644
--- a/source/blender/src/sequence.c
+++ b/source/blender/src/sequence.c
@@ -1993,7 +1993,7 @@ void do_build_seqar_cfra(ListBase *seqbase, Sequence ***seqar, int cfra)
int redisplay= (!G.background && !(G.rendering));
oldsce= G.scene;
- if(seq->scene!=G.scene) set_scene_bg(seq->scene); /* set_scene does full dep updates */
+ if(seq->scene!=G.scene) set_scene_bg(seq->scene);
/* prevent eternal loop */
doseq= G.scene->r.scemode & R_DOSEQ;
diff --git a/source/blender/src/space.c b/source/blender/src/space.c
index ec16fb89fa3..c7926d00715 100644
--- a/source/blender/src/space.c
+++ b/source/blender/src/space.c
@@ -459,6 +459,7 @@ void start_game(void)
* Better would be to make a better routine
* in the game engine for finding the camera.
* - zr
+ * Note: yes, this is all very badly hacked! (ton)
*/
for (sc= G.main->scene.first; sc; sc= sc->id.next) {
if (!sc->camera) {
@@ -500,7 +501,8 @@ void start_game(void)
restore_all_scene_cfra(scene_cfra_store);
set_scene_bg(startscene);
-
+ scene_update_for_newframe(G.scene, G.scene->lay);
+
if (G.flags & G_FILE_AUTOPLAY)
exit_usiblender();