diff --git a/intern/cycles/kernel/shaders/node_texture.h b/intern/cycles/kernel/shaders/node_texture.h index 5f9cd5afa47..2d47b8e4672 100644 --- a/intern/cycles/kernel/shaders/node_texture.h +++ b/intern/cycles/kernel/shaders/node_texture.h @@ -14,32 +14,6 @@ * limitations under the License. */ -/* Voronoi Distances */ - -float voronoi_distance(string distance_metric, vector d, float e) -{ -#if 0 - if (distance_metric == "Distance Squared") -#endif - return dot(d, d); -#if 0 - if (distance_metric == "Actual Distance") - return length(d); - if (distance_metric == "Manhattan") - return fabs(d[0]) + fabs(d[1]) + fabs(d[2]); - if (distance_metric == "Chebychev") - return max(fabs(d[0]), max(fabs(d[1]), fabs(d[2]))); - if (distance_metric == "Minkovsky 1/2") - return sqrt(fabs(d[0])) + sqrt(fabs(d[1])) + sqrt(fabs(d[1])); - if (distance_metric == "Minkovsky 4") - return sqrt(sqrt(dot(d * d, d * d))); - if (distance_metric == "Minkovsky") - return pow(pow(fabs(d[0]), e) + pow(fabs(d[1]), e) + pow(fabs(d[2]), e), 1.0 / e); - - return 0.0; -#endif -} - /* Voronoi / Worley like */ color cellnoise_color(point p) @@ -51,7 +25,7 @@ color cellnoise_color(point p) return color(r, g, b); } -void voronoi(point p, string distance_metric, float e, float da[4], point pa[4]) +void voronoi(point p, float e, float da[4], point pa[4]) { /* returns distances in da and point coords in pa */ int xx, yy, zz, xi, yi, zi; @@ -71,7 +45,7 @@ void voronoi(point p, string distance_metric, float e, float da[4], point pa[4]) point ip = point(xx, yy, zz); point vp = (point)cellnoise_color(ip); point pd = p - (vp + ip); - float d = voronoi_distance(distance_metric, pd, e); + float d = dot(pd, pd); vp += point(xx, yy, zz); @@ -111,46 +85,6 @@ void voronoi(point p, string distance_metric, float e, float da[4], point pa[4]) } } -float voronoi_Fn(point p, int n) -{ - float da[4]; - point pa[4]; - - voronoi(p, "Distance Squared", 0, da, pa); - - return da[n]; -} - -float voronoi_FnFn(point p, int n1, int n2) -{ - float da[4]; - point pa[4]; - - voronoi(p, "Distance Squared", 0, da, pa); - - return da[n2] - da[n1]; -} - -float voronoi_F1(point p) { return voronoi_Fn(p, 0); } -float voronoi_F2(point p) { return voronoi_Fn(p, 1); } -float voronoi_F3(point p) { return voronoi_Fn(p, 2); } -float voronoi_F4(point p) { return voronoi_Fn(p, 3); } -float voronoi_F1F2(point p) { return voronoi_FnFn(p, 0, 1); } - -float voronoi_Cr(point p) -{ - /* crackle type pattern, just a scale/clamp of F2-F1 */ - float t = 10.0 * voronoi_F1F2(p); - return (t > 1.0) ? 1.0 : t; -} - -float voronoi_F1S(point p) { return 2.0 * voronoi_F1(p) - 1.0; } -float voronoi_F2S(point p) { return 2.0 * voronoi_F2(p) - 1.0; } -float voronoi_F3S(point p) { return 2.0 * voronoi_F3(p) - 1.0; } -float voronoi_F4S(point p) { return 2.0 * voronoi_F4(p) - 1.0; } -float voronoi_F1F2S(point p) { return 2.0 * voronoi_F1F2(p) - 1.0; } -float voronoi_CrS(point p) { return 2.0 * voronoi_Cr(p) - 1.0; } - /* Noise Bases */ float safe_noise(point p, string type) @@ -176,6 +110,7 @@ float noise_basis(point p, string basis) { if (basis == "Perlin") return safe_noise(p, "unsigned"); +#if 0 if (basis == "Voronoi F1") return voronoi_F1S(p); if (basis == "Voronoi F2") @@ -188,6 +123,7 @@ float noise_basis(point p, string basis) return voronoi_F1F2S(p); if (basis == "Voronoi Crackle") return voronoi_CrS(p); +#endif if (basis == "Cell Noise") return cellnoise(p); diff --git a/intern/cycles/kernel/shaders/node_voronoi_texture.osl b/intern/cycles/kernel/shaders/node_voronoi_texture.osl index df169599d08..29e143ae207 100644 --- a/intern/cycles/kernel/shaders/node_voronoi_texture.osl +++ b/intern/cycles/kernel/shaders/node_voronoi_texture.osl @@ -37,7 +37,7 @@ shader node_voronoi_texture( float da[4]; point pa[4]; - voronoi(p * Scale, "Distance Squared", 1.0, da, pa); + voronoi(p * Scale, 1.0, da, pa); /* Colored output */ if (Coloring == "Intensity") { diff --git a/intern/cycles/kernel/svm/svm_texture.h b/intern/cycles/kernel/svm/svm_texture.h index 2e06bbe8499..904c1e5259a 100644 --- a/intern/cycles/kernel/svm/svm_texture.h +++ b/intern/cycles/kernel/svm/svm_texture.h @@ -16,219 +16,6 @@ CCL_NAMESPACE_BEGIN -/* Voronoi Distances */ - -#if 0 -ccl_device float voronoi_distance(NodeDistanceMetric distance_metric, float3 d, float e) -{ -#if 0 - if(distance_metric == NODE_VORONOI_DISTANCE_SQUARED) -#endif - return dot(d, d); -#if 0 - if(distance_metric == NODE_VORONOI_ACTUAL_DISTANCE) - return len(d); - if(distance_metric == NODE_VORONOI_MANHATTAN) - return fabsf(d.x) + fabsf(d.y) + fabsf(d.z); - if(distance_metric == NODE_VORONOI_CHEBYCHEV) - return fmaxf(fabsf(d.x), fmaxf(fabsf(d.y), fabsf(d.z))); - if(distance_metric == NODE_VORONOI_MINKOVSKY_H) - return sqrtf(fabsf(d.x)) + sqrtf(fabsf(d.y)) + sqrtf(fabsf(d.y)); - if(distance_metric == NODE_VORONOI_MINKOVSKY_4) - return sqrtf(sqrtf(dot(d*d, d*d))); - if(distance_metric == NODE_VORONOI_MINKOVSKY) - return powf(powf(fabsf(d.x), e) + powf(fabsf(d.y), e) + powf(fabsf(d.z), e), 1.0f/e); - - return 0.0f; -#endif -} - -/* Voronoi / Worley like */ -ccl_device_inline float4 voronoi_Fn(float3 p, float e, int n1, int n2) -{ - float da[4]; - float3 pa[4]; - NodeDistanceMetric distance_metric = NODE_VORONOI_DISTANCE_SQUARED; - - /* returns distances in da and point coords in pa */ - int xx, yy, zz, xi, yi, zi; - - xi = floor_to_int(p.x); - yi = floor_to_int(p.y); - zi = floor_to_int(p.z); - - da[0] = 1e10f; - da[1] = 1e10f; - da[2] = 1e10f; - da[3] = 1e10f; - - pa[0] = make_float3(0.0f, 0.0f, 0.0f); - pa[1] = make_float3(0.0f, 0.0f, 0.0f); - pa[2] = make_float3(0.0f, 0.0f, 0.0f); - pa[3] = make_float3(0.0f, 0.0f, 0.0f); - - for(xx = xi-1; xx <= xi+1; xx++) { - for(yy = yi-1; yy <= yi+1; yy++) { - for(zz = zi-1; zz <= zi+1; zz++) { - float3 ip = make_float3((float)xx, (float)yy, (float)zz); - float3 vp = cellnoise_color(ip); - float3 pd = p - (vp + ip); - float d = voronoi_distance(distance_metric, pd, e); - - vp += ip; - - if(d < da[0]) { - da[3] = da[2]; - da[2] = da[1]; - da[1] = da[0]; - da[0] = d; - - pa[3] = pa[2]; - pa[2] = pa[1]; - pa[1] = pa[0]; - pa[0] = vp; - } - else if(d < da[1]) { - da[3] = da[2]; - da[2] = da[1]; - da[1] = d; - - pa[3] = pa[2]; - pa[2] = pa[1]; - pa[1] = vp; - } - else if(d < da[2]) { - da[3] = da[2]; - da[2] = d; - - pa[3] = pa[2]; - pa[2] = vp; - } - else if(d < da[3]) { - da[3] = d; - pa[3] = vp; - } - } - } - } - - float4 result = make_float4(pa[n1].x, pa[n1].y, pa[n1].z, da[n1]); - - if(n2 != -1) - result = make_float4(pa[n2].x, pa[n2].y, pa[n2].z, da[n2]) - result; - - return result; -} -#endif - -ccl_device float voronoi_F1_distance(float3 p) -{ - /* returns squared distance in da */ - float da = 1e10f; - -#ifndef __KERNEL_SSE2__ - int ix = floor_to_int(p.x), iy = floor_to_int(p.y), iz = floor_to_int(p.z); - - for(int xx = -1; xx <= 1; xx++) { - for(int yy = -1; yy <= 1; yy++) { - for(int zz = -1; zz <= 1; zz++) { - float3 ip = make_float3(ix + xx, iy + yy, iz + zz); - float3 vp = ip + cellnoise_color(ip); - float d = len_squared(p - vp); - da = min(d, da); - } - } - } -#else - ssef vec_p = load4f(p); - ssei xyzi = quick_floor_sse(vec_p); - - for(int xx = -1; xx <= 1; xx++) { - for(int yy = -1; yy <= 1; yy++) { - for(int zz = -1; zz <= 1; zz++) { - ssef ip = ssef(xyzi + ssei(xx, yy, zz, 0)); - ssef vp = ip + cellnoise_color(ip); - float d = len_squared<1, 1, 1, 0>(vec_p - vp); - da = min(d, da); - } - } - } -#endif - - return da; -} - -ccl_device float3 voronoi_F1_color(float3 p) -{ - /* returns color of the nearest point */ - float da = 1e10f; - -#ifndef __KERNEL_SSE2__ - float3 pa; - int ix = floor_to_int(p.x), iy = floor_to_int(p.y), iz = floor_to_int(p.z); - - for(int xx = -1; xx <= 1; xx++) { - for(int yy = -1; yy <= 1; yy++) { - for(int zz = -1; zz <= 1; zz++) { - float3 ip = make_float3(ix + xx, iy + yy, iz + zz); - float3 vp = ip + cellnoise_color(ip); - float d = len_squared(p - vp); - - if(d < da) { - da = d; - pa = vp; - } - } - } - } - - return cellnoise_color(pa); -#else - ssef pa, vec_p = load4f(p); - ssei xyzi = quick_floor_sse(vec_p); - - for(int xx = -1; xx <= 1; xx++) { - for(int yy = -1; yy <= 1; yy++) { - for(int zz = -1; zz <= 1; zz++) { - ssef ip = ssef(xyzi + ssei(xx, yy, zz, 0)); - ssef vp = ip + cellnoise_color(ip); - float d = len_squared<1, 1, 1, 0>(vec_p - vp); - - if(d < da) { - da = d; - pa = vp; - } - } - } - } - - ssef color = cellnoise_color(pa); - return (float3 &)color; -#endif -} - -#if 0 -ccl_device float voronoi_F1(float3 p) { return voronoi_Fn(p, 0.0f, 0, -1).w; } -ccl_device float voronoi_F2(float3 p) { return voronoi_Fn(p, 0.0f, 1, -1).w; } -ccl_device float voronoi_F3(float3 p) { return voronoi_Fn(p, 0.0f, 2, -1).w; } -ccl_device float voronoi_F4(float3 p) { return voronoi_Fn(p, 0.0f, 3, -1).w; } -ccl_device float voronoi_F1F2(float3 p) { return voronoi_Fn(p, 0.0f, 0, 1).w; } - -ccl_device float voronoi_Cr(float3 p) -{ - /* crackle type pattern, just a scale/clamp of F2-F1 */ - float t = 10.0f*voronoi_F1F2(p); - return (t > 1.0f)? 1.0f: t; -} - -ccl_device float voronoi_F1S(float3 p) { return 2.0f*voronoi_F1(p) - 1.0f; } -ccl_device float voronoi_F2S(float3 p) { return 2.0f*voronoi_F2(p) - 1.0f; } -ccl_device float voronoi_F3S(float3 p) { return 2.0f*voronoi_F3(p) - 1.0f; } -ccl_device float voronoi_F4S(float3 p) { return 2.0f*voronoi_F4(p) - 1.0f; } -ccl_device float voronoi_F1F2S(float3 p) { return 2.0f*voronoi_F1F2(p) - 1.0f; } -ccl_device float voronoi_CrS(float3 p) { return 2.0f*voronoi_Cr(p) - 1.0f; } -#endif - /* Noise Bases */ ccl_device float noise_basis(float3 p, NodeNoiseBasis basis) diff --git a/intern/cycles/kernel/svm/svm_types.h b/intern/cycles/kernel/svm/svm_types.h index 4f2117a605b..6d956a57da3 100644 --- a/intern/cycles/kernel/svm/svm_types.h +++ b/intern/cycles/kernel/svm/svm_types.h @@ -273,16 +273,6 @@ typedef enum NodeConvert { NODE_CONVERT_IV } NodeConvert; -typedef enum NodeDistanceMetric { - NODE_VORONOI_DISTANCE_SQUARED, - NODE_VORONOI_ACTUAL_DISTANCE, - NODE_VORONOI_MANHATTAN, - NODE_VORONOI_CHEBYCHEV, - NODE_VORONOI_MINKOVSKY_H, - NODE_VORONOI_MINKOVSKY_4, - NODE_VORONOI_MINKOVSKY -} NodeDistanceMetric; - typedef enum NodeNoiseBasis { NODE_NOISE_PERLIN, NODE_NOISE_VORONOI_F1, diff --git a/intern/cycles/kernel/svm/svm_voronoi.h b/intern/cycles/kernel/svm/svm_voronoi.h index 5a2e6e97dd3..d612d7e973f 100644 --- a/intern/cycles/kernel/svm/svm_voronoi.h +++ b/intern/cycles/kernel/svm/svm_voronoi.h @@ -18,6 +18,92 @@ CCL_NAMESPACE_BEGIN /* Voronoi */ +ccl_device float voronoi_F1_distance(float3 p) +{ + /* returns squared distance in da */ + float da = 1e10f; + +#ifndef __KERNEL_SSE2__ + int ix = floor_to_int(p.x), iy = floor_to_int(p.y), iz = floor_to_int(p.z); + + for(int xx = -1; xx <= 1; xx++) { + for(int yy = -1; yy <= 1; yy++) { + for(int zz = -1; zz <= 1; zz++) { + float3 ip = make_float3(ix + xx, iy + yy, iz + zz); + float3 vp = ip + cellnoise_color(ip); + float d = len_squared(p - vp); + da = min(d, da); + } + } + } +#else + ssef vec_p = load4f(p); + ssei xyzi = quick_floor_sse(vec_p); + + for(int xx = -1; xx <= 1; xx++) { + for(int yy = -1; yy <= 1; yy++) { + for(int zz = -1; zz <= 1; zz++) { + ssef ip = ssef(xyzi + ssei(xx, yy, zz, 0)); + ssef vp = ip + cellnoise_color(ip); + float d = len_squared<1, 1, 1, 0>(vec_p - vp); + da = min(d, da); + } + } + } +#endif + + return da; +} + +ccl_device float3 voronoi_F1_color(float3 p) +{ + /* returns color of the nearest point */ + float da = 1e10f; + +#ifndef __KERNEL_SSE2__ + float3 pa; + int ix = floor_to_int(p.x), iy = floor_to_int(p.y), iz = floor_to_int(p.z); + + for(int xx = -1; xx <= 1; xx++) { + for(int yy = -1; yy <= 1; yy++) { + for(int zz = -1; zz <= 1; zz++) { + float3 ip = make_float3(ix + xx, iy + yy, iz + zz); + float3 vp = ip + cellnoise_color(ip); + float d = len_squared(p - vp); + + if(d < da) { + da = d; + pa = vp; + } + } + } + } + + return cellnoise_color(pa); +#else + ssef pa, vec_p = load4f(p); + ssei xyzi = quick_floor_sse(vec_p); + + for(int xx = -1; xx <= 1; xx++) { + for(int yy = -1; yy <= 1; yy++) { + for(int zz = -1; zz <= 1; zz++) { + ssef ip = ssef(xyzi + ssei(xx, yy, zz, 0)); + ssef vp = ip + cellnoise_color(ip); + float d = len_squared<1, 1, 1, 0>(vec_p - vp); + + if(d < da) { + da = d; + pa = vp; + } + } + } + } + + ssef color = cellnoise_color(pa); + return (float3 &)color; +#endif +} + ccl_device_noinline float4 svm_voronoi(NodeVoronoiColoring coloring, float3 p) { if(coloring == NODE_VORONOI_INTENSITY) {