forked from bartvdbraak/blender
Cycles: add strength input for normal map node.
This commit is contained in:
parent
4063db3f61
commit
e73408f247
@ -20,6 +20,7 @@
|
|||||||
|
|
||||||
shader node_normal_map(
|
shader node_normal_map(
|
||||||
normal NormalIn = N,
|
normal NormalIn = N,
|
||||||
|
float Strength = 1.0,
|
||||||
color Color = color(0.5, 0.5, 1.0),
|
color Color = color(0.5, 0.5, 1.0),
|
||||||
string space = "Tangent",
|
string space = "Tangent",
|
||||||
string attr_name = "geom:tangent",
|
string attr_name = "geom:tangent",
|
||||||
@ -44,5 +45,8 @@ shader node_normal_map(
|
|||||||
Normal = normalize(transform("object", "world", vector(mcolor)));
|
Normal = normalize(transform("object", "world", vector(mcolor)));
|
||||||
else if (space == "World")
|
else if (space == "World")
|
||||||
Normal = normalize(vector(mcolor));
|
Normal = normalize(vector(mcolor));
|
||||||
|
|
||||||
|
if (Strength != 1.0)
|
||||||
|
Normal = normalize(NormalIn + (Normal - NormalIn)*max(Strength, 0.0));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -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)
|
__device void svm_node_normal_map(KernelGlobals *kg, ShaderData *sd, float *stack, uint4 node)
|
||||||
{
|
{
|
||||||
uint color_offset, normal_offset, space;
|
uint color_offset, strength_offset, normal_offset, space;
|
||||||
decode_node_uchar4(node.y, &color_offset, &normal_offset, &space, NULL);
|
decode_node_uchar4(node.y, &color_offset, &strength_offset, &normal_offset, &space);
|
||||||
|
|
||||||
float3 color = stack_load_float3(stack, color_offset);
|
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);
|
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) {
|
if(space == NODE_NORMAL_MAP_TANGENT) {
|
||||||
/* tangent space */
|
/* tangent space */
|
||||||
if(sd->object == ~0) {
|
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)));;
|
tangent = cross(sd->N, normalize(cross(tangent, sd->N)));;
|
||||||
|
|
||||||
float3 B = sign * cross(sd->N, tangent);
|
float3 B = sign * cross(sd->N, tangent);
|
||||||
float3 N = color.x * tangent + color.y * B + color.z * sd->N;
|
N = normalize(color.x * tangent + color.y * B + color.z * sd->N);
|
||||||
|
|
||||||
stack_store_float3(stack, normal_offset, normalize(N));
|
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
/* object, world space */
|
/* object, world space */
|
||||||
float3 N = color;
|
N = color;
|
||||||
|
|
||||||
if(space == NODE_NORMAL_MAP_OBJECT)
|
if(space == NODE_NORMAL_MAP_OBJECT)
|
||||||
object_normal_transform(kg, sd, &N);
|
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)
|
__device void svm_node_tangent(KernelGlobals *kg, ShaderData *sd, float *stack, uint4 node)
|
||||||
|
@ -3032,7 +3032,9 @@ NormalMapNode::NormalMapNode()
|
|||||||
attribute = ustring("");
|
attribute = ustring("");
|
||||||
|
|
||||||
add_input("NormalIn", SHADER_SOCKET_NORMAL, ShaderInput::NORMAL, true);
|
add_input("NormalIn", SHADER_SOCKET_NORMAL, ShaderInput::NORMAL, true);
|
||||||
|
add_input("Strength", SHADER_SOCKET_FLOAT, 1.0f);
|
||||||
add_input("Color", SHADER_SOCKET_COLOR);
|
add_input("Color", SHADER_SOCKET_COLOR);
|
||||||
|
|
||||||
add_output("Normal", SHADER_SOCKET_NORMAL);
|
add_output("Normal", SHADER_SOCKET_NORMAL);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -3055,6 +3057,7 @@ void NormalMapNode::attributes(AttributeRequestSet *attributes)
|
|||||||
void NormalMapNode::compile(SVMCompiler& compiler)
|
void NormalMapNode::compile(SVMCompiler& compiler)
|
||||||
{
|
{
|
||||||
ShaderInput *color_in = input("Color");
|
ShaderInput *color_in = input("Color");
|
||||||
|
ShaderInput *strength_in = input("Strength");
|
||||||
ShaderOutput *normal_out = output("Normal");
|
ShaderOutput *normal_out = output("Normal");
|
||||||
int attr = 0, attr_sign = 0;
|
int attr = 0, attr_sign = 0;
|
||||||
|
|
||||||
@ -3070,11 +3073,13 @@ void NormalMapNode::compile(SVMCompiler& compiler)
|
|||||||
}
|
}
|
||||||
|
|
||||||
compiler.stack_assign(color_in);
|
compiler.stack_assign(color_in);
|
||||||
|
compiler.stack_assign(strength_in);
|
||||||
compiler.stack_assign(normal_out);
|
compiler.stack_assign(normal_out);
|
||||||
|
|
||||||
compiler.add_node(NODE_NORMAL_MAP,
|
compiler.add_node(NODE_NORMAL_MAP,
|
||||||
compiler.encode_uchar4(
|
compiler.encode_uchar4(
|
||||||
color_in->stack_offset,
|
color_in->stack_offset,
|
||||||
|
strength_in->stack_offset,
|
||||||
normal_out->stack_offset,
|
normal_out->stack_offset,
|
||||||
space_enum[space]),
|
space_enum[space]),
|
||||||
attr, attr_sign);
|
attr, attr_sign);
|
||||||
|
@ -36,7 +36,7 @@
|
|||||||
|
|
||||||
/* **************** BUMP ******************** */
|
/* **************** BUMP ******************** */
|
||||||
static bNodeSocketTemplate sh_node_bump_in[] = {
|
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},
|
{ SOCK_FLOAT, 1, "Height", 1.0f, 1.0f, 1.0f, 1.0f, -1000.0f, 1000.0f, PROP_NONE, SOCK_HIDE_VALUE},
|
||||||
{ -1, 0, "" }
|
{ -1, 0, "" }
|
||||||
};
|
};
|
||||||
|
@ -30,6 +30,7 @@
|
|||||||
/* **************** OUTPUT ******************** */
|
/* **************** OUTPUT ******************** */
|
||||||
|
|
||||||
static bNodeSocketTemplate sh_node_normal_map_in[] = {
|
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},
|
{ SOCK_RGBA, 0, N_("Color"), 0.5f, 0.5f, 1.0f, 1.0f, 0.0f, 1.0f},
|
||||||
{ -1, 0, "" }
|
{ -1, 0, "" }
|
||||||
};
|
};
|
||||||
|
Loading…
Reference in New Issue
Block a user