@tolokoban/tgd
Version:
ToloGameDev library for WebGL2
87 lines • 6.79 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(meshIndexOrName, options) {
if (!isNumber(meshIndexOrName))
return [];
const { data, context, overrideMaterial, excludeByMaterialName, includeOnlyMaterialNames } = options;
const mesh = data.getMeshOrThrow(meshIndexOrName);
const targets = [];
for (let primitiveIndex = 0; primitiveIndex < mesh.primitives.length; primitiveIndex++) {
const primitive = data.getMeshPrimitive(meshIndexOrName, primitiveIndex);
const material = isNumber(primitive.material) ? data.getMaterial(primitive.material) : null;
const materialName = material?.name ?? `#${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?.({
data,
mesh,
primitive,
});
const target = new TgdPainterMeshGltf(context, {
name: `${mesh.name}/${material?.name ?? ""}`,
asset: data,
meshIndexOrName: meshIndexOrName,
primitiveIndex,
material: materialFactory,
skybox: options.skybox,
});
targets.push(target);
}
return targets;
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWVzaC1nbGIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvZmFjdG9yeS9tZXNoLWdsYi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFHQSxPQUFPLEVBQUUsa0JBQWtCLEVBQXlDLGNBQWMsRUFBRSxNQUFNLGNBQWMsQ0FBQTtBQUt4RyxPQUFPLEVBQUUsUUFBUSxFQUFFLFFBQVEsRUFBRSxNQUFNLG1CQUFtQixDQUFBO0FBNEJ0RDs7Ozs7OztHQU9HO0FBQ0gsTUFBTSxVQUFVLHFCQUFxQixDQUFDLE9BQWtDO0lBR3BFLE1BQU0sRUFBRSxJQUFJLEVBQUUsSUFBSSxHQUFHLENBQUMsRUFBRSxHQUFHLE9BQU8sQ0FBQTtJQUNsQyxNQUFNLFVBQVUsR0FBRyxhQUFhLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxDQUFBO0lBQzVDLE1BQU0sT0FBTyxHQUFHLGVBQWUsQ0FBQyxVQUFVLEVBQUUsT0FBTyxDQUFDLENBQUE7SUFDcEQsT0FBTyxFQUFFLE9BQU8sRUFBRSxDQUFBO0FBQ3RCLENBQUM7QUFFRDs7R0FFRztBQUNILFNBQVMsYUFBYSxDQUFDLElBQWdCLEVBQUUsSUFBeUM7SUFDOUUsSUFBSSxRQUFRLENBQUMsSUFBSSxDQUFDO1FBQUUsT0FBTyxJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFBO0lBQzdDLElBQUksUUFBUSxDQUFDLElBQUksQ0FBQztRQUFFLE9BQU8sSUFBSSxDQUFDLG9CQUFvQixDQUFDLElBQUksQ0FBQyxDQUFBO0lBQzFELE9BQU8sSUFBSSxDQUFBO0FBQ2YsQ0FBQztBQUVELFNBQVMsZUFBZSxDQUFDLElBQXVCLEVBQUUsT0FBa0M7SUFDaEYsTUFBTSxPQUFPLEdBQStCLEVBQUUsQ0FBQTtJQUM5QyxJQUFJLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQztRQUNuQixPQUFPLENBQUMsUUFBUSxHQUFHLElBQUksQ0FBQyxXQUFXLENBQUE7SUFDdkMsQ0FBQztJQUNELElBQUksSUFBSSxD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