diff options
author | Brecht Van Lommel <brechtvanlommel@pandora.be> | 2013-09-04 02:39:17 +0400 |
---|---|---|
committer | Brecht Van Lommel <brechtvanlommel@pandora.be> | 2013-09-04 02:39:17 +0400 |
commit | b314209356288c3768faa1d7fbd7b1bf9d179a7a (patch) | |
tree | 2fafde8bdccff99e294acb34dbca90605e2e5327 /source/blender/nodes | |
parent | 9467d9940583d6c3a2e1b83f854453da9e64fdd7 (diff) |
Cycles: add a sharpness input to the Cubic SSS falloff. When set to 1 this will
give a result more similar to the Compatible falloff option. The scale is x2
though to keep the perceived scatter radius roughly the same while changing the
sharpness. Difference with compatible will be mainly on non-flat geometry.
Diffstat (limited to 'source/blender/nodes')
-rw-r--r-- | source/blender/nodes/shader/nodes/node_shader_subsurface_scattering.c | 36 |
1 files changed, 34 insertions, 2 deletions
diff --git a/source/blender/nodes/shader/nodes/node_shader_subsurface_scattering.c b/source/blender/nodes/shader/nodes/node_shader_subsurface_scattering.c index 8ad529d192e..fd864f1c7c6 100644 --- a/source/blender/nodes/shader/nodes/node_shader_subsurface_scattering.c +++ b/source/blender/nodes/shader/nodes/node_shader_subsurface_scattering.c @@ -33,7 +33,8 @@ static bNodeSocketTemplate sh_node_subsurface_scattering_in[] = { { SOCK_RGBA, 1, N_("Color"), 0.8f, 0.8f, 0.8f, 1.0f, 0.0f, 1.0f}, { SOCK_FLOAT, 1, N_("Scale"), 1.0, 0.0f, 0.0f, 0.0f, 0.0f, 1000.0f}, { SOCK_VECTOR, 1, N_("Radius"), 1.0f, 1.0f, 1.0f, 0.0f, 0.0f, 100.0f}, - { SOCK_FLOAT, 1, N_("Texture Blur"), 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f}, + { SOCK_FLOAT, 1, N_("Sharpness"), 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f, PROP_FACTOR}, + { SOCK_FLOAT, 1, N_("Texture Blur"), 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f, PROP_FACTOR}, { SOCK_VECTOR, 1, N_("Normal"), 0.0f, 0.0f, 0.0f, 1.0f, -1.0f, 1.0f, PROP_NONE, SOCK_HIDE_VALUE}, { -1, 0, "" } }; @@ -43,6 +44,20 @@ static bNodeSocketTemplate sh_node_subsurface_scattering_out[] = { { -1, 0, "" } }; +static void node_shader_init_subsurface_scattering(bNodeTree *UNUSED(ntree), bNode *node) +{ + /*bNodeSocket *sock;*/ + + node->custom1 = SHD_SUBSURFACE_CUBIC; + + /*for (sock = node->inputs.first; sock; sock = sock->next) { + if (strcmp(sock->name, "Sharpness") == 0) { + bNodeSocketValueFloat *dval = sock->default_value; + dval->value = 0.0f; + } + }*/ +} + static int node_shader_gpu_subsurface_scattering(GPUMaterial *mat, bNode *UNUSED(node), bNodeExecData *UNUSED(execdata), GPUNodeStack *in, GPUNodeStack *out) { if (!in[1].link) @@ -51,6 +66,22 @@ static int node_shader_gpu_subsurface_scattering(GPUMaterial *mat, bNode *UNUSED return GPU_stack_link(mat, "node_subsurface_scattering", in, out); } +static void node_shader_update_subsurface_scattering(bNodeTree *UNUSED(ntree), bNode *node) +{ + bNodeSocket *sock; + int falloff = node->custom1; + + for (sock = node->inputs.first; sock; sock = sock->next) { + if (strcmp(sock->name, "Sharpness") == 0) { + if (falloff == SHD_SUBSURFACE_CUBIC) + sock->flag &= ~SOCK_UNAVAIL; + else + sock->flag |= SOCK_UNAVAIL; + + } + } +} + /* node type definition */ void register_node_type_sh_subsurface_scattering(void) { @@ -60,9 +91,10 @@ void register_node_type_sh_subsurface_scattering(void) node_type_compatibility(&ntype, NODE_NEW_SHADING); node_type_socket_templates(&ntype, sh_node_subsurface_scattering_in, sh_node_subsurface_scattering_out); node_type_size_preset(&ntype, NODE_SIZE_MIDDLE); - node_type_init(&ntype, NULL); + node_type_init(&ntype, node_shader_init_subsurface_scattering); node_type_storage(&ntype, "", NULL, NULL); node_type_gpu(&ntype, node_shader_gpu_subsurface_scattering); + node_type_update(&ntype, node_shader_update_subsurface_scattering, NULL); nodeRegisterType(&ntype); } |