UNPKG

@woosh/meep-engine

Version:

Pure JavaScript game engine. Fully featured and production ready.

56 lines (42 loc) 1.67 kB
import { vec3 } from "gl-matrix"; import { v3_dot } from "../../../../../core/geom/vec3/v3_dot.js"; import { sign_not_zero } from "../../../../../core/math/sign_not_zero.js"; import { UvEncoder } from "./UvEncoder.js"; export class OctahedralUvEncoder extends UvEncoder { uv_to_unit(output, input) { let px = input[0] * 2 - 1; let pz = input[1] * 2 - 1; const abs_x = Math.abs(px); const abs_z = Math.abs(pz); const py = 1 - abs_x - abs_z; if (py < 0) { px = sign_not_zero(px) * (1 - abs_z); pz = sign_not_zero(pz) * (1 - abs_x); } output[0] = px; output[1] = py; output[2] = pz; vec3.normalize(output, output); } unit_to_uv(output, input) { const input_x = input[0]; const input_y = input[1]; const input_z = input[2]; const octant_x = sign_not_zero(input_x); const octant_y = sign_not_zero(input_y); const octant_z = sign_not_zero(input_z); // |x| + |y| + |z| = 1 const sum = v3_dot(input_x, input_y, input_z, octant_x, octant_y, octant_z); let octahedron_x = input_x / sum; const octahedron_y = input_y / sum; let octahedron_z = input_z / sum; if (octahedron_y < 0) { const absolute_x = Math.abs(octahedron_x); const absolute_z = Math.abs(octahedron_z); octahedron_x = octant_x * (1 - absolute_z); octahedron_z = octant_z * (1 - absolute_x); } output[0] = octahedron_x; output[1] = octahedron_z; } }