[Bf-blender-cvs] [aac6ee6] master: Fix T45885: Cycles coordinate extension modes not working as expected Fix T45769: Image Texture Node clipping bug

Sergey Sharybin noreply at git.blender.org
Mon Aug 24 10:43:11 CEST 2015


Commit: aac6ee6b870eb968d37c16039e6cdc579df17288
Author: Sergey Sharybin
Date:   Mon Aug 24 10:37:59 2015 +0200
Branches: master
https://developer.blender.org/rBaac6ee6b870eb968d37c16039e6cdc579df17288

Fix T45885: Cycles coordinate extension modes not working as expected
Fix T45769: Image Texture Node clipping bug

Simple mistakes in the normalized/pixel-space coordinates handling.

Render tests for this feature are coming.

===================================================================

M	intern/cycles/kernel/kernel_compat_cpu.h

===================================================================

diff --git a/intern/cycles/kernel/kernel_compat_cpu.h b/intern/cycles/kernel/kernel_compat_cpu.h
index d02670f..951de88 100644
--- a/intern/cycles/kernel/kernel_compat_cpu.h
+++ b/intern/cycles/kernel/kernel_compat_cpu.h
@@ -144,7 +144,7 @@ template<typename T> struct texture_image  {
 					iy = wrap_periodic(iy, height);
 					break;
 				case EXTENSION_CLIP:
-					if (x < 0.0f || y < 0.0f || x >= width || y >= height) {
+					if (x < 0.0f || y < 0.0f || x > 1.0f || y > 1.0f) {
 						return make_float4(0.0f, 0.0f, 0.0f, 0.0f);
 					}
 					/* Fall through. */
@@ -168,7 +168,7 @@ template<typename T> struct texture_image  {
 					niy = wrap_periodic(iy+1, height);
 					break;
 				case EXTENSION_CLIP:
-					if (x < 0.0f || y < 0.0f || x >= width || y >= height) {
+					if (x < 0.0f || y < 0.0f || x > 1.0f || y > 1.0f) {
 						return make_float4(0.0f, 0.0f, 0.0f, 0.0f);
 					}
 					/* Fall through. */
@@ -176,8 +176,13 @@ template<typename T> struct texture_image  {
 					ix = wrap_clamp(ix, width);
 					iy = wrap_clamp(iy, height);
 
-					nix = wrap_clamp(ix+1, width);
-					niy = wrap_clamp(iy+1, height);
+					if (x >= 0.0f && y >= 0.0f && x <= 1.0f && y <= 1.0f) {
+						nix = wrap_clamp(ix+1, width);
+						niy = wrap_clamp(iy+1, height);
+					}
+					else {
+						return read(data[ix + iy*width]);
+					}
 					break;
 			}
 
@@ -208,7 +213,7 @@ template<typename T> struct texture_image  {
 					nniy = wrap_periodic(iy+2, height);
 					break;
 				case EXTENSION_CLIP:
-					if (x < 0.0f || y < 0.0f || x >= width || y >= height) {
+					if (x < 0.0f || y < 0.0f || x > 1.0f || y > 1.0f) {
 						return make_float4(0.0f, 0.0f, 0.0f, 0.0f);
 					}
 					/* Fall through. */
@@ -216,14 +221,19 @@ template<typename T> struct texture_image  {
 					ix = wrap_clamp(ix, width);
 					iy = wrap_clamp(iy, height);
 
-					pix = wrap_clamp(ix-1, width);
-					piy = wrap_clamp(iy-1, height);
+					if (x >= 0.0f && y >= 0.0f && x <= 1.0f && y <= 1.0f) {
+						pix = wrap_clamp(ix-1, width);
+						piy = wrap_clamp(iy-1, height);
 
-					nix = wrap_clamp(ix+1, width);
-					niy = wrap_clamp(iy+1, height);
+						nix = wrap_clamp(ix+1, width);
+						niy = wrap_clamp(iy+1, height);
 
-					nnix = wrap_clamp(ix+2, width);
-					nniy = wrap_clamp(iy+2, height);
+						nnix = wrap_clamp(ix+2, width);
+						nniy = wrap_clamp(iy+2, height);
+					}
+					else {
+						return read(data[ix + iy*width]);
+					}
 					break;
 			}
 
@@ -279,7 +289,7 @@ template<typename T> struct texture_image  {
 					iz = wrap_periodic(iz, depth);
 					break;
 				case EXTENSION_CLIP:
-					if (x < 0.0f || y < 0.0f || x >= width || y >= height) {
+					if (x < 0.0f || y < 0.0f || x > 1.0f || y > 1.0f) {
 						return make_float4(0.0f, 0.0f, 0.0f, 0.0f);
 					}
 					/* Fall through. */
@@ -308,7 +318,7 @@ template<typename T> struct texture_image  {
 					niz = wrap_periodic(iz+1, depth);
 					break;
 				case EXTENSION_CLIP:
-					if (x < 0.0f || y < 0.0f || x >= width || y >= height) {
+					if (x < 0.0f || y < 0.0f || x > 1.0f || y > 1.0f) {
 						return make_float4(0.0f, 0.0f, 0.0f, 0.0f);
 					}
 					/* Fall through. */
@@ -317,9 +327,14 @@ template<typename T> struct texture_image  {
 					iy = wrap_clamp(iy, height);
 					iz = wrap_clamp(iz, depth);
 
-					nix = wrap_clamp(ix+1, width);
-					niy = wrap_clamp(iy+1, height);
-					niz = wrap_clamp(iz+1, depth);
+					if (x >= 0.0f && y >= 0.0f && x <= 1.0f && y <= 1.0f) {
+						nix = wrap_clamp(ix+1, width);
+						niy = wrap_clamp(iy+1, height);
+						niz = wrap_clamp(iz+1, depth);
+					}
+					else {
+						return read(data[ix + iy*width + iz*width*height]);
+					}
 					break;
 			}
 
@@ -363,7 +378,7 @@ template<typename T> struct texture_image  {
 					nniz = wrap_periodic(iz+2, depth);
 					break;
 				case EXTENSION_CLIP:
-					if (x < 0.0f || y < 0.0f || x >= width || y >= height) {
+					if (x < 0.0f || y < 0.0f || x > 1.0f || y > 1.0f) {
 						return make_float4(0.0f, 0.0f, 0.0f, 0.0f);
 					}
 					/* Fall through. */
@@ -372,17 +387,22 @@ template<typename T> struct texture_image  {
 					iy = wrap_clamp(iy, height);
 					iz = wrap_clamp(iz, depth);
 
-					pix = wrap_clamp(ix-1, width);
-					piy = wrap_clamp(iy-1, height);
-					piz = wrap_clamp(iz-1, depth);
+					if (x >= 0.0f && y >= 0.0f && x <= 1.0f && y <= 1.0f) {
+						pix = wrap_clamp(ix-1, width);
+						piy = wrap_clamp(iy-1, height);
+						piz = wrap_clamp(iz-1, depth);
 
-					nix = wrap_clamp(ix+1, width);
-					niy = wrap_clamp(iy+1, height);
-					niz = wrap_clamp(iz+1, depth);
+						nix = wrap_clamp(ix+1, width);
+						niy = wrap_clamp(iy+1, height);
+						niz = wrap_clamp(iz+1, depth);
 
-					nnix = wrap_clamp(ix+2, width);
-					nniy = wrap_clamp(iy+2, height);
-					nniz = wrap_clamp(iz+2, depth);
+						nnix = wrap_clamp(ix+2, width);
+						nniy = wrap_clamp(iy+2, height);
+						nniz = wrap_clamp(iz+2, depth);
+					}
+					else {
+						return read(data[ix + iy*width + iz*width*height]);
+					}
 					break;
 			}




More information about the Bf-blender-cvs mailing list