UNPKG

@tolokoban/tgd

Version:

ToloGameDev library for WebGL2

91 lines 6.05 kB
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