encodeSurfaceNormal function

Vector2 encodeSurfaceNormal(
  1. 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);
}