diff options
Diffstat (limited to 'intern/cycles/kernel/shaders/node_bump.osl')
-rw-r--r-- | intern/cycles/kernel/shaders/node_bump.osl | 25 |
1 files changed, 19 insertions, 6 deletions
diff --git a/intern/cycles/kernel/shaders/node_bump.osl b/intern/cycles/kernel/shaders/node_bump.osl index 9882857f2ec..7f01cf2ca91 100644 --- a/intern/cycles/kernel/shaders/node_bump.osl +++ b/intern/cycles/kernel/shaders/node_bump.osl @@ -21,6 +21,7 @@ surface node_bump( int invert = 0, + int use_object_space = 0, normal NormalIn = N, float Strength = 0.1, float Distance = 1.0, @@ -29,12 +30,20 @@ surface node_bump( float SampleY = 0.0, output normal NormalOut = N) { + point Ptmp = P; + normal Normal = NormalIn; + + if (use_object_space) { + Ptmp = transform("object", Ptmp); + Normal = normalize(transform("object", Normal)); + } + /* get surface tangents from normal */ - vector dPdx = Dx(P); - vector dPdy = Dy(P); + vector dPdx = Dx(Ptmp); + vector dPdy = Dy(Ptmp); - vector Rx = cross(dPdy, NormalIn); - vector Ry = cross(NormalIn, dPdx); + vector Rx = cross(dPdy, Normal); + vector Ry = cross(Normal, dPdx); /* compute surface gradient and determinant */ float det = dot(dPdx, Rx); @@ -49,7 +58,11 @@ surface node_bump( dist *= -1.0; /* compute and output perturbed normal */ - NormalOut = normalize(absdet * NormalIn - dist * sign(det) * surfgrad); - NormalOut = normalize(strength * NormalOut + (1.0 - strength) * NormalIn); + NormalOut = normalize(absdet * Normal - dist * sign(det) * surfgrad); + NormalOut = normalize(strength * NormalOut + (1.0 - strength) * Normal); + + if (use_object_space) { + NormalOut = normalize(transform("object", "world", NormalOut)); + } } |