// Lê citologia-raw.glb (gerado por fetch-cell-organelles.py a partir de // dados REAIS de FIB-SEM do Janelia OpenOrganelle/CellMap — ver aquele // script para a curadoria completa e a licença CC BY 4.0), simplifica e // comprime com o MESMO recipe já usado pras malhas do Z-Anatomy em // extract-manifest.mjs, e salva o resultado final em seed/models/citologia.glb. // // Diferente do Z-Anatomy, aqui não precisamos marcar nós excluídos nem // resolver nomes duplicados — o .glb de entrada já tem exatamente 5 nós, // um por organela, com o nome final (ex: "celula-nucleo") definido no // próprio script Python. weld/simplify/dedup/meshopt só afetam a // geometria, não o nome dos nós, então o "meshName" no manifesto // (build-manifest-cell.mjs) pode confiar que bate exatamente com isso. import { NodeIO } from "@gltf-transform/core"; import { ALL_EXTENSIONS } from "@gltf-transform/extensions"; import { prune, dedup, weld, simplify, meshopt } from "@gltf-transform/functions"; import { MeshoptSimplifier, MeshoptEncoder } from "meshoptimizer"; import path from "node:path"; import { fileURLToPath } from "node:url"; import { mkdirSync } from "node:fs"; await MeshoptSimplifier.ready; await MeshoptEncoder.ready; const __dirname = path.dirname(fileURLToPath(import.meta.url)); const IN_PATH = path.resolve(__dirname, "../converted/citologia/citologia-raw.glb"); const OUT_DIR = path.resolve(__dirname, "../seed/models"); mkdirSync(OUT_DIR, { recursive: true }); const io = new NodeIO() .registerExtensions(ALL_EXTENSIONS) .registerDependencies({ "meshopt.encoder": MeshoptEncoder }); console.log(`Lendo ${IN_PATH}...`); const doc = await io.read(IN_PATH); const meshNames = doc .getRoot() .listNodes() .map((n) => n.getName()) .filter(Boolean); console.log(`Organelas encontradas: ${meshNames.join(", ")}`); await doc.transform( weld(), // As organelas maiores (membrana, RE) chegam com bem mais geometria do // que o necessário pra estudo interativo — mesmo ratio conservador já // usado no resto do atlas. simplify({ simplifier: MeshoptSimplifier, ratio: 0.5, error: 0.01 }), prune(), dedup(), meshopt({ encoder: MeshoptEncoder, level: "medium" }), ); const outPath = path.join(OUT_DIR, "citologia.glb"); await io.write(outPath, doc); console.log(`✓ ${outPath} salvo.`);