@tolokoban/tgd
Version:
ToloGameDev library for WebGL2
91 lines • 6.05 kB
JavaScript
import { TgdMat4 } from "./../../math/index.js";
import { TgdPainter } from "../painter.js";
import { TgdTransfo } from "../../math/transfo.js";
/**
* A Node can hold others Nodes or any object providing the
* TgdPainterNodeChild interface.
*
* Each Node is a local space for its children.
*
* All objects implementing `TgdInterfaceTransformable` have a `transfo` attribute
* that controls its position/orientation/scale in the world coordinate system. If
* you need an object's transformation to be defined in another object coordinate
* system, you just have to wrap it in a `TgdPainterNode`.
*
* As long as a `Transformable` is hold by the `painter` attribute of a `TgdPainterNode`,
* it will be controlled by the node.
* That means, you should not use its `transfo` attribute because it will be
* overwritten by the node.
*
* @example
* ```
* const body = new TgdPainterNode({
* target: new TgdPainterMesh(context)
* })
* const leftArm = new TgdPainterNode({
* transfo: { poition: [1, 0, 0] },
* target: new TgdPainterMesh(context)
* })
* const rightArm = new TgdPainterNode({
* transfo: { poition: [-1, 0, 0] },
* target: new TgdPainterMesh(context)
* })
* body.add( leftArm, rightArm )
* ```
*/
export class TgdPainterNode extends TgdPainter {
constructor(options = {}) {
super();
this.target = null;
this.parentMatrix = new TgdMat4();
this.globalMatrix = new TgdMat4();
this.children = [];
const { children = [], target = null, transfo, logic } = options;
for (const child of children)
this.add(child);
this.target = target;
this.transfo = new TgdTransfo(transfo);
this.logic = logic;
}
delete() {
var _a, _b;
for (const child of this.children) {
child.delete();
}
(_b = (_a = this.target) === null || _a === void 0 ? void 0 : _a.delete) === null || _b === void 0 ? void 0 : _b.call(_a);
}
add(...children) {
for (const child of children) {
this.children.push(child);
}
return this;
}
remove(...children) {
for (const child of children) {
const nodePosition = this.children.indexOf(child);
if (nodePosition !== -1)
this.children.splice(nodePosition, 1);
}
}
paint(time, delay) {
var _a, _b, _c;
(_a = this.logic) === null || _a === void 0 ? void 0 : _a.call(this, time, delay);
this.parentMatrix.reset();
const fringe = [this];
while (fringe.length > 0) {
const node = fringe.shift();
node.globalMatrix
.from(node.parentMatrix)
.multiply(node.transfo.matrix);
if (node.target) {
node.target.transfo.matrix.from(node.globalMatrix);
(_c = (_b = node.target).paint) === null || _c === void 0 ? void 0 : _c.call(_b, time, delay);
}
for (const child of node.children) {
child.parentMatrix.from(node.globalMatrix);
fringe.push(child);
}
}
}
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibm9kZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9wYWludGVyL25vZGUvbm9kZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0sV0FBVyxDQUFBO0FBQ25DLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxZQUFZLENBQUE7QUFDdkMsT0FBTyxFQUFFLFVBQVUsRUFBcUIsTUFBTSxvQkFBb0IsQ0FBQTtBQVVsRTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQStCRztBQUNILE1BQU0sT0FBTyxjQUFlLFNBQVEsVUFBVTtJQVMxQyxZQUFZLFVBQTBDLEVBQUU7UUFDcEQsS0FBSyxFQUFFLENBQUE7UUFSSixXQUFNLEdBQTRDLElBQUksQ0FBQTtRQUU1QyxpQkFBWSxHQUFHLElBQUksT0FBTyxFQUFFLENBQUE7UUFDNUIsaUJBQVksR0FBRyxJQUFJLE9BQU8sRUFBRSxDQUFBO1FBQzVCLGFBQVEsR0FBcUIsRUFBRSxDQUFBO1FBSzVDLE1BQU0sRUFBRSxRQUFRLEdBQUcsRUFBRSxFQUFFLE1BQU0sR0FBRyxJQUFJLEVBQUUsT0FBTyxFQUFFLEtBQUssRUFBRSxHQUFHLE9BQU8sQ0FBQTtRQUNoRSxLQUFLLE1BQU0sS0FBSyxJQUFJLFFBQVE7WUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFBO1FBQzdDLElBQUksQ0FBQyxNQUFNLEdBQUcsTUFBTSxDQUFBO1FBQ3BCLElBQUksQ0FBQyxPQUFPLEdBQUcsSUFBSSxVQUFVLENBQUMsT0FBTyxDQUFDLENBQUE7UUFDdEMsSUFBSSxDQUFDLEtBQUssR0FBRyxLQUFLLENBQUE7SUFDdEIsQ0FBQztJQUVELE1BQU07O1FBQ0YsS0FBSyxNQUFNLEtBQUssSUFBSSxJQUFJLENBQUMsUUFBUSxFQUFFLENBQUM7WUFDaEMsS0FBSyxDQUFDLE1BQU0sRUFBRSxDQUFBO1FBQ2xCLENBQUM7UUFDRCxNQUFBLE1BQUEsSUFBSSxDQUFDLE1BQU0sMENBQUUsTUFBTSxrREFBSSxDQUFBO0lBQzNCLENBQUM7SUFFRCxHQUFHLENBQUMsR0FBRyxRQUEwQjtRQUM3QixLQUFLLE1BQU0sS0FBSyxJQUFJLFFBQVEsRUFBRSxDQUFDO1lBQzNCLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFBO1FBQzdCLENBQUM7UUFDRCxPQUFPLElBQUksQ0FBQTtJQUNmLENBQUM7SUFFRCxNQUFNLENBQUMsR0FBRyxRQUEwQjtRQUNoQyxLQUFLLE1BQU0sS0FBSyxJQUFJLFFBQVEsRUFBRSxDQUFDO1lBQzNCLE1BQU0sWUFBWSxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFBO1lBQ2pELElBQUksWUFBWSxLQUFLLENBQUMsQ0FBQztnQkFBRSxJQUFJLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxZQUFZLEVBQUUsQ0FBQyxDQUFDLENBQUE7UUFDbEUsQ0FBQztJQUNMLENBQUM7SUFFRCxLQUFLLENBQUMsSUFBWSxFQUFFLEtBQWE7O1FBQzdCLE1BQUEsSUFBSSxDQUFDLEtBQUsscURBQUcsSUFBSSxFQUFFLEtBQUssQ0FBQyxDQUFBO1FBQ3pCLElBQUksQ0FBQyxZQUFZLENBQUMsS0FBSyxFQUFFLENBQUE7UUFDekIsTUFBTSxNQUFNLEdBQXFCLENBQUMsSUFBSSxDQUFDLENBQUE7UUFDdkMsT0FBTyxNQUFNLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRSxDQUFDO1lBQ3ZCLE1BQU0sSUFBSSxHQUFHLE1BQU0sQ0FBQyxLQUFLLEVBQW9CLENBQUE7WUFDN0MsSUFBSSxDQUFDLFlBQVk7aUJBQ1osSUFBSSxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUM7aUJBQ3ZCLFFBQVEsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxDQUFBO1lBQ2xDLElBQUksSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDO2dCQUNkLElBQUksQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFBO2dCQUNsRCxNQUFBLE1BQUEsSUFBSSxDQUFDLE1BQU0sRUFBQyxLQUFLLG1EQUFHLElBQUksRUFBRSxLQUFLLENBQUMsQ0FBQTtZQUNwQyxDQUFDO1lBQ0QsS0FBSyxNQUFNLEtBQUssSUFBSSxJQUFJLENBQUMsUUFBUSxFQUFFLENBQUM7Z0JBQ2hDLEtBQUssQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQTtnQkFDMUMsTUFBTSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQTtZQUN0QixDQUFDO1FBQ0wsQ0FBQztJQUNMLENBQUM7Q0FDSiJ9