Files
test2/intern/cycles/kernel/osl/shaders/node_geometry.osl
Alaska 4f5e684e24 Fix Cycles OSL geometry node point cloud inconsistency
Update the OSL script for the "Geometry" node to follow the correct
Tangent code path when working with point clouds.

There should be no functional change for the end user since the correct
code path was already taken by accident.

Pull Request: https://projects.blender.org/blender/blender/pulls/113472
2023-10-11 21:05:41 +02:00

63 lines
1.9 KiB
Plaintext

/* SPDX-FileCopyrightText: 2011-2022 Blender Foundation
*
* SPDX-License-Identifier: Apache-2.0 */
#include "stdcycles.h"
shader node_geometry(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,
output float RandomPerIsland = 0.0)
{
Position = P;
Normal = N;
TrueNormal = Ng;
Incoming = I;
Parametric = point(1.0 - u - v, u, 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);
}
point generated;
float IsCurve = 0;
float IsPoint = 0;
getattribute("geom:is_curve", IsCurve);
getattribute("geom:is_point", IsPoint);
/* create spherical tangent from generated coordinates if they're available,
* unless we're on a curve or point. */
if (!(IsCurve || IsPoint) && 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);
}
getattribute("geom:random_per_island", RandomPerIsland);
}