Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--intern/cycles/kernel/shaders/node_normal_map.osl4
-rw-r--r--intern/cycles/kernel/svm/svm_tex_coord.h23
-rw-r--r--intern/cycles/render/nodes.cpp5
-rw-r--r--source/blender/nodes/shader/nodes/node_shader_bump.c2
-rw-r--r--source/blender/nodes/shader/nodes/node_shader_normal_map.c1
5 files changed, 27 insertions, 8 deletions
diff --git a/intern/cycles/kernel/shaders/node_normal_map.osl b/intern/cycles/kernel/shaders/node_normal_map.osl
index e238313509e..d101ee870b7 100644
--- a/intern/cycles/kernel/shaders/node_normal_map.osl
+++ b/intern/cycles/kernel/shaders/node_normal_map.osl
@@ -20,6 +20,7 @@
shader node_normal_map(
normal NormalIn = N,
+ float Strength = 1.0,
color Color = color(0.5, 0.5, 1.0),
string space = "Tangent",
string attr_name = "geom:tangent",
@@ -44,5 +45,8 @@ shader node_normal_map(
Normal = normalize(transform("object", "world", vector(mcolor)));
else if (space == "World")
Normal = normalize(vector(mcolor));
+
+ if (Strength != 1.0)
+ Normal = normalize(NormalIn + (Normal - NormalIn)*max(Strength, 0.0));
}
diff --git a/intern/cycles/kernel/svm/svm_tex_coord.h b/intern/cycles/kernel/svm/svm_tex_coord.h
index a9449c0ded9..8ca7dff3970 100644
--- a/intern/cycles/kernel/svm/svm_tex_coord.h
+++ b/intern/cycles/kernel/svm/svm_tex_coord.h
@@ -227,12 +227,14 @@ __device void svm_node_tex_coord_bump_dy(KernelGlobals *kg, ShaderData *sd, floa
__device void svm_node_normal_map(KernelGlobals *kg, ShaderData *sd, float *stack, uint4 node)
{
- uint color_offset, normal_offset, space;
- decode_node_uchar4(node.y, &color_offset, &normal_offset, &space, NULL);
+ uint color_offset, strength_offset, normal_offset, space;
+ decode_node_uchar4(node.y, &color_offset, &strength_offset, &normal_offset, &space);
float3 color = stack_load_float3(stack, color_offset);
color = 2.0f*make_float3(color.x - 0.5f, color.y - 0.5f, color.z - 0.5f);
+ float3 N;
+
if(space == NODE_NORMAL_MAP_TANGENT) {
/* tangent space */
if(sd->object == ~0) {
@@ -257,19 +259,26 @@ __device void svm_node_normal_map(KernelGlobals *kg, ShaderData *sd, float *stac
tangent = cross(sd->N, normalize(cross(tangent, sd->N)));;
float3 B = sign * cross(sd->N, tangent);
- float3 N = color.x * tangent + color.y * B + color.z * sd->N;
-
- stack_store_float3(stack, normal_offset, normalize(N));
+ N = normalize(color.x * tangent + color.y * B + color.z * sd->N);
}
else {
/* object, world space */
- float3 N = color;
+ N = color;
if(space == NODE_NORMAL_MAP_OBJECT)
object_normal_transform(kg, sd, &N);
- stack_store_float3(stack, normal_offset, normalize(N));
+ N = normalize(N);
+ }
+
+ float strength = stack_load_float(stack, strength_offset);
+
+ if(strength != 1.0f) {
+ strength = max(strength, 0.0f);
+ N = normalize(sd->N + (N - sd->N)*strength);
}
+
+ stack_store_float3(stack, normal_offset, normalize(N));
}
__device void svm_node_tangent(KernelGlobals *kg, ShaderData *sd, float *stack, uint4 node)
diff --git a/intern/cycles/render/nodes.cpp b/intern/cycles/render/nodes.cpp
index 4f50de11edf..82afab4dc1a 100644
--- a/intern/cycles/render/nodes.cpp
+++ b/intern/cycles/render/nodes.cpp
@@ -3032,7 +3032,9 @@ NormalMapNode::NormalMapNode()
attribute = ustring("");
add_input("NormalIn", SHADER_SOCKET_NORMAL, ShaderInput::NORMAL, true);
+ add_input("Strength", SHADER_SOCKET_FLOAT, 1.0f);
add_input("Color", SHADER_SOCKET_COLOR);
+
add_output("Normal", SHADER_SOCKET_NORMAL);
}
@@ -3055,6 +3057,7 @@ void NormalMapNode::attributes(AttributeRequestSet *attributes)
void NormalMapNode::compile(SVMCompiler& compiler)
{
ShaderInput *color_in = input("Color");
+ ShaderInput *strength_in = input("Strength");
ShaderOutput *normal_out = output("Normal");
int attr = 0, attr_sign = 0;
@@ -3070,11 +3073,13 @@ void NormalMapNode::compile(SVMCompiler& compiler)
}
compiler.stack_assign(color_in);
+ compiler.stack_assign(strength_in);
compiler.stack_assign(normal_out);
compiler.add_node(NODE_NORMAL_MAP,
compiler.encode_uchar4(
color_in->stack_offset,
+ strength_in->stack_offset,
normal_out->stack_offset,
space_enum[space]),
attr, attr_sign);
diff --git a/source/blender/nodes/shader/nodes/node_shader_bump.c b/source/blender/nodes/shader/nodes/node_shader_bump.c
index 24ed825c36e..b0605f9b248 100644
--- a/source/blender/nodes/shader/nodes/node_shader_bump.c
+++ b/source/blender/nodes/shader/nodes/node_shader_bump.c
@@ -36,7 +36,7 @@
/* **************** BUMP ******************** */
static bNodeSocketTemplate sh_node_bump_in[] = {
- { SOCK_FLOAT, 1, "Strength", 0.1f, 0.0f, 0.0f, 0.0f, -1000.0f, 1000.0f},
+ { SOCK_FLOAT, 1, "Strength", 0.1f, 0.0f, 0.0f, 0.0f, 0.0f, 10.0f},
{ SOCK_FLOAT, 1, "Height", 1.0f, 1.0f, 1.0f, 1.0f, -1000.0f, 1000.0f, PROP_NONE, SOCK_HIDE_VALUE},
{ -1, 0, "" }
};
diff --git a/source/blender/nodes/shader/nodes/node_shader_normal_map.c b/source/blender/nodes/shader/nodes/node_shader_normal_map.c
index 39fd8a5decc..ee83699abdb 100644
--- a/source/blender/nodes/shader/nodes/node_shader_normal_map.c
+++ b/source/blender/nodes/shader/nodes/node_shader_normal_map.c
@@ -30,6 +30,7 @@
/* **************** OUTPUT ******************** */
static bNodeSocketTemplate sh_node_normal_map_in[] = {
+ { SOCK_FLOAT, 1, N_("Strength"), 1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 10.0f},
{ SOCK_RGBA, 0, N_("Color"), 0.5f, 0.5f, 1.0f, 1.0f, 0.0f, 1.0f},
{ -1, 0, "" }
};