@tolokoban/tgd
Version:
ToloGameDev library for WebGL2
124 lines • 10.5 kB
JavaScript
import { TgdEvent } from "./../index.js";
/**
* A frame is a rectangle inside the actual screen.
*
* It has its own coordinate system between -1 and +1.
*/
export class TgdFrame {
constructor(parent) {
this.parent = parent;
this.eventResize = new TgdEvent();
this._parentWidthPx = 0;
this._parentHeightPx = 0;
this._topPx = 0;
this._rightPx = 0;
this._bottomPx = 0;
this._leftPx = 0;
this._widthPx = 0;
this._heightPx = 0;
/**
* The size of the screen in pixels.
*/
this.updateScreenSize = ({ width, height }) => {
const w = Math.round(width);
const h = Math.round(height);
if (w === this._parentWidthPx && h === this._parentHeightPx)
return;
this._parentWidthPx = w;
this._parentHeightPx = h;
if (this._width) {
this._widthPx = resolveCoord(this._width, w);
const { _left, _right } = this;
if (_left === undefined && _right === undefined) {
// No left nor right, so we center the frame horizontally.
this._leftPx = (w - this._widthPx) / 2;
this._rightPx = w - this._leftPx;
}
else if (_left !== undefined) {
this._leftPx = resolveCoord(_left, w);
this._rightPx = this._leftPx + this._widthPx;
}
else {
this._rightPx = w - resolveCoord(this._right, w);
this._leftPx = this._rightPx - this._widthPx;
}
}
else {
this._leftPx = resolveCoord(this._left, w);
this._rightPx = w - resolveCoord(this._right, w);
this._widthPx = this._rightPx - this._leftPx;
}
if (this._height) {
this._heightPx = resolveCoord(this._height, w);
const { _bottom, _top } = this;
if (_bottom === undefined && _top === undefined) {
// No bottom nor top, so we center the frame horizontally.
this._bottomPx = (w - this._heightPx) / 2;
this._topPx = w - this._bottomPx;
}
else if (_bottom !== undefined) {
this._bottomPx = resolveCoord(_bottom, w);
this._topPx = this._bottomPx + this._heightPx;
}
else {
this._topPx = w - resolveCoord(this._top, w);
this._bottomPx = this._topPx - this._heightPx;
}
}
else {
this._bottomPx = resolveCoord(this._bottom, w);
this._topPx = w - resolveCoord(this._top, w);
this._heightPx = this._topPx - this._bottomPx;
}
this.eventResize.dispatch({
width: this._widthPx,
height: this._heightPx,
});
};
this.updateScreenSize(parent);
parent.eventResize.addListener(this.updateScreenSize);
}
get width() {
return this._widthPx;
}
get height() {
return this._heightPx;
}
get parentWidth() {
return this._parentWidthPx;
}
get parentHeight() {
return this._parentHeightPx;
}
xParentToFrame(x) {
const xParPx = (x + 1) * 0.5 * this._parentWidthPx;
const xFrmPx = xParPx - this._leftPx;
return 2 * (xFrmPx / this._widthPx) - 1;
}
yParentToFrame(y) {
const yParPx = (y + 1) * 0.5 * this._parentHeightPx;
const yFrmPx = yParPx - this._bottomPx;
return 2 * (yFrmPx / this._heightPx) - 1;
}
xFrameToParent(x) {
const xFrmPx = (x + 1) * 0.5 * this._widthPx;
const xParPx = xFrmPx + this._leftPx;
return 2 * (xParPx / this._parentWidthPx) - 1;
}
yFrameToParent(y) {
const yFrmPx = (y + 1) * 0.5 * this._heightPx;
const yParPx = yFrmPx + this._bottomPx;
return 2 * (yParPx / this._parentHeightPx) - 1;
}
delete() {
this.parent.eventResize.removeListener(this.updateScreenSize);
}
}
function resolveCoord(coord, size) {
if (coord === undefined)
return 0;
if (typeof coord === "number")
return coord;
return size * 1e-2 * coord[0];
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZnJhbWUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvaW5wdXQvZnJhbWUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLGdCQUFnQixDQUFBO0FBSXpDOzs7O0dBSUc7QUFDSCxNQUFNLE9BQU8sUUFBUTtJQWtCakIsWUFDcUIsTUFJaEI7UUFKZ0IsV0FBTSxHQUFOLE1BQU0sQ0FJdEI7UUF0QlcsZ0JBQVcsR0FBRyxJQUFJLFFBQVEsRUFBcUMsQ0FBQTtRQUV2RSxtQkFBYyxHQUFHLENBQUMsQ0FBQTtRQUNsQixvQkFBZSxHQUFHLENBQUMsQ0FBQTtRQU9uQixXQUFNLEdBQUcsQ0FBQyxDQUFBO1FBQ1YsYUFBUSxHQUFHLENBQUMsQ0FBQTtRQUNaLGNBQVMsR0FBRyxDQUFDLENBQUE7UUFDYixZQUFPLEdBQUcsQ0FBQyxDQUFBO1FBQ1gsYUFBUSxHQUFHLENBQUMsQ0FBQTtRQUNaLGNBQVMsR0FBRyxDQUFDLENBQUE7UUF5RHJCOztXQUVHO1FBQ2MscUJBQWdCLEdBQUcsQ0FBQyxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQXFDLEVBQUUsRUFBRTtZQUN6RixNQUFNLENBQUMsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFBO1lBQzNCLE1BQU0sQ0FBQyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLENBQUE7WUFDNUIsSUFBSSxDQUFDLEtBQUssSUFBSSxDQUFDLGNBQWMsSUFBSSxDQUFDLEtBQUssSUFBSSxDQUFDLGVBQWU7Z0JBQUUsT0FBTTtZQUVuRSxJQUFJLENBQUMsY0FBYyxHQUFHLENBQUMsQ0FBQTtZQUN2QixJQUFJLENBQUMsZUFBZSxHQUFHLENBQUMsQ0FBQTtZQUN4QixJQUFJLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQztnQkFDZCxJQUFJLENBQUMsUUFBUSxHQUFHLFlBQVksQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLENB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