diff options
author | OmarSquircleArt <omar.squircleart@gmail.com> | 2019-09-04 18:54:32 +0300 |
---|---|---|
committer | OmarSquircleArt <omar.squircleart@gmail.com> | 2019-09-04 18:54:32 +0300 |
commit | 23564583a4988778b4c43496fd21818b286f6ba1 (patch) | |
tree | 3dc149c4e5c26ea2aac460ed582cb31def988470 /source/blender/nodes | |
parent | 45d4c925799e94c6d442a9a9066af2d3305724e1 (diff) |
Shading: Extend Noise node to other dimenstions.
This patch extends perlin noise to operate in 1D, 2D, 3D, and 4D
space. The noise code has also been refactored to be more readable.
The Color output and distortion patterns changed, so this patch
breaks backward compatibility. This is due to the fact that we
now use random offsets as noise seeds, as opposed to swizzling
and constants offsets.
Reviewers: brecht, JacquesLucke
Differential Revision: https://developer.blender.org/D5560
Diffstat (limited to 'source/blender/nodes')
-rw-r--r-- | source/blender/nodes/shader/nodes/node_shader_tex_noise.c | 36 |
1 files changed, 28 insertions, 8 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 34c4b17f255..8c35591d112 100644 --- a/source/blender/nodes/shader/nodes/node_shader_tex_noise.c +++ b/source/blender/nodes/shader/nodes/node_shader_tex_noise.c @@ -23,6 +23,7 @@ static bNodeSocketTemplate sh_node_tex_noise_in[] = { {SOCK_VECTOR, 1, N_("Vector"), 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f, PROP_NONE, SOCK_HIDE_VALUE}, + {SOCK_FLOAT, 1, N_("W"), 0.0f, 0.0f, 0.0f, 0.0f, -1000.0f, 1000.0f}, {SOCK_FLOAT, 1, N_("Scale"), 5.0f, 0.0f, 0.0f, 0.0f, -1000.0f, 1000.0f}, {SOCK_FLOAT, 1, N_("Detail"), 2.0f, 0.0f, 0.0f, 0.0f, 0.0f, 16.0f}, {SOCK_FLOAT, 1, N_("Distortion"), 0.0f, 0.0f, 0.0f, 0.0f, -1000.0f, 1000.0f}, @@ -30,27 +31,27 @@ static bNodeSocketTemplate sh_node_tex_noise_in[] = { }; static bNodeSocketTemplate sh_node_tex_noise_out[] = { - {SOCK_RGBA, + {SOCK_FLOAT, 0, - N_("Color"), + N_("Fac"), 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f, - PROP_NONE, + PROP_FACTOR, SOCK_NO_INTERNAL_LINK}, - {SOCK_FLOAT, + {SOCK_RGBA, 0, - N_("Fac"), + N_("Color"), 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f, - PROP_FACTOR, + PROP_NONE, SOCK_NO_INTERNAL_LINK}, {-1, 0, ""}, }; @@ -60,6 +61,7 @@ static void node_shader_init_tex_noise(bNodeTree *UNUSED(ntree), bNode *node) NodeTexNoise *tex = MEM_callocN(sizeof(NodeTexNoise), "NodeTexNoise"); BKE_texture_mapping_default(&tex->base.tex_mapping, TEXMAP_TYPE_POINT); BKE_texture_colormapping_default(&tex->base.color_mapping); + tex->dimensions = 3; node->storage = tex; } @@ -74,10 +76,27 @@ static int node_shader_gpu_tex_noise(GPUMaterial *mat, in[0].link = GPU_attribute(CD_ORCO, ""); GPU_link(mat, "generated_texco", GPU_builtin(GPU_VIEW_POSITION), in[0].link, &in[0].link); } - node_shader_gpu_tex_mapping(mat, node, in, out); - return GPU_stack_link(mat, node, "node_tex_noise", in, out); + NodeTexNoise *tex = (NodeTexNoise *)node->storage; + static const char *names[] = { + "", + "node_noise_texture_1d", + "node_noise_texture_2d", + "node_noise_texture_3d", + "node_noise_texture_4d", + }; + return GPU_stack_link(mat, node, names[tex->dimensions], in, out); +} + +static void node_shader_update_tex_noise(bNodeTree *UNUSED(ntree), bNode *node) +{ + bNodeSocket *sockVector = nodeFindSocket(node, SOCK_IN, "Vector"); + bNodeSocket *sockW = nodeFindSocket(node, SOCK_IN, "W"); + + NodeTexNoise *tex = (NodeTexNoise *)node->storage; + nodeSetSocketAvailability(sockVector, tex->dimensions != 1); + nodeSetSocketAvailability(sockW, tex->dimensions == 1 || tex->dimensions == 4); } /* node type definition */ @@ -91,6 +110,7 @@ void register_node_type_sh_tex_noise(void) node_type_storage( &ntype, "NodeTexNoise", node_free_standard_storage, node_copy_standard_storage); node_type_gpu(&ntype, node_shader_gpu_tex_noise); + node_type_update(&ntype, node_shader_update_tex_noise); nodeRegisterType(&ntype); } |