@tolokoban/tgd
Version:
ToloGameDev library for WebGL2
148 lines • 10.7 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.parentMatrix = new TgdMat4();
/**
* globalMatrix = parentMatrix * transfo
*/
this.globalMatrix = new TgdMat4();
this.nodes = [];
this.targets = [];
const { children = [], transfo, logic, paintTheTargets = true, name = `TgdPainterNode/${this.name}`, } = options;
this.paintTheTargets = paintTheTargets;
for (const child of children)
this.add(child);
this.transfo = new TgdTransfo(transfo);
this.logic = logic === null || logic === void 0 ? void 0 : logic.bind(this);
this.name = name;
}
delete() {
var _a;
for (const child of this.nodes) {
child.delete();
}
for (const target of this.targets)
(_a = target.delete) === null || _a === void 0 ? void 0 : _a.call(target);
}
add(...children) {
for (const child of children) {
if (child instanceof TgdPainterNode) {
this.nodes.push(child);
}
else {
this.targets.push(child);
}
}
return this;
}
remove(...children) {
for (const child of children) {
if (child instanceof TgdPainterNode) {
const nodePosition = this.nodes.indexOf(child);
if (nodePosition !== -1)
this.nodes.splice(nodePosition, 1);
}
else {
const index = this.targets.indexOf(child);
if (index !== -1)
this.targets.splice(index, 1);
}
}
return this;
}
getNodes() {
return [...this.nodes];
}
getTargets() {
return [...this.targets];
}
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);
(_b = node.logic) === null || _b === void 0 ? void 0 : _b.call(node, time, delay);
for (const target of node.targets) {
target.transfo.matrix.from(node.globalMatrix);
if (this.paintTheTargets)
(_c = target.paint) === null || _c === void 0 ? void 0 : _c.call(target, time, delay);
}
for (const child of node.nodes) {
child.parentMatrix.from(node.globalMatrix);
fringe.push(child);
}
}
}
debug(caption = "TgdPainterNode") {
console.log(caption);
actualDebug(this);
}
}
function actualDebug(node, indent = "| ") {
var _a, _b;
console.log(`${indent}${node.name} [${format(node.transfo.orientation)}] (${format(node.transfo.position)})`);
const targets = node.getTargets();
if (targets.length > 0) {
if (targets.length === 1) {
console.log(`${indent} Target: ${(_a = targets[0].name) !== null && _a !== void 0 ? _a : "..."}`);
}
else {
console.log(`${indent} Targets (${targets.length})`);
for (const target of targets) {
console.log(`${indent} ${(_b = target.name) !== null && _b !== void 0 ? _b : "..."}`);
}
}
}
const nodes = node.getNodes();
if (nodes.length > 0) {
console.log(`${indent} Nodes (${nodes.length})`);
for (const child of nodes) {
actualDebug(child, `${indent} | `);
}
}
}
function format(vec) {
const list = [...vec].map(v => v.toFixed(3));
return list.join(", ");
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibm9kZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9wYWludGVyL25vZGUvbm9kZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsT0FBTyxFQUFvQixNQUFNLFdBQVcsQ0FBQTtBQUNyRCxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sWUFBWSxDQUFBO0FBQ3ZDLE9BQU8sRUFBRSxVQUFVLEVBQXFCLE1BQU0sb0JBQW9CLENBQUE7QUFtQmxFOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBK0JHO0FBQ0gsTUFBTSxPQUFPLGNBQWUsU0FBUSxVQUFVO0lBYTFDLFlBQVksVUFBMEMsRUFBRTtRQUNwRCxLQUFLLEVBQUUsQ0FBQTtRQVZNLGlCQUFZLEdBQUcsSUFBSSxPQUFPLEVBQUUsQ0FBQTtRQUM3Qzs7V0FFRztRQUNjLGlCQUFZLEdBQUcsSUFBSSxPQUFPLEVBQUUsQ0FBQTtRQUM1QixVQUFLLEdBQXFCLEVBQUUsQ0FBQTtRQUM1QixZQUFPLEdBQXVDLEVBQUUsQ0FBQTtRQUs3RCxNQUFNLEVBQ0YsUUFBUSxHQUFHLEVBQUUsRUFDYixPQUFPLEVBQ1AsS0FBSyxFQUNMLGVBQWUsR0FBRyxJQUFJLEVBQ3RCLElBQUksR0FBRyxrQkFBa0IsSUFBSSxDQUFDLElBQUksRUFBRSxHQUN2QyxHQUFHLE9BQU8sQ0FBQTtRQUNYLElBQUksQ0FBQyxlQUFlLEdBQUcsZUFBZSxDQUFBO1FBQ3RDLEtBQUssTUFBTSxLQUFLLElBQUksUUFBUTtZQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUE7UUFDN0MsSUFBSSxDQUFDLE9BQU8sR0FBRyxJQUFJLFVBQVUsQ0FBQyxPQUFPLENBQUMsQ0FBQTtRQUN0QyxJQUFJLENBQUMsS0FBSyxHQUFHLEtBQUssYUFBTCxLQUFLLHVCQUFMLEtBQUssQ0FBRSxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUE7UUFDOUIsSUFBSSxDQUFDLElBQUksR0FB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