[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [37899] trunk/blender/source/blender/ render/intern/source/imagetexture.c: fix [#27782] Tileable displacement map issue in Blender 2.58

Campbell Barton ideasman42 at gmail.com
Tue Jun 28 14:48:39 CEST 2011


Revision: 37899
          http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=37899
Author:   campbellbarton
Date:     2011-06-28 12:48:39 +0000 (Tue, 28 Jun 2011)
Log Message:
-----------
fix [#27782] Tileable displacement map issue in Blender 2.58
this bug was introduced in 2.58 (r37342), when adding filtering support to imagewrap(), the problem is boxsample was getting float values which were not wrapped as int values are.

Revision Links:
--------------
    http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=37342

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

Modified: trunk/blender/source/blender/render/intern/source/imagetexture.c
===================================================================
--- trunk/blender/source/blender/render/intern/source/imagetexture.c	2011-06-28 12:21:58 UTC (rev 37898)
+++ trunk/blender/source/blender/render/intern/source/imagetexture.c	2011-06-28 12:48:39 UTC (rev 37899)
@@ -76,7 +76,7 @@
 extern struct Render R;
 /* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */
 
-static void boxsample(ImBuf *ibuf, float minx, float miny, float maxx, float maxy, TexResult *texres, int imaprepeat, int imapextend);
+static void boxsample(ImBuf *ibuf, float minx, float miny, float maxx, float maxy, TexResult *texres, const short imaprepeat, const short imapextend);
 
 /* *********** IMAGEWRAPPING ****************** */
 
@@ -115,6 +115,7 @@
 {
 	float fx, fy, val1, val2, val3;
 	int x, y, retval;
+	int xi, yi; /* original values */
 
 	texres->tin= texres->ta= texres->tr= texres->tg= texres->tb= 0.0f;
 	
@@ -166,8 +167,8 @@
 		}
 	}
 
-	x = (int)floorf(fx*ibuf->x);
-	y = (int)floorf(fy*ibuf->y);
+	x= xi= (int)floorf(fx*ibuf->x);
+	y= yi= (int)floorf(fy*ibuf->y);
 
 	if(tex->extend == TEX_CLIPCUBE) {
 		if(x<0 || y<0 || x>=ibuf->x || y>=ibuf->y || texvec[2]<-1.0f || texvec[2]>1.0f) {
@@ -209,10 +210,17 @@
 		filterx = (0.5f * tex->filtersize) / ibuf->x;
 		filtery = (0.5f * tex->filtersize) / ibuf->y;
 
+		/* important that this value is wrapped [#27782]
+		 * this applies the modifications made by the checks above,
+		 * back to the floating point values */
+		fx -= (float)(xi - x) / (float)ibuf->x;
+		fy -= (float)(yi - y) / (float)ibuf->y;
+
 		boxsample(ibuf, fx-filterx, fy-filtery, fx+filterx, fy+filtery, texres, (tex->extend==TEX_REPEAT), (tex->extend==TEX_EXTEND));
 	}
-	else /* no filtering */
+	else { /* no filtering */
 		ibuf_get_color(&texres->tr, ibuf, x, y);
+	}
 	
 	if( (R.flag & R_SEC_FIELD) && (ibuf->flags & IB_fields) ) {
 		ibuf->rect-= (ibuf->x*ibuf->y);
@@ -524,15 +532,17 @@
 	}
 }
 
-static void boxsample(ImBuf *ibuf, float minx, float miny, float maxx, float maxy, TexResult *texres, int imaprepeat, int imapextend)
+static void boxsample(ImBuf *ibuf, float minx, float miny, float maxx, float maxy, TexResult *texres, const short imaprepeat, const short imapextend)
 {
 	/* Sample box, performs clip. minx etc are in range 0.0 - 1.0 .
-   * Enlarge with antialiased edges of pixels.
-   * If variable 'imaprepeat' has been set, the
-   * clipped-away parts are sampled as well.
-   */
+	 * Enlarge with antialiased edges of pixels.
+	 * If variable 'imaprepeat' has been set, the
+	 * clipped-away parts are sampled as well.
+	 */
 	/* note: actually minx etc isnt in the proper range... this due to filter size and offset vectors for bump */
 	/* note: talpha must be initialized */
+	/* note: even when 'imaprepeat' is set, this can only repeate once in any direction.
+	 * the point which min/max is derived from is assumed to be wrapped */
 	TexResult texr;
 	rctf *rf, stack[8];
 	float opp, tot, alphaclip= 1.0;




More information about the Bf-blender-cvs mailing list