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

View File

@@ -394,7 +394,10 @@ static ShaderNode *add_node(Scene *scene, BL::BlendData b_data, BL::Scene b_scen
node = new HairInfoNode(); node = new HairInfoNode();
} }
else if (b_node.is_a(&RNA_ShaderNodeBump)) { 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)) { else if (b_node.is_a(&RNA_ShaderNodeScript)) {
#ifdef WITH_OSL #ifdef WITH_OSL

View File

@@ -22,8 +22,10 @@
* Morten S. Mikkelsen, 2010 */ * Morten S. Mikkelsen, 2010 */
surface node_bump( surface node_bump(
int invert = 0,
normal NormalIn = N, normal NormalIn = N,
float Strength = 0.0, float Strength = 0.1,
float Distance = 1.0,
float SampleCenter = 0.0, float SampleCenter = 0.0,
float SampleX = 0.0, float SampleX = 0.0,
float SampleY = 0.0, float SampleY = 0.0,
@@ -42,10 +44,14 @@ surface node_bump(
float absdet = fabs(det); 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 */ /* 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); NormalOut = normalize(strength*NormalOut + (1.0 - strength)*NormalIn);
} }

View File

@@ -24,7 +24,10 @@ __device void svm_node_set_bump(KernelGlobals *kg, ShaderData *sd, float *stack,
{ {
#ifdef __RAY_DIFFERENTIALS__ #ifdef __RAY_DIFFERENTIALS__
/* get normal input */ /* 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 */ /* get surface tangents from normal */
float3 Rx = cross(sd->dP.dy, normal_in); 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 absdet = fabsf(det);
float strength = stack_load_float(stack, strength_offset); 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 */ /* 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); normal_out = normalize(strength*normal_out + (1.0f - strength)*normal_in);
stack_store_float3(stack, node.w, normal_out); stack_store_float3(stack, node.w, normal_out);
#endif #endif

View File

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

View File

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

View File

@@ -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); 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) static void node_shader_buts_normal_map(uiLayout *layout, bContext *C, PointerRNA *ptr)
{ {
uiItemR(layout, ptr, "space", 0, "", 0); uiItemR(layout, ptr, "space", 0, "", 0);
@@ -990,6 +995,9 @@ static void node_shader_set_butfunc(bNodeType *ntype)
case SH_NODE_TEX_COORD: case SH_NODE_TEX_COORD:
ntype->uifunc = node_shader_buts_tex_coord; ntype->uifunc = node_shader_buts_tex_coord;
break; break;
case SH_NODE_BUMP:
ntype->uifunc = node_shader_buts_bump;
break;
case SH_NODE_NORMAL_MAP: case SH_NODE_NORMAL_MAP:
ntype->uifunc = node_shader_buts_normal_map; ntype->uifunc = node_shader_buts_normal_map;
break; break;

View File

@@ -2260,7 +2260,7 @@ void node_object_info(out vec3 location, out float object_index, out float mater
random = 0.0; 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; result = N;
} }

View File

@@ -3416,6 +3416,16 @@ static void def_glossy(StructRNA *srna)
RNA_def_property_update(prop, NC_NODE | NA_EDITED, "rna_Node_update"); 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 void def_sh_normal_map(StructRNA *srna)
{ {
static EnumPropertyItem prop_space_items[] = { static EnumPropertyItem prop_space_items[] = {

View File

@@ -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_OBJECT_INFO, 0, "OBJECT_INFO", ObjectInfo, "Object Info", "" )
DefNode( ShaderNode, SH_NODE_PARTICLE_INFO, 0, "PARTICLE_INFO", ParticleInfo, "Particle 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_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_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_TANGENT, def_sh_tangent, "TANGENT", Tangent, "Tangent", "" )
DefNode( ShaderNode, SH_NODE_SCRIPT, def_sh_script, "SCRIPT", Script, "Script", "" ) DefNode( ShaderNode, SH_NODE_SCRIPT, def_sh_script, "SCRIPT", Script, "Script", "" )

View File

@@ -36,7 +36,8 @@
/* **************** BUMP ******************** */ /* **************** BUMP ******************** */
static bNodeSocketTemplate sh_node_bump_in[] = { 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_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}, { SOCK_VECTOR, 1, N_("Normal"), 0.0f, 0.0f, 0.0f, 1.0f, -1.0f, 1.0f, PROP_NONE, SOCK_HIDE_VALUE},
{ -1, 0, "" } { -1, 0, "" }