[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [27394] branches/render25/source/blender/ render/intern/source: Render Branch: strands rendering now does raytraced ao/env/indirect at the

Brecht Van Lommel brecht at blender.org
Wed Mar 10 20:16:57 CET 2010


Revision: 27394
          http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=27394
Author:   blendix
Date:     2010-03-10 20:16:56 +0100 (Wed, 10 Mar 2010)

Log Message:
-----------
Render Branch: strands rendering now does raytraced ao/env/indirect at the
root of the strand just like approximate.

Modified Paths:
--------------
    branches/render25/source/blender/render/intern/source/object_particle.c
    branches/render25/source/blender/render/intern/source/rayshade.c

Modified: branches/render25/source/blender/render/intern/source/object_particle.c
===================================================================
--- branches/render25/source/blender/render/intern/source/object_particle.c	2010-03-10 19:02:50 UTC (rev 27393)
+++ branches/render25/source/blender/render/intern/source/object_particle.c	2010-03-10 19:16:56 UTC (rev 27394)
@@ -616,7 +616,7 @@
 	float pa_time, pa_birthtime, pa_dietime;
 	float random, simplify[2];
 	int i, a, k, max_k=0, totpart, dosimplify = 0, dosurfacecache = 0;
-	int totchild=0;
+	int totchild=0, dosurfacenor=0;
 	int seed, path_nbr=0, num;
 	int totface, *origindex = 0;
 	char **uv_name=0;
@@ -786,9 +786,15 @@
 
 			if(re->params.r.mode & R_SPEED)
 				dosurfacecache= 1;
-			else if((re->db.wrld.mode & (WO_AMB_OCC|WO_ENV_LIGHT|WO_INDIRECT_LIGHT)) && (re->db.wrld.ao_gather_method == WO_LIGHT_GATHER_APPROX))
-				if(ma->amb != 0.0f)
+			else if(re->db.wrld.mode & (WO_AMB_OCC|WO_ENV_LIGHT|WO_INDIRECT_LIGHT) && ma->amb!=0.0f) {
+				if(re->db.wrld.ao_gather_method == WO_LIGHT_GATHER_APPROX)
 					dosurfacecache= 1;
+				else
+					dosurfacenor= 1;
+			}
+			
+			if(ma->mode_l & MA_STR_SURFDIFF)
+				dosurfacenor= 1;
 
 			totface= psmd->dm->getNumFaces(psmd->dm);
 			origindex= psmd->dm->getFaceDataArray(psmd->dm, CD_ORIGINDEX);
@@ -939,7 +945,7 @@
 		}
 
 		/* surface normal shading setup */
-		if(ma->mode_l & MA_STR_SURFDIFF) {
+		if(dosurfacenor) {
 			mul_m3_v3(nmat, nor);
 			sd.surfnor= nor;
 		}

Modified: branches/render25/source/blender/render/intern/source/rayshade.c
===================================================================
--- branches/render25/source/blender/render/intern/source/rayshade.c	2010-03-10 19:02:50 UTC (rev 27393)
+++ branches/render25/source/blender/render/intern/source/rayshade.c	2010-03-10 19:16:56 UTC (rev 27394)
@@ -57,6 +57,7 @@
 #include "material.h"
 #include "object.h"
 #include "object_mesh.h"
+#include "object_strand.h"
 #include "pixelfilter.h"
 #include "raycounter.h"
 #include "rayobject.h"
@@ -1960,17 +1961,36 @@
 	maxdist= re->db.wrld.aodist;
 	nearest= (indirect || (ao && (re->db.wrld.aomode & WO_LIGHT_DIST)) || Rmean);
 
-	/* local orthonormal basis */
-	if((re->db.wrld.ao_bump_method == WO_LIGHT_BUMP_FULL) || !(re->db.wrld.aomode & WO_LIGHT_CACHE))
-		negate_v3_v3(basis[2], shi->geometry.vn);
-	else
-		negate_v3_v3(basis[2], shi->geometry.vno);
+	if(!shi->primitive.strand) {
+		/* jittered starting coordinates */
+		shade_jittered_coords(re, shi, totsample, jitco, &totjitco);
 
-	ortho_basis_v3v3_v3(basis[0], basis[1], basis[2]);
+		/* local orthonormal basis */
+		if((re->db.wrld.ao_bump_method == WO_LIGHT_BUMP_FULL) || !(re->db.wrld.aomode & WO_LIGHT_CACHE))
+			negate_v3_v3(basis[2], shi->geometry.vn);
+		else
+			negate_v3_v3(basis[2], shi->geometry.vno);
 
-	/* jittered starting coordinates */
-	shade_jittered_coords(re, shi, totsample, jitco, &totjitco);
+		ortho_basis_v3v3_v3(basis[0], basis[1], basis[2]);
+	}
+	else {
+		/* for strands we sample at the root of the strand */
+		StrandRen *strand= shi->primitive.strand;
+		float *surfnor= render_strand_get_surfnor(shi->primitive.obr, strand, 0);
+		float offset[3];
 
+		copy_v3_v3(jitco[0], strand->vert[1].co);
+		totjitco= 1;
+
+		/* offset to avoid self intersection */
+		sub_v3_v3v3(offset, strand->vert[2].co, jitco[0]);
+		normalize_v3(offset);
+		madd_v3_v3fl(jitco[0], offset, 1e-8f);
+
+		copy_v3_v3(basis[2], surfnor);
+		ortho_basis_v3v3_v3(basis[0], basis[1], basis[2]);
+	}
+
 	/* clear accumulation variables */
 	accum_ao= 0.0f;
 	zero_v3(accum_env);





More information about the Bf-blender-cvs mailing list