primocode 10.13.0 → 10.14.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +66 -12
- package/bin/primocode.js +148 -8
- package/lib/act.js +48 -1
- package/lib/catalogo.js +12 -1
- package/lib/config.js +1 -0
- package/lib/estudio/cota.js +150 -0
- package/lib/estudio/dados/projetos/clube-ad5.json +105 -0
- package/lib/estudio/dados/projetos/clube-ae-sem-memoria.json +107 -0
- package/lib/estudio/dados/projetos/clube-agent.json +120 -0
- package/lib/estudio/dados/projetos/clube-antes-e-agora.json +86 -0
- package/lib/estudio/dados/projetos/clube-apresentando-clube.json +110 -0
- package/lib/estudio/dados/projetos/clube-bluevisa.json +106 -0
- package/lib/estudio/dados/projetos/clube-caught-in-the-fire.json +127 -0
- package/lib/estudio/dados/projetos/clube-chat-cliente-satisfeito.json +98 -0
- package/lib/estudio/dados/projetos/clube-chatgpt-anuncios.json +120 -0
- package/lib/estudio/dados/projetos/clube-claude-dj.json +140 -0
- package/lib/estudio/dados/projetos/clube-claude-mcp.json +142 -0
- package/lib/estudio/dados/projetos/clube-cleanui.json +106 -0
- package/lib/estudio/dados/projetos/clube-clinica-take-unico.json +128 -0
- package/lib/estudio/dados/projetos/clube-clinica.json +104 -0
- package/lib/estudio/dados/projetos/clube-clube-opener.json +125 -0
- package/lib/estudio/dados/projetos/clube-clube.json +108 -0
- package/lib/estudio/dados/projetos/clube-codigo.json +101 -0
- package/lib/estudio/dados/projetos/clube-distilbook.json +104 -0
- package/lib/estudio/dados/projetos/clube-drive-upload.json +115 -0
- package/lib/estudio/dados/projetos/clube-dub.json +119 -0
- package/lib/estudio/dados/projetos/clube-enxovaly.json +105 -0
- package/lib/estudio/dados/projetos/clube-fecha7.json +118 -0
- package/lib/estudio/dados/projetos/clube-filatov.json +128 -0
- package/lib/estudio/dados/projetos/clube-frame.json +108 -0
- package/lib/estudio/dados/projetos/clube-glass.json +118 -0
- package/lib/estudio/dados/projetos/clube-letra-em-apps.json +84 -0
- package/lib/estudio/dados/projetos/clube-letra-globo-3d.json +111 -0
- package/lib/estudio/dados/projetos/clube-letra-nos-apps.json +146 -0
- package/lib/estudio/dados/projetos/clube-letra-seis-mundos.json +100 -0
- package/lib/estudio/dados/projetos/clube-lula-3.json +146 -0
- package/lib/estudio/dados/projetos/clube-morph.json +119 -0
- package/lib/estudio/dados/projetos/clube-motion-designer.json +115 -0
- package/lib/estudio/dados/projetos/clube-motion-pacote.json +112 -0
- package/lib/estudio/dados/projetos/clube-movimento.json +103 -0
- package/lib/estudio/dados/projetos/clube-not-like-us.json +117 -0
- package/lib/estudio/dados/projetos/clube-pinterest-inspiracao.json +86 -0
- package/lib/estudio/dados/projetos/clube-pixel-e-tinta.json +108 -0
- package/lib/estudio/dados/projetos/clube-ponte.json +118 -0
- package/lib/estudio/dados/projetos/clube-processo-edit-tonal.json +126 -0
- package/lib/estudio/dados/projetos/clube-processo-motion-100-ia.json +109 -0
- package/lib/estudio/dados/projetos/clube-promo.json +114 -0
- package/lib/estudio/dados/projetos/clube-proposito.json +115 -0
- package/lib/estudio/dados/projetos/clube-rankhog.json +128 -0
- package/lib/estudio/dados/projetos/clube-recursao.json +116 -0
- package/lib/estudio/dados/projetos/clube-revelar.json +118 -0
- package/lib/estudio/dados/projetos/clube-robo.json +125 -0
- package/lib/estudio/dados/projetos/clube-shelby-ep2.json +144 -0
- package/lib/estudio/dados/projetos/clube-shelby.json +97 -0
- package/lib/estudio/dados/projetos/clube-solar-eclipse.json +96 -0
- package/lib/estudio/dados/projetos/clube-soldier.json +128 -0
- package/lib/estudio/dados/projetos/clube-som-de-cena.json +108 -0
- package/lib/estudio/dados/projetos/clube-spotify-candidatura.json +112 -0
- package/lib/estudio/dados/projetos/clube-tda-app.json +118 -0
- package/lib/estudio/dados/projetos/clube-tda-ia.json +75 -0
- package/lib/estudio/dados/projetos/clube-telegram-chat.json +118 -0
- package/lib/estudio/dados/projetos/clube-telegram-ilha.json +106 -0
- package/lib/estudio/dados/projetos/clube-tennessee-nike.json +132 -0
- package/lib/estudio/dados/projetos/clube-tudo-se-move.json +112 -0
- package/lib/estudio/dados/projetos/clube-uiad.json +107 -0
- package/lib/estudio/dados/projetos/clube-viralgrow.json +108 -0
- package/lib/estudio/dados/projetos/clube-whose-side.json +140 -0
- package/lib/estudio/dados/projetos/clube-youtube-inscrever.json +108 -0
- package/lib/estudio/dados/projetos/elementos-do-site-em-movimento.json +49 -0
- package/lib/estudio/dados/projetos/explainer-narrado.json +51 -0
- package/lib/estudio/dados/projetos/lancamento-de-produto.json +51 -0
- package/lib/estudio/dados/projetos/motion-so-com-sons.json +50 -0
- package/lib/estudio/dados/projetos/titulo-em-after-effects.json +51 -0
- package/lib/estudio/dados/projetos/tour-de-saas.json +50 -0
- package/lib/estudio/dados/projetos-ae/antes-e-agora/ae/cenas.jsx +733 -0
- package/lib/estudio/dados/projetos-ae/antes-e-agora/assets/fazer_assets.py +88 -0
- package/lib/estudio/dados/projetos-ae/letra-em-apps/ae/cenas.jsx +402 -0
- package/lib/estudio/dados/projetos-ae/letra-em-apps/assets/preparar_assets.py +17 -0
- package/lib/estudio/dados/projetos-ae/letra-em-apps/assets/svg_para_ae.py +25 -0
- package/lib/estudio/dados/projetos-ae/letra-nos-apps/BRIEF-AGENTES.md +31 -0
- package/lib/estudio/dados/projetos-ae/letra-nos-apps/README.md +53 -0
- package/lib/estudio/dados/projetos-ae/letra-nos-apps/ROTEIRO-CENAS.md +69 -0
- package/lib/estudio/dados/projetos-ae/letra-nos-apps/ae/A-agenda.jsx +148 -0
- package/lib/estudio/dados/projetos-ae/letra-nos-apps/ae/B-docs.jsx +174 -0
- package/lib/estudio/dados/projetos-ae/letra-nos-apps/ae/C-alttab.jsx +113 -0
- package/lib/estudio/dados/projetos-ae/letra-nos-apps/ae/D-spotify.jsx +118 -0
- package/lib/estudio/dados/projetos-ae/letra-nos-apps/ae/E-notas.jsx +146 -0
- package/lib/estudio/dados/projetos-ae/letra-nos-apps/ae/F-jornal1.jsx +144 -0
- package/lib/estudio/dados/projetos-ae/letra-nos-apps/ae/G-google.jsx +153 -0
- package/lib/estudio/dados/projetos-ae/letra-nos-apps/ae/H-mapa.jsx +176 -0
- package/lib/estudio/dados/projetos-ae/letra-nos-apps/ae/I-imagens.jsx +132 -0
- package/lib/estudio/dados/projetos-ae/letra-nos-apps/ae/J-jornal2.jsx +191 -0
- package/lib/estudio/dados/projetos-ae/letra-nos-apps/ae/K-maps.jsx +184 -0
- package/lib/estudio/dados/projetos-ae/letra-nos-apps/ae/camera-movimentos.jsx +48 -0
- package/lib/estudio/dados/projetos-ae/letra-nos-apps/ae/camera.jsx +57 -0
- package/lib/estudio/dados/projetos-ae/letra-nos-apps/ae/card-spotify.jsx +98 -0
- package/lib/estudio/dados/projetos-ae/letra-nos-apps/ae/digitar.jsx +38 -0
- package/lib/estudio/dados/projetos-ae/letra-nos-apps/ae/jornal-comum.jsx +196 -0
- package/lib/estudio/dados/projetos-ae/letra-nos-apps/ae/letra.jsx +23 -0
- package/lib/estudio/dados/projetos-ae/letra-nos-apps/ae/letra_automatica.py +83 -0
- package/lib/estudio/dados/projetos-ae/letra-nos-apps/ae/montagem.jsx +74 -0
- package/lib/estudio/dados/projetos-ae/letra-nos-apps/ae/w-agenda/render_html.py +13 -0
- package/lib/estudio/dados/projetos-ae/letra-nos-apps/ae/w-agenda/util.jsx +162 -0
- package/lib/estudio/dados/projetos-ae/letra-nos-apps/ae/w-midia-comum.jsx +114 -0
- package/lib/estudio/dados/projetos-ae/letra-nos-apps/ae/wg-util.jsx +360 -0
- package/lib/estudio/dados/projetos-ae/letra-nos-apps/assets/F-jornal1/render_html.py +13 -0
- package/lib/estudio/dados/projetos-ae/letra-nos-apps/assets/render_w-midia.py +26 -0
- package/lib/estudio/dados/projetos-ae/letra-nos-apps/assets/w-midia-ferramentas/inclin.py +30 -0
- package/lib/estudio/dados/projetos-ae/letra-nos-apps/assets/w-midia-ferramentas/medir_d.py +36 -0
- package/lib/estudio/dados/projetos-ae/letra-nos-apps/assets/w-midia-ferramentas/medir_e.py +27 -0
- package/lib/estudio/dados/projetos-ae/letra-nos-apps/camera/ajustar_movimentos.py +61 -0
- package/lib/estudio/dados/projetos-ae/letra-nos-apps/camera/ancorar.py +74 -0
- package/lib/estudio/dados/projetos-ae/letra-nos-apps/camera/assar.py +47 -0
- package/lib/estudio/dados/projetos-ae/letra-nos-apps/camera/camera3d_jornal.py +172 -0
- package/lib/estudio/dados/projetos-ae/letra-nos-apps/camera/comparar.py +32 -0
- package/lib/estudio/dados/projetos-ae/letra-nos-apps/camera/dados_ae_jornal.py +46 -0
- package/lib/estudio/dados/projetos-ae/letra-nos-apps/camera/folha_contato.py +28 -0
- package/lib/estudio/dados/projetos-ae/letra-nos-apps/camera/homografia_jornal.py +74 -0
- package/lib/estudio/dados/projetos-ae/letra-nos-apps/camera/integrar.py +44 -0
- package/lib/estudio/dados/projetos-ae/letra-nos-apps/camera/medir_quadro_a_quadro.py +32 -0
- package/lib/estudio/dados/projetos-ae/letra-nos-apps/camera/mesa_2d.py +64 -0
- package/lib/estudio/dados/projetos-ae/letra-nos-apps/camera/plot_cenas.py +11 -0
- package/lib/estudio/dados/projetos-ae/letra-nos-apps/camera/retificar_quadros.py +38 -0
- package/lib/estudio/dados/projetos-ae/letra-nos-apps/camera/w-agenda/assar_ab.py +52 -0
- package/lib/estudio/dados/projetos-ae/letra-nos-apps/camera/w-agenda/medir_ab.py +59 -0
- package/lib/estudio/dados/projetos-ae/letra-nos-apps/camera/wg_ajustar_h.py +111 -0
- package/lib/estudio/dados/projetos-ae/letra-nos-apps/camera/wg_corrige_cam.py +17 -0
- package/lib/estudio/dados/projetos-ae/letra-nos-apps/camera/wg_ecc_cadeia.py +80 -0
- package/lib/estudio/dados/projetos-ae/letra-nos-apps/camera/wg_finalizar_cam.py +65 -0
- package/lib/estudio/dados/projetos-ae/letra-nos-apps/camera/wg_mosaico.py +61 -0
- package/lib/estudio/dados/projetos-ae/letra-nos-apps/guia-do-metodo/tutorial-lyric-edit-interfaces/01-gramatica-e-roteiro.md +55 -0
- package/lib/estudio/dados/projetos-ae/letra-nos-apps/guia-do-metodo/tutorial-lyric-edit-interfaces/02-camera.md +66 -0
- package/lib/estudio/dados/projetos-ae/letra-nos-apps/guia-do-metodo/tutorial-lyric-edit-interfaces/03-montagem-no-ae.md +50 -0
- package/lib/estudio/dados/projetos-ae/letra-nos-apps/guia-do-metodo/tutorial-lyric-edit-interfaces/04-render-e-conferencia.md +43 -0
- package/lib/estudio/dados/projetos-ae/letra-nos-apps/guia-do-metodo/tutorial-lyric-edit-interfaces/05-abertura-celular-mergulho.md +43 -0
- package/lib/estudio/dados/projetos-ae/letra-nos-apps/guia-do-metodo/tutorial-lyric-edit-interfaces.md +42 -0
- package/lib/estudio/dados/projetos-ae/letra-nos-apps/transicao/atraso_imagem.py +31 -0
- package/lib/estudio/dados/projetos-ae/letra-nos-apps/transicao/fundo.py +56 -0
- package/lib/estudio/dados/projetos-ae/letra-nos-apps/transicao/juntar.py +45 -0
- package/lib/estudio/dados/projetos-ae/letra-nos-apps/transicao/montar.py +177 -0
- package/lib/estudio/dados/projetos-ae/letra-nos-apps/transicao/rastreio.py +74 -0
- package/lib/estudio/dados/projetos-ae/letra-nos-apps/transicao/sincronia.py +18 -0
- package/lib/estudio/dados/projetos-ae/pinterest-inspiracao/ae/cenas.jsx +530 -0
- package/lib/estudio/dados/projetos-ae/pinterest-inspiracao/assets/fazer_assets.py +107 -0
- package/lib/estudio/dados/projetos-ae/processo-motion-100-ia/assets/pessoas/figurinha.py +46 -0
- package/lib/estudio/dados/projetos-ae/processo-motion-100-ia/comp-a/BRIEF-A.md +83 -0
- package/lib/estudio/dados/projetos-ae/processo-motion-100-ia/comp-a/audio.py +179 -0
- package/lib/estudio/dados/projetos-ae/processo-motion-100-ia/comp-a/confere.py +20 -0
- package/lib/estudio/dados/projetos-ae/processo-motion-100-ia/comp-a/dados/tempo-parte1.js +1 -0
- package/lib/estudio/dados/projetos-ae/processo-motion-100-ia/comp-a/dados/tempo-parte2.js +1 -0
- package/lib/estudio/dados/projetos-ae/processo-motion-100-ia/comp-a/gerar_emojis.py +11 -0
- package/lib/estudio/dados/projetos-ae/processo-motion-100-ia/comp-a/img/filmes/_indice.js +122 -0
- package/lib/estudio/dados/projetos-ae/processo-motion-100-ia/comp-a/js/base.js +380 -0
- package/lib/estudio/dados/projetos-ae/processo-motion-100-ia/comp-a/js/main.js +86 -0
- package/lib/estudio/dados/projetos-ae/processo-motion-100-ia/comp-a/js/p1a.js +169 -0
- package/lib/estudio/dados/projetos-ae/processo-motion-100-ia/comp-a/js/p1b.js +455 -0
- package/lib/estudio/dados/projetos-ae/processo-motion-100-ia/comp-a/js/p1c.js +389 -0
- package/lib/estudio/dados/projetos-ae/processo-motion-100-ia/comp-a/js/p2.js +379 -0
- package/lib/estudio/dados/projetos-ae/processo-motion-100-ia/comp-a/video.py +62 -0
- package/lib/estudio/dados/projetos-ae/processo-motion-100-ia/take-unico/README.md +65 -0
- package/lib/estudio/dados/projetos-ae/processo-motion-100-ia/take-unico/oraculo_take.py +137 -0
- package/lib/estudio/dados/projetos-ae/processo-motion-100-ia/take-unico/render_take.py +388 -0
- package/lib/estudio/dados/projetos-ae/processo-motion-100-ia/take-unico/take.js +235 -0
- package/lib/estudio/editor.js +285 -0
- package/lib/estudio/effectcraft.js +152 -0
- package/lib/estudio/exportar.js +181 -0
- package/lib/estudio/index.js +90 -2
- package/lib/estudio/kit-ae/base.jsx +1146 -0
- package/lib/estudio/kit-ae/cenas.jsx +395 -0
- package/lib/estudio/kit-ae/primitivas.jsx +911 -0
- package/lib/estudio/maquina-diretor.js +393 -0
- package/lib/estudio/maquina-elementos.js +134 -0
- package/lib/estudio/maquina-layout.js +198 -0
- package/lib/estudio/maquina-som.js +478 -0
- package/lib/estudio/maquina-trilha.js +160 -0
- package/lib/estudio/maquina-voz.js +429 -0
- package/lib/estudio/maquina.js +516 -0
- package/lib/estudio/projetos.js +60 -0
- package/lib/headless.js +71 -0
- package/lib/hooks.js +72 -0
- package/lib/local/cerebro.json +398 -12
- package/lib/local/entrada.js +46 -2
- package/lib/marca-kit.js +309 -0
- package/lib/mcp.js +286 -6
- package/lib/perigo.js +31 -3
- package/lib/planos.js +47 -19
- package/lib/preparar.js +111 -0
- package/lib/retomar.js +55 -0
- package/lib/sandbox.js +197 -0
- package/lib/skills.js +3 -1
- package/lib/tools.js +13 -4
- package/lib/ui.js +1 -1
- package/package.json +4 -2
- package/skills/after-effects/SKILL.md +52 -0
- package/skills/maquina-de-motion/SKILL.md +84 -0
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
# Roteiro das 11 cenas da recriação (On My Way do @subzmotion)
|
|
2
|
+
|
|
3
|
+
> Data: 2026-10-17 · Tipo: guia · Status: vigente
|
|
4
|
+
|
|
5
|
+
**Resumo:** o que cada cena precisa ter, em que tempo, com quais textos (nossos) e como encaixa na vizinha. Original: `05-pesquisa/referencias/2026-10-17-subzmotion/midia/05-DeMZpQ5gv-t.mp4` (1080×1080, 24 qps, 814 quadros). Decupagem: `.../evidencias/05-on-my-way.md`. **Atualização 17/10 (pedido do autor):** o vídeo é edit de música em inglês, então a interface fica **em inglês igual ao original** e os campos de letra mostram **a mesma letra** do original. Esses campos leem de `ae/letra.json` (um slot por campo, com tempos e nº de palavras; o autor cola a letra; vazio = texto reserva em inglês) por `ae/letra.jsx`. O Claude não escreve letra de música. Pessoas continuam personagens originais nossos.
|
|
6
|
+
|
|
7
|
+
## Contrato técnico (vale para todas)
|
|
8
|
+
|
|
9
|
+
- Cada cena = comp **"CENA <id>"**, 1080×1080, 24 qps, **33,9167 s (814 quadros) e tempo interno = tempo do vídeo** (nada de deslocar a comp no tempo). Motion blur ligado na comp e em toda camada que se mexe.
|
|
10
|
+
- **Mundo da cena** = a tela do original no instante de referência `ref`. Com a câmera em identidade (zoom 0, mira 540,540, giro 0) a comp tem que mostrar o mesmo quadro do original em `ref`. A interface se estende além do quadro onde a câmera passa (ver "pegada" no `camera/cena-<id>.json`).
|
|
11
|
+
- Câmera: `ae/camera.jsx` → `CAMERA_criar(comp, ".../camera/cena-<id>.json")` cria o null **CAM**; todo o mundo é filho dele. As chaves vêm da medição do original (já limpas); onde o quadro não bater com o original, corrija os keyframes dos controles do CAM.
|
|
12
|
+
- Digitação: `ae/digitar.jsx` → `DIGITAR(camada, palavras, inícios, fim, op)`. Tempos de palavra abaixo (medidos na voz).
|
|
13
|
+
- Zoom alto (> 3×) só com camada vetorial (forma, texto); PNG de interface em 3× do tamanho do mundo (escala 33,3%).
|
|
14
|
+
- **Encaixe** (cena vizinha dentro desta): comp provisória **"ENCAIXE <id-da-vizinha>"** 1080×1080 (sólido cinza + nome escrito), posta com `CAMERA_encaixe` usando `camera/encaixes.json` no instante da troca. Na troca ela tem que encher a tela exatamente, sem máscara visível; depois anima (máscara que arredonda, escala, borda) como no original. Na montagem final a provisória é trocada pela cena real.
|
|
15
|
+
|
|
16
|
+
## Cenas
|
|
17
|
+
|
|
18
|
+
| id | Tempo | ref | O que é (copiar do original) |
|
|
19
|
+
|---|---|---|---|
|
|
20
|
+
| A-agenda | 0,00–2,62 | 2,58 | Google Agenda escuro: chip lilás do evento → visão do dia → app inteiro com cartão de detalhes |
|
|
21
|
+
| B-docs | 2,62–4,95 | 4,875 | Docs/Chrome escuro, menu, busca em pílula, fundo preto com estrelas; globo com 2 palavras curvas |
|
|
22
|
+
| C-alttab | 4,95–6,04 | 5,50 | Área de trabalho do Windows com papel de parede (retrato nosso) + barra do alt-tab com 2 miniaturas |
|
|
23
|
+
| D-spotify | 6,04–8,05 | 8,00 | Janela do Spotify com a letra em tela cheia (fundo azul), karaokê palavra a palavra |
|
|
24
|
+
| E-notas | 8,05–10,80 | 9,50 | Notas do Instagram (4 avatares com balões) + linha de conversa embaixo |
|
|
25
|
+
| F-jornal1 | 10,80–16,62 | 16,40 | Jornal moderno 3D em mesa de madeira, 2 páginas, manchetes digitadas |
|
|
26
|
+
| G-google | 16,62–18,95 | 18,80 | Busca do Google escura com painel de conhecimento e grade de imagens |
|
|
27
|
+
| H-mapa | 18,95–22,30 | 22,20 | Mapa de satélite estilo jogo com 2 marcadores (avatar + etiqueta-seta) |
|
|
28
|
+
| I-imagens | 22,30–24,62 | 24,58 | Busca de imagens (céu laranja) + resultado de vídeo com palavras grifadas em azul |
|
|
29
|
+
| J-jornal2 | 24,62–28,00 | 27,90 | Jornal antigo 3D (foto P&B de olhos), manchete alta, papel queimando |
|
|
30
|
+
| K-maps | 28,00–33,875 | 30,90 | Google Maps claro com 2 pinos-avatar, caixa de busca, avatar andando na estrada |
|
|
31
|
+
|
|
32
|
+
## Encaixes (de `camera/encaixes.json`)
|
|
33
|
+
|
|
34
|
+
| Troca | Quem entra onde | O "buraco" no original |
|
|
35
|
+
|---|---|---|
|
|
36
|
+
| 2,62 | A dentro de B | ícone do app à esquerda do menu (a janela da agenda encolhe até virar o fundo do ícone; a esfera azul fica por cima) |
|
|
37
|
+
| 4,95 | B dentro de C | miniatura 1 do alt-tab (borda ciano) |
|
|
38
|
+
| 4,95–6,04 | D dentro de C | miniatura 2 do alt-tab; a seleção pula para ela (~5,7) e a janela abre até a tela cheia em 6,04 (leve inclinação 3D) |
|
|
39
|
+
| 8,05 | D dentro de E | avatar "Sua nota" (máscara retângulo → círculo entre 8,04 e 8,42) |
|
|
40
|
+
| 10,80 | E dentro de F | foto da página 1 do jornal (depois a foto troca por cortina de baixo para cima) |
|
|
41
|
+
| 16,62 | F dentro de G | ícone do app no "Ver resultados sobre" (a página dupla vira quadrado arredondado; a arte do ícone desliza por cima) |
|
|
42
|
+
| 18,95 | G dentro de H | marcador redondo do avatar 1 (a página vira quadrado arredondado com borda amarela e encolhe para o círculo) |
|
|
43
|
+
| 22,30 | H dentro de I | 1ª imagem da grade (antes, em H, uma miniatura vermelha nasce na etiqueta branca, 22,05–22,30) |
|
|
44
|
+
| 24,62 | I dentro de J | figura pequena da página do jornal |
|
|
45
|
+
| 28,00 | J dentro de K | pino-avatar 1 (a foto da mesa vira quadrado arredondado → círculo do pino) |
|
|
46
|
+
|
|
47
|
+
## Textos da tela e tempos de palavra
|
|
48
|
+
|
|
49
|
+
**Superado em 17/10:** os textos em português abaixo foram a 1ª versão; agora valem os slots de `ae/letra.json` (mesmos campos e tempos) e a interface em inglês. A lista fica como mapa de campos e tempos.
|
|
50
|
+
|
|
51
|
+
Tempos em segundos = início de cada palavra na voz. "fim" = quando a digitação termina (copiado do original).
|
|
52
|
+
|
|
53
|
+
- **A, chip do evento** (5): Revisar · a · timeline · do · cliente — 0,00 0,18 0,42 0,74 0,96, fim 1,20. Horário fixo "2:30 – 3:30pm". Em ~1,25 o evento ganha check e risco.
|
|
54
|
+
- **A, 2º evento** (4): Ajustar · curvas · e · cores — 1,52 1,82 1,90 2,12, fim 2,30. Horário "3:30 – 4:30pm".
|
|
55
|
+
- **A, título do cartão** (1): MOTION — 2,33, fim 2,54 (caixa alta, como no original). Linhas do cartão: "sábado, 3 de outubro · 3:30 – 4:30pm", "Hoje", "estúdio.quadro", "Livre", "Particular", botão "Marcar como concluída".
|
|
56
|
+
- **B, busca** (4): publicar · o · reel · no — 2,80 3,12 3,48 3,80, fim 4,10.
|
|
57
|
+
- **B, globo** (2, curvas em volta do globo): MUNDO · TODO — entram com o globo, 4,42–4,62.
|
|
58
|
+
- **D, letra no Spotify** (9 linhas; acesas: 5 e 6): 1 "Ninguém viu o rascunho" · 2 "Começou num quadro vazio" · 3 "Depois veio a primeira curva" · 4 "E o projeto pegou ritmo" · **5 "Tudo em movimento"** (acende 5,94 6,20 6,58) · **6 "nada fica parado"** (acende 7,36 7,70 8,02) · 7 "A câmera anda o tempo inteiro" · 8 "O som chega junto com a imagem" · 9 "E o render sai na hora certa". Busca do topo: "O que você quer ouvir?".
|
|
59
|
+
- **E, notas**: nota 1 (música) "♪ MADRUGADA / lo-fi" (@lu.motion); nota 2 digitada (3): RENDER · EM · ANDAMENTO — 8,34 8,60 8,68, fim 8,95 (@o.produtor); nota 3 digitada (2): QUASE · PRONTO — 9,54 9,92, fim 10,25 (@mari.frames); nota 4 (música) "♪ TRILHA NOVA / estúdio" (@seu.perfil). Linha de conversa: "Render Farm ✓ · 2 novas mensagens · 14 h" com ícone redondo amarelo nosso. "Sua nota" no 1º avatar.
|
|
60
|
+
- **F, jornal "DIÁRIO DO QUADRO"** (4 manchetes de 3): PRIMEIRO CORTE APROVADO. (10,52 11,44 11,86, digita 11,20–12,25) · CLIENTE PEDE MAIS. (12,56 12,88 13,24, digita 13,00–14,00) · ESTÚDIO VIRA NOITE (14,04 14,44 14,84, digita 14,50–15,30) · ENTREGA NO PRAZO (15,18 15,64 16,10, digita 15,75–16,30). Selos: "AO VIVO", "BASTIDORES"; linha "EDIÇÃO ESPECIAL | 6 DE OUTUBRO DE 2026"; corpo em texto corrido nosso sobre motion.
|
|
61
|
+
- **G, busca** (1): motion — 16,54 (digita 17,20–17,60). Painel (3): Motion · design · brasileiro — 17,54 18,02 18,48 (digita 18,00–18,60); subtítulo "Técnica de animação". Chip "Ver resultados sobre · Estúdio Quadro · App de vídeo".
|
|
62
|
+
- **H, etiqueta amarela** (4): ONDE · FICA · O · ESTÚDIO? — 18,78 19,14 19,48 19,90 (digita 19,20–20,30). **Etiqueta branca** (5): VIRA · À · DIREITA · NA · PONTE — 20,64 21,10 21,50 21,64 22,02 (digita 20,80–22,20). Nomes no mapa: "Vila Render", "Morro Alto", "Vale Verde".
|
|
63
|
+
- **I, título** (3): céu · de · outubro — 22,38 22,66 23,16 (digita 22,60–23,40). **Resultado de vídeo**: "Céu de outubro ganha cor no fim da tarde" com "ganha · cor · no · fim" grifados em azul em 23,58 24,22 24,52 24,76; canal "YouTube · estúdio.quadro"; créditos inventados ("Direção: Ana Lima · Produção: Caio Reis · Motion: Bia Torres").
|
|
64
|
+
- **J, jornal "GAZETA DO ESTÚDIO"** manchete (6): O · VÍDEO · VIRALIZOU · EM · UM · DIA — 25,48 25,56 26,00 26,94 27,36 27,58 (digita 25,70–27,70). Linhas: "OLHOS NA TELA", "UMA IDEIA. UM QUADRO. UM MOVIMENTO."
|
|
65
|
+
- **K, rótulo do pino 1** (1): AQUI… — 28,06. **Busca** (7): estúdio · de · motion · aberto · agora · perto · daqui — 28,84 29,32 29,78 30,10 30,46 30,88 31,20 (digita 29,40–30,40). **Rótulo do pino 2** (2): PERTO · DAQUI.. (aparece 31,00–32,30). **Texto azul ao lado do avatar 2** (5): Entrega · marcada · para · as · seis — 31,64 32,34 32,84 32,94 33,30 (digita 32,50–33,30). Lugares: "Praça do Relógio", "SP-332", "SP-101", "Gruta da Pedra Branca".
|
|
66
|
+
|
|
67
|
+
## Pessoas e imagens nossas (GPT Image 2 pelo `08-integracoes/codex-imagem.py`)
|
|
68
|
+
|
|
69
|
+
Avatares: @lu.motion (mulher jovem, luz suave rosada), @o.produtor (homem de boné e fone, tons azul-escuros), @mari.frames (mulher de cabelo dourado, luz quente laranja, pose pensativa), @seu.perfil (pessoa de roupa escura, fundo neutro). Papel de parede do Windows = retrato grande do @o.produtor. Fotos do jornal 1: estúdio de motion à noite, monitores com luz azul-laranja (3 cenas). Mesa de madeira escura vista de cima. Mapa de satélite estilo jogo (vila, campos, estradas). 4 fotos de céu laranja/vermelho. Foto P&B antiga de olhos (pessoa original). Arte do ícone "Estúdio Quadro". Grade do painel do Google: 4 imagens de motion design (renders abstratos, telas animadas). Nada de rosto de pessoa real conhecida, nada de marca de jogo.
|
|
@@ -0,0 +1,148 @@
|
|
|
1
|
+
// =====================================================================
|
|
2
|
+
// CENA A-agenda (0,00–2,62 s, ref 2,58) — Google Agenda escuro. Agente w-agenda, 17/10/2026. ES3.
|
|
3
|
+
// Rodar num eval.run: $.evalFile(P + "ae/A-agenda.jsx"); return GERAR_A();
|
|
4
|
+
// Mundo = quadro 2,58 s do original (1080x1080). Câmera: camera/w-agenda/cena-A-agenda.json (remedida:
|
|
5
|
+
// cadeia SIFT + 6 passos refeitos pela geometria do anel/chip; ver camera/w-agenda/assar_ab.py).
|
|
6
|
+
// Elementos:
|
|
7
|
+
// FUNDO (cinza 17) · APP (PNG 3x: janela, cabeçalho, lateral, painel do dia, rótulos das horas)
|
|
8
|
+
// GRADE e AGORA (formas: linhas das horas, linha vertical, linha vermelha + bolinha)
|
|
9
|
+
// EV2 (null que sobe o 2º evento 1,25–1,92 s) + chip, anel, título digitado e horário que troca
|
|
10
|
+
// EV1: chip (lilás -> escuro em 1,21–1,29 s), anel -> ícone de check, título digitado, horário, riscos
|
|
11
|
+
// CARTAO (null: entra de baixo 2,17–2,58 s com escala) + PNG do cartão, título digitado (slot A3 do letra.json), emoji 2,625 s
|
|
12
|
+
// ESFERA A (cresce 2,50–2,58 s sobre o cartão; depois de 2,625 s quem segue é a esfera da cena B)
|
|
13
|
+
// =====================================================================
|
|
14
|
+
var P_W = File.decode("<HOME>/Documents/Cria%C3%A7%C3%A3o%20de%20conteudo/07-videos/projetos/2026-10-17-subzmotion-recriacao/");
|
|
15
|
+
$.evalFile(new File(P_W + "ae/camera.jsx"));
|
|
16
|
+
$.evalFile(new File(P_W + "ae/digitar.jsx"));
|
|
17
|
+
$.evalFile(new File(P_W + "ae/w-agenda/util.jsx"));
|
|
18
|
+
$.evalFile(new File(P_W + "ae/letra.jsx"));
|
|
19
|
+
// Tempos de digitacao medidos no original (inicio de cada palavra = quadro em que a 1a letra aparece; fim = ultima letra).
|
|
20
|
+
// Valem quando o texto colado tem o mesmo numero de palavras do original; senao usa os tempos do slot (letra.json).
|
|
21
|
+
var A_DIG = { A1: { t: null, fim: 1.25, fica: 0.03 }, // tempos do slot batem com o original
|
|
22
|
+
A2: { t: [1.30, 1.31, 1.625, 2.042], fim: 2.208, fica: 0.03 },
|
|
23
|
+
A3: { t: [2.29], fim: 2.60, fica: 0 } }; // fim antes de 2,625: o borrao amostra o quadro 63 em 2,620 e o cursor vazaria
|
|
24
|
+
function A_tempos(s, d) { return (d.t && d.t.length == s.palavras.length) ? d.t : s.tempos; }
|
|
25
|
+
// Digitacao quadro a quadro medida no original (letras visiveis por quadro, tamanho das palavras, cursor piscando).
|
|
26
|
+
// Usada quando o texto colado tem o mesmo numero de palavras do original; senao cai no DIGITAR com os tempos acima.
|
|
27
|
+
var A_QUADROS = {
|
|
28
|
+
A1: { F0: 0, C: [1,2,2,2,2,4,5,6,7,8,8,9,10,11,12,13,14,15,15,16,17,17,19,20,21,21,22,23,24,25,26,26], LO: [2,5,4,3,8], CUR: [[9,16],[25,30]] },
|
|
29
|
+
A2: { F0: 30, C: [0,0,6,6,6,6,7,7,7,9,10,10,11,11,12,12,13,14,14,15,15,16], LO: [3,3,5,2], CUR: [[25,32],[41,48]] },
|
|
30
|
+
A3: { F0: 54, C: [1,2,2,3,4,5,6,7,8], LO: [8], CUR: [[61,62]] }
|
|
31
|
+
};
|
|
32
|
+
function A_digitar(lay, s, id, op) {
|
|
33
|
+
var q = A_QUADROS[id];
|
|
34
|
+
if (q && q.LO.length == s.palavras.length) return U_digitarQuadros(lay, op.texto || s.texto, q.C, q.F0, q.LO, q.CUR);
|
|
35
|
+
return DIGITAR(lay, op.palavras || s.palavras, A_tempos(s, A_DIG[id]), A_DIG[id].fim, { cursor: true, cursorFica: A_DIG[id].fica });
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
var A_COR = {
|
|
39
|
+
fundo: [17, 17, 17], linha: [44, 44, 46], vermelho: [238, 92, 86],
|
|
40
|
+
chip: [100, 138, 222], chipFeito: [65, 83, 130], texto: [16, 20, 32], textoFeito: [160, 174, 205], anel: [22, 24, 30],
|
|
41
|
+
titulo: [227, 227, 227]
|
|
42
|
+
};
|
|
43
|
+
var GS = "GoogleSansFlex120pt-Regular", GSM = "GoogleSansFlex120pt-Medium";
|
|
44
|
+
|
|
45
|
+
function GERAR_A() {
|
|
46
|
+
var comp = U_novaComp("CENA A-agenda");
|
|
47
|
+
var cam = CAMERA_criar(comp, P_W + "camera/w-agenda/cena-A-agenda.json");
|
|
48
|
+
var f = U_f;
|
|
49
|
+
|
|
50
|
+
// ---------- fundo e app ----------
|
|
51
|
+
var fundo = comp.layers.addSolid(U_cor(A_COR.fundo), "FUNDO", 1080, 1080, 1, comp.duration);
|
|
52
|
+
fundo.moveToEnd();
|
|
53
|
+
var app = U_png(comp, U_importar(P_W + "assets/A-agenda/A-app.png"), "APP", cam);
|
|
54
|
+
|
|
55
|
+
// ---------- grade do dia (vetor: a camera chega a 60x aqui) ----------
|
|
56
|
+
var gr = U_forma(comp, "GRADE", cam);
|
|
57
|
+
for (var k = -2; k <= 8; k++) { var y = 404 + 68.6 * k; U_linha(gr, "hora " + k, [[438, y], [1028, y]], A_COR.linha, 1.0); }
|
|
58
|
+
U_linha(gr, "vertical", [[450, 228], [450, 1024]], A_COR.linha, 1.0);
|
|
59
|
+
var ag = U_forma(comp, "AGORA", cam);
|
|
60
|
+
U_linha(ag, "linha", [[450, 370], [1028, 370]], A_COR.vermelho, 2.0);
|
|
61
|
+
U_elipse(ag, "bolinha", 450, 370, 16, A_COR.vermelho);
|
|
62
|
+
|
|
63
|
+
// ---------- 2o evento (sobe do horario das 5:30 ate colar no 1o) ----------
|
|
64
|
+
var ev2 = comp.layers.addNull(comp.duration); ev2.name = "EV2"; ev2.enabled = false; U_pai(ev2, cam);
|
|
65
|
+
U_tr(ev2).property("ADBE Anchor Point").setValue([0, 0]); U_tr(ev2).property("ADBE Scale").setValue([100, 100]);
|
|
66
|
+
var dy = [[28, 92], [29, 84], [30, 76], [31, 68], [32, 59.6], [33, 52.6], [34, 45.4], [35, 38.7], [36, 33.2], [37, 26.5], [38, 21.1],
|
|
67
|
+
[39, 16.4], [40, 12.0], [41, 8.1], [42, 5.0], [43, 2.6], [44, 1.1], [45, 0.3], [46, 0]];
|
|
68
|
+
var lp = []; for (var i = 0; i < dy.length; i++) lp.push([f(dy[i][0]), [0, dy[i][1]]]);
|
|
69
|
+
U_chaves(U_tr(ev2).property("ADBE Position"), lp);
|
|
70
|
+
var c2 = U_forma(comp, "EV2 chip", ev2);
|
|
71
|
+
U_ret(c2, "ponta", 451, 479, 600, 548, 6, A_COR.chip); U_ret(c2, "corpo", 520, 479, 1028, 548, 0, A_COR.chip);
|
|
72
|
+
c2.inPoint = f(29);
|
|
73
|
+
// anel numa camada propria acima do chip (dentro da mesma forma o grupo criado por ultimo fica embaixo do preenchimento)
|
|
74
|
+
var a2 = U_forma(comp, "EV2 anel", ev2);
|
|
75
|
+
U_elipse(a2, "anel", 469.1, 495.25, 17.5, A_COR.anel, 1.5);
|
|
76
|
+
a2.inPoint = f(29);
|
|
77
|
+
var sA2 = LETRA("A2");
|
|
78
|
+
var t2 = U_texto(comp, "EV2 titulo", sA2.texto, ev2, [485, 503.25], GSM, 20, A_COR.texto, 0);
|
|
79
|
+
A_digitar(t2, sA2, "A2", {});
|
|
80
|
+
t2.inPoint = f(29);
|
|
81
|
+
// no chip o original usa hifen com espacos ("2:30 - 3:30pm"); no cartao, travessao
|
|
82
|
+
var h2 = U_texto(comp, "EV2 horario", "5:30 - 6:30pm", ev2, [485, 526.25], GS, 20, A_COR.texto, 0);
|
|
83
|
+
h2.property("ADBE Text Properties").property("ADBE Text Document").expression =
|
|
84
|
+
"time < 1.60 ? '5:30 - 6:30pm' : (time < 1.98 ? '4:30 - 5:30pm' : '3:30 - 4:30pm');";
|
|
85
|
+
h2.inPoint = f(29);
|
|
86
|
+
|
|
87
|
+
// ---------- 1o evento (o chip onde a camera comeca) ----------
|
|
88
|
+
var c1 = U_forma(comp, "EV1 chip", cam);
|
|
89
|
+
U_ret(c1, "ponta", 451, 407, 600, 476, 6, A_COR.chip); U_ret(c1, "corpo", 520, 407, 1028, 476, 0, A_COR.chip);
|
|
90
|
+
var corChip = [[f(29), U_cor(A_COR.chip)], [f(31), U_cor(A_COR.chipFeito)]];
|
|
91
|
+
U_chaves(c1.property("ADBE Root Vectors Group").property("ponta").property("ADBE Vectors Group").property("ADBE Vector Graphic - Fill").property("ADBE Vector Fill Color"), corChip);
|
|
92
|
+
U_chaves(c1.property("ADBE Root Vectors Group").property("corpo").property("ADBE Vectors Group").property("ADBE Vector Graphic - Fill").property("ADBE Vector Fill Color"), corChip);
|
|
93
|
+
var a1 = U_forma(comp, "EV1 anel", cam);
|
|
94
|
+
U_elipse(a1, "anel", 469.1, 423.25, 17.5, A_COR.anel, 1.5);
|
|
95
|
+
U_chaves(U_tr(a1).property("ADBE Opacity"), [[f(29), 100], [f(30), 0]]);
|
|
96
|
+
var ck = U_forma(comp, "EV1 check", cam);
|
|
97
|
+
var arco = U_elipse(ck, "arco", 469.1, 423.25, 17.5, A_COR.textoFeito, 1.6);
|
|
98
|
+
arco.property("ADBE Vectors Group").addProperty("ADBE Vector Filter - Trim");
|
|
99
|
+
var trim = ck.property("ADBE Root Vectors Group").property("arco").property("ADBE Vectors Group").property("ADBE Vector Filter - Trim");
|
|
100
|
+
trim.property("ADBE Vector Trim Start").setValue(0); trim.property("ADBE Vector Trim End").setValue(86); trim.property("ADBE Vector Trim Offset").setValue(-30);
|
|
101
|
+
U_linha(ck, "visto", [[464.2, 422.6], [468.2, 426.8], [478.6, 415.2]], A_COR.textoFeito, 1.7);
|
|
102
|
+
U_chaves(U_tr(ck).property("ADBE Opacity"), [[f(29), 0], [f(30), 100]]);
|
|
103
|
+
var sA1 = LETRA("A1");
|
|
104
|
+
var t1 = U_texto(comp, "EV1 titulo", sA1.texto, cam, [485, 431.25], GSM, 20, A_COR.texto, 0);
|
|
105
|
+
A_digitar(t1, sA1, "A1", {});
|
|
106
|
+
U_preencher(t1, [[f(29), A_COR.texto], [f(30), A_COR.textoFeito]]);
|
|
107
|
+
var h1 = U_texto(comp, "EV1 horario", "2:30 - 3:30pm", cam, [485, 454.25], GS, 20, A_COR.texto, 0);
|
|
108
|
+
U_preencher(h1, [[f(29), A_COR.texto], [f(30), A_COR.textoFeito]]);
|
|
109
|
+
var rs = U_forma(comp, "EV1 riscos", cam);
|
|
110
|
+
// risco do titulo acompanha a largura do texto colado (medida em 1,3 s, quando ja esta todo digitado)
|
|
111
|
+
var rt = U_ret(rs, "risco titulo", 485, 424.9, 600, 426.3, 0, A_COR.textoFeito);
|
|
112
|
+
var rtr = rs.property("ADBE Root Vectors Group").property("risco titulo").property("ADBE Vectors Group").property("ADBE Vector Shape - Rect");
|
|
113
|
+
rtr.property("ADBE Vector Rect Size").expression = 'var r = thisComp.layer("EV1 titulo").sourceRectAtTime(1.3, false); [r.width, 1.4];';
|
|
114
|
+
rtr.property("ADBE Vector Rect Position").expression = 'var r = thisComp.layer("EV1 titulo").sourceRectAtTime(1.3, false); [485 + r.left + r.width / 2, 425.6];';
|
|
115
|
+
U_linha(rs, "risco horario", [[485, 448.6], [601.4, 448.6]], A_COR.textoFeito, 1.4);
|
|
116
|
+
U_chaves(U_tr(rs).property("ADBE Opacity"), [[f(29), 0], [f(30), 100]]);
|
|
117
|
+
|
|
118
|
+
// ---------- cartao de detalhes (entra voando de baixo, com escala que assenta) ----------
|
|
119
|
+
var ca = comp.layers.addNull(comp.duration); ca.name = "CARTAO"; ca.enabled = false; U_pai(ca, cam);
|
|
120
|
+
U_tr(ca).property("ADBE Anchor Point").setValue([529, 572]);
|
|
121
|
+
// centro do cartao no mundo e escala, medidos por quadro (SIFT no cartao f57-f62; f52-f56 estimados no borrao)
|
|
122
|
+
var cq = [[52, 511, 1420, 133], [53, 488, 1200, 130], [54, 500, 1036, 126], [55, 511, 877, 122], [56, 517.3, 784.1, 116.8], [57, 521.5, 714.1, 110.9],
|
|
123
|
+
[58, 524.1, 666.5, 107.1], [59, 526.0, 631.8, 104.5], [60, 527.4, 606.0, 102.5], [61, 528.2, 586.6, 101.1], [62, 529, 572, 100]];
|
|
124
|
+
var lpos = [], lesc = [];
|
|
125
|
+
for (i = 0; i < cq.length; i++) { lpos.push([f(cq[i][0]), [cq[i][1], cq[i][2]]]); lesc.push([f(cq[i][0]), [cq[i][3], cq[i][3]]]); }
|
|
126
|
+
U_chaves(U_tr(ca).property("ADBE Position"), lpos); U_chaves(U_tr(ca).property("ADBE Scale"), lesc);
|
|
127
|
+
var cpng = U_png(comp, U_importar(P_W + "assets/A-agenda/A-cartao.png"), "CARTAO png", ca);
|
|
128
|
+
cpng.inPoint = f(52);
|
|
129
|
+
var sA3 = LETRA("A3"); var palA3 = []; for (i = 0; i < sA3.palavras.length; i++) palA3.push(sA3.palavras[i].toUpperCase());
|
|
130
|
+
var tc = U_texto(comp, "CARTAO titulo", sA3.texto.toUpperCase(), ca, [186, 410], GS, 45, A_COR.titulo, 0);
|
|
131
|
+
A_digitar(tc, sA3, "A3", { texto: sA3.texto.toUpperCase(), palavras: palA3 });
|
|
132
|
+
tc.inPoint = f(52);
|
|
133
|
+
var emo = U_png(comp, U_importar(P_W + "assets/A-agenda/A-emoji.png"), "CARTAO emoji", ca, [400, 392]);
|
|
134
|
+
// emoji logo depois do fim do titulo (no original: ~29 px depois da ultima letra)
|
|
135
|
+
U_tr(emo).property("ADBE Position").expression = 'var r = thisComp.layer("CARTAO titulo").sourceRectAtTime(2.62, false); [186 + r.left + r.width + 29, 392];';
|
|
136
|
+
emo.inPoint = f(63);
|
|
137
|
+
|
|
138
|
+
// ---------- esfera azul pousando no cartao (so ate a troca; depois e a da cena B) ----------
|
|
139
|
+
var es = U_png(comp, U_importar(P_W + "assets/A-agenda/esfera.png"), "ESFERA A", ca, [517.5, 535.5], 0);
|
|
140
|
+
var dEs = [[59, 0], [60, 2], [61, 4], [62, 8], [63, 15.7]];
|
|
141
|
+
var le = []; for (i = 0; i < dEs.length; i++) { var e = 100 * dEs[i][1] / 1090; le.push([f(dEs[i][0]), [e, e]]); }
|
|
142
|
+
U_chaves(U_tr(es).property("ADBE Scale"), le);
|
|
143
|
+
es.inPoint = f(60); es.outPoint = f(63);
|
|
144
|
+
|
|
145
|
+
// ordem: fundo embaixo; CAM e nulls em cima (nao aparecem)
|
|
146
|
+
cam.moveToBeginning();
|
|
147
|
+
return { ok: true, comp: comp.name, camadas: comp.numLayers };
|
|
148
|
+
}
|
|
@@ -0,0 +1,174 @@
|
|
|
1
|
+
// =====================================================================
|
|
2
|
+
// CENA B-docs (2,62-4,95 s, ref 4,875) - janela escura estilo Google Earth/Docs no Chrome. Agente w-agenda, 17/10/2026. ES3.
|
|
3
|
+
// Rodar num eval.run: $.evalFile(P + "ae/B-docs.jsx"); return GERAR_B();
|
|
4
|
+
// Mundo = quadro 4,875 s do original. Camera: camera/w-agenda/cena-B-docs.json (cadeia SIFT; o trecho 4,46-4,83
|
|
5
|
+
// NAO segura: a camera continua recuando - so o anel de texto do globo gira).
|
|
6
|
+
// Interface igual ao original (menu em indonesio). Textos de letra: slots B1 e B2 do ae/letra.json.
|
|
7
|
+
// Elementos (de baixo para cima):
|
|
8
|
+
// PAGINA (PNG 3x: faixa do menu, faixa da barra, campo preto com estrelas, icones da barra)
|
|
9
|
+
// ENCAIXE A-agenda (comp provisoria) + JANELA A matte (quadrado da janela que arredonda ate virar circulo)
|
|
10
|
+
// ESFERA B (o icone azul: cresce de 0,8 a 49 px de mundo entre 2,625 e 3,5 s, centro fixo)
|
|
11
|
+
// MENU (6 textos), PILULA + LUPA (vetor), BUSCA (texto digitado, a camera segue)
|
|
12
|
+
// GLOBO (imagem fixa) + ANEL TEXTO (slot B2) (texto em caminho circular que gira 4,42 s em diante)
|
|
13
|
+
// MOLDURA (cinza com furo arredondado que cresce 4,58-4,92 s: a janela/cartao do alt-tab aparece) + LEGENDA
|
|
14
|
+
// =====================================================================
|
|
15
|
+
var P_W = File.decode("<HOME>/Documents/Cria%C3%A7%C3%A3o%20de%20conteudo/07-videos/projetos/2026-10-17-subzmotion-recriacao/");
|
|
16
|
+
$.evalFile(new File(P_W + "ae/camera.jsx"));
|
|
17
|
+
$.evalFile(new File(P_W + "ae/digitar.jsx"));
|
|
18
|
+
$.evalFile(new File(P_W + "ae/w-agenda/util.jsx"));
|
|
19
|
+
$.evalFile(new File(P_W + "ae/letra.jsx"));
|
|
20
|
+
// Busca (slot B1): tempos medidos no original (1a letra de cada palavra em 3,125 / 3,375 / 3,75 / 3,958 s; ultima em 4,167 s).
|
|
21
|
+
var B_DIG = { t: [3.125, 3.375, 3.75, 3.958], fim: 4.23, fica: 0 };
|
|
22
|
+
|
|
23
|
+
var B_COR = { texto: [227, 227, 227], pilula: [53, 55, 58], lupa: [196, 199, 197], moldura: [27, 27, 27], anel: [236, 236, 236], legenda: [214, 214, 214] };
|
|
24
|
+
var B_GS = "GoogleSansFlex120pt-Regular", B_GSM = "GoogleSansFlex120pt-Medium";
|
|
25
|
+
var B_ENC = { centro: [-318.7, 135.6], lado: 59.21 }; // onde a cena A mora no mundo B (= mira/zoom do CAM em 2,625 s)
|
|
26
|
+
var B_JANELA = { centro: [-320.6, 134.6], lado: [53.5, 53.6] }; // janela da Agenda dentro do encaixe (mundo B)
|
|
27
|
+
var B_GLOBO = { c: [544.5, 586.5], r: 143, rTexto: 151, inicioGraus: 136.5, arcoGraus: 206 }; // anel: linha de base no raio 151, de 136,5 a 342,5 graus
|
|
28
|
+
|
|
29
|
+
function B_encaixeProvisorio(nome) {
|
|
30
|
+
var velha = U_comp(nome); if (velha) velha.remove();
|
|
31
|
+
var c = app.project.items.addComp(nome, 1080, 1080, 1, 814 / 24, 24);
|
|
32
|
+
c.layers.addSolid([0.42, 0.42, 0.42], "cinza", 1080, 1080, 1, c.duration);
|
|
33
|
+
var t = c.layers.addText(nome);
|
|
34
|
+
var tp = t.property("ADBE Text Properties").property("ADBE Text Document"); var d = tp.value;
|
|
35
|
+
d.font = "GoogleSansFlex120pt-Medium"; d.fontSize = 90; d.fillColor = [1, 1, 1]; d.justification = ParagraphJustification.CENTER_JUSTIFY;
|
|
36
|
+
tp.setValue(d);
|
|
37
|
+
t.property("ADBE Transform Group").property("ADBE Position").setValue([540, 560]);
|
|
38
|
+
return c;
|
|
39
|
+
}
|
|
40
|
+
// circulo como Shape de 4 vertices comecando no angulo a0 (graus, tela: 0 = direita, 90 = baixo) e andando no sentido horario
|
|
41
|
+
function B_circulo(cx, cy, r, a0) {
|
|
42
|
+
var s = new Shape(), v = [], it = [], ot = [], k = r * 0.5523;
|
|
43
|
+
for (var i = 0; i < 4; i++) {
|
|
44
|
+
var a = (a0 + 90 * i) * Math.PI / 180, c = Math.cos(a), sn = Math.sin(a);
|
|
45
|
+
v.push([cx + r * c, cy + r * sn]); ot.push([-k * sn, k * c]); it.push([k * sn, -k * c]);
|
|
46
|
+
}
|
|
47
|
+
s.vertices = v; s.inTangents = it; s.outTangents = ot; s.closed = true; return s;
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
// a busca do original e toda em minusculas (estilo de digitacao na pilula), qualquer que seja a caixa do texto colado
|
|
51
|
+
function B_caixaB1(t) { return String(t).toLowerCase(); }
|
|
52
|
+
|
|
53
|
+
function GERAR_B() {
|
|
54
|
+
var comp = U_novaComp("CENA B-docs");
|
|
55
|
+
var cam = CAMERA_criar(comp, P_W + "camera/w-agenda/cena-B-docs.json");
|
|
56
|
+
var f = U_f, i;
|
|
57
|
+
|
|
58
|
+
var fundo = comp.layers.addSolid([0, 0, 0], "FUNDO", 1080, 1080, 1, comp.duration); fundo.moveToEnd();
|
|
59
|
+
var pag = U_importar(P_W + "assets/B-docs/B-pagina.png");
|
|
60
|
+
var lp = U_png(comp, pag, "PAGINA", cam, [-450, -150]);
|
|
61
|
+
U_tr(lp).property("ADBE Anchor Point").setValue([0, 0]);
|
|
62
|
+
|
|
63
|
+
// ---------- a Agenda encolhida vira o fundo do icone ----------
|
|
64
|
+
var enc = B_encaixeProvisorio("ENCAIXE A-agenda");
|
|
65
|
+
var le = CAMERA_encaixe(comp, cam, enc, B_ENC.centro, B_ENC.lado, 0, "ENCAIXE A-agenda");
|
|
66
|
+
le.motionBlur = true;
|
|
67
|
+
var jm = U_forma(comp, "JANELA A matte", cam);
|
|
68
|
+
var jg = U_ret(jm, "janela", B_JANELA.centro[0] - B_JANELA.lado[0] / 2, B_JANELA.centro[1] - B_JANELA.lado[1] / 2,
|
|
69
|
+
B_JANELA.centro[0] + B_JANELA.lado[0] / 2, B_JANELA.centro[1] + B_JANELA.lado[1] / 2, 0.8, [255, 255, 255]);
|
|
70
|
+
var rr = [[63, 0.8], [65, 1.2], [67, 2.2], [68, 3.2], [69, 5.5], [70, 8.5], [71, 12.5], [72, 17], [73, 22.5], [74, 26.8]];
|
|
71
|
+
var lr = []; for (i = 0; i < rr.length; i++) lr.push([f(rr[i][0]), rr[i][1]]);
|
|
72
|
+
U_chaves(jm.property("ADBE Root Vectors Group").property("janela").property("ADBE Vectors Group").property("ADBE Vector Shape - Rect").property("ADBE Vector Rect Roundness"), lr);
|
|
73
|
+
jm.moveBefore(le);
|
|
74
|
+
le.setTrackMatte(jm, TrackMatteType.ALPHA);
|
|
75
|
+
|
|
76
|
+
// ---------- esfera azul (icone do app) ----------
|
|
77
|
+
var es = U_png(comp, U_importar(P_W + "assets/A-agenda/esfera.png"), "ESFERA B", cam, [-320.8, 135.6], 0);
|
|
78
|
+
var dEs = [[63, 0.82], [64, 1.31], [65, 2.14], [66, 3.08], [67, 4.16], [68, 5.78], [69, 7.96], [70, 11.14], [71, 15.79], [72, 23.3],
|
|
79
|
+
[73, 31.7], [74, 38.0], [75, 40.7], [76, 43.0], [77, 44.9], [78, 46.2], [79, 47.3], [80, 48.5], [81, 48.8], [82, 49.0], [84, 49.3]];
|
|
80
|
+
var lse = []; for (i = 0; i < dEs.length; i++) { var e = 100 * dEs[i][1] / 1090; lse.push([f(dEs[i][0]), [e, e]]); }
|
|
81
|
+
U_chaves(U_tr(es).property("ADBE Scale"), lse);
|
|
82
|
+
es.inPoint = f(63);
|
|
83
|
+
|
|
84
|
+
// ---------- menu (vetor) ----------
|
|
85
|
+
// igual ao original (interface em indonesio), com o inicio de cada item medido no mundo
|
|
86
|
+
var itens = ["File", "Edit", "Tampilan", "Tambahkan", "Alat", "Bantuan"];
|
|
87
|
+
var xs = [-275, -208, -138, -21, 119, 190];
|
|
88
|
+
for (i = 0; i < itens.length; i++) U_texto(comp, "MENU " + itens[i], itens[i], cam, [xs[i], 105], B_GS, 22, B_COR.texto, 0);
|
|
89
|
+
// ---------- pilula de busca + lupa + texto digitado ----------
|
|
90
|
+
var pl = U_forma(comp, "PILULA", cam);
|
|
91
|
+
U_ret(pl, "pilula", -270, 132, 152, 185, 26.5, B_COR.pilula);
|
|
92
|
+
var lu = U_forma(comp, "LUPA", cam);
|
|
93
|
+
U_elipse(lu, "lente", -238.5, 155, 15, B_COR.lupa, 2.6);
|
|
94
|
+
U_linha(lu, "cabo", [[-232.8, 160.8], [-226.5, 167.2]], B_COR.lupa, 2.6);
|
|
95
|
+
// texto de exemplo cinza na pilula ate 3,04 s; no quadro seguinte so o cursor; depois a digitacao
|
|
96
|
+
var ph = U_texto(comp, "BUSCA exemplo", "Explore", cam, [-194, 166], B_GS, 25, [150, 150, 152], 0);
|
|
97
|
+
ph.outPoint = f(74);
|
|
98
|
+
var sB1 = LETRA("B1");
|
|
99
|
+
var bu = U_texto(comp, "BUSCA", B_caixaB1(sB1.texto), cam, [-194, 166], B_GS, 25, B_COR.texto, 0);
|
|
100
|
+
// digitacao quadro a quadro medida no original (letras por quadro, tamanho das palavras, cursor piscando);
|
|
101
|
+
// texto colado com outro numero de palavras cai no DIGITAR com os tempos B_DIG
|
|
102
|
+
var B1Q = { F0: 74, C: [0,1,2,2,3,3,3,5,6,6,7,7,8,9,9,10,11,11,12,12,12,14,14,15,16,16,17], LO: [3,5,2,4], CUR: [[74,74],[83,90],[99,100]] };
|
|
103
|
+
if (sB1.palavras.length == B1Q.LO.length) U_digitarQuadros(bu, B_caixaB1(sB1.texto), B1Q.C, B1Q.F0, B1Q.LO, B1Q.CUR);
|
|
104
|
+
else DIGITAR(bu, sB1.palavras, (sB1.palavras.length == B_DIG.t.length) ? B_DIG.t : sB1.tempos, B_DIG.fim, { cursor: true, cursorFica: B_DIG.fica });
|
|
105
|
+
|
|
106
|
+
// ---------- globo + anel de texto ----------
|
|
107
|
+
var gl = U_png(comp, U_importar(P_W + "assets/B-docs/globo.png"), "GLOBO", cam, B_GLOBO.c, 100 * 2 * B_GLOBO.r / 1162.5);
|
|
108
|
+
gl.inPoint = f(104);
|
|
109
|
+
// texto curvo (slot B2, caixa alta). Dimensionado para ocupar o mesmo arco do original: de 136,5 a 342,5 graus
|
|
110
|
+
// sobre o raio 151 (535 px de linha de base). Fonte Poppins SemiBold corpo 98 (altura das maiusculas ~70 px, como
|
|
111
|
+
// no original); o espacamento ajusta; texto comprido demais reduz o corpo.
|
|
112
|
+
var sB2 = LETRA("B2"); var txB2 = sB2.texto.toUpperCase();
|
|
113
|
+
var an = U_texto(comp, "ANEL TEXTO", txB2, cam, [0, 0], "Poppins-SemiBold", 98, B_COR.anel, 0);
|
|
114
|
+
var arco = B_GLOBO.rTexto * B_GLOBO.arcoGraus * Math.PI / 180;
|
|
115
|
+
var w0 = an.sourceRectAtTime(0, false).width, nL = txB2.length, corpo = 98, trackPx = (arco - w0) / Math.max(1, nL - 1);
|
|
116
|
+
if (trackPx < -3) { trackPx = -3; corpo = 98 * (arco + 3 * (nL - 1)) / w0; }
|
|
117
|
+
if (trackPx > 16) trackPx = 16;
|
|
118
|
+
var tdB2 = an.property("ADBE Text Properties").property("ADBE Text Document"); var dB2 = tdB2.value;
|
|
119
|
+
dB2.fontSize = corpo; dB2.tracking = Math.round(1000 * trackPx / corpo); tdB2.setValue(dB2);
|
|
120
|
+
var mk = an.property("ADBE Mask Parade").addProperty("ADBE Mask Atom");
|
|
121
|
+
mk.property("ADBE Mask Shape").setValue(B_circulo(B_GLOBO.c[0], B_GLOBO.c[1], B_GLOBO.rTexto, B_GLOBO.inicioGraus));
|
|
122
|
+
mk.maskMode = MaskMode.NONE;
|
|
123
|
+
var po = an.property("ADBE Text Properties").property("ADBE Text Path Options");
|
|
124
|
+
po.property("ADBE Text Path").setValue(1);
|
|
125
|
+
po.property("ADBE Text First Margin").setValue(0);
|
|
126
|
+
U_tr(an).property("ADBE Anchor Point").setValue(B_GLOBO.c); U_tr(an).property("ADBE Position").setValue(B_GLOBO.c);
|
|
127
|
+
var gr = [[104, -228], [105, -205], [106, -184], [107, -159], [108, -129], [109, -100], [110, -75], [111, -56], [112, -41],
|
|
128
|
+
[113, -29.5], [114, -20], [115, -12], [116, -5.5], [117, 0], [118, 4.5], [119, 9], [120, 12.5], [122, 17], [125, 19.5], [128, 20.5]]; // depois de 4,92 s desacelera e para (cena C mostra o anel quase parado)
|
|
129
|
+
var lg = []; for (i = 0; i < gr.length; i++) lg.push([f(gr[i][0]), gr[i][1]]);
|
|
130
|
+
U_chaves(U_tr(an).property("ADBE Rotate Z"), lg);
|
|
131
|
+
an.inPoint = f(104);
|
|
132
|
+
|
|
133
|
+
// ---------- moldura (o furo cresce: aparece o cinza em volta da janela) ----------
|
|
134
|
+
var mo = U_forma(comp, "MOLDURA", cam);
|
|
135
|
+
var gm = mo.property("ADBE Root Vectors Group").addProperty("ADBE Vector Group"); gm.name = "cinza";
|
|
136
|
+
var cc = mo.property("ADBE Root Vectors Group").property("cinza").property("ADBE Vectors Group");
|
|
137
|
+
var big = cc.addProperty("ADBE Vector Shape - Rect");
|
|
138
|
+
big.property("ADBE Vector Rect Size").setValue([12000, 12000]); big.property("ADBE Vector Rect Position").setValue([540, 540]);
|
|
139
|
+
cc = mo.property("ADBE Root Vectors Group").property("cinza").property("ADBE Vectors Group");
|
|
140
|
+
var furo = cc.addProperty("ADBE Vector Shape - Rect"); furo.name = "furo";
|
|
141
|
+
cc = mo.property("ADBE Root Vectors Group").property("cinza").property("ADBE Vectors Group");
|
|
142
|
+
var mg = cc.addProperty("ADBE Vector Filter - Merge"); mg.property("ADBE Vector Merge Type").setValue(3); // subtrair
|
|
143
|
+
cc = mo.property("ADBE Root Vectors Group").property("cinza").property("ADBE Vectors Group");
|
|
144
|
+
var fi = cc.addProperty("ADBE Vector Graphic - Fill"); fi.property("ADBE Vector Fill Color").setValue(U_cor(B_COR.moldura));
|
|
145
|
+
// bordas do furo por quadro (mundo): [quadro, esquerda, topo, direita, baixo]
|
|
146
|
+
var bd = [[104, -2000, -100, 400, 600], [106, -1600, -20, 545, 680], [107, -1400, 10, 620, 721], [108, -1200, 30, 690, 762],
|
|
147
|
+
[109, -1000, 42, 745, 810], [110, -800, 50, 794, 854], [111, -600, 55, 838, 894], [112, -400, 56, 878, 929],
|
|
148
|
+
[113, -200, 56, 914, 959], [114, -60, 56, 947, 982], [115, 11, 56, 976, 1000], [116, 10, 56, 1002, 1013],
|
|
149
|
+
[117, 7, 55, 1026, 1022], [118, 2, 55, 1050, 1025]]; // depois de 4,92 s segura (a cena C assume)
|
|
150
|
+
var ls = [], lpp = [];
|
|
151
|
+
for (i = 0; i < bd.length; i++) {
|
|
152
|
+
var q = bd[i]; ls.push([f(q[0]), [q[3] - q[1], q[4] - q[2]]]); lpp.push([f(q[0]), [(q[1] + q[3]) / 2, (q[2] + q[4]) / 2]]);
|
|
153
|
+
}
|
|
154
|
+
var fp = mo.property("ADBE Root Vectors Group").property("cinza").property("ADBE Vectors Group").property("furo");
|
|
155
|
+
U_chaves(fp.property("ADBE Vector Rect Size"), ls); U_chaves(fp.property("ADBE Vector Rect Position"), lpp);
|
|
156
|
+
fp.property("ADBE Vector Rect Roundness").setValue(12);
|
|
157
|
+
// filete preto na borda do furo
|
|
158
|
+
var gb = mo.property("ADBE Root Vectors Group").addProperty("ADBE Vector Group"); gb.name = "filete";
|
|
159
|
+
var cb = mo.property("ADBE Root Vectors Group").property("filete").property("ADBE Vectors Group");
|
|
160
|
+
var f2 = cb.addProperty("ADBE Vector Shape - Rect"); f2.name = "furo2";
|
|
161
|
+
cb = mo.property("ADBE Root Vectors Group").property("filete").property("ADBE Vectors Group");
|
|
162
|
+
var st = cb.addProperty("ADBE Vector Graphic - Stroke"); st.property("ADBE Vector Stroke Color").setValue([0, 0, 0]); st.property("ADBE Vector Stroke Width").setValue(6);
|
|
163
|
+
var fp2 = mo.property("ADBE Root Vectors Group").property("filete").property("ADBE Vectors Group").property("furo2");
|
|
164
|
+
fp2.property("ADBE Vector Rect Size").expression = 'content("cinza").content("furo").size';
|
|
165
|
+
fp2.property("ADBE Vector Rect Position").expression = 'content("cinza").content("furo").position';
|
|
166
|
+
fp2.property("ADBE Vector Rect Roundness").setValue(12);
|
|
167
|
+
mo.inPoint = f(104);
|
|
168
|
+
var lgd = U_texto(comp, "LEGENDA", "Google Chrome - Google Chrome", cam, [-8, 19.5], "SegoeUI", 38, B_COR.legenda, 0);
|
|
169
|
+
U_chaves(U_tr(lgd).property("ADBE Position"), [[f(116), [-9, 12]], [f(117), [-8, 19.5]], [f(118), [-7.9, 21.8]]]);
|
|
170
|
+
lgd.inPoint = f(116);
|
|
171
|
+
|
|
172
|
+
cam.moveToBeginning();
|
|
173
|
+
return { ok: true, comp: comp.name, camadas: comp.numLayers };
|
|
174
|
+
}
|
|
@@ -0,0 +1,113 @@
|
|
|
1
|
+
// =====================================================================
|
|
2
|
+
// CENA C-alttab (4,95–6,04 s, ref 5,50): área de trabalho do Windows + alt-tab com 2 miniaturas.
|
|
3
|
+
// - miniatura 1 = ENCAIXE B-docs (provisória: sólido cinza + nome; a montagem troca pela CENA B-docs, que já traz o
|
|
4
|
+
// cartão cinza com a legenda "Google Chrome - Google Chrome"; por isso aqui só ficam o painel e a borda ciano)
|
|
5
|
+
// - miniatura 2 = comp "D janela" (a mesma janela da CENA D), que abre até a tela cheia em 6,04 com leve inclinação 3D
|
|
6
|
+
// Mundo = quadro 5,50 s do original. Depende de D-spotify.jsx ter rodado antes ("D janela", "Area de trabalho").
|
|
7
|
+
// Câmera: camera/cena-C-alttab.json, com 4,96–5,29 corrigido pela borda ciano medida quadro a quadro no original
|
|
8
|
+
// (a medição automática atrasava 1 quadro e errava a altura em ~12 px nesse trecho). Por isso o encaixe da B
|
|
9
|
+
// fica em centro (357,7 ; 537,75) e lado 216,4 (e não 383,8 ; 550,2 ; 193,3 do encaixes.json): é o quadro que a
|
|
10
|
+
// câmera corrigida mostra em 4,9583, então a B continua enchendo a tela exatamente na troca.
|
|
11
|
+
// Rodar: P = "<raiz>/"; $.evalFile(P + "ae/C-alttab.jsx");
|
|
12
|
+
// =====================================================================
|
|
13
|
+
$.evalFile(P + "ae/w-midia-comum.jsx");
|
|
14
|
+
$.evalFile(P + "ae/camera.jsx");
|
|
15
|
+
|
|
16
|
+
var C = {};
|
|
17
|
+
C.pasta = WM.pasta("w-midia");
|
|
18
|
+
C.pastaAssets = WM.pasta("w-midia assets");
|
|
19
|
+
// câmera corrigida no começo (zoom log2, mira x, mira y) — medida pela borda ciano da miniatura 1 (294 x 216,5 no mundo)
|
|
20
|
+
C.CAM_INI = [[4.9583, 2.32, 357.7, 537.75], [5.0, 2.026, 384.7, 538.0], [5.0417, 1.546, 409.7, 538.1], [5.0833, 1.169, 432.2, 538.4],
|
|
21
|
+
[5.125, 0.880, 452.0, 538.7], [5.1667, 0.658, 470.0, 539.1], [5.2083, 0.479, 485.8, 539.3], [5.25, 0.338, 500.7, 539.5], [5.2917, 0.225, 512.8, 539.9]];
|
|
22
|
+
// fim: quase parada com deriva mínima e identidade exata em 6,04 (a janela da D encaixa sem resto)
|
|
23
|
+
C.CAM_FIM = [[5.5417, 0, 540, 540], [5.7917, 0.003, 540.8, 540], [5.9583, 0, 540, 540], [6.0417, 0, 540, 540]];
|
|
24
|
+
C.B_CENTRO0 = [357.7, 537.75]; C.B_LADO0 = 216.4; // encaixe B na troca (4,9583)
|
|
25
|
+
C.B_CENTRO1 = [389.4, 541.8]; C.B_LADO1 = 230; // B assentada como miniatura 1 (5,25): janela da B com base em y 630 e centro x 377,5
|
|
26
|
+
C.BORDA = [293.5, 216.5, 24]; // borda ciano: largura, altura, raio
|
|
27
|
+
// borda ciano: x da borda esquerda (mundo) por tempo — medido no original (desliza da miniatura 1 para a 2)
|
|
28
|
+
C.BORDA_X = [[4.9583, 225.4], [5.2917, 225.4], [5.3333, 370], [5.375, 477], [5.4167, 496], [5.4583, 518], [5.5, 532],
|
|
29
|
+
[5.5417, 543], [5.5833, 549], [5.625, 554], [5.6667, 556], [5.7083, 558]];
|
|
30
|
+
// janela do Spotify: miniatura (canto 571,470; escala 0,1239) -> tela cheia em 6,0417 (= CENA D no 1º quadro)
|
|
31
|
+
// [t, centro x, centro y, escala (fração), giro Y (graus)] — escala e centro medidos pelo painel azul no original
|
|
32
|
+
C.JANELA = [[5.7917, 695.0, 550.0, 0.1239, 0], [5.8333, 721.3, 541.6, 0.358, 9], [5.875, 738.0, 537.8, 0.476, 6],
|
|
33
|
+
[5.9167, 749.7, 533.7, 0.567, 4], [5.9583, 761.7, 529.9, 0.642, 2.5], [6.0, 768.5, 527.6, 0.702, 1], [6.0417, 771.97, 526.31, 0.74936, 0]];
|
|
34
|
+
|
|
35
|
+
// ---------- ENCAIXE B-docs (provisória) ----------
|
|
36
|
+
var cB = WM.comp("ENCAIXE B-docs", 1080, 1080, C.pasta);
|
|
37
|
+
cB.layers.addSolid([0.5, 0.5, 0.5], "cinza provisório", 1080, 1080, 1, WM.DUR);
|
|
38
|
+
WM.texto(cB, "ENCAIXE B-docs", "SegoeUI-Bold", 90, [1, 1, 1], ParagraphJustification.CENTER_JUSTIFY, 540, 570, "nome");
|
|
39
|
+
|
|
40
|
+
// ---------- CENA C-alttab ----------
|
|
41
|
+
var cDesk = WM.item("Area de trabalho"), cJan = WM.item("D janela");
|
|
42
|
+
if (!cDesk || !cJan) throw new Error("rode D-spotify.jsx antes (faltam Area de trabalho / D janela)");
|
|
43
|
+
var ftAlt = WM.png(P + "assets/C-alttab/alttab.png", C.pastaAssets);
|
|
44
|
+
var cena = WM.comp("CENA C-alttab", 1080, 1080, C.pasta);
|
|
45
|
+
var cam = CAMERA_criar(cena, P + "camera/cena-C-alttab.json");
|
|
46
|
+
var fx = cam.property("ADBE Effect Parade"), k;
|
|
47
|
+
function trocar(lista, t0, t1) {
|
|
48
|
+
var z = [], x = [], y = [];
|
|
49
|
+
for (k = 0; k < lista.length; k++) { z.push([lista[k][0], lista[k][1]]); x.push([lista[k][0], lista[k][2]]); y.push([lista[k][0], lista[k][3]]); }
|
|
50
|
+
WM.trocarChaves(fx.property("Zoom (log2)").property(1), t0, t1, z);
|
|
51
|
+
WM.trocarChaves(fx.property("Mira X").property(1), t0, t1, x);
|
|
52
|
+
WM.trocarChaves(fx.property("Mira Y").property(1), t0, t1, y);
|
|
53
|
+
}
|
|
54
|
+
trocar(C.CAM_INI, 4.95, 5.30);
|
|
55
|
+
trocar(C.CAM_FIM, 5.53, 6.05);
|
|
56
|
+
|
|
57
|
+
function filho(L) { L.parent = cena.layer("CAM"); return L; }
|
|
58
|
+
// 1. área de trabalho (mundo = tela no quadro 5,50)
|
|
59
|
+
var desk = filho(cena.layers.add(cDesk)); desk.name = "Area de trabalho";
|
|
60
|
+
var t1 = desk.property("ADBE Transform Group");
|
|
61
|
+
t1.property("ADBE Anchor Point").setValue([540, 540]); t1.property("ADBE Position").setValue([540, 540]); t1.property("ADBE Scale").setValue([100, 100]);
|
|
62
|
+
// 2. painel do alt-tab
|
|
63
|
+
var alt = cena.layers.add(ftAlt); alt.name = "painel alt-tab (PNG 3x)"; filho(alt);
|
|
64
|
+
var t2 = alt.property("ADBE Transform Group");
|
|
65
|
+
t2.property("ADBE Anchor Point").setValue([0, 0]); t2.property("ADBE Position").setValue([0, 0]); t2.property("ADBE Scale").setValue([100 / 3, 100 / 3]);
|
|
66
|
+
// 3. ENCAIXE B-docs: enche a tela em 4,9583 e depois cresce de leve até o cartão ficar no lugar da miniatura 1 (5,25).
|
|
67
|
+
// A CENA B já traz o cartão (fundo cinza 27,27,27 = cor do painel, legenda e janela), então não há máscara nem cartão
|
|
68
|
+
// desenhado aqui. Alvo: janela da B (x 38–930, y 129–954 no quadro da B) centrada em x 377,5 e base em y 630 do mundo.
|
|
69
|
+
var Lb = cena.layers.add(cB); Lb.name = "ENCAIXE B-docs"; filho(Lb);
|
|
70
|
+
var t3 = Lb.property("ADBE Transform Group");
|
|
71
|
+
t3.property("ADBE Anchor Point").setValue([540, 540]);
|
|
72
|
+
var e0 = 100 * C.B_LADO0 / 1080, e1 = 100 * C.B_LADO1 / 1080;
|
|
73
|
+
t3.property("ADBE Position").setValuesAtTimes([4.9583, 5.25], [C.B_CENTRO0, C.B_CENTRO1]);
|
|
74
|
+
t3.property("ADBE Scale").setValuesAtTimes([4.9583, 5.25], [[e0, e0], [e1, e1]]);
|
|
75
|
+
WM.easeTodas(t3.property("ADBE Scale"), 10, 80); WM.easeTodas(t3.property("ADBE Position"), 10, 80);
|
|
76
|
+
// 4. borda ciano da seleção (desliza da miniatura 1 para a 2 em 5,29–5,71)
|
|
77
|
+
var bd = cena.layers.addShape(); bd.name = "borda ciano (seleção)"; filho(bd);
|
|
78
|
+
var g = bd.property("ADBE Root Vectors Group").addProperty("ADBE Vector Group"); g.name = "borda";
|
|
79
|
+
var gv = bd.property("ADBE Root Vectors Group").property("borda").property("ADBE Vectors Group");
|
|
80
|
+
var rr = gv.addProperty("ADBE Vector Shape - Rect");
|
|
81
|
+
gv.addProperty("ADBE Vector Graphic - Stroke");
|
|
82
|
+
gv = bd.property("ADBE Root Vectors Group").property("borda").property("ADBE Vectors Group");
|
|
83
|
+
gv.property(1).property("ADBE Vector Rect Size").setValue([C.BORDA[0], C.BORDA[1]]);
|
|
84
|
+
gv.property(1).property("ADBE Vector Rect Roundness").setValue(C.BORDA[2]);
|
|
85
|
+
var st = gv.property(2);
|
|
86
|
+
st.property("ADBE Vector Stroke Color").setValue(WM.cor("#1BD4EE")); st.property("ADBE Vector Stroke Width").setValue(4.5);
|
|
87
|
+
var t4 = bd.property("ADBE Transform Group");
|
|
88
|
+
t4.property("ADBE Anchor Point").setValue([0, 0]); t4.property("ADBE Scale").setValue([100, 100]);
|
|
89
|
+
var posB = [];
|
|
90
|
+
for (k = 0; k < C.BORDA_X.length; k++) posB.push([C.BORDA_X[k][0], [C.BORDA_X[k][1] + C.BORDA[0] / 2, 537.75]]);
|
|
91
|
+
WM.chaves(t4.property("ADBE Position"), posB, "linear");
|
|
92
|
+
WM.chaves(t4.property("ADBE Opacity"), [[0, 100], [5.7917, 100], [5.8333, 0]], "linear");
|
|
93
|
+
// brilho leve da borda
|
|
94
|
+
var gl = bd.property("ADBE Effect Parade").addProperty("ADBE Glo2");
|
|
95
|
+
try { gl.property("ADBE Glo2-0002").setValue(60); gl.property("ADBE Glo2-0003").setValue(6); gl.property("ADBE Glo2-0004").setValue(0.6); } catch (eG) {}
|
|
96
|
+
// 5. janela do Spotify (miniatura 2 que abre até a tela cheia)
|
|
97
|
+
var Lj = cena.layers.add(cJan); Lj.name = "D janela (miniatura 2 -> tela cheia)"; filho(Lj);
|
|
98
|
+
Lj.threeDLayer = true; Lj.collapseTransformation = false;
|
|
99
|
+
var t5 = Lj.property("ADBE Transform Group");
|
|
100
|
+
t5.property("ADBE Anchor Point").setValue([1001, 646, 0]);
|
|
101
|
+
var pj = [], sj = [], rj = [];
|
|
102
|
+
for (k = 0; k < C.JANELA.length; k++) {
|
|
103
|
+
var J = C.JANELA[k];
|
|
104
|
+
pj.push([J[0], [J[1], J[2], 0]]); sj.push([J[0], [100 * J[3], 100 * J[3], 100]]); rj.push([J[0], J[4]]);
|
|
105
|
+
}
|
|
106
|
+
WM.chaves(t5.property("ADBE Position"), pj, "linear");
|
|
107
|
+
WM.chaves(t5.property("ADBE Scale"), sj, "linear");
|
|
108
|
+
WM.chaves(t5.property("ADBE Rotate Y"), rj, "linear");
|
|
109
|
+
// ordem final (de cima para baixo): CAM, janela, borda, encaixe B, painel, área de trabalho
|
|
110
|
+
cena.layer("CAM").moveToBeginning();
|
|
111
|
+
WM.blurTodas(cena); cena.layer("CAM").motionBlur = false;
|
|
112
|
+
WM.limparSolidos();
|
|
113
|
+
"ok C: " + cena.numLayers + " camadas";
|