Cycles: bump node changes to add a Distance input that controls the overall displacement

distance, and an Invert option to invert the bump effect.
This commit is contained in:
Brecht Van Lommel 2013-05-10 16:57:17 +00:00
parent 2f9f3dd590
commit eaa6479ae3
10 changed files with 58 additions and 15 deletions

@ -394,7 +394,10 @@ static ShaderNode *add_node(Scene *scene, BL::BlendData b_data, BL::Scene b_scen
node = new HairInfoNode();
}
else if (b_node.is_a(&RNA_ShaderNodeBump)) {
node = new BumpNode();
BL::ShaderNodeBump b_bump_node(b_node);
BumpNode *bump = new BumpNode();
bump->invert = b_bump_node.invert();
node = bump;
}
else if (b_node.is_a(&RNA_ShaderNodeScript)) {
#ifdef WITH_OSL

@ -22,8 +22,10 @@
* Morten S. Mikkelsen, 2010 */
surface node_bump(
int invert = 0,
normal NormalIn = N,
float Strength = 0.0,
float Strength = 0.1,
float Distance = 1.0,
float SampleCenter = 0.0,
float SampleX = 0.0,
float SampleY = 0.0,
@ -42,10 +44,14 @@ surface node_bump(
float absdet = fabs(det);
float strength = clamp(Strength, 0.0, 1.0);
float strength = max(Strength, 0.0);
float dist = Distance;
if (invert)
dist *= -1.0;
/* compute and output perturbed normal */
NormalOut = normalize(absdet * NormalIn - sign(det) * surfgrad);
NormalOut = normalize(absdet * NormalIn - dist * sign(det) * surfgrad);
NormalOut = normalize(strength*NormalOut + (1.0 - strength)*NormalIn);
}

@ -24,7 +24,10 @@ __device void svm_node_set_bump(KernelGlobals *kg, ShaderData *sd, float *stack,
{
#ifdef __RAY_DIFFERENTIALS__
/* get normal input */
float3 normal_in = stack_valid(node.y)? stack_load_float3(stack, node.y): sd->N;
uint normal_offset, distance_offset, invert;
decode_node_uchar4(node.y, &normal_offset, &distance_offset, &invert, NULL);
float3 normal_in = stack_valid(normal_offset)? stack_load_float3(stack, normal_offset): sd->N;
/* get surface tangents from normal */
float3 Rx = cross(sd->dP.dy, normal_in);
@ -45,10 +48,15 @@ __device void svm_node_set_bump(KernelGlobals *kg, ShaderData *sd, float *stack,
float absdet = fabsf(det);
float strength = stack_load_float(stack, strength_offset);
strength = clamp(strength, 0.0f, 1.0f);
float distance = stack_load_float(stack, distance_offset);
if(invert)
distance *= -1.0f;
strength = max(strength, 0.0f);
/* compute and output perturbed normal */
float3 normal_out = normalize(absdet*normal_in - signf(det)*surfgrad);
float3 normal_out = normalize(absdet*normal_in - distance*signf(det)*surfgrad);
normal_out = normalize(strength*normal_out + (1.0f - strength)*normal_in);
stack_store_float3(stack, node.w, normal_out);
#endif

@ -3047,6 +3047,8 @@ void VectorMathNode::compile(OSLCompiler& compiler)
BumpNode::BumpNode()
: ShaderNode("bump")
{
invert = false;
/* this input is used by the user, but after graph transform it is no longer
* used and moved to sampler center/x/y instead */
add_input("Height", SHADER_SOCKET_FLOAT);
@ -3055,7 +3057,8 @@ BumpNode::BumpNode()
add_input("SampleX", SHADER_SOCKET_FLOAT);
add_input("SampleY", SHADER_SOCKET_FLOAT);
add_input("Normal", SHADER_SOCKET_NORMAL, ShaderInput::NORMAL);
add_input("Strength", SHADER_SOCKET_FLOAT, 0.1f);
add_input("Strength", SHADER_SOCKET_FLOAT, 1.0f);
add_input("Distance", SHADER_SOCKET_FLOAT, 0.1f);
add_output("Normal", SHADER_SOCKET_NORMAL);
}
@ -3066,13 +3069,15 @@ void BumpNode::compile(SVMCompiler& compiler)
ShaderInput *dx_in = input("SampleX");
ShaderInput *dy_in = input("SampleY");
ShaderInput *normal_in = input("Normal");
ShaderInput *intensity_in = input("Strength");
ShaderInput *strength_in = input("Strength");
ShaderInput *distance_in = input("Distance");
ShaderOutput *normal_out = output("Normal");
compiler.stack_assign(center_in);
compiler.stack_assign(dx_in);
compiler.stack_assign(dy_in);
compiler.stack_assign(intensity_in);
compiler.stack_assign(strength_in);
compiler.stack_assign(distance_in);
compiler.stack_assign(normal_out);
if(normal_in->link)
@ -3080,14 +3085,15 @@ void BumpNode::compile(SVMCompiler& compiler)
/* pack all parameters in the node */
compiler.add_node(NODE_SET_BUMP,
normal_in->stack_offset,
compiler.encode_uchar4(normal_in->stack_offset, distance_in->stack_offset, invert),
compiler.encode_uchar4(center_in->stack_offset, dx_in->stack_offset,
dy_in->stack_offset, intensity_in->stack_offset),
dy_in->stack_offset, strength_in->stack_offset),
normal_out->stack_offset);
}
void BumpNode::compile(OSLCompiler& compiler)
{
compiler.parameter("invert", invert);
compiler.add(this, "node_bump");
}

@ -470,6 +470,7 @@ public:
class BumpNode : public ShaderNode {
public:
SHADER_NODE_CLASS(BumpNode)
bool invert;
};
class RGBCurvesNode : public ShaderNode {

@ -839,6 +839,11 @@ static void node_shader_buts_tex_coord(uiLayout *layout, bContext *UNUSED(C), Po
uiItemR(layout, ptr, "from_dupli", 0, NULL, 0);
}
static void node_shader_buts_bump(uiLayout *layout, bContext *UNUSED(C), PointerRNA *ptr)
{
uiItemR(layout, ptr, "invert", 0, NULL, 0);
}
static void node_shader_buts_normal_map(uiLayout *layout, bContext *C, PointerRNA *ptr)
{
uiItemR(layout, ptr, "space", 0, "", 0);
@ -990,6 +995,9 @@ static void node_shader_set_butfunc(bNodeType *ntype)
case SH_NODE_TEX_COORD:
ntype->uifunc = node_shader_buts_tex_coord;
break;
case SH_NODE_BUMP:
ntype->uifunc = node_shader_buts_bump;
break;
case SH_NODE_NORMAL_MAP:
ntype->uifunc = node_shader_buts_normal_map;
break;

@ -2260,7 +2260,7 @@ void node_object_info(out vec3 location, out float object_index, out float mater
random = 0.0;
}
void node_bump(float strength, float height, vec3 N, out vec3 result)
void node_bump(float strength, float dist, float height, vec3 N, out vec3 result)
{
result = N;
}

@ -3416,6 +3416,16 @@ static void def_glossy(StructRNA *srna)
RNA_def_property_update(prop, NC_NODE | NA_EDITED, "rna_Node_update");
}
static void def_sh_bump(StructRNA *srna)
{
PropertyRNA *prop;
prop = RNA_def_property(srna, "invert", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "custom1", 1);
RNA_def_property_ui_text(prop, "Invert", "Invert the bump mapping direction to push into the surface instead of out");
RNA_def_property_update(prop, NC_NODE | NA_EDITED, "rna_Node_update");
}
static void def_sh_normal_map(StructRNA *srna)
{
static EnumPropertyItem prop_space_items[] = {

@ -94,7 +94,7 @@ DefNode( ShaderNode, SH_NODE_LIGHT_FALLOFF, 0, "LI
DefNode( ShaderNode, SH_NODE_OBJECT_INFO, 0, "OBJECT_INFO", ObjectInfo, "Object Info", "" )
DefNode( ShaderNode, SH_NODE_PARTICLE_INFO, 0, "PARTICLE_INFO", ParticleInfo, "Particle Info", "" )
DefNode( ShaderNode, SH_NODE_HAIR_INFO, 0, "HAIR_INFO", HairInfo, "Hair Info", "" )
DefNode( ShaderNode, SH_NODE_BUMP, 0, "BUMP", Bump, "Bump", "" )
DefNode( ShaderNode, SH_NODE_BUMP, def_sh_bump, "BUMP", Bump, "Bump", "" )
DefNode( ShaderNode, SH_NODE_NORMAL_MAP, def_sh_normal_map, "NORMAL_MAP", NormalMap, "Normal Map", "" )
DefNode( ShaderNode, SH_NODE_TANGENT, def_sh_tangent, "TANGENT", Tangent, "Tangent", "" )
DefNode( ShaderNode, SH_NODE_SCRIPT, def_sh_script, "SCRIPT", Script, "Script", "" )

@ -36,7 +36,8 @@
/* **************** BUMP ******************** */
static bNodeSocketTemplate sh_node_bump_in[] = {
{ SOCK_FLOAT, 1, N_("Strength"), 0.1f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f},
{ SOCK_FLOAT, 1, N_("Strength"), 1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f},
{ SOCK_FLOAT, 1, N_("Distance"), 0.1f, 0.0f, 0.0f, 0.0f, 0.0f, 1000.0f},
{ SOCK_FLOAT, 1, N_("Height"), 1.0f, 1.0f, 1.0f, 1.0f, -1000.0f, 1000.0f, PROP_NONE, SOCK_HIDE_VALUE},
{ SOCK_VECTOR, 1, N_("Normal"), 0.0f, 0.0f, 0.0f, 1.0f, -1.0f, 1.0f, PROP_NONE, SOCK_HIDE_VALUE},
{ -1, 0, "" }