@tolokoban/tgd
Version:
ToloGameDev library for WebGL2
91 lines • 7.07 kB
JavaScript
import { TgdPainterMeshGltf, TgdPainterNode, } from "./../painter/index.js";
import { isNumber, isString } from "./../types/guards.js";
/**
* Create a `TgdPainterNode` from a node hierarchy from a GLTF structure.
* @param options
* * `data`: a GLTF parser
* * `context`: we will create painters, so we need a TgdContext
* * `node`: the root node you want to paint.
* @returns
*/
export function tgdMakeMeshGlbPainter(options) {
const { data, node = 0 } = options;
const actualNode = getActualNode(data, node);
const painter = makeNodePainter(actualNode, options);
return { painter };
}
/**
* Retrieve node by index or by name
*/
function getActualNode(data, node) {
if (isNumber(node))
return data.getNode(node);
if (isString(node))
return data.getNodeByNameOrThrow(node);
return node;
}
function makeNodePainter(node, options) {
const transfo = {};
if (node.translation) {
transfo.position = node.translation;
}
if (node.rotation) {
transfo.orientation = node.rotation;
}
if (node.scale) {
transfo.scale = node.scale;
}
const { data } = options;
const children = makeMeshPainters(node.mesh, options);
if (node.children) {
for (const nodeIndex of node.children) {
children.push(makeNodePainter(data.getNode(nodeIndex), options));
}
}
const painter = new TgdPainterNode({
name: `TgdPainterNode::${node.name}`,
transfo,
children,
});
return painter;
}
function makeMeshPainters(meshIndex, options) {
var _a, _b;
if (!isNumber(meshIndex))
return [];
const { data, context, overrideMaterial, excludeByMaterialName, includeOnlyMaterialNames, } = options;
const mesh = data.getMesh(meshIndex);
const targets = [];
for (let primitiveIndex = 0; primitiveIndex < mesh.primitives.length; primitiveIndex++) {
const primitive = data.getMeshPrimitive(meshIndex, primitiveIndex);
const material = isNumber(primitive.material)
? data.getMaterial(primitive.material)
: null;
const materialName = (_a = material === null || material === void 0 ? void 0 : material.name) !== null && _a !== void 0 ? _a : `#${primitive.material}`;
if (excludeByMaterialName &&
excludeByMaterialName.includes(materialName)) {
// Skipping this primitive because the material has been excluded.
continue;
}
if (includeOnlyMaterialNames &&
!includeOnlyMaterialNames.includes(materialName)) {
// If we have an include only list, we skip everything else.
continue;
}
const materialFactory = overrideMaterial === null || overrideMaterial === void 0 ? void 0 : overrideMaterial({
data,
mesh,
primitive,
});
const target = new TgdPainterMeshGltf(context, {
name: `${mesh.name}/${(_b = material === null || material === void 0 ? void 0 : material.name) !== null && _b !== void 0 ? _b : ""}`,
asset: data,
meshIndex,
primitiveIndex,
material: materialFactory,
});
targets.push(target);
}
return targets;
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWVzaC1nbGIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvZmFjdG9yeS9tZXNoLWdsYi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFHQSxPQUFPLEVBQ0gsa0JBQWtCLEVBQ2xCLGNBQWMsR0FFakIsTUFBTSxjQUFjLENBQUE7QUFTckIsT0FBTyxFQUFFLFFBQVEsRUFBRSxRQUFRLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQTtBQTJCdEQ7Ozs7Ozs7R0FPRztBQUNILE1BQU0sVUFBVSxxQkFBcUIsQ0FBQyxPQUFrQztJQUdwRSxNQUFNLEVBQUUsSUFBSSxFQUFFLElBQUksR0FBRyxDQUFDLEVBQUUsR0FBRyxPQUFPLENBQUE7SUFDbEMsTUFBTSxVQUFVLEdBQUcsYUFBYSxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsQ0FBQTtJQUM1QyxNQUFNLE9BQU8sR0FBRyxlQUFlLENBQUMsVUFBVSxFQUFFLE9BQU8sQ0FBQyxDQUFBO0lBQ3BELE9BQU8sRUFBRSxPQUFPLEVBQUUsQ0FBQTtBQUN0QixDQUFDO0FBRUQ7O0dBRUc7QUFDSCxTQUFTLGFBQWEsQ0FDbEIsSUFBZ0IsRUFDaEIsSUFBeUM7SUFFekMsSUFBSSxRQUFRLENBQUMsSUFBSSxDQUFDO1FBQUUsT0FBTyxJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFBO0lBQzdDLElBQUksUUFBUSxDQUFDLElBQUksQ0FBQztRQUFFLE9BQU8sSUFBSSxDQUFDLG9CQUFvQixDQUFDLElBQUksQ0FBQyxDQUFBO0lBQzFELE9BQU8sSUFBSSxDQUFBO0FBQ2YsQ0FBQztBQUVELFNBQVMsZUFBZSxDQUNwQixJQUF1QixFQUN2QixPQUFrQztJQUVsQyxNQUFNLE9BQU8sR0FBK0IsRUFBRSxDQUFBO0lBQzlDLElBQUksSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDO1FBQ25CLE9BQU8sQ0FBQyxRQUFRLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQTtJQUN2QyxDQUFDO0lBQ0QsSUFBSSxJ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