[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [17643] branches/soc-2007-joeedh/source/ blender/render/intern/source: fixed some of the strand issues, though there 's still a problem where strand shade interpolation isn' t working for some reason.
Joseph Eagar
joeedh at gmail.com
Sun Nov 30 13:20:20 CET 2008
Revision: 17643
http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=17643
Author: joeedh
Date: 2008-11-30 13:20:20 +0100 (Sun, 30 Nov 2008)
Log Message:
-----------
fixed some of the strand issues, though there's still a problem where strand shade interpolation isn't working for some reason. not sure how important it is.
Modified Paths:
--------------
branches/soc-2007-joeedh/source/blender/render/intern/source/dsm.c
branches/soc-2007-joeedh/source/blender/render/intern/source/shadeoutput.c
branches/soc-2007-joeedh/source/blender/render/intern/source/strand.c
branches/soc-2007-joeedh/source/blender/render/intern/source/zbuf_shade.c
Modified: branches/soc-2007-joeedh/source/blender/render/intern/source/dsm.c
===================================================================
--- branches/soc-2007-joeedh/source/blender/render/intern/source/dsm.c 2008-11-30 12:00:03 UTC (rev 17642)
+++ branches/soc-2007-joeedh/source/blender/render/intern/source/dsm.c 2008-11-30 12:20:20 UTC (rev 17643)
@@ -199,10 +199,8 @@
map has finished rendering, the scene is rerotated back into camera
space (note this happens for every dsm map in the scene individually).
- this function is not based off the envmap equavilent env_rotate_scene,
- which turned out not to work at all, though I can't figure out why
- it works for envmap but not for dsm.
-
+ this is semi-based off of the env_rotate_scene equivalent.
+
note: this is more of a brute-forth method then env_rotate_scene uses.*/
static void retransform_renderscene(Render *re, float newview[4][4], float oldview[4][4], ShadBuf *buf, int mode)
{
@@ -1115,7 +1113,7 @@
mat= strand->buffer->ma;
ssamp.shi[0].mat= mat;
- ssamp.shi[0].har= ssamp.shi[0].mat->har;
+ ssamp.shi[0].har= mat->har;
memset(&sseg, 0, sizeof(sseg));
Modified: branches/soc-2007-joeedh/source/blender/render/intern/source/shadeoutput.c
===================================================================
--- branches/soc-2007-joeedh/source/blender/render/intern/source/shadeoutput.c 2008-11-30 12:00:03 UTC (rev 17642)
+++ branches/soc-2007-joeedh/source/blender/render/intern/source/shadeoutput.c 2008-11-30 12:20:20 UTC (rev 17643)
@@ -38,6 +38,7 @@
#include "BKE_texture.h"
#include "BKE_utildefines.h"
#include "BKE_global.h"
+#include "BKE_dsm.h"
#include "DNA_group_types.h"
#include "DNA_lamp_types.h"
@@ -1054,12 +1055,11 @@
LampShadowSubSample *lss= &(lar->shadsamp[shi->thread].s[shi->sample]);
if(do_real || lss->samplenr!=shi->samplenr) {
-
shadfac[0]= shadfac[1]= shadfac[2]= shadfac[3]= 1.0f;
if(lar->shb) {
if(lar->buftype==LA_SHADBUF_IRREGULAR) {
- shadfac[0] = shadfac[1] = shadfac[2] = ISB_getshadow(shi, lar->shb);
+ shadfac[3]= shadfac[2] = shadfac[1] = shadfac[0] = ISB_getshadow(shi, lar->shb);
} else if (lar->buftype==LA_SHADBUF_DEEP) {
if (G.rt == 51 || G.rt == 52 || DSM_SOFT) {
/*char bleh[1] = {0};
@@ -1081,19 +1081,21 @@
shadfac[1] = DSM_getBilinearShadow(lar->shb, shi->co, shi->dxco, shi->dyco, inp, 1);
shadfac[2] = DSM_getBilinearShadow(lar->shb, shi->co, shi->dxco, shi->dyco, inp, 2);
}
- } else
- shadfac[0] = shadfac[1] = shadfac[2] = testshadowbuf(&R, lar->shb, shi->co, shi->dxco, shi->dyco, inp, shi->mat->lbias);
+ shadfac[3] = (shadfac[0] + shadfac[1] + shadfac[2]) / 3.0;
+ } else {
+ shadfac[3]= shadfac[2] = shadfac[1] = shadfac[0] = testshadowbuf(&R, lar->shb, shi->co, shi->dxco, shi->dyco, inp, shi->mat->lbias);
+ }
} else if(lar->mode & LA_SHAD_RAY) {
ray_shadow(shi, lar, shadfac);
}
if(shi->depth==0) {
- VECCOPY(lss->shadfac, shadfac);
+ QUATCOPY(lss->shadfac, shadfac);
lss->samplenr= shi->samplenr;
}
}
else {
- VECCOPY(shadfac, lss->shadfac);
+ QUATCOPY(shadfac, lss->shadfac);
}
}
@@ -1201,7 +1203,7 @@
{
Material *ma= shi->mat;
VlakRen *vlr= shi->vlr;
- float lv[3], lampdist, lacol[3], shadfac[4], shadaver, lashdw[3];
+ float lv[3], lampdist, lacol[3], shadfac[4], lashdw[3];
float i, is, i_noshad, inp, *vn, *view, vnor[3], phongcorr=1.0f;
float visifac;
@@ -1350,10 +1352,8 @@
if(ma->mode & MA_TANGENT_V)
vn= shi->tang;
- /* init transp shadow. shadfac now only has three components */
+ /* init transp shadow */
shadfac[0]= shadfac[1]= shadfac[2]= shadfac[3]= 1.0f;
- /*average of the three shadow components*/
- shadaver = 1.0;
/* shadow and spec, (visifac==0 outside spot) */
if(visifac> 0.0f) {
@@ -1366,16 +1366,14 @@
lamp_get_shadow(lar, shi, INPR(shi->vn, lv), shadfac, shi->depth);
else
lamp_get_shadow(lar, shi, inp, shadfac, shi->depth);
-
- shadaver = (shadfac[0]+shadfac[1]+shadfac[2]) / 3.0f;
-
+
/* warning, here it skips the loop */
if((lar->mode & LA_ONLYSHADOW) && i>0.0) {
- shadaver= i*lar->energy*(1.0f-shadaver);
- shr->shad[0] -= shadfac[0]*shi->r*(1.0f-lashdw[0]);
- shr->shad[1] -= shadfac[1]*shi->g*(1.0f-lashdw[1]);
- shr->shad[2] -= shadfac[2]*shi->b*(1.0f-lashdw[2]);
+ shadfac[3]= i*lar->energy*(1.0f-shadfac[3]);
+ shr->shad[0] -= shadfac[3]*shi->r*(1.0f-lashdw[0]);
+ shr->shad[1] -= shadfac[3]*shi->g*(1.0f-lashdw[1]);
+ shr->shad[2] -= shadfac[3]*shi->b*(1.0f-lashdw[2]);
shr->spec[0] -= shadfac[3]*shi->specr*(1.0f-lashdw[0]);
shr->spec[1] -= shadfac[3]*shi->specg*(1.0f-lashdw[1]);
@@ -1384,9 +1382,7 @@
return;
}
- if(!(ma->mode & MA_SHADOW_TRA)) {
- i*= shadaver;
- }
+ i*= shadfac[3];
}
}
}
@@ -1394,10 +1390,7 @@
/* in case 'no diffuse' we still do most calculus, spec can be in shadow.*/
if(!(lar->mode & LA_NO_DIFF)) {
if(i>0.0f) {
- if(ma->mode & MA_SHADOW_TRA)
- add_to_diffuse(shr->shad, shi, is, i*shadfac[0]*lacol[0], i*shadfac[1]*lacol[1], i*shadfac[2]*lacol[2]);
- else
- add_to_diffuse(shr->shad, shi, is, i*lacol[0], i*lacol[1], i*lacol[2]);
+ add_to_diffuse(shr->shad, shi, is, i*shadfac[0]*lacol[0], i*shadfac[1]*lacol[1], i*shadfac[2]*lacol[2]);
}
/* add light for colored shadow */
if (i_noshad>i && !(lashdw[0]==0 && lashdw[1]==0 && lashdw[2]==0)) {
@@ -1405,10 +1398,7 @@
}
if(i_noshad>0.0f) {
if(passflag & (SCE_PASS_DIFFUSE|SCE_PASS_SHADOW)) {
- if(ma->mode & MA_SHADOW_TRA)
- add_to_diffuse(shr->diff, shi, is, i_noshad*shadfac[0]*lacol[0], i_noshad*shadfac[1]*lacol[1], i_noshad*shadfac[2]*lacol[2]);
- else
- add_to_diffuse(shr->diff, shi, is, i_noshad*lacol[0], i_noshad*lacol[1], i_noshad*lacol[2]);
+ add_to_diffuse(shr->diff, shi, is, i_noshad*shadfac[0]*lacol[0], i_noshad*shadfac[1]*lacol[1], i_noshad*shadfac[2]*lacol[2]);
}
else
VECCOPY(shr->diff, shr->shad);
@@ -1418,7 +1408,7 @@
/* specularity */
shadfac[3]*= phongcorr; /* note, shadfac not allowed to be stored nonlocal */
- if(shadaver>0.0f && shi->spec!=0.0f && !(lar->mode & LA_NO_SPEC) && !(lar->mode & LA_ONLYSHADOW)) {
+ if(shadfac[3]>0.0f && shi->spec!=0.0f && !(lar->mode & LA_NO_SPEC) && !(lar->mode & LA_ONLYSHADOW)) {
if(!(passflag & (SCE_PASS_COMBINED|SCE_PASS_SPEC)));
else if(lar->type==LA_HEMI) {
@@ -1437,11 +1427,11 @@
t= 0.5*t+0.5;
}
- t= shi->spec*spec(t, shi->har);
+ t= shadfac[3]*shi->spec*spec(t, shi->har);
- shr->spec[0]+= shadfac[0]*t*(lacol[0] * shi->specr);
- shr->spec[1]+= shadfac[1]*t*(lacol[1] * shi->specg);
- shr->spec[2]+= shadfac[2]*t*(lacol[2] * shi->specb);
+ shr->spec[0]+= t*(lacol[0] * shi->specr);
+ shr->spec[1]+= t*(lacol[1] * shi->specg);
+ shr->spec[2]+= t*(lacol[2] * shi->specb);
}
else {
/* specular shaders */
@@ -1461,19 +1451,19 @@
/* area lamp correction */
if(lar->type==LA_AREA) specfac*= inp;
- t= shadaver*shi->spec*visifac*specfac;
+ t= shadfac[3]*shi->spec*visifac*specfac;
if(ma->mode & MA_RAMP_SPEC) {
float spec[3];
do_specular_ramp(shi, specfac, t, spec);
- shr->spec[0]+= shadfac[0]*t*(lacol[0] * spec[0]);
- shr->spec[1]+= shadfac[1]*t*(lacol[1] * spec[1]);
- shr->spec[2]+= shadfac[2]*t*(lacol[2] * spec[2]);
+ shr->spec[0]+= t*(lacol[0] * spec[0]);
+ shr->spec[1]+= t*(lacol[1] * spec[1]);
+ shr->spec[2]+= t*(lacol[2] * spec[2]);
}
else {
- shr->spec[0]+= shadfac[0]*t*(lacol[0] * shi->specr);
- shr->spec[1]+= shadfac[1]*t*(lacol[1] * shi->specg);
- shr->spec[2]+= shadfac[2]*t*(lacol[2] * shi->specb);
+ shr->spec[0]+= t*(lacol[0] * shi->specr);
+ shr->spec[1]+= t*(lacol[1] * shi->specg);
+ shr->spec[2]+= t*(lacol[2] * shi->specb);
}
}
}
@@ -1488,7 +1478,7 @@
LampRen *lar;
GroupObject *go;
float inpr, lv[3];
- float *vn, *view, shadfac[4], shadaver;
+ float *view, shadfac[4];
float ir, accum, visifac, lampdist;
@@ -1521,10 +1511,9 @@
continue;
}
lamp_get_shadow(lar, shi, inpr, shadfac, shi->depth);
- shadaver = (shadfac[0]+shadfac[1]+shadfac[2])/3.0;
-
+
ir+= 1.0f;
- accum+= (1.0f-visifac) + (visifac)*shadaver;
+ accum+= (1.0f-visifac) + (visifac)*shadfac[3];
}
}
if(ir>0.0f) {
Modified: branches/soc-2007-joeedh/source/blender/render/intern/source/strand.c
===================================================================
--- branches/soc-2007-joeedh/source/blender/render/intern/source/strand.c 2008-11-30 12:00:03 UTC (rev 17642)
+++ branches/soc-2007-joeedh/source/blender/render/intern/source/strand.c 2008-11-30 12:20:20 UTC (rev 17643)
@@ -285,16 +285,18 @@
shi->har= shi->mat->har;
/* shade */
- shade_samples_do_AO(ssamp);
- shade_input_do_shade(shi, shr);
+ if (!sseg->shadow_mode) {
+ shade_samples_do_AO(ssamp);
+ shade_input_do_shade(shi, shr);
- /* apply simplification */
- strand_apply_shaderesult_alpha(shr, spoint->alpha);
+ /* apply simplification */
+ strand_apply_shaderesult_alpha(shr, spoint->alpha);
- /* include lamphalos for strand, since halo layer was added already */
- if(re->flag & R_LAMPHALO)
- if(shi->layflag & SCE_LAY_HALO)
- renderspothalo(shi, shr->combined, shr->combined[3]);
+ /* include lamphalos for strand, since halo layer was added already */
+ if(re->flag & R_LAMPHALO)
+ if(shi->layflag & SCE_LAY_HALO)
+ renderspothalo(shi, shr->combined, shr->combined[3]);
+ } else shade_color(shi, shr);
shi->strand= NULL;
}
Modified: branches/soc-2007-joeedh/source/blender/render/intern/source/zbuf_shade.c
===================================================================
--- branches/soc-2007-joeedh/source/blender/render/intern/source/zbuf_shade.c 2008-11-30 12:00:03 UTC (rev 17642)
+++ branches/soc-2007-joeedh/source/blender/render/intern/source/zbuf_shade.c 2008-11-30 12:20:20 UTC (rev 17643)
@@ -916,6 +916,8 @@
StrandVert *svert;
ObjectInstanceRen *obi;
ObjectRen *obr;
+
+ memset(&sseg, 0, sizeof(sseg));
obi= R.objectinstance + row->obi;
obr= obi->obr;
@@ -923,6 +925,7 @@
sseg.obi= obi;
sseg.strand= RE_findOrAddStrand(obr, row->p-1);
sseg.buffer= sseg.strand->buffer;
+ sseg.shadow_mode = 0;
@@ Diff output truncated at 10240 characters. @@
More information about the Bf-blender-cvs
mailing list