@woosh/meep-engine
Version:
Pure JavaScript game engine. Fully featured and production ready.
87 lines (66 loc) • 1.92 kB
JavaScript
import { Vector3 as ThreeVector3 } from 'three';
const corners = [
new ThreeVector3(-1, -1, 0),
new ThreeVector3(-1, -1, 0),
new ThreeVector3(-1, 1, 0),
new ThreeVector3(-1, 1, 0),
new ThreeVector3(1, -1, 0),
new ThreeVector3(1, -1, 0),
new ThreeVector3(1, 1, 0),
new ThreeVector3(1, 1, 0)
];
/**
*
* @param {Number} nearZ
* @param {Number} farZ
* @param {THREE.Camera} camera
* @param {THREE.Matrix4} matrixWorldInverse
* @param {AABB3} result
*/
function project(nearZ, farZ, camera, matrixWorldInverse, result) {
corners[0].set(-1, -1, nearZ);
corners[1].set(-1, -1, farZ);
corners[2].set(-1, 1, nearZ);
corners[3].set(-1, 1, farZ);
corners[4].set(1, -1, nearZ);
corners[5].set(1, -1, farZ);
corners[6].set(1, 1, nearZ);
corners[7].set(1, 1, farZ);
//compute corners of view frustum in light space
let x0 = Number.POSITIVE_INFINITY;
let y0 = Number.POSITIVE_INFINITY;
let z0 = Number.POSITIVE_INFINITY;
let x1 = Number.NEGATIVE_INFINITY;
let y1 = Number.NEGATIVE_INFINITY;
let z1 = Number.NEGATIVE_INFINITY;
for (let i = 0; i < 8; i++) {
const corner = corners[i];
corner.unproject(camera);
corner.applyMatrix4(matrixWorldInverse);
if (corner.x < x0) {
x0 = corner.x;
}
if (corner.x > x1) {
x1 = corner.x;
}
if (corner.y < y0) {
y0 = corner.y;
}
if (corner.y > y1) {
y1 = corner.y;
}
if (corner.z < z0) {
z0 = corner.z;
}
if (corner.z > z1) {
z1 = corner.z;
}
}
result.setBounds(x0, y0, z0, x1, y1, z1);
}
export default {
/**
* @deprecated use non-threejs specific code
*/
project,
};