blender/intern/cycles/kernel/shaders/node_geometry.osl
Sergey Sharybin de4dcda545 Fix T43651: New pointiness attribute doesn't work with displacement
Simple fix: just make pointiness aware of bump offset.
2015-02-20 17:20:24 +05:00

71 lines
2.0 KiB
Plaintext

/*
* Copyright 2011-2013 Blender Foundation
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
#include "stdosl.h"
shader node_geometry(
normal NormalIn = N,
string bump_offset = "center",
output point Position = point(0.0, 0.0, 0.0),
output normal Normal = normal(0.0, 0.0, 0.0),
output normal Tangent = normal(0.0, 0.0, 0.0),
output normal TrueNormal = normal(0.0, 0.0, 0.0),
output vector Incoming = vector(0.0, 0.0, 0.0),
output point Parametric = point(0.0, 0.0, 0.0),
output float Backfacing = 0.0,
output float Pointiness = 0.0)
{
Position = P;
Normal = NormalIn;
TrueNormal = Ng;
Incoming = I;
Parametric = point(u, v, 0.0);
Backfacing = backfacing();
if (bump_offset == "dx") {
Position += Dx(Position);
Parametric += Dx(Parametric);
}
else if (bump_offset == "dy") {
Position += Dy(Position);
Parametric += Dy(Parametric);
}
/* first try to get tangent attribute */
point generated;
/* try to create spherical tangent from generated coordinates */
if (getattribute("geom:generated", generated)) {
normal data = normal(-(generated[1] - 0.5), (generated[0] - 0.5), 0.0);
vector T = transform("object", "world", data);
Tangent = cross(Normal, normalize(cross(T, Normal)));
}
else {
/* otherwise use surface derivatives */
Tangent = normalize(dPdu);
}
getattribute("geom:pointiness", Pointiness);
if (bump_offset == "dx") {
Pointiness += Dx(Pointiness);
}
else if (bump_offset == "dy") {
Pointiness += Dy(Pointiness);
}
}