diff options
author | Brecht Van Lommel <brechtvanlommel@pandora.be> | 2008-01-30 16:35:28 +0300 |
---|---|---|
committer | Brecht Van Lommel <brechtvanlommel@pandora.be> | 2008-01-30 16:35:28 +0300 |
commit | 33656dfa83a3c89f8c5729282fb6d4d99d5ae79a (patch) | |
tree | 4c6daac4ffcf49d9f2eee85a40d14d4ee1f47636 | |
parent | bace7e5788bc83dacc05cef6e4b7d448c43c5380 (diff) |
- Bugfix for ztransp not being filled into the z-pass after FSA changes.
- Bugfix for speedvectors being not properly set for some strands.
-rw-r--r-- | source/blender/render/extern/include/RE_shader_ext.h | 2 | ||||
-rw-r--r-- | source/blender/render/intern/source/convertblender.c | 2 | ||||
-rw-r--r-- | source/blender/render/intern/source/rendercore.c | 4 | ||||
-rw-r--r-- | source/blender/render/intern/source/shadeinput.c | 2 | ||||
-rw-r--r-- | source/blender/render/intern/source/strand.c | 11 | ||||
-rw-r--r-- | source/blender/render/intern/source/zbuf.c | 9 |
6 files changed, 25 insertions, 5 deletions
diff --git a/source/blender/render/extern/include/RE_shader_ext.h b/source/blender/render/extern/include/RE_shader_ext.h index e082225c5ea..8e3d60d4d80 100644 --- a/source/blender/render/extern/include/RE_shader_ext.h +++ b/source/blender/render/extern/include/RE_shader_ext.h @@ -47,7 +47,7 @@ typedef struct ShadeResult { float combined[4]; float col[4]; - float alpha, mist; + float alpha, mist, z; float diff[3]; /* no ramps, shadow, etc */ float spec[3]; float shad[3]; diff --git a/source/blender/render/intern/source/convertblender.c b/source/blender/render/intern/source/convertblender.c index 7b81acdbc1c..38ae7fde181 100644 --- a/source/blender/render/intern/source/convertblender.c +++ b/source/blender/render/intern/source/convertblender.c @@ -4746,7 +4746,7 @@ static void calculate_speedvectors(Render *re, ObjectInstanceRen *obi, float *ve else strand++; index= RE_strandren_get_face(obr, strand, 0); - if(index && *index) { + if(index) { speed= RE_strandren_get_winspeed(obi, strand, 1); /* interpolate speed vectors from strand surface */ diff --git a/source/blender/render/intern/source/rendercore.c b/source/blender/render/intern/source/rendercore.c index 375d8a23a2e..a87824e23af 100644 --- a/source/blender/render/intern/source/rendercore.c +++ b/source/blender/render/intern/source/rendercore.c @@ -359,7 +359,7 @@ static void add_filt_passes(RenderLayer *rl, int curmask, int rectx, int offset, switch(rpass->passtype) { case SCE_PASS_Z: fp= rpass->rect + offset; - *fp= -shi->co[2]; + *fp= shr->z; break; case SCE_PASS_RGBA: col= shr->col; @@ -451,7 +451,7 @@ static void add_passes(RenderLayer *rl, int offset, ShadeInput *shi, ShadeResult switch(rpass->passtype) { case SCE_PASS_Z: fp= rpass->rect + offset; - *fp= -shi->co[2]; + *fp= shr->z; break; case SCE_PASS_RGBA: col= shr->col; diff --git a/source/blender/render/intern/source/shadeinput.c b/source/blender/render/intern/source/shadeinput.c index a0554cbaa56..57fda17fc48 100644 --- a/source/blender/render/intern/source/shadeinput.c +++ b/source/blender/render/intern/source/shadeinput.c @@ -186,6 +186,8 @@ void shade_input_do_shade(ShadeInput *shi, ShadeResult *shr) } else shr->combined[3]= 1.0f; + /* add z */ + shr->z= -shi->co[2]; } /* **************************************************************************** */ diff --git a/source/blender/render/intern/source/strand.c b/source/blender/render/intern/source/strand.c index e66d12de15b..2aceb8c6306 100644 --- a/source/blender/render/intern/source/strand.c +++ b/source/blender/render/intern/source/strand.c @@ -214,6 +214,8 @@ void interpolate_shade_result(ShadeResult *shr1, ShadeResult *shr2, float t, Sha } /* optim... */ if(addpassflag & ~(SCE_PASS_VECTOR)) { + if(addpassflag & SCE_PASS_Z) + interpolate_vec1(&shr1->z, &shr2->z, t, negt, &shr->z); if(addpassflag & SCE_PASS_RGBA) interpolate_vec4(shr1->col, shr2->col, t, negt, shr->col); if(addpassflag & SCE_PASS_NORMAL) { @@ -411,6 +413,7 @@ typedef struct StrandPart { ZSpan *zspan; APixstrand *apixbuf; + int *totapixbuf; int *rectz; long *rectdaps; int rectx, recty; @@ -483,6 +486,8 @@ static APixstrand *addpsAstrand(ZSpan *zspan) return zspan->curpstrand; } +#define MAX_ZROW 2000 + static void do_strand_fillac(void *handle, int x, int y, float u, float v, float z) { StrandPart *spart= (StrandPart*)handle; @@ -528,7 +533,7 @@ static void do_strand_fillac(void *handle, int x, int y, float u, float v, float {apn->obi[n]= obi; apn->p[n]= strnr; apn->z[n]= zverg; apn->mask[n]= mask; apn->v[n]= t; apn->u[n]= s; apn->seg[n]= seg; break; } /* add to pixel list */ - if(zverg < bufferz) { + if(zverg < bufferz && (spart->totapixbuf[offset] < MAX_ZROW)) { t = u*spart->t[0] + v*spart->t[1] + (1.0f-u-v)*spart->t[2]; s = fabs(u*spart->s[0] + v*spart->s[1] + (1.0f-u-v)*spart->s[2]); @@ -551,6 +556,7 @@ static void do_strand_fillac(void *handle, int x, int y, float u, float v, float strand_shade_refcount(cache, sseg->v[1]); strand_shade_refcount(cache, sseg->v[2]); + spart->totapixbuf[offset]++; } } @@ -875,6 +881,8 @@ int zbuffer_strands_abuf(Render *re, RenderPart *pa, RenderLayer *rl, APixstrand BLI_memarena_free(memarena); + spart.totapixbuf= MEM_callocN(sizeof(int)*pa->rectx*pa->recty, "totapixbuf"); + if(!re->test_break()) { /* render segments in sorted order */ sortseg= sortsegments; @@ -907,6 +915,7 @@ int zbuffer_strands_abuf(Render *re, RenderPart *pa, RenderLayer *rl, APixstrand if(sortsegments) MEM_freeN(sortsegments); + MEM_freeN(spart.totapixbuf); zbuf_free_span(&zspan); diff --git a/source/blender/render/intern/source/zbuf.c b/source/blender/render/intern/source/zbuf.c index 080a66e46a7..aa652d78f3a 100644 --- a/source/blender/render/intern/source/zbuf.c +++ b/source/blender/render/intern/source/zbuf.c @@ -3575,6 +3575,11 @@ void add_transp_passes(RenderLayer *rl, int offset, ShadeResult *shr, float alph int pixsize= 3; switch(rpass->passtype) { + case SCE_PASS_Z: + fp= rpass->rect + offset; + if(shr->z < *fp) + *fp= shr->z; + break; case SCE_PASS_RGBA: fp= rpass->rect + 4*offset; addAlphaOverFloat(fp, shr->col); @@ -3801,6 +3806,8 @@ static int addtosamp_shr(ShadeResult *samp_shr, ShadeSample *ssamp, int addpassf addAlphaUnderFloat(samp_shr->combined, shr->combined); + samp_shr->z= MIN2(samp_shr->z, shr->z); + if(addpassflag & SCE_PASS_VECTOR) { QUATCOPY(samp_shr->winspeed, shr->winspeed); } @@ -4071,6 +4078,8 @@ 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)*R.osa); + for(a=0; a<R.osa; a++) + samp_shr[a].z= 10e10f; /* nice this memset, but speed vectors are not initialized OK then. it is sufficient to only clear 1 (see merge_transp_passes) */ if(addpassflag & SCE_PASS_VECTOR) |