[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