[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [27741] branches/render25/source/blender/ render/intern/source/rendercore.c: Render Branch: SSS now works slightly better with render layers, previously

Brecht Van Lommel brecht at blender.org
Thu Mar 25 13:02:03 CET 2010


Revision: 27741
          http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=27741
Author:   blendix
Date:     2010-03-25 13:02:03 +0100 (Thu, 25 Mar 2010)

Log Message:
-----------
Render Branch: SSS now works slightly better with render layers, previously
it would assume the material to be on all layers, now it only assumes it to
be on the layers that have an object with the same SSS material.

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

Modified: branches/render25/source/blender/render/intern/source/rendercore.c
===================================================================
--- branches/render25/source/blender/render/intern/source/rendercore.c	2010-03-25 11:42:02 UTC (rev 27740)
+++ branches/render25/source/blender/render/intern/source/rendercore.c	2010-03-25 12:02:03 UTC (rev 27741)
@@ -42,6 +42,7 @@
 #include "BLI_rand.h"
 #include "BLI_threads.h"
 
+#include "BKE_material.h"
 #include "BKE_utildefines.h"
 
 #include "DNA_lamp_types.h"
@@ -1041,6 +1042,40 @@
 #endif
 }
 
+static void render_sss_layer(Render *re, RenderResult *rr, Material *ma, ShadeInput *shi)
+{
+	ObjectInstanceRen *obi;
+	ObjectRen *obr;
+	VlakRen *vlr;
+	RenderLayer *rl;
+	int v;
+
+	/* we use as layer the combined layer flags of all render layers that
+	   have this material. actually we should be doing SSS per layer .. */
+	for(obi=re->db.instancetable.first; obi; obi=obi->next) {
+		obr= obi->obr;
+
+		for(v=0; v<obr->totvlak; v++) {
+			if((v & 255)==0) vlr= obr->vlaknodes[v>>8].vlak;
+			else vlr++;
+			
+			if(material_in_material(vlr->mat, ma))
+				break;
+		}
+
+		if(v != obr->totvlak) {
+			for(rl=rr->layers.first; rl; rl=rl->next) {
+				if(obi->lay & rl->lay) {
+					shi->shading.lay |= rl->lay;
+					shi->shading.layflag |= rl->layflag;
+					shi->shading.passflag |= rl->passflag;
+					shi->shading.combinedflag |= ~rl->pass_xor;
+				}
+			}
+		}
+	}
+}
+
 void render_sss_bake_part(Render *re, RenderPart *pa)
 {
 	ShadeSample ssamp;
@@ -1080,20 +1115,15 @@
 	memset(&ssamp, 0, sizeof(ssamp));
 	shade_sample_initialize(re, &ssamp, pa, rr->layers.first);
 	ssamp.tot= 1;
-	
-	for(rl=rr->layers.first; rl; rl=rl->next) {
-		ssamp.shi[0].shading.lay |= rl->lay;
-		ssamp.shi[0].shading.layflag |= rl->layflag;
-		ssamp.shi[0].shading.passflag |= rl->passflag;
-		ssamp.shi[0].shading.combinedflag |= ~rl->pass_xor;
-	}
 
+	render_sss_layer(re, rr, mat, &ssamp.shi[0]);
+	lay= ssamp.shi[0].shading.lay;
+
 	rl= rr->layers.first;
 	ssamp.shi[0].shading.passflag |= SCE_PASS_RGBA|SCE_PASS_COMBINED;
 	ssamp.shi[0].shading.combinedflag &= ~(SCE_PASS_SPEC);
 	ssamp.shi[0].material.mat_override= NULL;
 	ssamp.shi[0].material.light_override= NULL;
-	lay= ssamp.shi[0].shading.lay;
 
 	/* create the pixelstrs to be used later */
 	zbuffer_sss(re, pa, lay, &handle, addps_sss);





More information about the Bf-blender-cvs mailing list