From c5c53b0f2df4d9eeae6564fa3e2e500bef2d8d15 Mon Sep 17 00:00:00 2001 From: Brecht Van Lommel Date: Mon, 11 Feb 2008 11:00:09 +0000 Subject: [PATCH] Bugfix: FSA enabled in compositing scene but disabled in other scenes could crash, there was code to make sure osa level is the same in all scenes, but that was set too late, after sample tables are created. Fix for some unitinialized vector warnings with FSA, these were harmless, unfortunately. --- .../render/extern/include/RE_pipeline.h | 2 +- .../render/intern/source/convertblender.c | 2 +- source/blender/render/intern/source/envmap.c | 2 +- .../blender/render/intern/source/pipeline.c | 30 ++++++++++--------- .../blender/render/intern/source/rendercore.c | 18 ++++++----- source/blender/render/intern/source/zbuf.c | 13 ++++---- source/blender/src/previewrender.c | 4 +-- source/blender/src/renderwin.c | 2 +- 8 files changed, 41 insertions(+), 32 deletions(-) diff --git a/source/blender/render/extern/include/RE_pipeline.h b/source/blender/render/extern/include/RE_pipeline.h index c9b973c4f1d..d8f6836005b 100644 --- a/source/blender/render/extern/include/RE_pipeline.h +++ b/source/blender/render/extern/include/RE_pipeline.h @@ -153,7 +153,7 @@ struct RenderLayer *RE_GetRenderLayer(struct RenderResult *rr, const char *name) float *RE_RenderLayerGetPass(struct RenderLayer *rl, int passtype); /* obligatory initialize call, disprect is optional */ -void RE_InitState (struct Render *re, struct RenderData *rd, int winx, int winy, rcti *disprect); +void RE_InitState (struct Render *re, struct Render *source, struct RenderData *rd, int winx, int winy, rcti *disprect); /* use this to change disprect of active render */ void RE_SetDispRect (struct Render *re, rcti *disprect); diff --git a/source/blender/render/intern/source/convertblender.c b/source/blender/render/intern/source/convertblender.c index 3791ace07b0..6f9f0831729 100644 --- a/source/blender/render/intern/source/convertblender.c +++ b/source/blender/render/intern/source/convertblender.c @@ -5173,7 +5173,7 @@ void RE_make_sticky(void) } re= RE_NewRender("_make sticky_"); - RE_InitState(re, &G.scene->r, G.scene->r.xsch, G.scene->r.ysch, NULL); + RE_InitState(re, NULL, &G.scene->r, G.scene->r.xsch, G.scene->r.ysch, NULL); /* use renderdata and camera to set viewplane */ RE_SetCamera(re, G.scene->camera); diff --git a/source/blender/render/intern/source/envmap.c b/source/blender/render/intern/source/envmap.c index 81d5c8ea9ed..fd73fd7ab60 100644 --- a/source/blender/render/intern/source/envmap.c +++ b/source/blender/render/intern/source/envmap.c @@ -127,7 +127,7 @@ static Render *envmap_render_copy(Render *re, EnvMap *env) envre->r.size= 100; envre->r.yasp= envre->r.xasp= 1; - RE_InitState(envre, &envre->r, cuberes, cuberes, NULL); + RE_InitState(envre, NULL, &envre->r, cuberes, cuberes, NULL); envre->scene= re->scene; /* unsure about this... */ /* view stuff in env render */ diff --git a/source/blender/render/intern/source/pipeline.c b/source/blender/render/intern/source/pipeline.c index a1e1dccb0a9..f1e88540935 100644 --- a/source/blender/render/intern/source/pipeline.c +++ b/source/blender/render/intern/source/pipeline.c @@ -1058,7 +1058,7 @@ void RE_FreeAllRender(void) /* what doesn't change during entire render sequence */ /* disprect is optional, if NULL it assumes full window render */ -void RE_InitState(Render *re, RenderData *rd, int winx, int winy, rcti *disprect) +void RE_InitState(Render *re, Render *source, RenderData *rd, int winx, int winy, rcti *disprect) { re->ok= TRUE; /* maybe flag */ @@ -1086,13 +1086,19 @@ void RE_InitState(Render *re, RenderData *rd, int winx, int winy, rcti *disprect re->ok= 0; } else { - /* check state variables, osa? */ - if(re->r.mode & (R_OSA)) { - re->osa= re->r.osa; - if(re->osa>16) re->osa= 16; + /* fullsample wants uniform osa levels */ + if(source && re->r.scemode & R_FULL_SAMPLE) { + re->r.osa= re->osa= source->osa; } - else re->osa= 0; - + else { + /* check state variables, osa? */ + if(re->r.mode & (R_OSA)) { + re->osa= re->r.osa; + if(re->osa>16) re->osa= 16; + } + else re->osa= 0; + } + /* always call, checks for gamma, gamma tables and jitter too */ make_sample_tables(re); @@ -1913,7 +1919,7 @@ static void render_scene(Render *re, Scene *sce, int cfra) } /* initial setup */ - RE_InitState(resc, &sce->r, winx, winy, &re->disprect); + RE_InitState(resc, re, &sce->r, winx, winy, &re->disprect); /* this to enable this scene to create speed vectors */ resc->r.scemode |= R_DOCOMP; @@ -1924,10 +1930,6 @@ static void render_scene(Render *re, Scene *sce, int cfra) /* ensure scene has depsgraph, base flags etc OK. Warning... also sets G.scene */ set_scene_bg(sce); - /* fullsample wants uniform osa levels */ - if(resc->r.scemode & R_FULL_SAMPLE) - resc->r.osa= resc->osa= re->osa; - /* copy callbacks */ resc->display_draw= re->display_draw; resc->test_break= re->test_break; @@ -2432,7 +2434,7 @@ static int render_initialize_from_scene(Render *re, Scene *scene) if(scene->r.scemode & R_SINGLE_LAYER) push_render_result(re); - RE_InitState(re, &scene->r, winx, winy, &disprect); + RE_InitState(re, NULL, &scene->r, winx, winy, &disprect); if(!re->ok) /* if an error was printed, abort */ return 0; @@ -2647,7 +2649,7 @@ void RE_ReadRenderResult(Scene *scene, Scene *scenode) re= RE_GetRender(scene->id.name); if(re==NULL) re= RE_NewRender(scene->id.name); - RE_InitState(re, &scene->r, winx, winy, &disprect); + RE_InitState(re, NULL, &scene->r, winx, winy, &disprect); re->scene= scene; read_render_result(re, 0); diff --git a/source/blender/render/intern/source/rendercore.c b/source/blender/render/intern/source/rendercore.c index a87824e23af..2230b4985f6 100644 --- a/source/blender/render/intern/source/rendercore.c +++ b/source/blender/render/intern/source/rendercore.c @@ -819,16 +819,20 @@ void edge_enhance_tile(RenderPart *pa, float *rectf) static void reset_sky_speed(RenderPart *pa, RenderLayer *rl) { /* for all pixels with max speed, set to zero */ + RenderLayer *rlpp[RE_MAX_OSA]; float *fp; - int a; + int a, sample, totsample; - fp= RE_RenderLayerGetPass(rl, SCE_PASS_VECTOR); - if(fp==NULL) return; - - for(a= 4*pa->rectx*pa->recty - 1; a>=0; a--) - if(fp[a] == PASS_VECTOR_MAX) fp[a]= 0.0f; -} + totsample= get_sample_layers(pa, rl, rlpp); + for(sample= 0; samplerectx*pa->recty - 1; a>=0; a--) + if(fp[a] == PASS_VECTOR_MAX) fp[a]= 0.0f; + } +} static unsigned short *make_solid_mask(RenderPart *pa) { diff --git a/source/blender/render/intern/source/zbuf.c b/source/blender/render/intern/source/zbuf.c index 8f4b75cfc73..c7e7c2efa4b 100644 --- a/source/blender/render/intern/source/zbuf.c +++ b/source/blender/render/intern/source/zbuf.c @@ -4055,12 +4055,15 @@ unsigned short *zbuffer_transp_shade(RenderPart *pa, RenderLayer *rl, float *pas /* for each mask-sample we alpha-under colors. then in end it's added using filter */ memset(samp_shr, 0, sizeof(ShadeResult)*osa); - for(a=0; awinspeed[0]= samp_shr->winspeed[1]= samp_shr->winspeed[2]= samp_shr->winspeed[3]= PASS_VECTOR_MAX; + if(addpassflag & SCE_PASS_VECTOR) { + samp_shr[a].winspeed[0]= PASS_VECTOR_MAX; + samp_shr[a].winspeed[1]= PASS_VECTOR_MAX; + samp_shr[a].winspeed[2]= PASS_VECTOR_MAX; + samp_shr[a].winspeed[3]= PASS_VECTOR_MAX; + } + } if(R.osa==0) { while(totface>0) { diff --git a/source/blender/src/previewrender.c b/source/blender/src/previewrender.c index 383b73b7619..00ae72d95d1 100644 --- a/source/blender/src/previewrender.c +++ b/source/blender/src/previewrender.c @@ -463,7 +463,7 @@ void BIF_previewrender(struct ID *id, struct RenderInfo *ri, struct ScrArea *are } /* allocates render result */ - RE_InitState(re, &sce->r, ri->pr_rectx, ri->pr_recty, NULL); + RE_InitState(re, NULL, &sce->r, ri->pr_rectx, ri->pr_recty, NULL); /* enforce preview image clear */ if(GS(id->name)==ID_MA) { @@ -780,7 +780,7 @@ void BIF_view3d_previewrender(ScrArea *sa) rdata.layers.first= rdata.layers.last= NULL; rdata.renderer= R_INTERN; - RE_InitState(re, &rdata, sa->winx, sa->winy, &ri->disprect); + RE_InitState(re, NULL, &rdata, sa->winx, sa->winy, &ri->disprect); if(orth) RE_SetOrtho(re, &viewplane, clipsta, clipend); diff --git a/source/blender/src/renderwin.c b/source/blender/src/renderwin.c index 46af717f2e3..f37f412f2a2 100644 --- a/source/blender/src/renderwin.c +++ b/source/blender/src/renderwin.c @@ -1270,7 +1270,7 @@ void BIF_do_ogl_render(View3D *v3d, int anim) winx= (G.scene->r.size*G.scene->r.xsch)/100; winy= (G.scene->r.size*G.scene->r.ysch)/100; - RE_InitState(re, &G.scene->r, winx, winy, NULL); + RE_InitState(re, NULL, &G.scene->r, winx, winy, NULL); /* for now, result is defaulting to floats still... */ rr= RE_GetResult(re);