[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [13293] trunk/blender/source/blender: Added new render pass: "Mist".

Ton Roosendaal ton at blender.org
Sat Jan 19 12:17:13 CET 2008


Revision: 13293
          http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=13293
Author:   ton
Date:     2008-01-19 12:17:12 +0100 (Sat, 19 Jan 2008)

Log Message:
-----------
Added new render pass: "Mist".
This is actually just the alpha value as currently being calculated
by the mist code. It is in many cases not very useful to have this as
alpha in shading result, also for postprocess and composite.

Note: this pass also works with "Mist" not set in World, of course.

Modified Paths:
--------------
    trunk/blender/source/blender/blenkernel/BKE_node.h
    trunk/blender/source/blender/blenkernel/intern/node.c
    trunk/blender/source/blender/imbuf/intern/allocimbuf.c
    trunk/blender/source/blender/makesdna/DNA_scene_types.h
    trunk/blender/source/blender/nodes/intern/CMP_nodes/CMP_image.c
    trunk/blender/source/blender/render/extern/include/RE_shader_ext.h
    trunk/blender/source/blender/render/intern/source/convertblender.c
    trunk/blender/source/blender/render/intern/source/pipeline.c
    trunk/blender/source/blender/render/intern/source/rendercore.c
    trunk/blender/source/blender/render/intern/source/shadeinput.c
    trunk/blender/source/blender/render/intern/source/strand.c
    trunk/blender/source/blender/render/intern/source/zbuf.c
    trunk/blender/source/blender/src/buttons_scene.c
    trunk/blender/source/blender/src/buttons_shading.c
    trunk/blender/source/blender/src/outliner.c

Modified: trunk/blender/source/blender/blenkernel/BKE_node.h
===================================================================
--- trunk/blender/source/blender/blenkernel/BKE_node.h	2008-01-19 03:24:12 UTC (rev 13292)
+++ trunk/blender/source/blender/blenkernel/BKE_node.h	2008-01-19 11:17:12 UTC (rev 13293)
@@ -236,21 +236,22 @@
 /* ************** COMPOSITE NODES *************** */
 
 /* output socket defines */
-#define RRES_OUT_IMAGE	0
-#define RRES_OUT_ALPHA	1
-#define RRES_OUT_Z	2
-#define RRES_OUT_NORMAL	3
-#define RRES_OUT_UV	4
-#define RRES_OUT_VEC	5
-#define RRES_OUT_RGBA	6
-#define RRES_OUT_DIFF	7
-#define RRES_OUT_SPEC	8
-#define RRES_OUT_SHADOW	9
-#define RRES_OUT_AO	10
-#define RRES_OUT_REFLECT 11
-#define RRES_OUT_REFRACT 12
-#define RRES_OUT_RADIO	 13
-#define RRES_OUT_INDEXOB 14
+#define RRES_OUT_IMAGE		0
+#define RRES_OUT_ALPHA		1
+#define RRES_OUT_Z			2
+#define RRES_OUT_NORMAL		3
+#define RRES_OUT_UV			4
+#define RRES_OUT_VEC		5
+#define RRES_OUT_RGBA		6
+#define RRES_OUT_DIFF		7
+#define RRES_OUT_SPEC		8
+#define RRES_OUT_SHADOW		9
+#define RRES_OUT_AO			10
+#define RRES_OUT_REFLECT	11
+#define RRES_OUT_REFRACT	12
+#define RRES_OUT_RADIO		13
+#define RRES_OUT_INDEXOB	14
+#define RRES_OUT_MIST		15
 
 /* note: types are needed to restore callbacks, don't change values */
 #define CMP_NODE_VIEWER		201

Modified: trunk/blender/source/blender/blenkernel/intern/node.c
===================================================================
--- trunk/blender/source/blender/blenkernel/intern/node.c	2008-01-19 03:24:12 UTC (rev 13292)
+++ trunk/blender/source/blender/blenkernel/intern/node.c	2008-01-19 11:17:12 UTC (rev 13293)
@@ -2211,6 +2211,8 @@
 	if(!(passflag & SCE_PASS_RADIO)) sock->flag |= SOCK_UNAVAIL;
 	sock= BLI_findlink(&node->outputs, RRES_OUT_INDEXOB);
 	if(!(passflag & SCE_PASS_INDEXOB)) sock->flag |= SOCK_UNAVAIL;
+	sock= BLI_findlink(&node->outputs, RRES_OUT_MIST);
+	if(!(passflag & SCE_PASS_MIST)) sock->flag |= SOCK_UNAVAIL;
 	
 }
 

Modified: trunk/blender/source/blender/imbuf/intern/allocimbuf.c
===================================================================
--- trunk/blender/source/blender/imbuf/intern/allocimbuf.c	2008-01-19 03:24:12 UTC (rev 13292)
+++ trunk/blender/source/blender/imbuf/intern/allocimbuf.c	2008-01-19 11:17:12 UTC (rev 13293)
@@ -280,6 +280,7 @@
 	
 	size = ibuf->x * ibuf->y;
 	size = size * 4 * sizeof(float);
+	ibuf->channels= 4;
 	
 	if ( (ibuf->rect_float = MEM_mapallocN(size, "imb_addrectfloatImBuf")) ){
 		ibuf->mall |= IB_rectfloat;
@@ -445,7 +446,7 @@
 		memcpy(ibuf2->rect, ibuf1->rect, x * y * sizeof(int));
 	
 	if (flags & IB_rectfloat)
-		memcpy(ibuf2->rect_float, ibuf1->rect_float, 4 * x * y * sizeof(float));
+		memcpy(ibuf2->rect_float, ibuf1->rect_float, ibuf1->channels * x * y * sizeof(float));
 
 	if (flags & IB_planes) 
 		memcpy(*(ibuf2->planes),*(ibuf1->planes),ibuf1->depth * ibuf1->skipx * y * sizeof(int));

Modified: trunk/blender/source/blender/makesdna/DNA_scene_types.h
===================================================================
--- trunk/blender/source/blender/makesdna/DNA_scene_types.h	2008-01-19 03:24:12 UTC (rev 13292)
+++ trunk/blender/source/blender/makesdna/DNA_scene_types.h	2008-01-19 11:17:12 UTC (rev 13293)
@@ -153,6 +153,8 @@
 #define SCE_PASS_INDEXOB	2048
 #define SCE_PASS_UV			4096
 #define SCE_PASS_RADIO		8192
+#define SCE_PASS_MIST		16384
+
 /* note, srl->passflag is treestore element 'nr' in outliner, short still... */
 
 

Modified: trunk/blender/source/blender/nodes/intern/CMP_nodes/CMP_image.c
===================================================================
--- trunk/blender/source/blender/nodes/intern/CMP_nodes/CMP_image.c	2008-01-19 03:24:12 UTC (rev 13292)
+++ trunk/blender/source/blender/nodes/intern/CMP_nodes/CMP_image.c	2008-01-19 11:17:12 UTC (rev 13293)
@@ -48,6 +48,7 @@
 	{	SOCK_RGBA, 0, "Refract",	0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f},
 	{	SOCK_RGBA, 0, "Radio",		0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f},
 	{	SOCK_VALUE, 0, "IndexOB",	0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f},
+	{	SOCK_VALUE, 0, "Mist",		0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f},
 	{	-1, 0, ""	}
 };
 
@@ -149,6 +150,8 @@
 		out[RRES_OUT_RADIO]->data= compbuf_multilayer_get(rd, rl, ima, iuser, SCE_PASS_RADIO);
 	if(out[RRES_OUT_INDEXOB]->hasoutput)
 		out[RRES_OUT_INDEXOB]->data= compbuf_multilayer_get(rd, rl, ima, iuser, SCE_PASS_INDEXOB);
+	if(out[RRES_OUT_MIST]->hasoutput)
+		out[RRES_OUT_MIST]->data= compbuf_multilayer_get(rd, rl, ima, iuser, SCE_PASS_MIST);
 	
 };
 
@@ -236,7 +239,7 @@
       CompBuf *buf;
       int buftype= CB_VEC3;
 
-      if(ELEM(passcode, SCE_PASS_Z, SCE_PASS_INDEXOB))
+      if(ELEM3(passcode, SCE_PASS_Z, SCE_PASS_INDEXOB, SCE_PASS_MIST))
          buftype= CB_VAL;
       else if(passcode==SCE_PASS_VECTOR)
          buftype= CB_VEC4;
@@ -282,7 +285,9 @@
    if(out[RRES_OUT_RADIO]->hasoutput)
       out[RRES_OUT_RADIO]->data= compbuf_from_pass(rd, rl, rectx, recty, SCE_PASS_RADIO);
    if(out[RRES_OUT_INDEXOB]->hasoutput)
-      out[RRES_OUT_INDEXOB]->data= compbuf_from_pass(rd, rl, rectx, recty, SCE_PASS_INDEXOB);
+	   out[RRES_OUT_INDEXOB]->data= compbuf_from_pass(rd, rl, rectx, recty, SCE_PASS_INDEXOB);
+   if(out[RRES_OUT_MIST]->hasoutput)
+	   out[RRES_OUT_MIST]->data= compbuf_from_pass(rd, rl, rectx, recty, SCE_PASS_MIST);
 
 };
 

Modified: trunk/blender/source/blender/render/extern/include/RE_shader_ext.h
===================================================================
--- trunk/blender/source/blender/render/extern/include/RE_shader_ext.h	2008-01-19 03:24:12 UTC (rev 13292)
+++ trunk/blender/source/blender/render/extern/include/RE_shader_ext.h	2008-01-19 11:17:12 UTC (rev 13293)
@@ -47,7 +47,7 @@
 {
 	float combined[4];
 	float col[4];
-	float alpha;
+	float alpha, mist;
 	float diff[3];		/* no ramps, shadow, etc */
 	float spec[3];
 	float shad[3];

Modified: trunk/blender/source/blender/render/intern/source/convertblender.c
===================================================================
--- trunk/blender/source/blender/render/intern/source/convertblender.c	2008-01-19 03:24:12 UTC (rev 13292)
+++ trunk/blender/source/blender/render/intern/source/convertblender.c	2008-01-19 11:17:12 UTC (rev 13293)
@@ -3656,8 +3656,13 @@
 	}
 	else {
 		memset(&re->wrld, 0, sizeof(World));
-		re->wrld.exp= 0.0;
-		re->wrld.range= 1.0;
+		re->wrld.exp= 0.0f;
+		re->wrld.range= 1.0f;
+		
+		/* for mist pass */
+		re->wrld.miststa= re->clipsta;
+		re->wrld.mistdist= re->clipend-re->clipsta;
+		re->wrld.misi= 1.0f;
 	}
 	
 	re->wrld.linfac= 1.0 + pow((2.0*re->wrld.exp + 0.5), -10);

Modified: trunk/blender/source/blender/render/intern/source/pipeline.c
===================================================================
--- trunk/blender/source/blender/render/intern/source/pipeline.c	2008-01-19 03:24:12 UTC (rev 13292)
+++ trunk/blender/source/blender/render/intern/source/pipeline.c	2008-01-19 11:17:12 UTC (rev 13293)
@@ -331,6 +331,10 @@
 		if(channel==-1) return "IndexOB";
 		return "IndexOB.X";
 	}
+	if(passtype == SCE_PASS_MIST) {
+		if(channel==-1) return "Mist";
+		return "Mist.Z";
+	}
 	return "Unknown";
 }
 
@@ -379,6 +383,9 @@
 	if(strcmp(str, "IndexOB")==0)
 		return SCE_PASS_INDEXOB;
 
+	if(strcmp(str, "Mist")==0)
+		return SCE_PASS_MIST;
+	
 	return 0;
 }
 
@@ -546,6 +553,8 @@
 				render_layer_add_pass(rr, rl, 3, SCE_PASS_RADIO);
 		if(srl->passflag  & SCE_PASS_INDEXOB)
 			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);
 		
 	}
 	/* sss, previewrender and envmap don't do layers, so we make a default one */

Modified: trunk/blender/source/blender/render/intern/source/rendercore.c
===================================================================
--- trunk/blender/source/blender/render/intern/source/rendercore.c	2008-01-19 03:24:12 UTC (rev 13292)
+++ trunk/blender/source/blender/render/intern/source/rendercore.c	2008-01-19 11:17:12 UTC (rev 13293)
@@ -400,6 +400,12 @@
 						*fp= (float)shi->obr->ob->index;
 				}
 				break;
+			case SCE_PASS_MIST:
+				/*  */
+				col= &shr->mist;
+				pixsize= 1;
+				break;
+			
 			case SCE_PASS_VECTOR:
 			{
 				/* add minimum speed in pixel, no filter */

Modified: trunk/blender/source/blender/render/intern/source/shadeinput.c
===================================================================
--- trunk/blender/source/blender/render/intern/source/shadeinput.c	2008-01-19 03:24:12 UTC (rev 13292)
+++ trunk/blender/source/blender/render/intern/source/shadeinput.c	2008-01-19 11:17:12 UTC (rev 13293)
@@ -161,12 +161,17 @@
 	}
 	
 	/* MIST */
-	if((R.wrld.mode & WO_MIST) && (shi->mat->mode & MA_NOMIST)==0 ) {
+	if((shi->passflag & SCE_PASS_MIST) || ((R.wrld.mode & WO_MIST) && (shi->mat->mode & MA_NOMIST)==0))  {
 		if(R.r.mode & R_ORTHO)
-			alpha= mistfactor(-shi->co[2], shi->co);
+			shr->mist= mistfactor(-shi->co[2], shi->co);
 		else
-			alpha= mistfactor(VecLength(shi->co), shi->co);
+			shr->mist= mistfactor(VecLength(shi->co), shi->co);
 	}
+	else shr->mist= 0.0f;
+	
+	if((R.wrld.mode & WO_MIST) && (shi->mat->mode & MA_NOMIST)==0 ) {
+		alpha= shr->mist;
+	}
 	else alpha= 1.0f;
 	
 	/* add mist and premul color */

Modified: trunk/blender/source/blender/render/intern/source/strand.c
===================================================================
--- trunk/blender/source/blender/render/intern/source/strand.c	2008-01-19 03:24:12 UTC (rev 13292)
+++ trunk/blender/source/blender/render/intern/source/strand.c	2008-01-19 11:17:12 UTC (rev 13293)
@@ -458,6 +458,11 @@
 		return 1;
 }
 
+static void interpolate_vec1(float *v1, float *v2, float t, float negt, float *v)
+{
+	v[0]= negt*v1[0] + t*v2[0];
+}
+
 static void interpolate_vec3(float *v1, float *v2, float t, float negt, float *v)
 {
 	v[0]= negt*v1[0] + t*v2[0];
@@ -504,6 +509,8 @@
 			interpolate_vec3(shr1->refr, shr2->refr, t, negt, shr->refr);
 		if(addpassflag & SCE_PASS_RADIO)
 			interpolate_vec3(shr1->rad, shr2->rad, t, negt, shr->rad);
+		if(addpassflag & SCE_PASS_MIST)
+			interpolate_vec1(&shr1->mist, &shr2->mist, t, negt, &shr->mist);
 	}
 }
 

Modified: trunk/blender/source/blender/render/intern/source/zbuf.c
===================================================================
--- trunk/blender/source/blender/render/intern/source/zbuf.c	2008-01-19 03:24:12 UTC (rev 13292)
+++ trunk/blender/source/blender/render/intern/source/zbuf.c	2008-01-19 11:17:12 UTC (rev 13293)
@@ -3346,6 +3346,10 @@
 			case SCE_PASS_NORMAL:

@@ Diff output truncated at 10240 characters. @@




More information about the Bf-blender-cvs mailing list