diff options
Diffstat (limited to 'source/blender/nodes/shader/nodes/node_shader_tex_noise.c')
-rw-r--r-- | source/blender/nodes/shader/nodes/node_shader_tex_noise.c | 56 |
1 files changed, 41 insertions, 15 deletions
diff --git a/source/blender/nodes/shader/nodes/node_shader_tex_noise.c b/source/blender/nodes/shader/nodes/node_shader_tex_noise.c index e8fb4737305..8cde640f8b2 100644 --- a/source/blender/nodes/shader/nodes/node_shader_tex_noise.c +++ b/source/blender/nodes/shader/nodes/node_shader_tex_noise.c @@ -30,26 +30,49 @@ #include "../node_shader_util.h" #include "node_shader_noise.h" -static float noise_texture_value(float vec[3]) +static float noise_texture(float scale, float detail, float distortion, float vec[3], float color[3]) { - float p[3]; + float p[3], pg[3], pb[3]; + int basis= SHD_NOISE_PERLIN; - mul_v3_v3fl(p, vec, 1e8f); - return cellnoise(p); -} + mul_v3_v3fl(p, vec, scale); -static void noise_texture_color(float rgb[3], float vec[3]) -{ - float p[3]; + if(distortion != 0.0f) { + float r[3], p_offset[3], p_noffset[3]; + float offset[3] = {13.5f, 13.5f, 13.5f}; + + add_v3_v3v3(p_offset, p, offset); + sub_v3_v3v3(p_noffset, p, offset); + + r[0] = noise_basis(p_offset, basis) * distortion; + r[1] = noise_basis(p, basis) * distortion; + r[2] = noise_basis(p_noffset, basis) * distortion; + + add_v3_v3(p, r); + } - mul_v3_v3fl(p, vec, 1e8f); - cellnoise_color(rgb, p); + pg[0]= p[1]; + pg[1]= p[0]; + pg[2]= p[2]; + + pb[0]= p[1]; + pb[1]= p[2]; + pb[2]= p[0]; + + color[0]= noise_turbulence(p, basis, detail, 0); + color[1]= noise_turbulence(pg, basis, detail, 0); + color[2]= noise_turbulence(pb, basis, detail, 0); + + return color[0]; } /* **************** NOISE ******************** */ static bNodeSocketTemplate sh_node_tex_noise_in[]= { - { SOCK_VECTOR, 1, "Vector", 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f, PROP_NONE, SOCK_HIDE_VALUE}, + { SOCK_VECTOR, 1, "Vector", 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f, PROP_NONE, SOCK_HIDE_VALUE}, + { SOCK_FLOAT, 1, "Scale", 5.0f, 0.0f, 0.0f, 0.0f, -1000.0f, 1000.0f}, + { SOCK_FLOAT, 1, "Detail", 2.0f, 0.0f, 0.0f, 0.0f, 0.0f, 16.0f}, + { SOCK_FLOAT, 1, "Distortion", 0.0f, 0.0f, 0.0f, 0.0f, -1000.0f, 1000.0f}, { -1, 0, "" } }; @@ -72,15 +95,18 @@ static void node_shader_exec_tex_noise(void *data, bNode *node, bNodeStack **in, { ShaderCallData *scd= (ShaderCallData*)data; bNodeSocket *vecsock = node->inputs.first; - float vec[3]; + float vec[3], scale, detail, distortion; if(vecsock->link) nodestack_get_vec(vec, SOCK_VECTOR, in[0]); else copy_v3_v3(vec, scd->co); - noise_texture_color(out[0]->vec, vec); - out[1]->vec[0]= noise_texture_value(vec); + nodestack_get_vec(&scale, SOCK_FLOAT, in[1]); + nodestack_get_vec(&detail, SOCK_FLOAT, in[2]); + nodestack_get_vec(&distortion, SOCK_FLOAT, in[3]); + + out[1]->vec[0]= noise_texture(scale, detail, distortion, vec, out[0]->vec); } static int node_shader_gpu_tex_noise(GPUMaterial *mat, bNode *node, GPUNodeStack *in, GPUNodeStack *out) @@ -103,7 +129,7 @@ void register_node_type_sh_tex_noise(ListBase *lb) node_type_socket_templates(&ntype, sh_node_tex_noise_in, sh_node_tex_noise_out); node_type_size(&ntype, 150, 60, 200); node_type_init(&ntype, node_shader_init_tex_noise); - node_type_storage(&ntype, "", NULL, NULL); + node_type_storage(&ntype, "NodeTexNoise", node_free_standard_storage, node_copy_standard_storage); node_type_exec(&ntype, node_shader_exec_tex_noise); node_type_gpu(&ntype, node_shader_gpu_tex_noise); |