UNPKG

@woosh/meep-engine

Version:

Pure JavaScript game engine. Fully featured and production ready.

61 lines (46 loc) 1.7 kB
import { Vector3 as ThreeVector3 } from "three"; const farTL = new ThreeVector3(); const farTR = new ThreeVector3(); const farBL = new ThreeVector3(); const farBR = new ThreeVector3(); const nearTL = new ThreeVector3(); const nearTR = new ThreeVector3(); const nearBL = new ThreeVector3(); const nearBR = new ThreeVector3(); /** * * @param {Frustum} output * @param {AABB2} box screen-space 2d box in NDC (-1,+1) * @param {THREE.Camera} camera */ export function makeScreenScissorFrustum(output, box, camera) { camera.updateProjectionMatrix(); camera.updateMatrixWorld(); //convert box from view space into world space farTL.set(box.x0, box.y0, 1); farTR.set(box.x1, box.y0, 1); farBL.set(box.x0, box.y1, 1); farBR.set(box.x1, box.y1, 1); nearTL.set(box.x0, box.y0, -1); nearTR.set(box.x1, box.y0, -1); nearBL.set(box.x0, box.y1, -1); nearBR.set(box.x1, box.y1, -1); farTL.unproject(camera); farTR.unproject(camera); farBL.unproject(camera); farBR.unproject(camera); nearTL.unproject(camera); nearTR.unproject(camera); nearBL.unproject(camera); nearBR.unproject(camera); //create frustum planes const planes = output.planes; //set planes planes[0].setFromCoplanarPoints(nearTL, farTL, farTR); planes[1].setFromCoplanarPoints(nearTR, farTR, farBR); planes[2].setFromCoplanarPoints(farBR, farBL, nearBL); planes[3].setFromCoplanarPoints(farBL, farTL, nearTL); planes[4].setFromCoplanarPoints(nearTR, nearBR, nearBL); planes[5].setFromCoplanarPoints(farBR, farTR, farTL); planes[5].normal.multiplyScalar(-1); }