[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [14767] trunk/blender/source/blender:

Brecht Van Lommel brechtvanlommel at pandora.be
Fri May 9 17:32:55 CEST 2008


Revision: 14767
          http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=14767
Author:   blendix
Date:     2008-05-09 17:32:55 +0200 (Fri, 09 May 2008)

Log Message:
-----------

Fix for bug #7068: displace node crashes with procedural
texture input as vectors.

Modified Paths:
--------------
    trunk/blender/source/blender/nodes/intern/CMP_nodes/CMP_displace.c
    trunk/blender/source/blender/render/intern/source/imagetexture.c

Modified: trunk/blender/source/blender/nodes/intern/CMP_nodes/CMP_displace.c
===================================================================
--- trunk/blender/source/blender/nodes/intern/CMP_nodes/CMP_displace.c	2008-05-09 15:21:23 UTC (rev 14766)
+++ trunk/blender/source/blender/nodes/intern/CMP_nodes/CMP_displace.c	2008-05-09 15:32:55 UTC (rev 14767)
@@ -44,19 +44,23 @@
 	{	-1, 0, ""	}
 };
 
+static float *vecbuf_get_pixel(CompBuf *vecbuf, float *veccol, int x, int y)
+{
+	/* the x-xrad stuff is a bit weird, but i seem to need it otherwise 
+	 * my returned pixels are offset weirdly */
+	return compbuf_get_pixel(vecbuf, veccol, x-vecbuf->xrad, y-vecbuf->yrad, vecbuf->xrad, vecbuf->yrad);
+}
+
 static void do_displace(CompBuf *stackbuf, CompBuf *cbuf, CompBuf *vecbuf, float *veccol, float *xscale, float *yscale)
 {
 	ImBuf *ibuf;
-	int x, y, vx, vy, sx, sy;
 	float dx=0.0, dy=0.0;
 	float dspx, dspy;
-	float uv[2];
-
+	float uv[2], col[4], colnext[4], colprev[4];
+	float *vp, *vpnext, *vpprev;
 	float *out= stackbuf->rect, *vec=vecbuf->rect, *in= cbuf->rect;
-	float *vp, *vpnext, *vpprev;
+	int x, y, vx, vy, sx, sy;
 	
-	int row = 3*vecbuf->x;
-	
 	/* ibuf needed for sampling */
 	ibuf= IMB_allocImBuf(cbuf->x, cbuf->y, 32, 0, 0);
 	ibuf->rect_float= cbuf->rect;
@@ -65,13 +69,15 @@
 	
 	sx= stackbuf->x;
 	sy= stackbuf->y;
+
+	QUATCOPY(col, veccol);
+	QUATCOPY(colnext, veccol);
+	QUATCOPY(colprev, veccol);
 	
 	for(y=0; y<sy; y++) {
 		for(x= 0; x< sx; x++, out+=4, in+=4, vec+=3) {
 			
-			/* the x-xrad stuff is a bit weird, but i seem to need it otherwise 
-			 * my returned pixels are offset weirdly */
-			vp = compbuf_get_pixel(vecbuf, veccol, x-vecbuf->xrad, y-vecbuf->yrad, vecbuf->xrad, vecbuf->yrad);
+			vp = vecbuf_get_pixel(vecbuf, col, x, y);
 
 			/* this happens in compbuf_get_pixel, need to make sure the following
 			 * check takes them into account */
@@ -87,21 +93,27 @@
 			uv[1] = dspy / (float)sy;
 		
 			if(vx>0 && vx< vecbuf->x-1 && vy>0 && vy< vecbuf->y-1)  {
-				vpnext = vp+row;
-				vpprev = vp-row;
-			
-				/* adaptive sampling, X channel */
-				dx= 0.5f*(fabs(vp[0]-vp[-3]) + fabs(vp[0]-vp[3]));
+				/* adaptive sampling, X and Y channel.
+				 * we call vecbuf_get_pixel for every pixel since the input
+				 * might be a procedural, and then we can't use offsets */
+				vpprev = vecbuf_get_pixel(vecbuf, colprev, x-1, y);
+				vpnext = vecbuf_get_pixel(vecbuf, colnext, x+1, y);
+				dx= 0.5f*(fabs(vp[0]-vpprev[0]) + fabs(vp[0]-vpnext[0]));
+
+				vpprev = vecbuf_get_pixel(vecbuf, colprev, x, y-1);
+				vpnext = vecbuf_get_pixel(vecbuf, colnext, x, y+1);
+				dy= 0.5f*(fabs(vp[1]-vpnext[1]) + fabs(vp[1]-vpprev[1]));
+
+				vpprev = vecbuf_get_pixel(vecbuf, colprev, x-1, y-1);
+				vpnext = vecbuf_get_pixel(vecbuf, colnext, x-1, y+1);
+				dx+= 0.25f*(fabs(vp[0]-vpprev[0]) + fabs(vp[0]-vpnext[0]));
+				dy+= 0.25f*(fabs(vp[1]-vpprev[1]) + fabs(vp[1]-vpnext[1]));
+
+				vpprev = vecbuf_get_pixel(vecbuf, colprev, x+1, y-1);
+				vpnext = vecbuf_get_pixel(vecbuf, colnext, x+1, y+1);
+				dx+= 0.25f*(fabs(vp[0]-vpprev[0]) + fabs(vp[0]-vpnext[0]));
+				dy+= 0.25f*(fabs(vp[1]-vpprev[1]) + fabs(vp[1]-vpnext[1]));
 				
-				dx+= 0.25f*(fabs(vp[0]-vpprev[-3]) + fabs(vp[0]-vpnext[-3]));
-				dx+= 0.25f*(fabs(vp[0]-vpprev[+3]) + fabs(vp[0]-vpnext[+3]));
-				
-				/* adaptive sampling, Y channel */
-				dy= 0.5f*(fabs(vp[1]-vp[-row+1]) + fabs(vp[1]-vp[row+1]));
-						 
-				dy+= 0.25f*(fabs(vp[1]-vpprev[+1-3]) + fabs(vp[1]-vpnext[+1-3]));
-				dy+= 0.25f*(fabs(vp[1]-vpprev[+1+3]) + fabs(vp[1]-vpnext[+1+3]));
-				
 				/* scaled down to prevent blurriness */
 				/* 8: magic number, provides a good level of sharpness without getting too aliased */
 				dx /= 8;

Modified: trunk/blender/source/blender/render/intern/source/imagetexture.c
===================================================================
--- trunk/blender/source/blender/render/intern/source/imagetexture.c	2008-05-09 15:21:23 UTC (rev 14766)
+++ trunk/blender/source/blender/render/intern/source/imagetexture.c	2008-05-09 15:32:55 UTC (rev 14767)
@@ -616,6 +616,7 @@
 		return;
 	}
 	
+	memset(&texres, 0, sizeof(texres));
 	boxsample(ibuf, fx, fy, fx+dx, fy+dy, &texres, 0, 1);
 	result[0]= texres.tr;
 	result[1]= texres.tg;





More information about the Bf-blender-cvs mailing list