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
path: root/source
diff options
context:
space:
mode:
authorBrecht Van Lommel <brechtvanlommel@pandora.be>2008-01-30 16:35:28 +0300
committerBrecht Van Lommel <brechtvanlommel@pandora.be>2008-01-30 16:35:28 +0300
commit33656dfa83a3c89f8c5729282fb6d4d99d5ae79a (patch)
tree4c6daac4ffcf49d9f2eee85a40d14d4ee1f47636 /source
parentbace7e5788bc83dacc05cef6e4b7d448c43c5380 (diff)
- Bugfix for ztransp not being filled into the z-pass after FSA changes.
- Bugfix for speedvectors being not properly set for some strands.
Diffstat (limited to 'source')
-rw-r--r--source/blender/render/extern/include/RE_shader_ext.h2
-rw-r--r--source/blender/render/intern/source/convertblender.c2
-rw-r--r--source/blender/render/intern/source/rendercore.c4
-rw-r--r--source/blender/render/intern/source/shadeinput.c2
-rw-r--r--source/blender/render/intern/source/strand.c11
-rw-r--r--source/blender/render/intern/source/zbuf.c9
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)