Files
anatomia/data-pipeline/scripts/build-cell-model.mjs
T

57 lines
2.3 KiB
JavaScript

// 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.`);