Skip to main content
Go to Editor

Documentação

Este guia ajuda-o a começar rapidamente com o JSON Optimizer. Carregar projeto: Use o InputNode para carregar os seus ficheiros .json , .atlas e .png . Escolher

FPSUIYouTubeanimationcom perdasconceitosconectorescontrolosdadosdesempenhoestatísticasexemplosexportfluxo de trabalhofluxosgráficosguiaguideinicianteligaçõesmaismemóriamétricasotimizaçãoplaybackpremium+preçosrecorderrecordingresultadossem perdassubscriçãotabelatimelinetiposvideoviewervisualizadorvídeo

Introdução: fluxo de trabalho básico

iniciantefluxo de trabalhoguia

Este guia ajuda-o a começar rapidamente com o JSON Optimizer. Carregar projeto: Use o InputNode para carregar os seus ficheiros .json , .atlas e .png . Escolher um preset (modo Plus): No modo Plus, use o painel da dir...

Read article

Tipos de socket e fluxo de dados

conectorestiposdadosligações

Este artigo explica os tipos de dados usados pelos sockets no grafo de nós e o que pode ser ligado a quê. Tipos de socket Carga do Spine — representação do projeto Spine amigável para tempo de execução, usada pela mai...

Read article

Planos de subscrição e funcionalidades Premium

subscriçãopremium+maispreços

O re-polish oferece dois níveis de subscrição para diferentes necessidades. Plano Gratuito ✓ Grafo de nós básico ✓ Visualizador JSON ✓ Linha de tempo para reproduzir animações em várias faixas com mistura ajustável en...

Read article

Conceitos fundamentais: com perda vs. sem perda

conceitoscom perdassem perdasiniciante

Os métodos de otimização dividem-se em dois tipos principais: Sem perda: removem apenas dados redundantes, preservando a fidelidade visual... Exemplos: Nó de otimização Spline , CleanupNode . Com perda: simplificam cu...

Read article

Como medir a eficácia

guiamétricasestatísticas

Para compreender a eficácia da sua otimização, preste atenção às seguintes métricas: Tamanho do ficheiro: O tamanho final do ficheiro .json é o principal objetivo da otimização. Contagem de keyframes: No separador "Es...

Read article

Visualizador: painel de controlos

visualizadorcontrolosUI

O separador Visualizador sobrepõe um painel de Controlos em cima da tela. Está dividido em três grupos: Controlos de animação Animação — seleciona qual animação Spine está a ser reproduzida. Aparência — seleciona qual...

Read article

Visualizador: painel de desempenho

desempenhoFPSmemóriaUI

O painel Performance mostra métricas de runtime em tempo real para o(s) skeleton(s) atualmente em reprodução. Tempo real FPS — frames por segundo medidos pelo monitor. Frame Time — tempo por frame em milissegundos (qu...

Read article

Visualizador: Linha temporal

viewertimelineanimationplaybackguide

O painel Linha temporal é um sequenciador de animação ancorável na parte inferior do Visualizador. Permite organizar clipes de animação em múltiplas faixas, controlar a reprodução e pré-visualizar transições. Faixas e...

Read article

Visualizador: Gravador

viewerrecorderrecordingexportvideoguide

O Gravador captura animações Spine do visualizador como vídeo, imagens animadas ou sequências de imagens. Modos de gravação ⚡ Gravação rápida — captura em tempo real usando MediaRecorder + captureStream() . Produz ape...

Read article

Separador Resultados

resultadostabelaotimização

O separador Resultados mostra a saída detalhada da otimização. Tabela de resultados — uma vista com uma linha por alteração dos resultados de otimização do JSON (por exemplo, que animação/osso/propriedade/fotograma‑ch...

Read article

Separador Estatísticas

estatísticasgráficosmétricas

O separador Estatísticas resume os resultados da otimização através de gráficos e métricas agregadas. Gráfico de otimização — visualiza o impacto da otimização no conjunto de dados (quando as otimizações de JSON produ...

Read article

Exemplos de pipelines (Vídeo)

vídeoexemplosfluxosYouTube

Abaixo estão fluxos completos e reais da playlist oficial do YouTube. Abrir a playlist completa Exemplos Experiências Spine2D 1: otimização de curvas com algoritmo RDP — demonstração base de otimização Spine 2D: o alg...

Read article

Nodes

Input

Importa ficheiros de projeto Spine, entradas apenas JSON, recursos de demonstração e pacotes ZIP para o grafo.

Objetivo: Este e o principal ponto de entrada para a maioria dos fluxos de trabalho. Le JSON, atlas e texturas e normaliza-os para dados internos que os nos a jusante conseguem processar.

Modos suportados:
1. Projeto completo: JSON + atlas + texturas
2. Apenas JSON: processa dados de esqueleto/animacao sem atlas
3. Pacote ZIP: um ficheiro zip empacotado que contem um projeto completo
4. Recursos de demonstracao: dados de exemplo incorporados para testes rapidos

Saidas principais:
- **payload_out**: dados normalizados para nos de otimizacao
- **original_json_out**: JSON de origem para comparacao ou reconstrucao
- **atlas_project_out**: projeto de atlas analisado quando sao fornecidas texturas

Video To Png Sequence

Converta um clip de vídeo numa sequência de fotogramas PNG para fluxos de trabalho Spine.

Esta é uma ferramenta de entrada gratuita no menu Input, pensada para fluxos de produção. Suporta chroma key para ecrãs verdes e limpeza de matte ao estilo unpremultiply para fundos pretos. As saídas são enviadas por payload_out e atlas_out.

Picture Input

Adiciona imagens PNG/JPEG independentes a viewport para que possa criar pre-visualizacoes e capturas de apresentacao mais limpas.

Objetivo: Use este no para colocar imagens diretamente na viewport como camadas de apresentacao ou auxiliares visuais. E util quando pretende decorar uma cena, adicionar graficos de apoio e tornar as pre-visualizacoes do projeto mais polidas antes de gravar videos ou demos.

Fluxo de trabalho: Carregue uma imagem e, em seguida, use as ferramentas da viewport para a dimensionar, mover e ajustar o respetivo z-index para que fique corretamente posicionada na composicao. Isto e conveniente para criar capturas de apresentacao apelativas sem tocar nos dados principais do projeto Spine.

Este no e autonomo e nao expoe sockets do grafo.

Version: Formato de versão Spine JSON para o esqueleto stub gerado.
Blending: Modo de mistura para o anexo gerado (normal, aditivo, multiplicar, ecrã).

Psd To Skeletons

Carrega ficheiros PSD/PSB em camadas e gera esqueletos Spine ligados que preservam o layout da cena no Photoshop para previews precisos.

Objetivo: Use este nó quando a cena já foi montada no Photoshop e pretende transformar essa pilha de camadas num conjunto de esqueletos Spine ligados dentro do viewer. Cada camada PSD visível torna-se no seu próprio esqueleto em estilo imagem, posicionado pelas coordenadas do PSD, o que facilita muito a construção do preview e o posicionamento exato dos objetos.

Fluxo no viewer: Depois da geração, continua a poder alterar o draw order no viewer e colocar outros esqueletos entre as camadas PSD importadas, permitindo encaixar personagens ou props Spine adicionais diretamente na composição do Photoshop.

Disponibilidade: Nó gratuito. Este nó é autónomo e não expõe sockets do grafo.

Version: Formato de versão Spine JSON usado para os esqueletos de camada gerados.
Blending: Modo de mistura usado para os attachments gerados.
Load PSD: Abre o seletor PSD/PSB e gera esqueletos de camada ligados a partir do ficheiro escolhido.
File Info: Resumo só de leitura do ficheiro PSD/PSB atualmente carregado.
Layer Count: Contagem só de leitura das camadas visíveis que serão convertidas em esqueletos ligados.
Preflight: Relatório só de leitura sobre problemas nos nomes das camadas detetados antes da geração.

Project Input

Carrega uma pasta ou um arquivo de projeto Spine para o grafo e expõe um ProjectPayload através do socket project_out para nós a jusante preparados para projetos.

Objetivo: Ponto de entrada para fluxos de trabalho baseados em projetos. Analisa uma pasta ou um arquivo de projeto Spine, constrói um ProjectPayload e mantém metadados em cache prontos para nós a jusante como Project Viewer, filtros, Static Bake e Deduplicator.

Controlos:
- **Load Folder**: Abre o seletor de pastas do sistema através da File System Access API, analisa o diretório selecionado, atualiza o resumo, coloca metadados em cache e inicia um file watcher para que alterações posteriores possam ser analisadas novamente.
- **Browse (Fallback)**: Usa um input **webkitdirectory** oculto em navegadores sem **showDirectoryPicker()**. Carrega o projeto, mas sem um handle persistente do diretório, pelo que a monitorização em direto e os rescans fiáveis não estão disponíveis.
- **Load Archive**: Carrega um arquivo **.zip** ou **.spine** como árvore virtual de projeto. Projetos carregados a partir de arquivo não mantêm um handle de diretório, por isso **Rescan** não está disponível por conceção.
- **Rescan**: Volta a analisar a pasta carregada anteriormente quando existe um handle de diretório. Volta a verificar a permissão de leitura antes da análise. Projetos carregados através de fallback browse ou modo de arquivo costumam indicar que nenhum diretório está carregado.
- **Clear Project**: Para a monitorização de ficheiros e limpa o payload atual, o resumo, a execution cache e os metadados de payload em cache.
- **Reset to Defaults**: Repõe apenas os controlos genéricos do nó. **Não** descarrega o projeto atual e não substitui **Clear Project**.
- **Drop folder or .zip here**: Ponto de entrada de drag-and-drop que aceita pastas e arquivos e os encaminha pelo mesmo pipeline de carregamento.

Saídas:
- **project_out**: ProjectPayload com a árvore analisada, a lista plana de ficheiros, os totais de tamanho e a repartição por tipo para nós a jusante preparados para projetos.
- **stats**: Saída de diagnóstico apenas para DEV.

Output

Recolhe os resultados finais e permite descarregar dados otimizados como ficheiros separados, conjuntos de ficheiros agrupados ou arquivos.

Objetivo: Atua como o centro de exportacao para JSON otimizado, dados de atlas, texturas e sprites. Pode montar resultados a partir de um unico conjunto JSON/atlas/texturas, de varios conjuntos de ficheiros ou apenas de sprites quando pretende saida de imagem sem reconstruir um projeto Spine completo.

Opcoes de exportacao:
- Descarregar ficheiros individualmente ou como um unico arquivo
- Descarregar resultados empacotados ou um arquivo com ficheiros descompactados
- Exportar JSON em formato compacto ou num formato legivel com pretty print
- Exportar dados completos do projeto Spine ou apenas resultados de sprite/imagem

Fluxo de encadeamento: O OutputNode nao tem de ser o fim absoluto do grafo. Pode passar as suas saidas para outra fase do pipeline e executar os mesmos ficheiros atraves de passes adicionais de otimizacao. Na pratica, a otimizacao de chaves e curvas foi testada ate 3 iteracoes consecutivas.

Saidas principais:
- **reconstructed_json_out**: JSON Spine reconstruido
- **original_json_passthrough_out**: passagem direta do JSON original
- **payload_out**: payload para encadeamento adicional
- **changes**: alteracoes de otimizacao recolhidas
- **atlas_assets**: recursos de atlas prontos para exportacao

RDP

Simplifica curvas de animação (RDP).

Objetivo: Reduz o número de keyframes em segmentos de animação lineares ou quase lineares removendo pontos que estão numa linha reta entre outros dois.

Regra de Ouro: Desativada por predefinição. Protege curvas com forma significativa (área/curvatura) contra linearização. Desative apenas para compressão mais agressiva após revisão visual.

Chaves de socket: payload_in, payload_out, changes

Epsilon: Desvio máximo da curva original. Valores mais altos removem mais keyframes mas podem perder detalhes da curva.
Steep: Limiar de sensibilidade à curvatura. Protege curvas complexas de serem achatadas para lineares.
Round Mode: Modo de arredondamento para valores otimizados: nenhum (manter original), décimos (1 casa decimal), inteiros.
Golden Rule: Quando ativado, protege curvas com forma/área significativa de serem simplificadas pelo RDP.
S Run Length: Número mínimo de curvas S padrão do Spine consecutivas necessário antes de esta linearização baseada em modelo ser ativada. Defina 0 para desativar a funcionalidade.
S Deviation: Desvio normalizado permitido em relação ao modelo padrão de curva S do Spine, em permilagem (0-300). Valores mais baixos exigem uma correspondência mais próxima; valores mais altos linearizam mais sequências próximas do modelo.

Spline

Otimização de curvas com splines.

Objetivo: Ajuste suave de curvas mantendo a qualidade visual.

Chaves de socket: payload_in, payload_out, changes

Max Error: Erro máximo de aproximação permitido para ajuste de spline. Menor = ajuste mais preciso ao original.
Min Group Size: Número mínimo de keyframes lineares consecutivos necessários para formar um grupo removível.

Refit

Refit de curvas (Bezier) para reduzir keyframes.

Objetivo: Ajusta menos curvas mantendo-se dentro de uma tolerância.

Chaves de socket: payload_in, payload_out, changes

Error Tolerance: Desvio máximo permitido entre a curva original e a Bézier ajustada. Menor = correspondência mais precisa.
Max Iterations: Número de iterações de otimização para ajuste de curva. Mais iterações = melhor ajuste mas mais lento.

Quantizer

Reduz a precisão de valores numéricos em keyframes e curvas.

Objetivo: forma simples mas eficaz de reduzir o tamanho do ficheiro ao arredondar números para um número específico de casas decimais.

Utilização: pode ser aplicado a quase todos os dados de animação. Torna-se mais eficaz com contagens de keyframes mais elevadas.

Atenção: uma quantização demasiado agressiva (baixa precisão) pode causar jitter ou artefactos visuais nas animações.

Precision: Número de casas decimais para valores de keyframe. Menos = ficheiro mais pequeno mas menor precisão.

Cleanup

Executa várias tarefas de limpeza para remover dados de animação redundantes ou desnecessários.

Objetivo: ferramenta especializada para remover tipos específicos de dados redundantes que outros otimizadores podem não detetar.

Utilização: ligue o seu payload a 'payload_in' e use o resultado de 'payload_out'. Se quiser um relatório por alteração, use também 'changes'.

Chaves de socket:
- Entradas: payload_in
- Saídas: payload_out, changes

Limpezas atualmente suportadas:
1. **Remover tracks de cor/alpha não usados**: remove timelines de cor/alpha para slots que nunca ficam visíveis durante a animação.
2. **Remover rotações IK redundantes**: remove keyframes de rotação de bones totalmente controlados por uma constraint IK com mix a 100%.
3. **Remover keys de Path Constraint**: remove keyframes de rotate/translate de bones totalmente controlados por uma path constraint (mix a 100%).
4. **Sanitizar caracteres não ingleses**: substitui caracteres não ingleses em nomes/identificadores para evitar problemas em ferramentas posteriores.

Remove Unused Color Tracks: Remover componentes de cor/alfa que nunca mudam do valor predefinido.
Remove Redundant IKRotation: Remover keyframes de rotação de ossos totalmente controlados por restrições IK.
Remove Redundant Path Constraint Keys: Remover keyframes de restrição de caminho que duplicam valores de configuração.
Sanitize Non English Characters: Substituir caracteres não-ASCII em nomes de ossos/slots por equivalentes seguros.

Scale

Escala todos os valores numéricos nos keyframes de animação por um fator especificado.

Objetivo: escala uniformemente os dados de animação, útil para redimensionar o skeleton proporcionalmente ou ajustar a intensidade da animação.

Utilização: ligue ao payload e defina o fator de escala. Valores acima de 1.0 aumentam; abaixo de 1.0 reduzem.

Parâmetros:
- **Scale Factor**: multiplicador aplicado a todos os valores de posição e tamanho.
- **Include Rotations**: se também deve escalar valores de rotação (normalmente desativado).

Casos de uso:
- Redimensionar animações importadas para corresponder a novas dimensões do skeleton
- Criar variantes exageradas ou subtis de animações
- Escalonar em lote várias animações para diferentes tamanhos de personagem

Scale Bones: Escalar posições e tamanhos dos ossos.
Scale Attachments: Escalar posições e tamanhos dos anexos.
Scale Animations: Escalar keyframes da animação.
Scale Constraints: Escalar parâmetros de restrições.
Scale Path: Escalar dados do caminho.

Schneider

Ajusta curvas Bézier suaves a keyframes de animação usando o algoritmo de ajuste de curvas Schneider.

Objetivo: ajuste avançado de curvas que produz curvas Bézier com aspeto natural a partir de sequências densas de keyframes.

Disponibilidade: **Somente nó Plus**.

Como funciona: o algoritmo Schneider analisa posições e tangentes dos keyframes para gerar pontos de controlo Bézier ótimos que correspondem de perto ao movimento original.

Parâmetros:
- **Error Tolerance**: desvio máximo permitido em relação aos keyframes originais. Menor = mais preciso; maior = curvas mais suaves.
- **Corner Angle**: limiar de ângulo (graus) a partir do qual a curva deve ser dividida em segmentos.

Melhor para:
- Animações desenhadas à mão ou importadas com muitos keyframes
- Converter interpolação linear em curvas Bézier suaves
- Reduzir a contagem de keyframes mantendo a qualidade da curva

Nota: mais intensivo computacionalmente do que algoritmos mais simples como RDP, mas produz qualidade de curva superior.

Min Segment Size: Número mínimo de keyframes num segmento para processamento.

Physics Constraint Bake

Bake Physics Constraints to Keys: converte o movimento do PhysicsConstraint em keyframes de rotação/translação e remove timelines de física.

Objetivo: converte a simulação de física em tempo de execução em keyframes explícitos, tornando as animações determinísticas e editáveis sem PhysicsConstraints. Após o bake, remove PhysicsConstraints e timelines de física do payload.

Disponibilidade: **Somente nó Plus**.

Entradas/Saídas:
- **payload_in** → **payload_out** (baked)
- **changes** (lista opcional de alterações)

Controlos:
- **Sample FPS**: taxa de amostragem da simulação.
- **Bake Rotation**: grava keyframes de rotação.
- **Bake Translation**: grava keyframes de translação.
- **Bake Translation (Children)**: aplica o bake de translação aos ossos filhos que dependem do movimento físico.

Notas:
- Requer o Spine JSON original para reconstruir os dados de simulação.
- Use quando quiser remover PhysicsConstraints, mas manter o movimento.

Attachment Visibility

Otimiza a renderização ao definir o attachment de um slot como null quando o seu alpha é zero.

Objetivo: impede que o motor de jogo tenha de processar ou renderizar attachments invisíveis.

Utilização: analisa tracks de alpha/cor e adiciona ou modifica automaticamente keyframes no track 'attachment' correspondente.

Parâmetros:
- **Alpha Threshold**: valor de alpha abaixo do qual um attachment é considerado invisível.
- **Auto Restore**: se ativado, o nó repõe automaticamente o último attachment visível quando o alpha sobe acima do limiar.

Payload Merger

Combina vários payloads de animação processados de volta num único payload unificado.

Objetivo: essencial para pipelines de processamento em paralelo, onde diferentes animações ou grupos de bones são otimizados separadamente e precisam de ser recombinados.

Estratégia de merge:
1. **Entrada base**: fornece a estrutura do skeleton (bones, slots, skins, etc.)
2. **Entradas de override**: fornecem tracks processados que substituem os tracks da base
3. **Last Write Wins**: quando vários overrides fornecem o mesmo track, o último tem prioridade

Deteção de conflitos:
- Conflitos entre entradas de override são detetados e reportados
- Substituição Base → Override é comportamento normal (não é um conflito)
- Um toast de aviso é mostrado quando ocorrem conflitos de tracks

Exemplo de pipeline:
```
Input → AnimFilter('run') → Cleanup ───────┐
      → AnimFilter('idle') → Quantizer ────┤
      → (base) ────────────────────────────→ Merger → Output
```

Casos de uso:
- Otimizadores diferentes para animações diferentes
- Processamento separado de bones/slots com recombinação
- Testes A/B de diferentes estratégias de otimização

Warn conflicts: Mostrar avisos em conflitos de fusão de payload.

Animation Viewer

Ferramenta visual para inspecionar e comparar curvas de animação antes e depois da otimização.

Objetivo: fornece uma representação gráfica de keyframes e curvas para o track selecionado.

Utilização: ao ligar as entradas 'payload_before' e 'payload_after', sobrepõe as curvas original e otimizada, facilitando ver o impacto das suas otimizações.

Show changed: Mostrar apenas animações modificadas.
Animation: Seleção de animação para visualização.
Target: Osso/slot alvo para visualização.
Property: Propriedade a apresentar (rotação, translação, etc.).

Project Viewer

Displays a Spine project from the project_in socket for inspection and preview without mutating the incoming data.

Deduplicator

Deduplicates atlas projects by consuming project_inputs and returning payloads, atlas_projects, original_jsons, and shared_atlas_out for canonicalized downstream workflows.

The Deduplicator node scans all atlas regions for visually identical or near-identical sprites. It merges duplicates by choosing a canonical representative and remapping references. Several thresholds control detection sensitivity for different sprite types (glow, solid, alpha). Optionally constrains the output canonical atlas dimensions. A verification pass ensures the deduplicated result is visually equivalent to the original within the specified RMSE tolerance.

Repack mode: Modo de reempacotamento após desduplicação.
Glow threshold: Limiar para detetar sprites com efeito de brilho.
Solid threshold: Limiar para detetar sprites sólidos.
Min sprite area: Área mínima do sprite para análise (pixéis²).
Alpha hash threshold: Limiar de hash alfa para comparação.
Verification threshold: Limiar de verificação de duplicados.
Color rmse threshold: Limiar de RMSE de cor para deteção de duplicados.
Constrain canonical atlas size: Restringir o tamanho canónico do atlas.
Max canonical atlas width: Largura máxima do atlas canónico.
Max canonical atlas height: Altura máxima do atlas canónico.

Animation Filter

Filtra tracks de animação com base no nome da animação (por exemplo, 'run', 'idle').

Objetivo: útil para aplicar estratégias de otimização diferentes a animações diferentes.

Utilização: por exemplo, pode aplicar otimizações agressivas com perda (como DCT) a animações de personagens de fundo, enquanto usa otimizações sem perda (como Spline) para ações da personagem principal.

Asset Filter

Filtra assets de atlas por nome; funciona em dois modos: antes do unpacker (filtra texto do atlas) ou após o unpacker (filtra sprites).

Objetivo: controla quais os recursos incluídos no fluxo de trabalho — quais os recursos a desempacotar do atlas e quais os sprites desempacotados a incluir no reempacotamento.

Modos:
1. MODO PRÉ-DESEMPACOTADOR (antes do AtlasUnpacker):
   - Entrada: atlas_in (atlas_project)
   - Saída: atlas_out (atlas_project filtrado)
   - Fluxo: InputNode → AssetFilter → AtlasUnpacker
   - Caso de uso: filtrar quais os recursos a desempacotar do atlas (poupa tempo de processamento)

2. MODO PÓS-DESEMPACOTADOR (após o AtlasUnpacker):
   - Entrada: sprites_in (sprites)
   - Saída: sprites_out (sprites filtrados)
   - Fluxo: AtlasUnpacker → AssetFilter → AtlasRepacker
   - Caso de uso: filtrar quais os sprites desempacotados a incluir no atlas final

Comportamento da interface:
- No modo PRÉ-DESEMPACOTADOR: analisa o texto do atlas para descobrir nomes de recursos
- No modo PÓS-DESEMPACOTADOR: descobre nomes de recursos a partir do array de sprites
- Alternador 'Permitir tudo': quando ativado, deixa passar todos os recursos (a lista é mostrada mas desativada)
- Caixas de seleção: selecione recursos específicos para incluir (quando 'Permitir tudo' está desativado)

Exemplos:
- Pré-desempacotador: selecionar apenas recursos 'char_*' para desempacotar só sprites da personagem
- Pós-desempacotador: excluir sprites 'background_*' do atlas final reempacotado
- Criar um atlas só de armas selecionando o padrão 'weapon_*'

Bone Filter

Filtra tracks de animação de bones com base no nome da bone.

Objetivo: permite direcionar ou excluir bones específicas do processo de otimização.

Utilização: pode querer excluir bones sensíveis, como as usadas para expressões faciais, de uma otimização agressiva para preservar todos os detalhes, enquanto otimiza mais fortemente bones menos importantes.

Skin Filter

Filtra dados de animação e assets com base nos nomes das skins.

Objetivo: processar apenas skins específicas de um projeto Spine com múltiplas skins.

Utilização: quando um projeto Spine tem várias skins (por exemplo, 'default', 'armor', 'casual'), este nó permite filtrar quais as skins a incluir no processamento.

Parâmetros:
- **Skins List**: checkboxes para cada skin disponível
- **Allow All**: alternador para incluir todas as skins (padrão)

Casos de uso:
- Criar um atlas separado por skin
- Aplicar otimizações diferentes a skins diferentes
- Excluir skins raramente usadas do build otimizado

Nota: as skins partilham a estrutura do skeleton, mas podem ter attachments diferentes.

Slot Filter

Filtra tracks de animação de slots com base no nome do slot.

Objetivo: útil para direcionar ou excluir slots específicos que possam ter requisitos especiais de timing ou visibilidade.

Utilização: pode usar isto para excluir slots de armas ou efeitos que são trocados via código, evitando que sejam afetados por otimizações de visibilidade de attachments.

Parameter Filter

Filtra tracks de animação com base no tipo de propriedade (por exemplo, rotação, escala, cor).

Objetivo: permite aplicar otimizações subsequentes apenas a tipos específicos de dados de animação.

Utilização: coloque este nó antes de um otimizador para limitar o seu âmbito. Por exemplo, pode aplicar a otimização RDP apenas a tracks de 'translation' e 'scale'.

Atlas Unpacker

Extrai sprites individuais de um atlas de texturas Spine.

Objetivo: decompõe um ficheiro de atlas nos seus sprites componentes, permitindo análise individual ou reempacotamento.

Utilização: ligue a saída 'atlas_project' do InputNode à entrada 'atlas_project_in' deste nó. A saída pode então ser enviada para o AssetViewer para inspeção ou para o AtlasRepacker para otimização.

⭐ Corte por malha (Mesh Cropping): ligue a saída 'Original JSON' do InputNode à entrada 'Skeleton JSON' para ativar o corte automático dos sprites aos limites da sua malha (em vez de bounds retangulares). Isto reduz significativamente a utilização de memória de texturas para sprites com mesh attachments, removendo píxeis transparentes fora do contorno da malha.

Saídas:
- **sprites_out**: Array de sprites normalizado (para viewer/repacker)
- **sprites_data_out**: Imagens/metadados de sprites extraídos (bundle estruturado)
- **atlas_out**: Pass-through do projeto de atlas

Chaves de socket: atlas_project, atlas_project_in, skeleton_json_in, sprites_out, sprites_data_out, atlas_out

Atlas Repacker

Reempacota sprites individuais em um ou mais novos atlases de texturas otimizados.

Objetivo: este nó otimiza a memória de texturas e, quando possível, reduz chamadas de desenho ao criar folhas de imagens mais eficientes.

Utilização: recebe dados de imagens (normalmente do nó de desempacotamento de atlas) e cria uma nova disposição do atlas.

Parâmetros:
- **Tamanho máximo da textura**: largura/altura máximas das páginas de atlas de saída.
- **Preenchimento**: distância em píxeis entre imagens.
- **Escala**: redimensiona as imagens antes do empacotamento.
- **Potência de dois**: impõe dimensões de saída para potências de dois (por exemplo, 1024, 2048), exigido por algumas plataformas.
- **Permitir rotação**: permite rodar as imagens 90 graus para melhorar a eficiência do empacotamento.

Min Page Width: Largura mínima da página do atlas em pixéis.
Min Page Height: Altura mínima da página do atlas em pixéis.
Max Page Width: Largura máxima da página do atlas em pixéis.
Max Page Height: Altura máxima da página do atlas em pixéis.
Padding X: Espaçamento horizontal entre sprites em pixéis.
Padding Y: Espaçamento vertical entre sprites em pixéis.
Edge Padding: Espaçamento das margens da página do atlas.
Duplicate Padding: Duplicar pixéis da margem para prevenir artefactos de filtragem.
Alpha Mode: Modo alfa: PMA (alfa pré-multiplicado) ou direto.
Alpha Threshold: Limiar de alfa para cortar pixéis invisíveis.
Strip Whitespace X: Cortar pixéis vazios horizontalmente.
Strip Whitespace Y: Cortar pixéis vazios verticalmente.
Color Bleed Radius: Raio de sangria de cor para prevenir costuras durante a filtragem.
Scale: Fator de escala aplicado a todos os sprites antes do empacotamento.
Power Of Two: Arredondar dimensões da página para potência de dois.
Divisible By4: Arredondar dimensões da página para múltiplos de 4 (para compressão de textura).
Square: Forçar páginas quadradas.
Allow Rotation: Permitir rotação de 90° dos sprites para melhor empacotamento.
Packer Type: Algoritmo de empacotamento: MaxRects ou Shelf.

Atlas Viewer

Ferramenta leve de visualização e análise de atlas para inspecionar a estrutura antes do unpacking.

Objetivo: fornece uma forma rápida de pré-visualizar páginas e regiões do atlas sem executar a operação pesada de unpacking. Ajuda a validar a estrutura do atlas e a identificar regiões não utilizadas.

Utilização: ligue a saída 'atlas_project' do InputNode à entrada 'atlas'. Opcionalmente, ligue 'original_json_out' à entrada 'json' para analisar o uso das regiões.

Funcionalidades:
- Pré-visualização das páginas do atlas com limites das regiões
- Realce de regiões: Verde = usada, Vermelho = não usada no skeleton
- Controlos de navegação entre páginas
- Estatísticas com total e regiões não utilizadas

Casos de uso:
- Validação rápida do atlas antes da otimização
- Identificar peso morto (regiões não utilizadas)
- Depurar problemas de packing do atlas
- Compreender a estrutura dos assets

Chaves de socket: atlas_project, atlas_in, atlas, json

Page Info: Dimensões e informações da página do atlas.
Stats: Estatísticas de utilização de espaço e contagem de sprites.

Atlas Merger

Combina várias fontes de atlas num único atlas unificado.

Objetivo: fundir vários projetos de atlas num só.

Entrada:
- **atlas_inputs**: array multi-entrada de projetos de atlas

Saídas:
- **atlas_out**: projeto de atlas fundido
- **merged_out**: saída fundida legada
- **merged_atlas_out**: saída fundida legada

Casos de uso:
- Combinar o atlas da personagem com o atlas de armas
- Fundir sprites base com conteúdo DLC
- Recompor após processamento paralelo de atlas

Pipeline típico:
```
InputA → Unpacker → Repacker ─┐
                               ├→ Atlas Merger → Unpacker → Repacker → Output
InputB → Unpacker → Repacker ─┘
```
Antes do Repacker, os dados são sprites individuais; depois do Repacker tornam-se um projeto de atlas. O Atlas Merger combina os projetos de atlas, e uma passagem final Unpacker → Repacker reempacota tudo de forma mais compacta num único atlas unificado.

Asset Viewer

Mostra sprites individuais de um atlas desempacotado.

Objetivo: ferramenta visual de depuração para manipulação de atlas.

Utilização: aceita 'sprites_data' do nó Atlas Unpacker e permite ver cada imagem extraída, rever as suas propriedades (dimensões, rotação, etc.) e verificar a correção visual após o unpacking.

Asset select: Seleção de recurso para visualização.
Pixel stats: Mostrar estatísticas de pixéis do recurso.