[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [15024] branches/soc-2008-unclezeiv/source /blender: Added a new RenderLayer: "false color" (SCE_PASS_LCFAUX).

Davide Vercelli davide.vercelli at gmail.com
Wed May 28 03:51:36 CEST 2008


Revision: 15024
          http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=15024
Author:   unclezeiv
Date:     2008-05-28 03:51:35 +0200 (Wed, 28 May 2008)

Log Message:
-----------
Added a new RenderLayer: "false color" (SCE_PASS_LCFAUX). This will not be part of the final user UI, but should turn out to be very useful for visual debugging during development (it could also be useful for other rendering related projects).
Please note that:
- it doesn't show up as a node socket (I'll add that later, if needed)
- it doesn't show up in the outliner (this is because it's the *first* SCE_PASS_ flag that doesn't fit in a short!!)
- this is a work in progress, please report strange behavior
Currently the red channel reports the (current cut size / max cut size) ratio.
Additionally fixed a deallocation bug.

Modified Paths:
--------------
    branches/soc-2008-unclezeiv/source/blender/makesdna/DNA_scene_types.h
    branches/soc-2008-unclezeiv/source/blender/render/extern/include/RE_shader_ext.h
    branches/soc-2008-unclezeiv/source/blender/render/intern/include/lightcuts.h
    branches/soc-2008-unclezeiv/source/blender/render/intern/source/convertblender.c
    branches/soc-2008-unclezeiv/source/blender/render/intern/source/lightcuts.c
    branches/soc-2008-unclezeiv/source/blender/render/intern/source/pipeline.c
    branches/soc-2008-unclezeiv/source/blender/render/intern/source/rendercore.c
    branches/soc-2008-unclezeiv/source/blender/render/intern/source/shadeoutput.c
    branches/soc-2008-unclezeiv/source/blender/src/buttons_scene.c
    branches/soc-2008-unclezeiv/source/blender/src/outliner.c

Modified: branches/soc-2008-unclezeiv/source/blender/makesdna/DNA_scene_types.h
===================================================================
--- branches/soc-2008-unclezeiv/source/blender/makesdna/DNA_scene_types.h	2008-05-28 00:44:41 UTC (rev 15023)
+++ branches/soc-2008-unclezeiv/source/blender/makesdna/DNA_scene_types.h	2008-05-28 01:51:35 UTC (rev 15024)
@@ -158,6 +158,7 @@
 #define SCE_PASS_UV			4096
 #define SCE_PASS_RADIO		8192
 #define SCE_PASS_MIST		16384
+#define SCE_PASS_LCFAUX     32768
 
 /* note, srl->passflag is treestore element 'nr' in outliner, short still... */
 

Modified: branches/soc-2008-unclezeiv/source/blender/render/extern/include/RE_shader_ext.h
===================================================================
--- branches/soc-2008-unclezeiv/source/blender/render/extern/include/RE_shader_ext.h	2008-05-28 00:44:41 UTC (rev 15023)
+++ branches/soc-2008-unclezeiv/source/blender/render/extern/include/RE_shader_ext.h	2008-05-28 01:51:35 UTC (rev 15024)
@@ -57,6 +57,7 @@
 	float nor[3];
 	float rad[3];
 	float winspeed[4];
+	float faux[4];
 } ShadeResult;
 
 /* only here for quick copy */

Modified: branches/soc-2008-unclezeiv/source/blender/render/intern/include/lightcuts.h
===================================================================
--- branches/soc-2008-unclezeiv/source/blender/render/intern/include/lightcuts.h	2008-05-28 00:44:41 UTC (rev 15023)
+++ branches/soc-2008-unclezeiv/source/blender/render/intern/include/lightcuts.h	2008-05-28 01:51:35 UTC (rev 15024)
@@ -35,10 +35,10 @@
 
 void lightcuts_init(Render *re);
 
-void lightcuts_free(struct LightcutsData *lcd);
+void lightcuts_free(struct LightcutsData **p);
 
 typedef float (*LightContribFunc)(LampRen *lar, ShadeInput *shi);
 
-void lightcuts_do_lights(struct LightcutsData *lcd, LightContribFunc get_contrib, ShadeInput *shi, float *diff);
+void lightcuts_do_lights(struct LightcutsData *lcd, LightContribFunc get_contrib, ShadeInput *shi, ShadeResult *shr);
 
 #endif /*LIGHTCUTS_H_*/

Modified: branches/soc-2008-unclezeiv/source/blender/render/intern/source/convertblender.c
===================================================================
--- branches/soc-2008-unclezeiv/source/blender/render/intern/source/convertblender.c	2008-05-28 00:44:41 UTC (rev 15023)
+++ branches/soc-2008-unclezeiv/source/blender/render/intern/source/convertblender.c	2008-05-28 01:51:35 UTC (rev 15024)
@@ -4436,7 +4436,7 @@
 	free_occ(re);
 	free_strand_surface(re);
 	
-	lightcuts_free(re->lcdata);
+	lightcuts_free(&re->lcdata);
 	
 	re->totvlak=re->totvert=re->totstrand=re->totlamp=re->tothalo= 0;
 	re->i.convertdone= 0;

Modified: branches/soc-2008-unclezeiv/source/blender/render/intern/source/lightcuts.c
===================================================================
--- branches/soc-2008-unclezeiv/source/blender/render/intern/source/lightcuts.c	2008-05-28 00:44:41 UTC (rev 15023)
+++ branches/soc-2008-unclezeiv/source/blender/render/intern/source/lightcuts.c	2008-05-28 01:51:35 UTC (rev 15024)
@@ -85,6 +85,7 @@
 	int free_local; /* location of first empty slot */
 	int root_local; /* id of root node */
 	float max_local_dist; /* maximum distance for local lights */
+	int light_counter;
 	
 	float error_rate;
 	int max_lights;
@@ -342,18 +343,16 @@
 	ListBase *pointlights;
 	LampRen *lar, *larnew;
 	float r, g, b, n;
-	int count = 0;
 	
 	re->lcdata = lcd = MEM_callocN(sizeof(LightcutsData), "LightcutsData");
 	pointlights= &lcd->pointlights;
 	lcd->max_local_dist = MAXFLOAT;
+	lcd->light_counter= 0;
 	
 	for(go=lights->first; go; go= go->next) {
 		lar= go->lampren;
 		if(lar==NULL) continue;
 		
-		count += 2;
-		
 		/* first copy the initial light */
 		gonew= MEM_callocN(sizeof(GroupObject), "groupobject");
 		BLI_addtail(pointlights, gonew);
@@ -374,6 +373,8 @@
 		if (lar->dist < lcd->max_local_dist)
 			lcd->max_local_dist = lar->dist;
 		
+		lcd->light_counter++;
+		
 #if 0
 		/*
 		 * proof-of-concept functionality:
@@ -459,7 +460,7 @@
  * RESOLUTION: the one of the lamp, then adjusted
  */
 
-void lightcuts_do_lights(LightcutsData *lcd, LightContribFunc get_contrib, ShadeInput *shi, float *diff)
+void lightcuts_do_lights(LightcutsData *lcd, LightContribFunc get_contrib, ShadeInput *shi, ShadeResult *shr)
 {
 	/* TODO: show that this size is always sufficient */
 	CutNode *cut_nodes; 
@@ -575,19 +576,31 @@
 	 * an updated TOTREP value (even thought numerically questionable?)
 	 */
 	
-	VECADD(diff, diff, totest);
+	shr->shad[0]+= totest[0]*shi->r;
+	shr->shad[1]+= totest[1]*shi->g;
+	shr->shad[2]+= totest[2]*shi->b;
+	VECCOPY(shr->diff, shr->shad);
 	
+	if (shi->passflag & SCE_PASS_LCFAUX) {
+		shr->faux[0]= (float)(used + BLI_heap_size(cut)) / (float)(MIN2(lcd->max_cut, lcd->light_counter));
+		shr->faux[1]= 0.5;
+		shr->faux[2]= 0.5;
+		shr->faux[3]= (float)((used + BLI_heap_size(cut)) > 0.0);
+	}
+	
 	BLI_heap_free(cut, 0);
 	
 	MEM_freeN(cut_nodes);
 }
 
-void lightcuts_free(struct LightcutsData *lcd)
+void lightcuts_free(LightcutsData **p)
 {
+	LightcutsData *lcd = *p;
 	if (lcd) {
 		if (lcd->array_local)
 			MEM_freeN(lcd->array_local);
 		BLI_freelistN(&lcd->pointlights);
 		MEM_freeN(lcd);
 	}
+	*p= NULL;
 }

Modified: branches/soc-2008-unclezeiv/source/blender/render/intern/source/pipeline.c
===================================================================
--- branches/soc-2008-unclezeiv/source/blender/render/intern/source/pipeline.c	2008-05-28 00:44:41 UTC (rev 15023)
+++ branches/soc-2008-unclezeiv/source/blender/render/intern/source/pipeline.c	2008-05-28 01:51:35 UTC (rev 15024)
@@ -349,6 +349,13 @@
 		if(channel==-1) return "Mist";
 		return "Mist.Z";
 	}
+	if(passtype == SCE_PASS_LCFAUX) {
+		if(channel==-1) return "FauxCol";
+		if(channel==0) return "FauxCol.R";
+		if(channel==1) return "FauxCol.G";
+		if(channel==2) return "FauxCol.B";
+		return "FauxCol.A";
+	}
 	return "Unknown";
 }
 
@@ -400,6 +407,9 @@
 	if(strcmp(str, "Mist")==0)
 		return SCE_PASS_MIST;
 	
+	if(strcmp(str, "FauxCol")==0)
+		return SCE_PASS_LCFAUX;
+	
 	return 0;
 }
 
@@ -567,6 +577,8 @@
 			render_layer_add_pass(rr, rl, 1, SCE_PASS_INDEXOB);
 		if(srl->passflag  & SCE_PASS_MIST)
 			render_layer_add_pass(rr, rl, 1, SCE_PASS_MIST);
+		if(srl->passflag  & SCE_PASS_LCFAUX)
+			render_layer_add_pass(rr, rl, 4, SCE_PASS_LCFAUX);
 		
 	}
 	/* sss, previewrender and envmap don't do layers, so we make a default one */

Modified: branches/soc-2008-unclezeiv/source/blender/render/intern/source/rendercore.c
===================================================================
--- branches/soc-2008-unclezeiv/source/blender/render/intern/source/rendercore.c	2008-05-28 00:44:41 UTC (rev 15023)
+++ branches/soc-2008-unclezeiv/source/blender/render/intern/source/rendercore.c	2008-05-28 01:51:35 UTC (rev 15024)
@@ -519,6 +519,12 @@
 				}
 			}
 				break;
+			
+			case SCE_PASS_LCFAUX:
+				/* XXX: actually I'm not sure that filtering makes sense here -- UncleZeiv */
+				col= shr->faux;
+				pixsize= 4;
+				break;
 		}
 		if(col) {
 			fp= rpass->rect + pixsize*offset;
@@ -595,6 +601,10 @@
 				fp= rpass->rect + offset;
 				*fp= shr->mist;
 				break;
+			case SCE_PASS_LCFAUX:
+				col= shr->faux;
+				pixsize= 4;
+				break;
 		}
 		if(col) {
 			fp= rpass->rect + pixsize*offset;

Modified: branches/soc-2008-unclezeiv/source/blender/render/intern/source/shadeoutput.c
===================================================================
--- branches/soc-2008-unclezeiv/source/blender/render/intern/source/shadeoutput.c	2008-05-28 00:44:41 UTC (rev 15023)
+++ branches/soc-2008-unclezeiv/source/blender/render/intern/source/shadeoutput.c	2008-05-28 01:51:35 UTC (rev 15024)
@@ -1614,12 +1614,7 @@
 	if(passflag & (SCE_PASS_COMBINED|SCE_PASS_DIFFUSE|SCE_PASS_SPEC|SCE_PASS_SHADOW)) {
 		
 		if (R.r.mode & R_LIGHTCUTS) {
-			float diff[3] = {0.0, 0.0, 0.0};
-			lightcuts_do_lights(R.lcdata, single_light_contrib, shi, diff);
-			shr->shad[0]+= diff[0]*shi->r;
-			shr->shad[1]+= diff[1]*shi->g;
-			shr->shad[2]+= diff[2]*shi->b;
-			VECCOPY(shr->diff, shr->shad);
+			lightcuts_do_lights(R.lcdata, single_light_contrib, shi, shr);
 		}
 		else {
 			GroupObject *go;

Modified: branches/soc-2008-unclezeiv/source/blender/src/buttons_scene.c
===================================================================
--- branches/soc-2008-unclezeiv/source/blender/src/buttons_scene.c	2008-05-28 00:44:41 UTC (rev 15023)
+++ branches/soc-2008-unclezeiv/source/blender/src/buttons_scene.c	2008-05-28 01:51:35 UTC (rev 15024)
@@ -3408,6 +3408,12 @@
 static void render_panel_lightcuts(void)
 {
 	uiBlock *block;
+	SceneRenderLayer *srl= BLI_findlink(&G.scene->r.layers, G.scene->r.actlay);
+	
+	if(srl==NULL) {
+		G.scene->r.actlay= 0;
+		srl= G.scene->r.layers.first;
+	}
 
 	block= uiNewBlock(&curarea->uiblocks, "render_panel_lightcuts", UI_EMBOSS, UI_HELV, curarea->win);
 	if(uiNewPanel(curarea, block, "Lightcuts", "Render", 640, 0, 318, 204)==0) return;
@@ -3417,6 +3423,7 @@
 	uiDefButF(block, NUM, B_REDR, "Max error:", 692, 120, 192, 20, &G.scene->r.lightcuts_max_error, 0.001, 1.0, 0, 0, "The maximum allowed error rate");
 	uiDefButI(block, NUM, B_REDR, "Lights:", 692, 98, 192, 20, &G.scene->r.lightcuts_max_lights, 0, 100000, 0, 0, "The maximum number of lights to generate");
 	uiDefButI(block, NUM, B_REDR, "Max cut:", 692, 76, 192, 20, &G.scene->r.lightcuts_max_cut, 0, 5000, 0, 0, "The maximum size of the cut");
+	uiDefButBitI(block, TOG, SCE_PASS_LCFAUX, B_SET_PASS, "False color", 692, 54, 192, 20, &srl->passflag, 0, 0, 0, 0, "Deliver false color pass");
 }
 
 void render_panels()

Modified: branches/soc-2008-unclezeiv/source/blender/src/outliner.c
===================================================================
--- branches/soc-2008-unclezeiv/source/blender/src/outliner.c	2008-05-28 00:44:41 UTC (rev 15023)
+++ branches/soc-2008-unclezeiv/source/blender/src/outliner.c	2008-05-28 01:51:35 UTC (rev 15024)
@@ -486,7 +486,13 @@
 	te= outliner_add_element(soops, &tenla->subtree, id, tenla, TSE_R_PASS, SCE_PASS_RADIO);
 	te->name= "Radiosity";
 	te->directdata= &srl->passflag;
-	
+
+/*
+ * XXX: TODO: aye! guess whose flag doesn't fit in a short?!?
+	te= outliner_add_element(soops, &tenla->subtree, id, tenla, TSE_R_PASS, SCE_PASS_LCFAUX);
+	te->name= "False color";
+	te->directdata= &srl->passflag;
+*/	
 }
 
 





More information about the Bf-blender-cvs mailing list