@tolokoban/tgd
Version:
ToloGameDev library for WebGL2
156 lines • 11.4 kB
JavaScript
import { TgdMat4, TgdTransfo, } from "./../math/index.js";
export class TgdCamera {
constructor(options = {}) {
var _a, _b, _c, _d;
this._screenWidth = 1920;
this._screenHeight = 1080;
this._screenAspectRatio = 1920 / 1080;
/** Do we need recalculation? */
this._dirtyModelView = true;
this.dirtyModelViewInverse = true;
this._dirtyAxis = true;
this._dirtyProjection = true;
this.dirtyProjectionInverse = true;
this._near = 1e-3;
this._far = Infinity;
// transformation
this._matrixModelView = new TgdMat4();
this._matrixProjectionInverse = new TgdMat4();
this._zoom = 1;
this.name = (_a = options.name) !== null && _a !== void 0 ? _a : `TgdCamera#${TgdCamera.incrementalId++}`;
this._near = (_b = options.near) !== null && _b !== void 0 ? _b : 1e-3;
this._far = (_c = options.far) !== null && _c !== void 0 ? _c : 1e6;
this.transfo = new TgdTransfo(options.transfo);
this.zoom = (_d = options.zoom) !== null && _d !== void 0 ? _d : 1;
}
getCurrentState() {
return {
distance: this.transfo.distance,
orientation: this.transfo.orientation.clone(),
spaceHeightAtTarget: this.spaceHeightAtTarget,
position: this.transfo.position.clone(),
zoom: this.zoom,
};
}
get near() {
return this._near;
}
set near(v) {
if (v === this._near)
return;
this._near = v;
this.dirtyProjection = true;
}
get far() {
return this._far;
}
set far(v) {
if (v === this._far)
return;
this._far = v;
this.dirtyProjection = true;
}
get screenAspectRatio() {
return this._screenAspectRatio;
}
get screenWidth() {
return this._screenWidth;
}
set screenWidth(v) {
if (v === this._screenWidth)
return;
this._screenWidth = v;
this.dirtyProjection = true;
this._screenAspectRatio = this._screenWidth / this._screenHeight;
}
get screenHeight() {
return this._screenHeight;
}
set screenHeight(v) {
if (v === this._screenHeight)
return;
this._screenHeight = v;
this.dirtyProjection = true;
this._screenAspectRatio = this._screenWidth / this._screenHeight;
}
get spaceHeightAtTarget() {
return this.getSpaceHeightAtTarget();
}
set spaceHeightAtTarget(v) {
this.setSpaceHeightAtTarget(v);
}
get spaceWidthAtTarget() {
return (this.screenWidth * this.spaceHeightAtTarget) / this.screenHeight;
}
set spaceWidthAtTarget(v) {
this.setSpaceHeightAtTarget((v * this.screenHeight) / this.screenWidth);
}
from(camera) {
const { zoom, screenWidth, screenHeight } = camera;
this.transfo.from(camera.transfo);
this.zoom = zoom;
this.screenWidth = screenWidth;
this.screenHeight = screenHeight;
this.dirtyModelView = true;
this.copyProjectionFrom(camera);
return this;
}
fromTransfo(transfo) {
this.transfo.from(transfo);
this.dirtyModelView = true;
return this;
}
/**
* This matrix will transform a world coordinate into a camera coordinate.
*/
get matrixModelView() {
return this._matrixModelView.invert(this.transfo.matrix);
}
get matrixProjectionInverse() {
if (this.dirtyProjectionInverse) {
this._matrixProjectionInverse.invert(this.matrixProjection);
this.dirtyProjectionInverse = false;
}
return this._matrixProjectionInverse;
}
get zoom() {
return this._zoom;
}
set zoom(v) {
if (this._zoom === v)
return;
this._zoom = v;
this.transfo.setScale(v, v, v);
this.dirtyModelView = true;
}
debug(caption) {
const name = `${this.name}: ${caption !== null && caption !== void 0 ? caption : ""}`;
console.log("TgdCamera", name);
console.log(" Distance:", this.transfo.distance);
console.log(" Zoom:", this.zoom);
this.transfo.orientation.debug(` Orientation`);
this.transfo.position.debug(` Target`);
this.transfo.actualPosition.debug(` Actual position`);
this.matrixModelView.debug(` MatrixModelView`);
this.matrixProjection.debug(` MatrixProjection`);
}
get dirtyModelView() {
return this._dirtyModelView;
}
set dirtyModelView(v) {
this._dirtyModelView = v;
if (v) {
this.dirtyModelViewInverse = true;
}
}
get dirtyProjection() {
return this._dirtyProjection;
}
set dirtyProjection(v) {
this._dirtyProjection = v;
if (v)
this.dirtyProjectionInverse = true;
}
}
TgdCamera.incrementalId = 1;
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2FtZXJhLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2NhbWVyYS9jYW1lcmEudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUdILE9BQU8sRUFDUCxVQUFVLEdBRWIsTUFBTSxXQUFXLENBQUE7QUFvQmxCLE1BQU0sT0FBZ0IsU0FBUztJQXlCM0IsWUFBWSxVQUE0QixFQUFFOztRQW5CbEMsaUJBQVksR0FBRyxJQUFJLENBQUE7UUFDbkIsa0JBQWEsR0FBRyxJQUFJLENBQUE7UUFDcEIsdUJBQWtCLEdBQUcsSUFBSSxHQUFHLElBQUksQ0FBQTtRQUV4QyxnQ0FBZ0M7UUFDeEIsb0JBQWUsR0FBRyxJQUFJLENBQUE7UUFDdEIsMEJBQXFCLEdBQUcsSUFBSSxDQUFBO1FBQzVCLGVBQVUsR0FBRyxJQUFJLENBQUE7UUFDZixxQkFBZ0IsR0FBRyxJQUFJLENBQUE7UUFDdkIsMkJBQXNCLEdBQUcsSUFBSSxDQUFBO1FBRTdCLFVBQUssR0FBRyxJQUFJLENBQUE7UUFDWixTQUFJLEdBQUcsUUFBUSxDQUFBO1FBRXpCLGlCQUFpQjtRQUNBLHFCQUFnQixHQUFHLElBQUksT0FBTyxFQUFFLENBQUE7UUFDaEMsNkJBQXdCLEdBQUcsSUFBSSxPQUFPLEVBQUUsQ0FBQTtRQUNqRCxVQUFLLEdBQUcsQ0FBQyxDQUFBO1FBR2IsSUFBSSxDQUFDLElBQUksR0FBRyxNQUFBLE9BQU8sQ0FBQyxJQUFJLG1DQUFJLGFBQWEsU0FBUyxDQUFDLGFBQWEsRUFBRSxFQUFFLENBQUE7UUFDcEUsSUFBSSxDQUFDLEtBQUssR0FBRyxNQUFBLE9BQU8sQ0FBQyxJQUFJLG1DQUFJLElBQUksQ0FBQTtRQUNqQyxJQUFJLENBQUMsSUFBSSxHQUFHLE1BQUEsT0FBTyxDQUFDLEdBQUcsbUNBQUksR0FBRyxDQUFBO1FBQzlCLElBQUksQ0FBQyxPQUFPLEdBQUcsSUFBSSxVQUFVLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxDQUFBO1FBQzlDLElB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