diff options
author | Brecht Van Lommel <brechtvanlommel@pandora.be> | 2011-11-07 01:05:58 +0400 |
---|---|---|
committer | Brecht Van Lommel <brechtvanlommel@pandora.be> | 2011-11-07 01:05:58 +0400 |
commit | fb56dbc2afc7c8b6ffc24406ed82cbcbff090da3 (patch) | |
tree | 5832366c7147ad6ebc858312ac106b5d1571b5e5 /intern/cycles/kernel | |
parent | 3bf96250cde08ab9ad717819114b48ccb11c2d5d (diff) |
Cycles: procedural texture nodes reorganization. This will break existing files
using them, but rather do it now that I have the chance still. Highlights:
* Wood and Marble merged into a single Wave texture
* Clouds + Distorted Noise merged into new Noise node
* Blend renamed to Gradient
* Stucci removed, was mostly useful for old bump
* Noise removed, will come back later, didn't actually work yet
* Depth setting is now Detail socket, which accepts float values
* Scale socket instead of Size socket
http://wiki.blender.org/index.php/Doc:2.6/Manual/Render/Cycles/Nodes/Textures
Diffstat (limited to 'intern/cycles/kernel')
-rw-r--r-- | intern/cycles/kernel/CMakeLists.txt | 8 | ||||
-rw-r--r-- | intern/cycles/kernel/svm/svm.h | 43 | ||||
-rw-r--r-- | intern/cycles/kernel/svm/svm_clouds.h | 55 | ||||
-rw-r--r-- | intern/cycles/kernel/svm/svm_distorted_noise.h | 59 | ||||
-rw-r--r-- | intern/cycles/kernel/svm/svm_fresnel.h | 4 | ||||
-rw-r--r-- | intern/cycles/kernel/svm/svm_gradient.h (renamed from intern/cycles/kernel/svm/svm_blend.h) | 43 | ||||
-rw-r--r-- | intern/cycles/kernel/svm/svm_magic.h | 60 | ||||
-rw-r--r-- | intern/cycles/kernel/svm/svm_marble.h | 67 | ||||
-rw-r--r-- | intern/cycles/kernel/svm/svm_musgrave.h | 59 | ||||
-rw-r--r-- | intern/cycles/kernel/svm/svm_noisetex.h | 55 | ||||
-rw-r--r-- | intern/cycles/kernel/svm/svm_stucci.h | 63 | ||||
-rw-r--r-- | intern/cycles/kernel/svm/svm_texture.h | 29 | ||||
-rw-r--r-- | intern/cycles/kernel/svm/svm_types.h | 27 | ||||
-rw-r--r-- | intern/cycles/kernel/svm/svm_voronoi.h | 65 | ||||
-rw-r--r-- | intern/cycles/kernel/svm/svm_wave.h | 65 | ||||
-rw-r--r-- | intern/cycles/kernel/svm/svm_wood.h | 69 |
16 files changed, 252 insertions, 519 deletions
diff --git a/intern/cycles/kernel/CMakeLists.txt b/intern/cycles/kernel/CMakeLists.txt index cf10f035585..893c4bb6081 100644 --- a/intern/cycles/kernel/CMakeLists.txt +++ b/intern/cycles/kernel/CMakeLists.txt @@ -42,33 +42,29 @@ set(svm_headers svm/emissive.h svm/svm.h svm/svm_attribute.h - svm/svm_blend.h svm/svm_bsdf.h svm/svm_closure.h - svm/svm_clouds.h svm/svm_convert.h svm/svm_displace.h - svm/svm_distorted_noise.h svm/svm_fresnel.h svm/svm_geometry.h + svm/svm_gradient.h svm/svm_image.h svm/svm_light_path.h svm/svm_magic.h svm/svm_mapping.h - svm/svm_marble.h svm/svm_math.h svm/svm_mix.h svm/svm_musgrave.h svm/svm_noise.h svm/svm_noisetex.h svm/svm_sky.h - svm/svm_stucci.h svm/svm_tex_coord.h svm/svm_texture.h svm/svm_types.h svm/svm_value.h svm/svm_voronoi.h - svm/svm_wood.h + svm/svm_wave.h svm/volume.h ) diff --git a/intern/cycles/kernel/svm/svm.h b/intern/cycles/kernel/svm/svm.h index 9628f96bcab..2615272691c 100644 --- a/intern/cycles/kernel/svm/svm.h +++ b/intern/cycles/kernel/svm/svm.h @@ -120,29 +120,25 @@ CCL_NAMESPACE_END #include "svm_texture.h" #include "svm_attribute.h" -#include "svm_blend.h" +#include "svm_gradient.h" #include "svm_closure.h" -#include "svm_clouds.h" +#include "svm_noisetex.h" #include "svm_convert.h" #include "svm_displace.h" -#include "svm_distorted_noise.h" #include "svm_fresnel.h" #include "svm_geometry.h" #include "svm_image.h" #include "svm_light_path.h" #include "svm_magic.h" #include "svm_mapping.h" -#include "svm_marble.h" +#include "svm_wave.h" #include "svm_math.h" #include "svm_mix.h" #include "svm_musgrave.h" -#include "svm_noisetex.h" #include "svm_sky.h" -#include "svm_stucci.h" #include "svm_tex_coord.h" #include "svm_value.h" #include "svm_voronoi.h" -#include "svm_wood.h" CCL_NAMESPACE_BEGIN @@ -206,12 +202,6 @@ __device_noinline void svm_eval_nodes(KernelGlobals *kg, ShaderData *sd, ShaderT offset = node.y; break; #ifdef __TEXTURES__ - case NODE_TEX_NOISE_F: - svm_node_tex_noise_f(sd, stack, node.y, node.z); - break; - case NODE_TEX_NOISE_V: - svm_node_tex_noise_v(sd, stack, node.y, node.z); - break; case NODE_TEX_IMAGE: svm_node_tex_image(kg, sd, stack, node); break; @@ -221,11 +211,11 @@ __device_noinline void svm_eval_nodes(KernelGlobals *kg, ShaderData *sd, ShaderT case NODE_TEX_SKY: svm_node_tex_sky(kg, sd, stack, node.y, node.z); break; - case NODE_TEX_BLEND: - svm_node_tex_blend(sd, stack, node); + case NODE_TEX_GRADIENT: + svm_node_tex_gradient(sd, stack, node); break; - case NODE_TEX_CLOUDS: - svm_node_tex_clouds(sd, stack, node); + case NODE_TEX_NOISE: + svm_node_tex_noise(kg, sd, stack, node, &offset); break; case NODE_TEX_VORONOI: svm_node_tex_voronoi(kg, sd, stack, node, &offset); @@ -233,20 +223,11 @@ __device_noinline void svm_eval_nodes(KernelGlobals *kg, ShaderData *sd, ShaderT case NODE_TEX_MUSGRAVE: svm_node_tex_musgrave(kg, sd, stack, node, &offset); break; - case NODE_TEX_MARBLE: - svm_node_tex_marble(kg, sd, stack, node, &offset); + case NODE_TEX_WAVE: + svm_node_tex_wave(kg, sd, stack, node, &offset); break; case NODE_TEX_MAGIC: - svm_node_tex_magic(sd, stack, node); - break; - case NODE_TEX_STUCCI: - svm_node_tex_stucci(kg, sd, stack, node, &offset); - break; - case NODE_TEX_DISTORTED_NOISE: - svm_node_tex_distorted_noise(kg, sd, stack, node, &offset); - break; - case NODE_TEX_WOOD: - svm_node_tex_wood(kg, sd, stack, node, &offset); + svm_node_tex_magic(kg, sd, stack, node, &offset); break; #endif case NODE_GEOMETRY: @@ -285,8 +266,8 @@ __device_noinline void svm_eval_nodes(KernelGlobals *kg, ShaderData *sd, ShaderT case NODE_FRESNEL: svm_node_fresnel(sd, stack, node.y, node.z, node.w); break; - case NODE_BLEND_WEIGHT: - svm_node_blend_weight(sd, stack, node); + case NODE_LAYER_WEIGHT: + svm_node_layer_weight(sd, stack, node); break; case NODE_SET_DISPLACEMENT: svm_node_set_displacement(sd, stack, node.y); diff --git a/intern/cycles/kernel/svm/svm_clouds.h b/intern/cycles/kernel/svm/svm_clouds.h deleted file mode 100644 index b89f1ceb072..00000000000 --- a/intern/cycles/kernel/svm/svm_clouds.h +++ /dev/null @@ -1,55 +0,0 @@ -/* - * Copyright 2011, Blender Foundation. - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; either version 2 - * of the License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software Foundation, - * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - */ - -CCL_NAMESPACE_BEGIN - -/* Clouds */ - -__device_inline void svm_clouds(NodeNoiseBasis basis, int hard, int depth, float size, float3 p, float *fac, float3 *color) -{ - p /= size; - - *fac = noise_turbulence(p, basis, depth, hard); - *color = make_float3(*fac, - noise_turbulence(make_float3(p.y, p.x, p.z), basis, depth, hard), - noise_turbulence(make_float3(p.y, p.z, p.x), basis, depth, hard)); -} - -__device void svm_node_tex_clouds(ShaderData *sd, float *stack, uint4 node) -{ - uint basis, hard, depth; - uint size_offset, co_offset, fac_offset, color_offset; - - decode_node_uchar4(node.y, &basis, &hard, &depth, NULL); - decode_node_uchar4(node.z, &size_offset, &co_offset, &fac_offset, &color_offset); - - float3 co = stack_load_float3(stack, co_offset); - float size = stack_load_float_default(stack, size_offset, node.w); - size = nonzerof(size, 1e-5f); - - float3 color; - float f; - - svm_clouds((NodeNoiseBasis)basis, hard, depth, size, co, &f, &color); - - if(stack_valid(fac_offset)) stack_store_float(stack, fac_offset, f); - if(stack_valid(color_offset)) stack_store_float3(stack, color_offset, color); -} - -CCL_NAMESPACE_END - diff --git a/intern/cycles/kernel/svm/svm_distorted_noise.h b/intern/cycles/kernel/svm/svm_distorted_noise.h deleted file mode 100644 index 7d1556cd185..00000000000 --- a/intern/cycles/kernel/svm/svm_distorted_noise.h +++ /dev/null @@ -1,59 +0,0 @@ -/* - * Copyright 2011, Blender Foundation. - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; either version 2 - * of the License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software Foundation, - * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - */ - -CCL_NAMESPACE_BEGIN - -/* Distorted Noise (variable lacunarity noise) */ - -__device_noinline float svm_distorted_noise(float3 p, float size, NodeNoiseBasis basis, NodeNoiseBasis distortion_basis, float distortion) -{ - float3 r; - float3 offset = make_float3(13.5f, 13.5f, 13.5f); - - p /= size; - - r.x = noise_basis(p + offset, basis) * distortion; - r.y = noise_basis(p, basis) * distortion; - r.z = noise_basis(p - offset, basis) * distortion; - - return noise_basis(p + r, distortion_basis); /* distorted-domain noise */ -} - -__device void svm_node_tex_distorted_noise(KernelGlobals *kg, ShaderData *sd, float *stack, uint4 node, int *offset) -{ - uint4 node2 = read_node(kg, offset); - - uint basis, distortion_basis; - uint size_offset, distortion_offset, co_offset, fac_offset; - - decode_node_uchar4(node.y, &basis, &distortion_basis, NULL, NULL); - decode_node_uchar4(node.z, &size_offset, &distortion_offset, &co_offset, &fac_offset); - - float3 co = stack_load_float3(stack, co_offset); - float size = stack_load_float_default(stack, size_offset, node2.x); - float distortion = stack_load_float_default(stack, distortion_offset, node2.y); - size = nonzerof(size, 1e-5f); - - float f = svm_distorted_noise(co, size, (NodeNoiseBasis)basis, - (NodeNoiseBasis)distortion_basis, distortion); - - stack_store_float(stack, fac_offset, f); -} - -CCL_NAMESPACE_END - diff --git a/intern/cycles/kernel/svm/svm_fresnel.h b/intern/cycles/kernel/svm/svm_fresnel.h index 1b9d99506e3..7684eabeecb 100644 --- a/intern/cycles/kernel/svm/svm_fresnel.h +++ b/intern/cycles/kernel/svm/svm_fresnel.h @@ -33,7 +33,7 @@ __device void svm_node_fresnel(ShaderData *sd, float *stack, uint ior_offset, ui /* Blend Weight Node */ -__device void svm_node_blend_weight(ShaderData *sd, float *stack, uint4 node) +__device void svm_node_layer_weight(ShaderData *sd, float *stack, uint4 node) { uint blend_offset = node.y; uint blend_value = node.z; @@ -44,7 +44,7 @@ __device void svm_node_blend_weight(ShaderData *sd, float *stack, uint4 node) float f; - if(type == NODE_BLEND_WEIGHT_FRESNEL) { + if(type == NODE_LAYER_WEIGHT_FRESNEL) { float eta = fmaxf(1.0f - blend, 1e-5f); eta = (sd->flag & SD_BACKFACING)? eta: 1.0f/eta; diff --git a/intern/cycles/kernel/svm/svm_blend.h b/intern/cycles/kernel/svm/svm_gradient.h index 97fa4aff9e7..79298f5f581 100644 --- a/intern/cycles/kernel/svm/svm_blend.h +++ b/intern/cycles/kernel/svm/svm_gradient.h @@ -18,36 +18,31 @@ CCL_NAMESPACE_BEGIN -/* Blend */ +/* Gradient */ -__device float svm_blend(float3 p, NodeBlendType type, NodeBlendAxis axis) +__device float svm_gradient(float3 p, NodeBlendType type) { - float x, y; + float x, y, z; - if(axis == NODE_BLEND_VERTICAL) { - x= p.y; - y= p.x; - } - else { - x= p.x; - y= p.y; - } + x= p.x; + y= p.y; + z= p.z; if(type == NODE_BLEND_LINEAR) { - return (1.0f + x)/2.0f; + return x; } else if(type == NODE_BLEND_QUADRATIC) { - float r = fmaxf((1.0f + x)/2.0f, 0.0f); + float r = fmaxf(x, 0.0f); return r*r; } else if(type == NODE_BLEND_EASING) { - float r = fminf(fmaxf((1.0f + x)/2.0f, 0.0f), 1.0f); + float r = fminf(fmaxf(x, 0.0f), 1.0f); float t = r*r; return (3.0f*t - 2.0f*t*r); } else if(type == NODE_BLEND_DIAGONAL) { - return (2.0f + x + y)/4.0f; + return (x + y)/2.0f; } else if(type == NODE_BLEND_RADIAL) { return atan2(y, x)/(2.0f*M_PI_F) + 0.5f; @@ -64,15 +59,21 @@ __device float svm_blend(float3 p, NodeBlendType type, NodeBlendAxis axis) return 0.0f; } -__device void svm_node_tex_blend(ShaderData *sd, float *stack, uint4 node) +__device void svm_node_tex_gradient(ShaderData *sd, float *stack, uint4 node) { - float3 co = stack_load_float3(stack, node.z); - uint type, axis; + uint type, co_offset, color_offset, fac_offset; + + decode_node_uchar4(node.y, &type, &co_offset, &fac_offset, &color_offset); + + float3 co = stack_load_float3(stack, co_offset); - decode_node_uchar4(node.y, &type, &axis, NULL, NULL); + float f = svm_gradient(co, (NodeBlendType)type); + f = clamp(f, 0.0f, 1.0f); - float f = svm_blend(co, (NodeBlendType)type, (NodeBlendAxis)axis); - stack_store_float(stack, node.w, f); + if(stack_valid(fac_offset)) + stack_store_float(stack, fac_offset, f); + if(stack_valid(color_offset)) + stack_store_float3(stack, color_offset, make_float3(f, f, f)); } CCL_NAMESPACE_END diff --git a/intern/cycles/kernel/svm/svm_magic.h b/intern/cycles/kernel/svm/svm_magic.h index af847869f6e..65d37937e1e 100644 --- a/intern/cycles/kernel/svm/svm_magic.h +++ b/intern/cycles/kernel/svm/svm_magic.h @@ -20,56 +20,54 @@ CCL_NAMESPACE_BEGIN /* Magic */ -__device_noinline float3 svm_magic(float3 p, int n, float turbulence) +__device_noinline float3 svm_magic(float3 p, int n, float distortion) { - float turb = turbulence/5.0f; - float x = sinf((p.x + p.y + p.z)*5.0f); float y = cosf((-p.x + p.y - p.z)*5.0f); float z = -cosf((-p.x - p.y + p.z)*5.0f); if(n > 0) { - x *= turb; - y *= turb; - z *= turb; + x *= distortion; + y *= distortion; + z *= distortion; y = -cosf(x-y+z); - y *= turb; + y *= distortion; if(n > 1) { x= cosf(x-y-z); - x *= turb; + x *= distortion; if(n > 2) { z= sinf(-x-y-z); - z *= turb; + z *= distortion; if(n > 3) { x= -cosf(-x+y-z); - x *= turb; + x *= distortion; if(n > 4) { y= -sinf(-x+y+z); - y *= turb; + y *= distortion; if(n > 5) { y= -cosf(-x+y+z); - y *= turb; + y *= distortion; if(n > 6) { x= cosf(x+y+z); - x *= turb; + x *= distortion; if(n > 7) { z= sinf(x+y-z); - z *= turb; + z *= distortion; if(n > 8) { x= -cosf(-x-y+z); - x *= turb; + x *= distortion; if(n > 9) { y= -sinf(x-y+z); - y *= turb; + y *= distortion; } } } @@ -81,27 +79,35 @@ __device_noinline float3 svm_magic(float3 p, int n, float turbulence) } } - if(turb != 0.0f) { - turb *= 2.0f; - x /= turb; - y /= turb; - z /= turb; + if(distortion != 0.0f) { + distortion *= 2.0f; + x /= distortion; + y /= distortion; + z /= distortion; } return make_float3(0.5f - x, 0.5f - y, 0.5f - z); } -__device void svm_node_tex_magic(ShaderData *sd, float *stack, uint4 node) +__device void svm_node_tex_magic(KernelGlobals *kg, ShaderData *sd, float *stack, uint4 node, int *offset) { - uint depth, turbulence_offset, co_offset, color_offset; + uint depth; + uint scale_offset, distortion_offset, co_offset, fac_offset, color_offset; - decode_node_uchar4(node.y, &depth, &turbulence_offset, &co_offset, &color_offset); + decode_node_uchar4(node.y, &depth, &color_offset, &fac_offset, NULL); + decode_node_uchar4(node.z, &co_offset, &scale_offset, &distortion_offset, NULL); + uint4 node2 = read_node(kg, offset); float3 co = stack_load_float3(stack, co_offset); - float turbulence = stack_load_float_default(stack, turbulence_offset, node.z); + float scale = stack_load_float_default(stack, scale_offset, node2.x); + float distortion = stack_load_float_default(stack, distortion_offset, node2.y); + + float3 color = svm_magic(co*scale, depth, distortion); - float3 color = svm_magic(co, depth, turbulence); - stack_store_float3(stack, color_offset, color); + if(stack_valid(fac_offset)) + stack_store_float(stack, fac_offset, average(color)); + if(stack_valid(color_offset)) + stack_store_float3(stack, color_offset, color); } CCL_NAMESPACE_END diff --git a/intern/cycles/kernel/svm/svm_marble.h b/intern/cycles/kernel/svm/svm_marble.h deleted file mode 100644 index aa22565e956..00000000000 --- a/intern/cycles/kernel/svm/svm_marble.h +++ /dev/null @@ -1,67 +0,0 @@ -/* - * Copyright 2011, Blender Foundation. - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; either version 2 - * of the License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software Foundation, - * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - */ - -CCL_NAMESPACE_BEGIN - -/* Marble */ - -__device_noinline float svm_marble(float3 p, float size, NodeMarbleType type, NodeWaveType wave, NodeNoiseBasis basis, int hard, float turb, int depth) -{ - float x = p.x; - float y = p.y; - float z = p.z; - - float n = 5.0f * (x + y + z); - - float mi = n + turb * noise_turbulence(p/size, basis, depth, hard); - - mi = noise_wave(wave, mi); - - if(type == NODE_MARBLE_SHARP) - mi = sqrt(mi); - else if(type == NODE_MARBLE_SHARPER) - mi = sqrt(sqrt(mi)); - - return mi; -} - -__device void svm_node_tex_marble(KernelGlobals *kg, ShaderData *sd, float *stack, uint4 node, int *offset) -{ - uint4 node2 = read_node(kg, offset); - - uint type, wave, basis, hard; - uint depth; - uint size_offset, turbulence_offset, co_offset, fac_offset; - - decode_node_uchar4(node.y, &type, &wave, &basis, &hard); - decode_node_uchar4(node.z, &depth, NULL, NULL, NULL); - decode_node_uchar4(node.w, &size_offset, &turbulence_offset, &co_offset, &fac_offset); - - float3 co = stack_load_float3(stack, co_offset); - float size = stack_load_float_default(stack, size_offset, node2.x); - float turbulence = stack_load_float_default(stack, turbulence_offset, node2.y); - size = nonzerof(size, 1e-5f); - - float f = svm_marble(co, size, (NodeMarbleType)type, (NodeWaveType)wave, - (NodeNoiseBasis)basis, hard, turbulence, depth); - - stack_store_float(stack, fac_offset, f); -} - -CCL_NAMESPACE_END - diff --git a/intern/cycles/kernel/svm/svm_musgrave.h b/intern/cycles/kernel/svm/svm_musgrave.h index be327f7f262..34cf7868f07 100644 --- a/intern/cycles/kernel/svm/svm_musgrave.h +++ b/intern/cycles/kernel/svm/svm_musgrave.h @@ -36,14 +36,14 @@ __device_noinline float noise_musgrave_fBm(float3 p, NodeNoiseBasis basis, float int i; for(i = 0; i < (int)octaves; i++) { - value += noise_basis(p, basis) * pwr; + value += snoise(p) * pwr; pwr *= pwHL; p *= lacunarity; } rmd = octaves - floor(octaves); if(rmd != 0.0f) - value += rmd * noise_basis(p, basis) * pwr; + value += rmd * snoise(p) * pwr; return value; } @@ -64,14 +64,14 @@ __device_noinline float noise_musgrave_multi_fractal(float3 p, NodeNoiseBasis ba int i; for(i = 0; i < (int)octaves; i++) { - value *= (pwr * noise_basis(p, basis) + 1.0f); + value *= (pwr * snoise(p) + 1.0f); pwr *= pwHL; p *= lacunarity; } rmd = octaves - floor(octaves); if(rmd != 0.0f) - value *= (rmd * pwr * noise_basis(p, basis) + 1.0f); /* correct? */ + value *= (rmd * pwr * snoise(p) + 1.0f); /* correct? */ return value; } @@ -92,11 +92,11 @@ __device_noinline float noise_musgrave_hetero_terrain(float3 p, NodeNoiseBasis b int i; /* first unscaled octave of function; later octaves are scaled */ - value = offset + noise_basis(p, basis); + value = offset + snoise(p); p *= lacunarity; for(i = 1; i < (int)octaves; i++) { - increment = (noise_basis(p, basis) + offset) * pwr * value; + increment = (snoise(p) + offset) * pwr * value; value += increment; pwr *= pwHL; p *= lacunarity; @@ -104,7 +104,7 @@ __device_noinline float noise_musgrave_hetero_terrain(float3 p, NodeNoiseBasis b rmd = octaves - floor(octaves); if(rmd != 0.0f) { - increment = (noise_basis(p, basis) + offset) * pwr * value; + increment = (snoise(p) + offset) * pwr * value; value += rmd * increment; } @@ -126,7 +126,7 @@ __device_noinline float noise_musgrave_hybrid_multi_fractal(float3 p, NodeNoiseB float pwr = pwHL; int i; - result = noise_basis(p, basis) + offset; + result = snoise(p) + offset; weight = gain * result; p *= lacunarity; @@ -134,7 +134,7 @@ __device_noinline float noise_musgrave_hybrid_multi_fractal(float3 p, NodeNoiseB if(weight > 1.0f) weight = 1.0f; - signal = (noise_basis(p, basis) + offset) * pwr; + signal = (snoise(p) + offset) * pwr; pwr *= pwHL; result += weight * signal; weight *= gain * signal; @@ -143,7 +143,7 @@ __device_noinline float noise_musgrave_hybrid_multi_fractal(float3 p, NodeNoiseB rmd = octaves - floor(octaves); if(rmd != 0.0f) - result += rmd * ((noise_basis(p, basis) + offset) * pwr); + result += rmd * ((snoise(p) + offset) * pwr); return result; } @@ -163,7 +163,7 @@ __device_noinline float noise_musgrave_ridged_multi_fractal(float3 p, NodeNoiseB float pwr = pwHL; int i; - signal = offset - fabsf(noise_basis(p, basis)); + signal = offset - fabsf(snoise(p)); signal *= signal; result = signal; weight = 1.0f; @@ -171,7 +171,7 @@ __device_noinline float noise_musgrave_ridged_multi_fractal(float3 p, NodeNoiseB for(i = 1; i < (int)octaves; i++) { p *= lacunarity; weight = clamp(signal * gain, 0.0f, 1.0f); - signal = offset - fabsf(noise_basis(p, basis)); + signal = offset - fabsf(snoise(p)); signal *= signal; signal *= weight; result += signal * pwr; @@ -183,9 +183,10 @@ __device_noinline float noise_musgrave_ridged_multi_fractal(float3 p, NodeNoiseB /* Shader */ -__device float svm_musgrave(NodeMusgraveType type, NodeNoiseBasis basis, float dimension, float lacunarity, float octaves, float offset, float intensity, float gain, float size, float3 p) +__device float svm_musgrave(NodeMusgraveType type, float dimension, float lacunarity, float octaves, float offset, float intensity, float gain, float scale, float3 p) { - p /= size; + NodeNoiseBasis basis = NODE_NOISE_PERLIN; + p *= scale; if(type == NODE_MUSGRAVE_MULTIFRACTAL) return intensity*noise_musgrave_multi_fractal(p, basis, dimension, lacunarity, octaves); @@ -206,31 +207,33 @@ __device void svm_node_tex_musgrave(KernelGlobals *kg, ShaderData *sd, float *st uint4 node2 = read_node(kg, offset); uint4 node3 = read_node(kg, offset); - uint type, basis, co_offset, fac_offset; - uint dimension_offset, lacunarity_offset, octaves_offset, offset_offset; - uint gain_offset, size_offset; + uint type, co_offset, color_offset, fac_offset; + uint dimension_offset, lacunarity_offset, detail_offset, offset_offset; + uint gain_offset, scale_offset; - decode_node_uchar4(node.y, &type, &basis, &co_offset, &fac_offset); - decode_node_uchar4(node.z, &dimension_offset, &lacunarity_offset, &octaves_offset, &offset_offset); - decode_node_uchar4(node.z, &gain_offset, &size_offset, NULL, NULL); + decode_node_uchar4(node.y, &type, &co_offset, &color_offset, &fac_offset); + decode_node_uchar4(node.z, &dimension_offset, &lacunarity_offset, &detail_offset, &offset_offset); + decode_node_uchar4(node.z, &gain_offset, &scale_offset, NULL, NULL); float3 co = stack_load_float3(stack, co_offset); float dimension = stack_load_float_default(stack, dimension_offset, node2.x); float lacunarity = stack_load_float_default(stack, lacunarity_offset, node2.y); - float octaves = stack_load_float_default(stack, octaves_offset, node2.z); + float detail = stack_load_float_default(stack, detail_offset, node2.z); float foffset = stack_load_float_default(stack, offset_offset, node2.w); float gain = stack_load_float_default(stack, gain_offset, node3.x); - float size = stack_load_float_default(stack, size_offset, node3.y); + float scale = stack_load_float_default(stack, scale_offset, node3.y); - dimension = fmaxf(dimension, 0.0f); - octaves = fmaxf(octaves, 0.0f); + dimension = fmaxf(dimension, 1e-5f); + detail = clamp(detail, 0.0f, 16.0f); lacunarity = fmaxf(lacunarity, 1e-5f); - size = nonzerof(size, 1e-5f); - float f = svm_musgrave((NodeMusgraveType)type, (NodeNoiseBasis)basis, - dimension, lacunarity, octaves, foffset, 1.0f, gain, size, co); + float f = svm_musgrave((NodeMusgraveType)type, + dimension, lacunarity, detail, foffset, 1.0f, gain, scale, co); - stack_store_float(stack, fac_offset, f); + if(stack_valid(fac_offset)) + stack_store_float(stack, fac_offset, f); + if(stack_valid(color_offset)) + stack_store_float3(stack, color_offset, make_float3(f, f, f)); } CCL_NAMESPACE_END diff --git a/intern/cycles/kernel/svm/svm_noisetex.h b/intern/cycles/kernel/svm/svm_noisetex.h index 38b249a80fe..7421597040e 100644 --- a/intern/cycles/kernel/svm/svm_noisetex.h +++ b/intern/cycles/kernel/svm/svm_noisetex.h @@ -18,30 +18,55 @@ CCL_NAMESPACE_BEGIN -__device float svm_noise_texture_value(float3 p) -{ - return cellnoise(p*1e8f); -} +/* Clouds */ -__device float3 svm_noise_texture_color(float3 p) +__device_inline void svm_noise(float3 p, float scale, float detail, float distortion, float *fac, float3 *color) { - return cellnoise_color(p*1e8f); -} + NodeNoiseBasis basis = NODE_NOISE_PERLIN; + int hard = 0; -__device void svm_node_tex_noise_f(ShaderData *sd, float *stack, uint co_offset, uint out_offset) -{ - float3 co = stack_load_float3(stack, co_offset); - float f = svm_noise_texture_value(co); + p *= scale; + + if(distortion != 0.0f) { + float3 r, offset = make_float3(13.5f, 13.5f, 13.5f); + + r.x = noise_basis(p + offset, basis) * distortion; + r.y = noise_basis(p, basis) * distortion; + r.z = noise_basis(p - offset, basis) * distortion; - stack_store_float(stack, out_offset, f); + p += r; + } + + *fac = noise_turbulence(p, basis, detail, hard); + *color = make_float3(*fac, + noise_turbulence(make_float3(p.y, p.x, p.z), basis, detail, hard), + noise_turbulence(make_float3(p.y, p.z, p.x), basis, detail, hard)); } -__device void svm_node_tex_noise_v(ShaderData *sd, float *stack, uint co_offset, uint out_offset) +__device void svm_node_tex_noise(KernelGlobals *kg, ShaderData *sd, float *stack, uint4 node, int *offset) { + uint co_offset, scale_offset, detail_offset, distortion_offset, fac_offset, color_offset; + + decode_node_uchar4(node.y, &co_offset, &scale_offset, &detail_offset, &distortion_offset); + + uint4 node2 = read_node(kg, offset); + + float scale = stack_load_float_default(stack, scale_offset, node2.x); + float detail = stack_load_float_default(stack, detail_offset, node2.y); + float distortion = stack_load_float_default(stack, distortion_offset, node2.z); float3 co = stack_load_float3(stack, co_offset); - float3 f = svm_noise_texture_color(co); - stack_store_float3(stack, out_offset, f); + float3 color; + float f; + + svm_noise(co, scale, detail, distortion, &f, &color); + + decode_node_uchar4(node.z, &color_offset, &fac_offset, NULL, NULL); + + if(stack_valid(fac_offset)) + stack_store_float(stack, fac_offset, f); + if(stack_valid(color_offset)) + stack_store_float3(stack, color_offset, color); } CCL_NAMESPACE_END diff --git a/intern/cycles/kernel/svm/svm_stucci.h b/intern/cycles/kernel/svm/svm_stucci.h deleted file mode 100644 index 89353ab4cd3..00000000000 --- a/intern/cycles/kernel/svm/svm_stucci.h +++ /dev/null @@ -1,63 +0,0 @@ -/* - * Copyright 2011, Blender Foundation. - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; either version 2 - * of the License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software Foundation, - * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - */ - -CCL_NAMESPACE_BEGIN - -/* Stucci */ - -__device_noinline float svm_stucci(NodeStucciType type, NodeNoiseBasis basis, int hard, float turbulence, float size, float3 p) -{ - p /= size; - - float b2 = noise_basis_hard(p, basis, hard); - float ofs = turbulence/200.0f; - - if(type != NODE_STUCCI_PLASTIC) - ofs *= b2*b2; - - float r = noise_basis_hard(make_float3(p.x, p.y, p.z+ofs), basis, hard); - - if(type == NODE_STUCCI_WALL_OUT) - r = 1.0f - r; - - return fmaxf(r, 0.0f); -} - -__device void svm_node_tex_stucci(KernelGlobals *kg, ShaderData *sd, float *stack, uint4 node, int *offset) -{ - uint4 node2 = read_node(kg, offset); - - uint type, basis, hard; - uint size_offset, turbulence_offset, co_offset, fac_offset; - - decode_node_uchar4(node.y, &type, &basis, &hard, NULL); - decode_node_uchar4(node.z, &size_offset, &turbulence_offset, &co_offset, &fac_offset); - - float3 co = stack_load_float3(stack, co_offset); - float size = stack_load_float_default(stack, size_offset, node2.x); - float turbulence = stack_load_float_default(stack, turbulence_offset, node2.y); - size = nonzerof(size, 1e-5f); - - float f = svm_stucci((NodeStucciType)type, (NodeNoiseBasis)basis, hard, - turbulence, size, co); - - stack_store_float(stack, fac_offset, f); -} - -CCL_NAMESPACE_END - diff --git a/intern/cycles/kernel/svm/svm_texture.h b/intern/cycles/kernel/svm/svm_texture.h index e273a92c988..82797018d74 100644 --- a/intern/cycles/kernel/svm/svm_texture.h +++ b/intern/cycles/kernel/svm/svm_texture.h @@ -213,14 +213,17 @@ __device float noise_wave(NodeWaveType wave, float a) /* Turbulence */ -__device_noinline float noise_turbulence(float3 p, NodeNoiseBasis basis, int octaves, int hard) +__device_noinline float noise_turbulence(float3 p, NodeNoiseBasis basis, float octaves, int hard) { float fscale = 1.0f; float amp = 1.0f; float sum = 0.0f; - int i; + int i, n; - for(i = 0; i <= octaves; i++) { + octaves = clamp(octaves, 0.0f, 16.0f); + n= (int)octaves; + + for(i = 0; i <= n; i++) { float t = noise_basis(fscale*p, basis); if(hard) @@ -231,9 +234,25 @@ __device_noinline float noise_turbulence(float3 p, NodeNoiseBasis basis, int oct fscale *= 2.0f; } - sum *= ((float)(1 << octaves)/(float)((1 << (octaves+1)) - 1)); + float rmd = octaves - floor(octaves); + + if(rmd != 0.0f) { + float t = noise_basis(fscale*p, basis); + + if(hard) + t = fabsf(2.0f*t - 1.0f); + + float sum2 = sum + t*amp; + + sum *= ((float)(1 << n)/(float)((1 << (n+1)) - 1)); + sum2 *= ((float)(1 << (n+1))/(float)((1 << (n+2)) - 1)); - return sum; + return (1.0f - rmd)*sum + rmd*sum2; + } + else { + sum *= ((float)(1 << n)/(float)((1 << (n+1)) - 1)); + return sum; + } } CCL_NAMESPACE_END diff --git a/intern/cycles/kernel/svm/svm_types.h b/intern/cycles/kernel/svm/svm_types.h index baec3d7ac6e..89fc413c539 100644 --- a/intern/cycles/kernel/svm/svm_types.h +++ b/intern/cycles/kernel/svm/svm_types.h @@ -44,8 +44,6 @@ typedef enum NodeType { NODE_CLOSURE_WEIGHT = 500, NODE_MIX_CLOSURE = 600, NODE_JUMP = 700, - NODE_TEX_NOISE_F = 800, - NODE_TEX_NOISE_V = 900, NODE_TEX_IMAGE = 1000, NODE_TEX_SKY = 1100, NODE_GEOMETRY = 1200, @@ -57,15 +55,12 @@ typedef enum NodeType { NODE_CONVERT = 1900, NODE_FRESNEL = 2000, NODE_EMISSION_WEIGHT = 2100, - NODE_TEX_BLEND = 2200, + NODE_TEX_GRADIENT = 2200, NODE_TEX_VORONOI = 2300, NODE_TEX_MUSGRAVE = 2400, - NODE_TEX_MARBLE = 2500, + NODE_TEX_WAVE = 2500, NODE_TEX_MAGIC = 2600, - NODE_TEX_STUCCI = 2700, - NODE_TEX_DISTORTED_NOISE = 2800, - NODE_TEX_WOOD = 2900, - NODE_TEX_CLOUDS = 3000, + NODE_TEX_NOISE = 3000, NODE_SHADER_JUMP = 3100, NODE_SET_DISPLACEMENT = 3200, NODE_GEOMETRY_BUMP_DX = 3300, @@ -83,7 +78,7 @@ typedef enum NodeType { NODE_ATTR_BUMP_DY = 4500, NODE_TEX_ENVIRONMENT = 4600, NODE_CLOSURE_HOLDOUT = 4700, - NODE_BLEND_WEIGHT = 4800, + NODE_LAYER_WEIGHT = 4800, NODE_CLOSURE_VOLUME = 4900 } NodeType; @@ -211,10 +206,8 @@ typedef enum NodeMusgraveType { } NodeMusgraveType; typedef enum NodeWoodType { - NODE_WOOD_BANDS, - NODE_WOOD_RINGS, - NODE_WOOD_BAND_NOISE, - NODE_WOOD_RING_NOISE + NODE_WAVE_BANDS, + NODE_WAVE_RINGS } NodeWoodType; typedef enum NodeBlendType { @@ -246,14 +239,12 @@ typedef enum NodeStucciType { typedef enum NodeVoronoiColoring { NODE_VORONOI_INTENSITY, - NODE_VORONOI_POSITION, - NODE_VORONOI_POSITION_OUTLINE, - NODE_VORONOI_POSITION_OUTLINE_INTENSITY + NODE_VORONOI_CELLS } NodeVoronoiColoring; typedef enum NodeBlendWeightType { - NODE_BLEND_WEIGHT_FRESNEL, - NODE_BLEND_WEIGHT_FACING + NODE_LAYER_WEIGHT_FRESNEL, + NODE_LAYER_WEIGHT_FACING } NodeBlendWeightType; typedef enum ShaderType { diff --git a/intern/cycles/kernel/svm/svm_voronoi.h b/intern/cycles/kernel/svm/svm_voronoi.h index 36965959cc2..f5ee7851a51 100644 --- a/intern/cycles/kernel/svm/svm_voronoi.h +++ b/intern/cycles/kernel/svm/svm_voronoi.h @@ -20,50 +20,25 @@ CCL_NAMESPACE_BEGIN /* Voronoi */ -__device_noinline float4 svm_voronoi(NodeDistanceMetric distance_metric, NodeVoronoiColoring coloring, - float weight1, float weight2, float weight3, float weight4, - float exponent, float intensity, float size, float3 p) +__device_noinline float4 svm_voronoi(NodeVoronoiColoring coloring, float scale, float3 p) { - float aw1 = fabsf(weight1); - float aw2 = fabsf(weight2); - float aw3 = fabsf(weight3); - float aw4 = fabsf(weight4); - float sc = (aw1 + aw2 + aw3 + aw4); - - if(sc != 0.0f) - sc = intensity/sc; - /* compute distance and point coordinate of 4 nearest neighbours */ float da[4]; float3 pa[4]; - voronoi(p/size, distance_metric, exponent, da, pa); + voronoi(p*scale, NODE_VORONOI_DISTANCE_SQUARED, 1.0f, da, pa); - /* Scalar output */ - float fac = sc * fabsf(weight1*da[0] + weight2*da[1] + weight3*da[2] + weight4*da[3]); + /* output */ + float fac; float3 color; - /* colored output */ if(coloring == NODE_VORONOI_INTENSITY) { + fac = fabsf(da[0]); color = make_float3(fac, fac, fac); } else { - color = aw1*cellnoise_color(pa[0]); - color += aw2*cellnoise_color(pa[1]); - color += aw3*cellnoise_color(pa[2]); - color += aw4*cellnoise_color(pa[3]); - - if(coloring != NODE_VORONOI_POSITION) { - float t1 = min((da[1] - da[0])*10.0f, 1.0f); - - if(coloring == NODE_VORONOI_POSITION_OUTLINE_INTENSITY) - color *= t1*fac; - else if(coloring == NODE_VORONOI_POSITION_OUTLINE) - color *= t1*sc; - } - else { - color *= sc; - } + color = cellnoise_color(pa[0]); + fac= average(color); } return make_float4(color.x, color.y, color.z, fac); @@ -71,31 +46,15 @@ __device_noinline float4 svm_voronoi(NodeDistanceMetric distance_metric, NodeVor __device void svm_node_tex_voronoi(KernelGlobals *kg, ShaderData *sd, float *stack, uint4 node, int *offset) { - uint4 node2 = read_node(kg, offset); - uint4 node3 = read_node(kg, offset); + uint coloring = node.y; + uint scale_offset, co_offset, fac_offset, color_offset; - uint distance_metric, coloring, exponent_offset; - uint size_offset, co_offset, fac_offset, color_offset; - uint weight1_offset, weight2_offset, weight3_offset, weight4_offset; - - decode_node_uchar4(node.y, &distance_metric, &coloring, &exponent_offset, NULL); - decode_node_uchar4(node.z, &size_offset, &co_offset, &fac_offset, &color_offset); - decode_node_uchar4(node.w, &weight1_offset, &weight2_offset, &weight3_offset, &weight4_offset); + decode_node_uchar4(node.z, &scale_offset, &co_offset, &fac_offset, &color_offset); float3 co = stack_load_float3(stack, co_offset); - float weight1 = stack_load_float_default(stack, weight1_offset, node2.x); - float weight2 = stack_load_float_default(stack, weight2_offset, node2.y); - float weight3 = stack_load_float_default(stack, weight3_offset, node2.z); - float weight4 = stack_load_float_default(stack, weight4_offset, node2.w); - float exponent = stack_load_float_default(stack, exponent_offset, node3.x); - float size = stack_load_float_default(stack, size_offset, node3.y); - - exponent = fmaxf(exponent, 1e-5f); - size = nonzerof(size, 1e-5f); + float scale = stack_load_float_default(stack, scale_offset, node.w); - float4 result = svm_voronoi((NodeDistanceMetric)distance_metric, - (NodeVoronoiColoring)coloring, - weight1, weight2, weight3, weight4, exponent, 1.0f, size, co); + float4 result = svm_voronoi((NodeVoronoiColoring)coloring, scale, co); float3 color = make_float3(result.x, result.y, result.z); float f = result.w; diff --git a/intern/cycles/kernel/svm/svm_wave.h b/intern/cycles/kernel/svm/svm_wave.h new file mode 100644 index 00000000000..8f2131156c4 --- /dev/null +++ b/intern/cycles/kernel/svm/svm_wave.h @@ -0,0 +1,65 @@ +/* + * Copyright 2011, Blender Foundation. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + */ + +CCL_NAMESPACE_BEGIN + +/* Marble */ + +__device_noinline float svm_wave(NodeWoodType type, float3 p, float scale, float detail, float distortion, float dscale) +{ + float w, n; + + p *= scale; + + if(type == NODE_WAVE_BANDS) + n= (p.x + p.x + p.z)*10.0f; + else /* if(type == NODE_WAVE_RINGS) */ + n= len(p)*20.0f; + + if(distortion != 0.0f) + n += distortion * noise_turbulence(p*dscale, NODE_NOISE_PERLIN, detail, 0); + + w = noise_wave(NODE_WAVE_SINE, n); + + return w; +} + +__device void svm_node_tex_wave(KernelGlobals *kg, ShaderData *sd, float *stack, uint4 node, int *offset) +{ + uint4 node2 = read_node(kg, offset); + + uint type; + uint co_offset, scale_offset, detail_offset, dscale_offset, distortion_offset, color_offset, fac_offset; + + decode_node_uchar4(node.y, &type, &color_offset, &fac_offset, &dscale_offset); + decode_node_uchar4(node.z, &co_offset, &scale_offset, &detail_offset, &distortion_offset); + + float3 co = stack_load_float3(stack, co_offset); + float scale = stack_load_float_default(stack, scale_offset, node2.x); + float detail = stack_load_float_default(stack, detail_offset, node2.y); + float distortion = stack_load_float_default(stack, distortion_offset, node2.z); + float dscale = stack_load_float_default(stack, dscale_offset, node2.w); + + float f = svm_wave((NodeWoodType)type, co, scale, detail, distortion, dscale); + + if(stack_valid(fac_offset)) stack_store_float(stack, fac_offset, f); + if(stack_valid(color_offset)) stack_store_float3(stack, color_offset, make_float3(f, f, f)); +} + +CCL_NAMESPACE_END + diff --git a/intern/cycles/kernel/svm/svm_wood.h b/intern/cycles/kernel/svm/svm_wood.h deleted file mode 100644 index 0f22e633766..00000000000 --- a/intern/cycles/kernel/svm/svm_wood.h +++ /dev/null @@ -1,69 +0,0 @@ -/* - * Copyright 2011, Blender Foundation. - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; either version 2 - * of the License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software Foundation, - * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - */ - -CCL_NAMESPACE_BEGIN - -/* Wood */ - -__device_noinline float svm_wood(float3 p, float size, NodeWoodType type, NodeWaveType wave, NodeNoiseBasis basis, uint hard, float turb) -{ - float x = p.x; - float y = p.y; - float z = p.z; - - if(type == NODE_WOOD_BANDS) { - return noise_wave(wave, (x + y + z)*10.0f); - } - else if(type == NODE_WOOD_RINGS) { - return noise_wave(wave, sqrt(x*x + y*y + z*z)*20.0f); - } - else if (type == NODE_WOOD_BAND_NOISE) { - float wi = turb*noise_basis_hard(p/size, basis, hard); - return noise_wave(wave, (x + y + z)*10.0f + wi); - } - else if (type == NODE_WOOD_RING_NOISE) { - float wi = turb*noise_basis_hard(p/size, basis, hard); - return noise_wave(wave, sqrt(x*x + y*y + z*z)*20.0f + wi); - } - - return 0.0f; -} - -__device void svm_node_tex_wood(KernelGlobals *kg, ShaderData *sd, float *stack, uint4 node, int *offset) -{ - uint4 node2 = read_node(kg, offset); - - uint type, wave, basis, hard; - uint co_offset, size_offset, turbulence_offset, fac_offset; - - decode_node_uchar4(node.y, &type, &wave, &basis, &hard); - decode_node_uchar4(node.z, &co_offset, &size_offset, &turbulence_offset, &fac_offset); - - float3 co = stack_load_float3(stack, co_offset); - float size = stack_load_float_default(stack, size_offset, node2.y); - float turbulence = stack_load_float_default(stack, turbulence_offset, node2.z); - size = nonzerof(size, 1e-5f); - - float f = svm_wood(co, size, (NodeWoodType)type, (NodeWaveType)wave, - (NodeNoiseBasis)basis, hard, turbulence); - - stack_store_float(stack, fac_offset, f); -} - -CCL_NAMESPACE_END - |