UNPKG

@tolokoban/tgd

Version:

ToloGameDev library for WebGL2

87 lines 6.79 kB
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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