UNPKG

@tolokoban/tgd

Version:

ToloGameDev library for WebGL2

74 lines 5.61 kB
import { TgdMat4, TgdVec3 } from "./../math/index.js"; import { TgdCamera } from "./camera.js"; import { mat4 } from "gl-matrix"; export class TgdCameraPerspective extends TgdCamera { constructor(options = {}) { var _a; super(options); this._matrixProjection = new TgdMat4(); this._fovy = Math.PI / 4; this._ray = { origin: new TgdVec3(), direction: new TgdVec3(), }; this._fovy = (_a = options.fovy) !== null && _a !== void 0 ? _a : Math.PI / 4; } copyProjectionFrom(camera) { this.fovy = camera.fovy; this.near = camera.near; this.far = camera.far; return this; } castRay(screenX, screenY) { const { transfo } = this; const { origin, direction } = this._ray; origin.from(transfo.actualPosition); const h = Math.atan(this.fovy * 0.5); const w = h * this.screenAspectRatio; direction .fromOpposite(transfo.axisZ) .addWithScale(transfo.axisX, w * screenX) .addWithScale(transfo.axisY, h * screenY) .normalize(); return this._ray; } /** * Vertical field of view in radians. * * The revealed space at a distance of 1 from the camera * will have a height of `2 * tan(fovy / 2)`. */ get fovy() { return this._fovy; } set fovy(v) { if (v === this._fovy) return; this._fovy = v; this.dirtyProjection = true; } get matrixProjection() { this.updateProjectionIfNeeded(); return this._matrixProjection; } getSpaceHeightAtTarget() { return 2 * Math.tan(this.fovy * 0.5) * this.transfo.distance; } setSpaceHeightAtTarget(v) { this.transfo.setDistance(v / (2 * Math.tan(this.fovy * 0.5))); } updateProjectionIfNeeded() { if (!this.dirtyProjection) return; const fovy = this._fovy; const aspect = this.screenAspectRatio; const near = this._near; const far = this._far; const out = this._matrixProjection; mat4.perspective(out, fovy, aspect, near, far); out[0] *= this.zoom; out[5] *= this.zoom; this.dirtyProjection = true; } } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2FtZXJhLXBlcnNwZWN0aXZlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2NhbWVyYS9jYW1lcmEtcGVyc3BlY3RpdmUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSxXQUFXLENBQUE7QUFDNUMsT0FBTyxFQUFFLFNBQVMsRUFBb0IsTUFBTSxVQUFVLENBQUE7QUFDdEQsT0FBTyxFQUFFLElBQUksRUFBRSxNQUFNLFdBQVcsQ0FBQTtBQVloQyxNQUFNLE9BQU8sb0JBQXFCLFNBQVEsU0FBUztJQVEvQyxZQUFZLFVBQXVDLEVBQUU7O1FBQ2pELEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQTtRQVJELHNCQUFpQixHQUFHLElBQUksT0FBTyxFQUFFLENBQUE7UUFDMUMsVUFBSyxHQUFHLElBQUksQ0FBQyxFQUFFLEdBQUcsQ0FBQyxDQUFBO1FBQ1YsU0FBSSxHQUFHO1lBQ3BCLE1BQU0sRUFBRSxJQUFJLE9BQU8sRUFBRTtZQUNyQixTQUFTLEVBQUUsSUFBSSxPQUFPLEVBQUU7U0FDM0IsQ0FBQTtRQUlHLElBQUksQ0FBQyxLQUFLLEdBQUcsTUFBQSxPQUFPLENBQUMsSUFBSSxtQ0FBSSxJQUFJLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQTtJQUM1QyxDQUFDO0lBRUQsa0JBQWtCLENBQUMsTUFBNEI7UUFDM0MsSUFBSSxDQUFDLElBQUksR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFBO1FBQ3ZCLElBQUksQ0FBQyxJQUFJLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQTtRQUN2QixJQUFJLENBQUMsR0FBRyxHQUFHLE1BQU0sQ0FBQyxHQUFHLENBQUE7UUFDckIsT0FBTyxJQUFJLENBQUE7SUFDZixDQUFDO0lBRUQsT0FBTyxDQUNILE9BQWUsRUFDZixPQUFlO1FBRWYsTUFBTSxFQUFFLE9BQU8sRUFBRSxHQUFHLElBQUksQ0FBQTtRQUN4QixNQUFNLEVBQUUsTUFB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