diff --git a/data-pipeline/scripts/extract-manifest.mjs b/data-pipeline/scripts/extract-manifest.mjs index f802d26..9b528c0 100644 --- a/data-pipeline/scripts/extract-manifest.mjs +++ b/data-pipeline/scripts/extract-manifest.mjs @@ -145,6 +145,15 @@ for (const { fbx, key } of SOURCES) { const resolved = resolveSkeletalBone(rawName); const dedupeKey = resolved ? `${resolved.canonicalKey}::${resolved.side}` : null; if (!resolved || includedBones.has(dedupeKey)) { + // Marca explicitamente como excluído (não é um dos 206 ossos — + // é "acidente ósseo"/marcador de origem-inserção muscular ou, + // como no caso das linhas de anotação/ponteiro de rótulo do + // Z-Anatomy original, um objeto sem relação nenhuma com a malha + // do osso, só aninhado dentro dela na hierarquia da FBX). Sem + // essa marca, o frontend (SystemModel.resolveStructure) sobe + // pelos pais à procura de um slug e ACHA o do osso-pai, + // "herdando" visibilidade de algo que devia ficar sempre oculto. + node.setExtras({ excluded: true }); for (const child of node.listChildren()) visit(child); return; } diff --git a/frontend/src/components/viewer/SystemModel.tsx b/frontend/src/components/viewer/SystemModel.tsx index 417a005..6830995 100644 --- a/frontend/src/components/viewer/SystemModel.tsx +++ b/frontend/src/components/viewer/SystemModel.tsx @@ -76,6 +76,11 @@ export function SystemModel({ const bySlug = bySlugInFile.get(slug); if (bySlug) return bySlug; } + // O pipeline marca explicitamente nós que NÃO são um dos 206 ossos + // (acidentes ósseos, marcadores de origem/inserção muscular, linhas + // de anotação do app original) — parar aqui evita que esse nó + // "herde" o slug de um osso-pai ao continuar subindo a árvore. + if (node.userData?.excluded) return undefined; const name = originalNames.current.get(node); if (name) { const byName = byMeshNameInFile.get(name);