@woosh/meep-engine
Version:
Pure JavaScript game engine. Fully featured and production ready.
56 lines (42 loc) • 1.67 kB
JavaScript
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;
}
}