encodeSurfaceNormal function
Vector2
encodeSurfaceNormal(
- Vector3 n
EncodeOctahedral from color.glsl: a unit normal in two channels.
Implementation
Vector2 encodeSurfaceNormal(Vector3 n) {
final sum = n.x.abs() + n.y.abs() + n.z.abs();
final scaled = sum > 1e-6 ? n / sum : Vector3(0.0, 0.0, 1.0);
var e = Vector2(scaled.x, scaled.y);
if (scaled.z < 0.0) {
e = Vector2(
(1.0 - scaled.y.abs()) * (scaled.x >= 0.0 ? 1.0 : -1.0),
(1.0 - scaled.x.abs()) * (scaled.y >= 0.0 ? 1.0 : -1.0),
);
}
return Vector2(e.x * 0.5 + 0.5, e.y * 0.5 + 0.5);
}