primocode 10.12.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.
Files changed (207) hide show
  1. package/README.md +74 -12
  2. package/bin/primocode.js +148 -8
  3. package/lib/act.js +48 -1
  4. package/lib/catalogo.js +12 -1
  5. package/lib/config.js +1 -0
  6. package/lib/estudio/assinaturas/gerativo.json +1 -1
  7. package/lib/estudio/camadas.js +4 -0
  8. package/lib/estudio/cota.js +150 -0
  9. package/lib/estudio/dados/projetos/clube-ad5.json +105 -0
  10. package/lib/estudio/dados/projetos/clube-ae-sem-memoria.json +107 -0
  11. package/lib/estudio/dados/projetos/clube-agent.json +120 -0
  12. package/lib/estudio/dados/projetos/clube-antes-e-agora.json +86 -0
  13. package/lib/estudio/dados/projetos/clube-apresentando-clube.json +110 -0
  14. package/lib/estudio/dados/projetos/clube-bluevisa.json +106 -0
  15. package/lib/estudio/dados/projetos/clube-caught-in-the-fire.json +127 -0
  16. package/lib/estudio/dados/projetos/clube-chat-cliente-satisfeito.json +98 -0
  17. package/lib/estudio/dados/projetos/clube-chatgpt-anuncios.json +120 -0
  18. package/lib/estudio/dados/projetos/clube-claude-dj.json +140 -0
  19. package/lib/estudio/dados/projetos/clube-claude-mcp.json +142 -0
  20. package/lib/estudio/dados/projetos/clube-cleanui.json +106 -0
  21. package/lib/estudio/dados/projetos/clube-clinica-take-unico.json +128 -0
  22. package/lib/estudio/dados/projetos/clube-clinica.json +104 -0
  23. package/lib/estudio/dados/projetos/clube-clube-opener.json +125 -0
  24. package/lib/estudio/dados/projetos/clube-clube.json +108 -0
  25. package/lib/estudio/dados/projetos/clube-codigo.json +101 -0
  26. package/lib/estudio/dados/projetos/clube-distilbook.json +104 -0
  27. package/lib/estudio/dados/projetos/clube-drive-upload.json +115 -0
  28. package/lib/estudio/dados/projetos/clube-dub.json +119 -0
  29. package/lib/estudio/dados/projetos/clube-enxovaly.json +105 -0
  30. package/lib/estudio/dados/projetos/clube-fecha7.json +118 -0
  31. package/lib/estudio/dados/projetos/clube-filatov.json +128 -0
  32. package/lib/estudio/dados/projetos/clube-frame.json +108 -0
  33. package/lib/estudio/dados/projetos/clube-glass.json +118 -0
  34. package/lib/estudio/dados/projetos/clube-letra-em-apps.json +84 -0
  35. package/lib/estudio/dados/projetos/clube-letra-globo-3d.json +111 -0
  36. package/lib/estudio/dados/projetos/clube-letra-nos-apps.json +146 -0
  37. package/lib/estudio/dados/projetos/clube-letra-seis-mundos.json +100 -0
  38. package/lib/estudio/dados/projetos/clube-lula-3.json +146 -0
  39. package/lib/estudio/dados/projetos/clube-morph.json +119 -0
  40. package/lib/estudio/dados/projetos/clube-motion-designer.json +115 -0
  41. package/lib/estudio/dados/projetos/clube-motion-pacote.json +112 -0
  42. package/lib/estudio/dados/projetos/clube-movimento.json +103 -0
  43. package/lib/estudio/dados/projetos/clube-not-like-us.json +117 -0
  44. package/lib/estudio/dados/projetos/clube-pinterest-inspiracao.json +86 -0
  45. package/lib/estudio/dados/projetos/clube-pixel-e-tinta.json +108 -0
  46. package/lib/estudio/dados/projetos/clube-ponte.json +118 -0
  47. package/lib/estudio/dados/projetos/clube-processo-edit-tonal.json +126 -0
  48. package/lib/estudio/dados/projetos/clube-processo-motion-100-ia.json +109 -0
  49. package/lib/estudio/dados/projetos/clube-promo.json +114 -0
  50. package/lib/estudio/dados/projetos/clube-proposito.json +115 -0
  51. package/lib/estudio/dados/projetos/clube-rankhog.json +128 -0
  52. package/lib/estudio/dados/projetos/clube-recursao.json +116 -0
  53. package/lib/estudio/dados/projetos/clube-revelar.json +118 -0
  54. package/lib/estudio/dados/projetos/clube-robo.json +125 -0
  55. package/lib/estudio/dados/projetos/clube-shelby-ep2.json +144 -0
  56. package/lib/estudio/dados/projetos/clube-shelby.json +97 -0
  57. package/lib/estudio/dados/projetos/clube-solar-eclipse.json +96 -0
  58. package/lib/estudio/dados/projetos/clube-soldier.json +128 -0
  59. package/lib/estudio/dados/projetos/clube-som-de-cena.json +108 -0
  60. package/lib/estudio/dados/projetos/clube-spotify-candidatura.json +112 -0
  61. package/lib/estudio/dados/projetos/clube-tda-app.json +118 -0
  62. package/lib/estudio/dados/projetos/clube-tda-ia.json +75 -0
  63. package/lib/estudio/dados/projetos/clube-telegram-chat.json +118 -0
  64. package/lib/estudio/dados/projetos/clube-telegram-ilha.json +106 -0
  65. package/lib/estudio/dados/projetos/clube-tennessee-nike.json +132 -0
  66. package/lib/estudio/dados/projetos/clube-tudo-se-move.json +112 -0
  67. package/lib/estudio/dados/projetos/clube-uiad.json +107 -0
  68. package/lib/estudio/dados/projetos/clube-viralgrow.json +108 -0
  69. package/lib/estudio/dados/projetos/clube-whose-side.json +140 -0
  70. package/lib/estudio/dados/projetos/clube-youtube-inscrever.json +108 -0
  71. package/lib/estudio/dados/projetos/elementos-do-site-em-movimento.json +49 -0
  72. package/lib/estudio/dados/projetos/explainer-narrado.json +51 -0
  73. package/lib/estudio/dados/projetos/lancamento-de-produto.json +51 -0
  74. package/lib/estudio/dados/projetos/motion-so-com-sons.json +50 -0
  75. package/lib/estudio/dados/projetos/titulo-em-after-effects.json +51 -0
  76. package/lib/estudio/dados/projetos/tour-de-saas.json +50 -0
  77. package/lib/estudio/dados/projetos-ae/antes-e-agora/ae/cenas.jsx +733 -0
  78. package/lib/estudio/dados/projetos-ae/antes-e-agora/assets/fazer_assets.py +88 -0
  79. package/lib/estudio/dados/projetos-ae/letra-em-apps/ae/cenas.jsx +402 -0
  80. package/lib/estudio/dados/projetos-ae/letra-em-apps/assets/preparar_assets.py +17 -0
  81. package/lib/estudio/dados/projetos-ae/letra-em-apps/assets/svg_para_ae.py +25 -0
  82. package/lib/estudio/dados/projetos-ae/letra-nos-apps/BRIEF-AGENTES.md +31 -0
  83. package/lib/estudio/dados/projetos-ae/letra-nos-apps/README.md +53 -0
  84. package/lib/estudio/dados/projetos-ae/letra-nos-apps/ROTEIRO-CENAS.md +69 -0
  85. package/lib/estudio/dados/projetos-ae/letra-nos-apps/ae/A-agenda.jsx +148 -0
  86. package/lib/estudio/dados/projetos-ae/letra-nos-apps/ae/B-docs.jsx +174 -0
  87. package/lib/estudio/dados/projetos-ae/letra-nos-apps/ae/C-alttab.jsx +113 -0
  88. package/lib/estudio/dados/projetos-ae/letra-nos-apps/ae/D-spotify.jsx +118 -0
  89. package/lib/estudio/dados/projetos-ae/letra-nos-apps/ae/E-notas.jsx +146 -0
  90. package/lib/estudio/dados/projetos-ae/letra-nos-apps/ae/F-jornal1.jsx +144 -0
  91. package/lib/estudio/dados/projetos-ae/letra-nos-apps/ae/G-google.jsx +153 -0
  92. package/lib/estudio/dados/projetos-ae/letra-nos-apps/ae/H-mapa.jsx +176 -0
  93. package/lib/estudio/dados/projetos-ae/letra-nos-apps/ae/I-imagens.jsx +132 -0
  94. package/lib/estudio/dados/projetos-ae/letra-nos-apps/ae/J-jornal2.jsx +191 -0
  95. package/lib/estudio/dados/projetos-ae/letra-nos-apps/ae/K-maps.jsx +184 -0
  96. package/lib/estudio/dados/projetos-ae/letra-nos-apps/ae/camera-movimentos.jsx +48 -0
  97. package/lib/estudio/dados/projetos-ae/letra-nos-apps/ae/camera.jsx +57 -0
  98. package/lib/estudio/dados/projetos-ae/letra-nos-apps/ae/card-spotify.jsx +98 -0
  99. package/lib/estudio/dados/projetos-ae/letra-nos-apps/ae/digitar.jsx +38 -0
  100. package/lib/estudio/dados/projetos-ae/letra-nos-apps/ae/jornal-comum.jsx +196 -0
  101. package/lib/estudio/dados/projetos-ae/letra-nos-apps/ae/letra.jsx +23 -0
  102. package/lib/estudio/dados/projetos-ae/letra-nos-apps/ae/letra_automatica.py +83 -0
  103. package/lib/estudio/dados/projetos-ae/letra-nos-apps/ae/montagem.jsx +74 -0
  104. package/lib/estudio/dados/projetos-ae/letra-nos-apps/ae/w-agenda/render_html.py +13 -0
  105. package/lib/estudio/dados/projetos-ae/letra-nos-apps/ae/w-agenda/util.jsx +162 -0
  106. package/lib/estudio/dados/projetos-ae/letra-nos-apps/ae/w-midia-comum.jsx +114 -0
  107. package/lib/estudio/dados/projetos-ae/letra-nos-apps/ae/wg-util.jsx +360 -0
  108. package/lib/estudio/dados/projetos-ae/letra-nos-apps/assets/F-jornal1/render_html.py +13 -0
  109. package/lib/estudio/dados/projetos-ae/letra-nos-apps/assets/render_w-midia.py +26 -0
  110. package/lib/estudio/dados/projetos-ae/letra-nos-apps/assets/w-midia-ferramentas/inclin.py +30 -0
  111. package/lib/estudio/dados/projetos-ae/letra-nos-apps/assets/w-midia-ferramentas/medir_d.py +36 -0
  112. package/lib/estudio/dados/projetos-ae/letra-nos-apps/assets/w-midia-ferramentas/medir_e.py +27 -0
  113. package/lib/estudio/dados/projetos-ae/letra-nos-apps/camera/ajustar_movimentos.py +61 -0
  114. package/lib/estudio/dados/projetos-ae/letra-nos-apps/camera/ancorar.py +74 -0
  115. package/lib/estudio/dados/projetos-ae/letra-nos-apps/camera/assar.py +47 -0
  116. package/lib/estudio/dados/projetos-ae/letra-nos-apps/camera/camera3d_jornal.py +172 -0
  117. package/lib/estudio/dados/projetos-ae/letra-nos-apps/camera/comparar.py +32 -0
  118. package/lib/estudio/dados/projetos-ae/letra-nos-apps/camera/dados_ae_jornal.py +46 -0
  119. package/lib/estudio/dados/projetos-ae/letra-nos-apps/camera/folha_contato.py +28 -0
  120. package/lib/estudio/dados/projetos-ae/letra-nos-apps/camera/homografia_jornal.py +74 -0
  121. package/lib/estudio/dados/projetos-ae/letra-nos-apps/camera/integrar.py +44 -0
  122. package/lib/estudio/dados/projetos-ae/letra-nos-apps/camera/medir_quadro_a_quadro.py +32 -0
  123. package/lib/estudio/dados/projetos-ae/letra-nos-apps/camera/mesa_2d.py +64 -0
  124. package/lib/estudio/dados/projetos-ae/letra-nos-apps/camera/plot_cenas.py +11 -0
  125. package/lib/estudio/dados/projetos-ae/letra-nos-apps/camera/retificar_quadros.py +38 -0
  126. package/lib/estudio/dados/projetos-ae/letra-nos-apps/camera/w-agenda/assar_ab.py +52 -0
  127. package/lib/estudio/dados/projetos-ae/letra-nos-apps/camera/w-agenda/medir_ab.py +59 -0
  128. package/lib/estudio/dados/projetos-ae/letra-nos-apps/camera/wg_ajustar_h.py +111 -0
  129. package/lib/estudio/dados/projetos-ae/letra-nos-apps/camera/wg_corrige_cam.py +17 -0
  130. package/lib/estudio/dados/projetos-ae/letra-nos-apps/camera/wg_ecc_cadeia.py +80 -0
  131. package/lib/estudio/dados/projetos-ae/letra-nos-apps/camera/wg_finalizar_cam.py +65 -0
  132. package/lib/estudio/dados/projetos-ae/letra-nos-apps/camera/wg_mosaico.py +61 -0
  133. package/lib/estudio/dados/projetos-ae/letra-nos-apps/guia-do-metodo/tutorial-lyric-edit-interfaces/01-gramatica-e-roteiro.md +55 -0
  134. package/lib/estudio/dados/projetos-ae/letra-nos-apps/guia-do-metodo/tutorial-lyric-edit-interfaces/02-camera.md +66 -0
  135. package/lib/estudio/dados/projetos-ae/letra-nos-apps/guia-do-metodo/tutorial-lyric-edit-interfaces/03-montagem-no-ae.md +50 -0
  136. package/lib/estudio/dados/projetos-ae/letra-nos-apps/guia-do-metodo/tutorial-lyric-edit-interfaces/04-render-e-conferencia.md +43 -0
  137. package/lib/estudio/dados/projetos-ae/letra-nos-apps/guia-do-metodo/tutorial-lyric-edit-interfaces/05-abertura-celular-mergulho.md +43 -0
  138. package/lib/estudio/dados/projetos-ae/letra-nos-apps/guia-do-metodo/tutorial-lyric-edit-interfaces.md +42 -0
  139. package/lib/estudio/dados/projetos-ae/letra-nos-apps/transicao/atraso_imagem.py +31 -0
  140. package/lib/estudio/dados/projetos-ae/letra-nos-apps/transicao/fundo.py +56 -0
  141. package/lib/estudio/dados/projetos-ae/letra-nos-apps/transicao/juntar.py +45 -0
  142. package/lib/estudio/dados/projetos-ae/letra-nos-apps/transicao/montar.py +177 -0
  143. package/lib/estudio/dados/projetos-ae/letra-nos-apps/transicao/rastreio.py +74 -0
  144. package/lib/estudio/dados/projetos-ae/letra-nos-apps/transicao/sincronia.py +18 -0
  145. package/lib/estudio/dados/projetos-ae/pinterest-inspiracao/ae/cenas.jsx +530 -0
  146. package/lib/estudio/dados/projetos-ae/pinterest-inspiracao/assets/fazer_assets.py +107 -0
  147. package/lib/estudio/dados/projetos-ae/processo-motion-100-ia/assets/pessoas/figurinha.py +46 -0
  148. package/lib/estudio/dados/projetos-ae/processo-motion-100-ia/comp-a/BRIEF-A.md +83 -0
  149. package/lib/estudio/dados/projetos-ae/processo-motion-100-ia/comp-a/audio.py +179 -0
  150. package/lib/estudio/dados/projetos-ae/processo-motion-100-ia/comp-a/confere.py +20 -0
  151. package/lib/estudio/dados/projetos-ae/processo-motion-100-ia/comp-a/dados/tempo-parte1.js +1 -0
  152. package/lib/estudio/dados/projetos-ae/processo-motion-100-ia/comp-a/dados/tempo-parte2.js +1 -0
  153. package/lib/estudio/dados/projetos-ae/processo-motion-100-ia/comp-a/gerar_emojis.py +11 -0
  154. package/lib/estudio/dados/projetos-ae/processo-motion-100-ia/comp-a/img/filmes/_indice.js +122 -0
  155. package/lib/estudio/dados/projetos-ae/processo-motion-100-ia/comp-a/js/base.js +380 -0
  156. package/lib/estudio/dados/projetos-ae/processo-motion-100-ia/comp-a/js/main.js +86 -0
  157. package/lib/estudio/dados/projetos-ae/processo-motion-100-ia/comp-a/js/p1a.js +169 -0
  158. package/lib/estudio/dados/projetos-ae/processo-motion-100-ia/comp-a/js/p1b.js +455 -0
  159. package/lib/estudio/dados/projetos-ae/processo-motion-100-ia/comp-a/js/p1c.js +389 -0
  160. package/lib/estudio/dados/projetos-ae/processo-motion-100-ia/comp-a/js/p2.js +379 -0
  161. package/lib/estudio/dados/projetos-ae/processo-motion-100-ia/comp-a/video.py +62 -0
  162. package/lib/estudio/dados/projetos-ae/processo-motion-100-ia/take-unico/README.md +65 -0
  163. package/lib/estudio/dados/projetos-ae/processo-motion-100-ia/take-unico/oraculo_take.py +137 -0
  164. package/lib/estudio/dados/projetos-ae/processo-motion-100-ia/take-unico/render_take.py +388 -0
  165. package/lib/estudio/dados/projetos-ae/processo-motion-100-ia/take-unico/take.js +235 -0
  166. package/lib/estudio/diretor.js +2 -1
  167. package/lib/estudio/editor.js +285 -0
  168. package/lib/estudio/efeitos-fabrica/terminal-digitando.jsx +2 -1
  169. package/lib/estudio/effectcraft.js +152 -0
  170. package/lib/estudio/exportar.js +181 -0
  171. package/lib/estudio/gerativo.js +44 -15
  172. package/lib/estudio/index.js +126 -5
  173. package/lib/estudio/kit/gerativo.jsx +15 -0
  174. package/lib/estudio/kit-ae/base.jsx +1146 -0
  175. package/lib/estudio/kit-ae/cenas.jsx +395 -0
  176. package/lib/estudio/kit-ae/primitivas.jsx +911 -0
  177. package/lib/estudio/kokoro.js +3 -1
  178. package/lib/estudio/maquina-diretor.js +393 -0
  179. package/lib/estudio/maquina-elementos.js +134 -0
  180. package/lib/estudio/maquina-layout.js +198 -0
  181. package/lib/estudio/maquina-som.js +478 -0
  182. package/lib/estudio/maquina-trilha.js +160 -0
  183. package/lib/estudio/maquina-voz.js +429 -0
  184. package/lib/estudio/maquina.js +516 -0
  185. package/lib/estudio/projetos.js +60 -0
  186. package/lib/estudio/remotion.js +6 -4
  187. package/lib/estudio/revisor.js +61 -0
  188. package/lib/estudio/voicestudio.js +81 -0
  189. package/lib/headless.js +71 -0
  190. package/lib/hooks.js +72 -0
  191. package/lib/local/cerebro.json +398 -12
  192. package/lib/local/entrada.js +46 -2
  193. package/lib/marca-kit.js +309 -0
  194. package/lib/mcp.js +286 -6
  195. package/lib/perigo.js +31 -3
  196. package/lib/planos.js +47 -19
  197. package/lib/preparar.js +111 -0
  198. package/lib/retomar.js +55 -0
  199. package/lib/sandbox.js +197 -0
  200. package/lib/skills.js +3 -1
  201. package/lib/tools.js +13 -4
  202. package/lib/ui.js +1 -1
  203. package/lib/video/auto.js +18 -3
  204. package/package.json +4 -2
  205. package/skills/after-effects/SKILL.md +52 -0
  206. package/skills/maquina-de-motion/SKILL.md +84 -0
  207. package/skills/motion-de-primeira/SKILL.md +33 -51
@@ -0,0 +1,184 @@
1
+ // =====================================================================
2
+ // CENA K-maps (28,00–33,875 s, ref 30,90) — Google Maps claro (agente w-google, 17/10). ES3.
3
+ // Mapa vetorial nosso desenhado sobre o mosaico do original (coordenadas do mundo = quadro de 30,90).
4
+ // Câmera: camera/cena-K-maps-ajustada.json — a medida tinha 3 trechos que não fechavam entre si (o original usa
5
+ // prints do Maps em zooms diferentes): 28,0–29,0 corrigido por pontos fixos (avatar 1, D152, D607, pino verde),
6
+ // 29,4–30,9 por cadeia ECC ancorada em 30,5, e o fim pelo ECC 30,5→33,5 conferido no avatar 1.
7
+ // Encaixe J: o pino-avatar 1 (comp provisória "ENCAIXE J-jornal2"). Para em 33,3 (único descanso).
8
+ // Textos de letra: K1 (rótulo do pino 1), K2 (busca), K3 (rótulo do pino verde perto do avatar 2), K4 (texto azul).
9
+ // =====================================================================
10
+ (function () {
11
+ var P0 = File.decode("<HOME>/Documents/Cria%C3%A7%C3%A3o%20de%20conteudo/07-videos/projetos/2026-10-17-subzmotion-recriacao/");
12
+ $.evalFile(P0 + "ae/wg-util.jsx");
13
+ var ID = "K-maps", MG = 60, TS = 28.0;
14
+ var pasta = WG.pasta("CENA " + ID + " (w-google)");
15
+ var M = WG.comp("MUNDO " + ID, 1080 + 2 * MG, 1080 + 2 * MG, pasta);
16
+ var C = WG.camera(M, ID), cam = C.cam;
17
+ var FR = "Roboto-Regular", FRM = "Roboto-Medium", FRB = "Roboto-Bold", FG = "GoogleSansFlex120pt-Regular", FI = "SegoeMDL2Assets";
18
+ var VERDE = "#CFF2DC", VERDE2 = "#A9E5C2", URB = "#EEEEF0", ESTR = "#8DA4C1", AGUA = "#8DD7EB", TRILHA = "#9ED8B6";
19
+ var i;
20
+ function rotulo(s, x, y, tam, cor, o) {
21
+ o = o || {};
22
+ var L = WG.texto(M, cam, "rotulo " + s, s, { x: x, y: y, fonte: o.fonte || FRM, tam: tam, cor: cor, traco: "#FFFFFF", tracoL: o.halo || 4, just: o.just });
23
+ if (o.rot) WG.tr(L).property("ADBE Rotate Z").setValue(o.rot);
24
+ return L;
25
+ }
26
+ function pino(nome, x, y, d, cor, icone, corIcone) {
27
+ var g = WG.nulo(M, cam, "pino " + nome, [0, 0], [x, y]);
28
+ WG.forma(M, g, "pino " + nome + " sombra", { x: -d * 0.18, y: d * 0.42, w: d * 0.36, h: d * 0.16, elipse: true, cor: "#000000", alfa: 18 });
29
+ WG.forma(M, g, "pino " + nome + " borda", { x: -d / 2 - 2, y: -d / 2 - 2, w: d + 4, h: d + 4, elipse: true, cor: "#FFFFFF" });
30
+ WG.forma(M, g, "pino " + nome + " cor", { x: -d / 2, y: -d / 2, w: d, h: d, elipse: true, cor: cor });
31
+ if (icone) WG.texto(M, g, "pino " + nome + " icone", icone, { x: 0, y: d * 0.22, fonte: FI, tam: d * 0.55, cor: corIcone || "#FFFFFF", just: "C" });
32
+ return g;
33
+ }
34
+ function badge(s, cx, cy) {
35
+ var g = WG.nulo(M, cam, "placa " + s, [0, 0], [cx, cy]);
36
+ WG.forma(M, g, "placa " + s + " borda", { x: -33, y: -17, w: 66, h: 34, r: 7, cor: "#C9A62C" });
37
+ WG.forma(M, g, "placa " + s + " fundo", { x: -31, y: -15, w: 62, h: 30, r: 6, cor: "#FBD54B" });
38
+ WG.texto(M, g, "placa " + s + " texto", s, { x: 0, y: 7.5, fonte: FRM, tam: 20, cor: "#3C4043", just: "C" });
39
+ return g;
40
+ }
41
+
42
+ // =================== base do mapa ===================
43
+ WG.forma(M, cam, "mapa base (parque claro)", { x: -800, y: -700, w: 2800, h: 2300, cor: VERDE });
44
+ WG.caminho(M, cam, "area urbana", [[148, -700], [1900, -700], [1900, 250], [1300, 300], [1100, 262], [900, 325], [760, 300], [700, 322], [600, 430], [505, 585], [468, 606], [425, 590], [300, 505], [172, 335], [148, 140]], { fechado: true, cor: URB, reto: false });
45
+ WG.caminho(M, cam, "parque escuro (campo de esportes)", [[-330, -110], [128, -110], [134, 400], [-330, 412]], { fechado: true, cor: VERDE2, reto: true });
46
+ WG.caminho(M, cam, "lago", [[800, 505], [788, 420], [840, 350], [950, 300], [1100, 268], [1192, 292], [1182, 380], [1100, 440], [1000, 482], [900, 507]], { fechado: true, cor: AGUA });
47
+ WG.caminho(M, cam, "riacho", [[588, 575], [629, 533], [695, 440], [760, 410], [805, 418]], { traco: AGUA, tracoL: 4 });
48
+ // trilhas tracejadas dos parques
49
+ var trilhas = [[[-250, 520], [-60, 470], [120, 600], [300, 760]], [[-200, 760], [0, 700], [180, 860], [240, 1100]], [[560, 470], [640, 560], [760, 540], [900, 600], [1100, 560]],
50
+ [[700, 760], [900, 820], [1100, 900], [1300, 960]], [[520, 900], [700, 1000], [900, 1050]], [[1000, 600], [1150, 640], [1350, 600], [1500, 640]], [[-120, 120], [0, 260], [80, 380]]];
51
+ for (i = 0; i < trilhas.length; i++) WG.caminho(M, cam, "trilha " + (i + 1), trilhas[i], { traco: TRILHA, tracoL: 1.6, tracejado: [7, 6] });
52
+ // ruas finas do bairro
53
+ var ruas = [[[300, -60], [520, 40], [700, 120], [900, 240]], [[180, 200], [300, 230], [430, 262]], [[250, -300], [262, 120], [270, 450]], [[520, -400], [540, 0], [562, 300]],
54
+ [[160, 60], [420, 52], [690, 62]], [[700, -150], [850, -60], [1000, 40], [1200, 140]], [[640, -380], [700, -150]], [[900, -400], [960, -200], [1020, 30]], [[1100, -100], [1300, 0], [1500, 120]]];
55
+ for (i = 0; i < ruas.length; i++) { WG.caminho(M, cam, "rua fina borda " + (i + 1), ruas[i], { traco: "#DCDCE2", tracoL: 6 }); WG.caminho(M, cam, "rua fina " + (i + 1), ruas[i], { traco: "#FFFFFF", tracoL: 3.6 }); }
56
+ // vias claras
57
+ var claras = [[[485, 602], [598, 424], [711, 295], [824, 182], [921, 85], [1010, -20], [1100, -150]], [[480, 642], [800, 850], [1163, 1069], [1500, 1260]]];
58
+ for (i = 0; i < claras.length; i++) { WG.caminho(M, cam, "via clara borda " + (i + 1), claras[i], { traco: "#D5DBE3", tracoL: 12 }); WG.caminho(M, cam, "via clara " + (i + 1), claras[i], { traco: "#F7F9FC", tracoL: 9 }); }
59
+ // vias principais (azul-acinzentado) + rotatória
60
+ var principais = [[[139, -700], [139, 134], [163, 327], [292, 521], [440, 610]],
61
+ [[450, 640], [240, 760], [34, 876], [-420, 1120], [-800, 1320]],
62
+ [[458, 650], [430, 880], [395, 1150], [380, 1400]],
63
+ [[470, 625], [540, 652], [650, 657], [756, 664], [890, 690], [1000, 704], [1190, 707], [1400, 703], [1700, 699], [2000, 696]]];
64
+ for (i = 0; i < principais.length; i++) WG.caminho(M, cam, "via principal " + (i + 1), principais[i], { traco: ESTR, tracoL: 15 });
65
+ WG.forma(M, cam, "rotatoria", { x: 438, y: 596, w: 52, h: 52, elipse: true, cor: ESTR });
66
+
67
+ // =================== rótulos e placas ===================
68
+ rotulo("Clock Square", 436, 628, 27, "#8E44D9", { just: "D" });
69
+ rotulo("Riverside College", -289, 543, 26, "#5F6368");
70
+ rotulo("Sports Field", -268, 32, 25, "#188038");
71
+ rotulo("Clock Tower Hotel", 284, -76, 26, "#C2185B");
72
+ rotulo("Royal Street", 470, 40, 21, "#5F6368", { rot: 26 });
73
+ rotulo("Constance Blvd", 131, 90, 19, "#5F6368", { rot: 86 });
74
+ rotulo("Magenta Blvd", 615, 450, 19, "#5F6368", { rot: -55 });
75
+ rotulo("Westfield", 824, -2, 34, "#3C4043", { fonte: FRB });
76
+ rotulo("Market Street", 744, -100, 21, "#5F6368", { rot: 25 });
77
+ rotulo("Equestrian Club", 1098, 466, 26, "#5F6368");
78
+ rotulo("of Westfield", 1098, 500, 26, "#5F6368");
79
+ rotulo("White Stone", 1342, 892, 32, "#8E44D9");
80
+ rotulo("Cave", 1342, 936, 32, "#8E44D9");
81
+ badge("D152", 363, 695); badge("D607", 429, 756); badge("D58", 982, 932); badge("D606", 1316, 711);
82
+ // pinos de lugar
83
+ var pf = pino("parque flor", 679, 470, 36, "#2E9E6E", null);
84
+ for (i = 0; i < 5; i++) { var an = i * 72 * Math.PI / 180; WG.forma(M, pf, "flor petala " + (i + 1), { x: Math.sin(an) * 6.5 - 4.5, y: -Math.cos(an) * 6.5 - 4.5, w: 9, h: 9, elipse: true, cor: "#FFFFFF" }); }
85
+ WG.forma(M, pf, "flor miolo", { x: -2.5, y: -2.5, w: 5, h: 5, elipse: true, cor: "#2E9E6E" });
86
+ pino("roxo 1", 860, 495, 32, "#A55CF5", "\uE80F");
87
+ pino("roxo 2", 932, 120, 32, "#A55CF5", "\uE80F");
88
+ pino("cinza clube", 990, 522, 32, "#8D9399", "\uE91F");
89
+ pino("hotel 1", -87, -112, 30, "#E3428B", "\uE80F");
90
+ pino("hotel 2", 232, -104, 30, "#E3428B", "\uE80F");
91
+ pino("hotel 3", 405, 342, 30, "#E3428B", "\uE80F");
92
+ pino("parque 1", 34, -58, 30, "#2E9E6E", "\uE91F");
93
+ pino("parque esportes", -92, 12, 30, "#2E9E6E", "\uE91F");
94
+ pino("golfe", -216, 834, 30, "#2E9E6E", "\uE7C1");
95
+ pino("faculdade", 130, 530, 30, "#8D9399", "\uE7BE");
96
+
97
+ // =================== barra lateral + caixa de busca ===================
98
+ WG.forma(M, cam, "lateral fundo", { x: -430, y: -320, w: 140, h: 1500, cor: "#F6FAFB" });
99
+ WG.texto(M, cam, "lateral menu", "\uE700", { x: -382, y: -136, fonte: FI, tam: 30, cor: "#3C4043", just: "C" });
100
+ WG.texto(M, cam, "lateral salvos icone", "\uE8A4", { x: -382, y: 8, fonte: FI, tam: 30, cor: "#3C4043", just: "C" });
101
+ WG.texto(M, cam, "lateral salvos", "Saved", { x: -382, y: 48, fonte: FR, tam: 21, cor: "#3C4043", just: "C" });
102
+ WG.texto(M, cam, "lateral recentes icone", "\uE81C", { x: -382, y: 210, fonte: FI, tam: 30, cor: "#3C4043", just: "C" });
103
+ WG.texto(M, cam, "lateral recentes", "Recents", { x: -382, y: 250, fonte: FR, tam: 21, cor: "#3C4043", just: "C" });
104
+ WG.imagem(M, cam, "lateral foto 1", "assets/I-imagens/ceu-4.png", { x: -410, y: 424, w: 60, h: 60, r: 10 });
105
+ WG.texto(M, cam, "lateral foto 1 nome", "Westfi...", { x: -382, y: 512, fonte: FR, tam: 19, cor: "#3C4043", just: "C" });
106
+ WG.imagem(M, cam, "lateral foto 2", "assets/I-imagens/ceu-3.png", { x: -410, y: 610, w: 60, h: 60, r: 10 });
107
+ WG.texto(M, cam, "lateral foto 2 nome 1", "Pine", { x: -382, y: 696, fonte: FR, tam: 19, cor: "#3C4043", just: "C" });
108
+ WG.texto(M, cam, "lateral foto 2 nome 2", "Lodge", { x: -382, y: 720, fonte: FR, tam: 19, cor: "#3C4043", just: "C" });
109
+ var caixa = WG.forma(M, cam, "busca caixa branca", { x: -238, y: -235, w: 974, h: 132, r: 66, cor: "#FFFFFF" });
110
+ caixa.property("ADBE Effect Parade").addProperty("ADBE Drop Shadow");
111
+ var dsC = caixa.property("ADBE Effect Parade").property("ADBE Drop Shadow");
112
+ dsC.property("ADBE Drop Shadow-0002").setValue(40); dsC.property("ADBE Drop Shadow-0003").setValue(180); dsC.property("ADBE Drop Shadow-0004").setValue(4); dsC.property("ADBE Drop Shadow-0005").setValue(14);
113
+ WG.texto(M, cam, "busca lupa", "\uE721", { x: 518, y: -158, fonte: FI, tam: 36, cor: "#3C4043", just: "C" });
114
+ WG.forma(M, cam, "busca rotas fundo", { x: 637, y: -215, w: 48, h: 48, r: 10, cor: "#0F8C7C" });
115
+ WG.tr(M.layer("busca rotas fundo")).property("ADBE Rotate Z").setValue(45);
116
+ WG.texto(M, cam, "busca rotas seta", "\uE72A", { x: 661, y: -181, fonte: FI, tam: 22, cor: "#FFFFFF", just: "C" });
117
+ var sK2 = WG.LETRA("K2");
118
+ var busca = WG.texto(M, cam, "busca digitada (letra K2)", sK2.texto, { x: -172, y: -152, fonte: FG, tam: 36, cor: "#202124" });
119
+ WG.DIGITAR(busca, sK2.palavras, WG.tempoDig("K2", sK2), WG.DIG.K2.fim, { cursor: true, cursorFica: 0.6 });
120
+
121
+ // =================== pino verde perto do avatar 2 (rótulo K3) ===================
122
+ pino("parque pessoa", 1147, 800, 40, "#2E9E6E", "\uE805");
123
+ var sK3 = WG.LETRA("K3");
124
+ var tK3 = WG.texto(M, cam, "rotulo verde K3 (letra)", sK3.texto, { x: 1185, y: 832, fonte: FRB, tam: 42, cor: "#1E8E55", traco: "#FFFFFF", tracoL: 5 });
125
+ WG.DIGITAR(tK3, sK3.palavras, WG.tempoDig("K3", sK3), WG.DIG.K3.fim, { cursor: false });
126
+
127
+ // =================== pino 1 (avatar @mari.frames) + encaixe J ===================
128
+ var c0 = WG.camEm(cam, TS), provJ = WG.provisoria("ENCAIXE J-jornal2");
129
+ var lado0 = 1080 / Math.pow(2, c0.z);
130
+ var D1 = 74; // diâmetro do pino 1 (anel branco) com escala 100
131
+ var g1 = WG.nulo(M, cam, "PINO 1 (grupo; tamanho como no original)", [0, 0], [464, 619]);
132
+ WG.forma(M, g1, "pino 1 base", { x: -D1 * 0.26, y: D1 * 0.42, w: D1 * 0.52, h: D1 * 0.3, elipse: true, cor: "#FFFFFF" });
133
+ WG.forma(M, g1, "pino 1 sombra", { x: -D1 * 0.53, y: -D1 * 0.47, w: D1 * 1.06, h: D1 * 1.06, elipse: true, cor: "#000000", alfa: 16 });
134
+ WG.forma(M, g1, "pino 1 anel branco", { x: -D1 / 2, y: -D1 / 2, w: D1, h: D1, elipse: true, cor: "#FFFFFF" });
135
+ var foto1 = WG.imagem(M, g1, "pino 1 foto (mari.frames)", "assets/comum/avatar-mari.png", { x: -D1 / 2 + 4, y: -D1 / 2 + 4, w: D1 - 8, h: D1 - 8, circulo: true, fy: 0.35 });
136
+ // tamanho do pino no mundo (o original troca de print do Maps; medido: 26 px em 28,5 → 74 px no fim)
137
+ // medido no original: anel ~58 px de mundo em 28,5, ~66 em 28,75-29,0, ~60 em 30,5 e 74 no fim
138
+ var esc1 = [[28.00, 125], [28.20, 100], [28.33, 76], [28.75, 89], [29.00, 89], [30.50, 81], [30.90, 83], [32.60, 100]];
139
+ var k1 = []; for (i = 0; i < esc1.length; i++) k1.push([esc1[i][0], [esc1[i][1], esc1[i][1]]]);
140
+ WG.chaves(WG.tr(g1).property("ADBE Scale"), k1, 50);
141
+ WG.chave2(WG.tr(foto1).property("ADBE Opacity"), 28.22, 0, 28.33, 100, 30, 50);
142
+ var enc = WG.CAMERA_encaixe(M, cam, provJ, [c0.mx, c0.my], lado0, -c0.g, "ENCAIXE J-jornal2");
143
+ enc.motionBlur = true;
144
+ enc.moveBefore(foto1);
145
+ var et = WG.tr(enc);
146
+ WG.chaves(et.property("ADBE Position"), [[TS, [c0.mx, c0.my]], [28.33, [464, 619]]], 70);
147
+ var sF = 100 * 58 / 1080;
148
+ WG.chaves(et.property("ADBE Scale"), [[TS, [100 * lado0 / 1080, 100 * lado0 / 1080]], [28.33, [sF, sF]]], 70);
149
+ WG.chaves(et.property("ADBE Rotate Z"), [[TS, -c0.g], [28.33, 0]], 70);
150
+ var mk = WG.mascara(enc, WG.formaRet(0, 0, 1080, 1080, 0), "arredonda");
151
+ WG.chaves(mk.property("ADBE Mask Shape"), [[TS, WG.formaRet(0, 0, 1080, 1080, 0)], [28.10, WG.formaRet(40, 40, 1000, 1000, 170)], [28.30, WG.formaRet(0, 0, 1080, 1080, 540)]], 60);
152
+ enc.outPoint = 28.40;
153
+ // rótulo verde do pino 1 (K1)
154
+ var sK1 = WG.LETRA("K1");
155
+ var gL1 = WG.nulo(M, cam, "ROTULO PINO 1 (grupo)", [0, 0], [500, 646]);
156
+ var tK1 = WG.texto(M, gL1, "rotulo verde K1 (letra)", sK1.texto, { x: 0, y: 0, fonte: FRB, tam: 40, cor: "#1E8E55", traco: "#FFFFFF", tracoL: 5 });
157
+ WG.DIGITAR(tK1, sK1.palavras, WG.tempoDig("K1", sK1), WG.DIG.K1.fim, { cursor: false });
158
+ WG.chaves(WG.tr(gL1).property("ADBE Scale"), [[28.33, [86, 86]], [30.50, [77, 77]], [32.60, [100, 100]]], 50);
159
+ WG.tr(gL1).property("ADBE Position").setValue([512, 641]);
160
+
161
+ // =================== avatar 2 (@o.produtor, anel azul) anda pela estrada até o avatar 1 ===================
162
+ var g2 = WG.nulo(M, cam, "AVATAR 2 (grupo, anda)", [0, 0], [1400, 690]);
163
+ var cam2 = [[30.90, [1405, 690]], [31.125, [1363, 692]], [31.25, [1310, 700]], [31.5, [1192, 705]], [31.75, [1088, 706]], [32.0, [996, 706]], [32.25, [890, 692]], [32.5, [756, 663]], [32.75, [650, 657]], [33.0, [580, 655]], [33.25, [541, 652]], [33.30, [538, 652]]];
164
+ WG.chaves(WG.tr(g2).property("ADBE Position"), cam2, 33, true);
165
+ var k2 = WG.tr(g2).property("ADBE Position");
166
+ for (i = 2; i < k2.numKeys; i++) { // passo contínuo (sem tranco nas chaves medidas)
167
+ k2.setInterpolationTypeAtKey(i, KeyframeInterpolationType.BEZIER, KeyframeInterpolationType.BEZIER);
168
+ k2.setTemporalContinuousAtKey(i, true); k2.setTemporalAutoBezierAtKey(i, true);
169
+ try { k2.setSpatialContinuousAtKey(i, true); k2.setSpatialAutoBezierAtKey(i, true); } catch (e) {}
170
+ }
171
+ k2.setInterpolationTypeAtKey(k2.numKeys, KeyframeInterpolationType.BEZIER, KeyframeInterpolationType.BEZIER);
172
+ WG.ease(k2, k2.numKeys, 85, 33); // pousa devagar e fica parado até o fim
173
+ WG.forma(M, g2, "avatar 2 sombra", { x: -40, y: -36, w: 80, h: 80, elipse: true, cor: "#000000", alfa: 16 });
174
+ WG.forma(M, g2, "avatar 2 anel azul", { x: -37.5, y: -37.5, w: 75, h: 75, elipse: true, cor: "#166FE7" });
175
+ WG.imagem(M, g2, "avatar 2 foto (o.produtor)", "assets/comum/avatar-produtor.png", { x: -33, y: -33, w: 66, h: 66, circulo: true, fy: 0.3 });
176
+ var sK4 = WG.LETRA("K4");
177
+ var tK4 = WG.texto(M, g2, "texto azul K4 (letra)", sK4.texto, { x: 52, y: 10, fonte: FRM, tam: 21, cor: "#1A73E8", traco: "#FFFFFF", tracoL: 3 });
178
+ WG.DIGITAR(tK4, sK4.palavras, WG.tempoDig("K4", sK4), WG.DIG.K4.fim, { cursor: false });
179
+ g2.inPoint = 30.85;
180
+
181
+ var cena = WG.cena(ID, M, C.d, pasta);
182
+ WG.limparSolidos();
183
+ return "ok K: " + M.numLayers + " camadas; encaixe J lado " + lado0.toFixed(1) + " centro " + c0.mx.toFixed(1) + "," + c0.my.toFixed(1) + " giro " + (-c0.g).toFixed(2);
184
+ })();
@@ -0,0 +1,48 @@
1
+ // =====================================================================
2
+ // Câmera por MOVIMENTOS (o rig do @subzmotion, para escrever a câmera de qualquer música)
3
+ // Um null "MOV k" por movimento, cada um com 2 keyframes (Progresso 0 -> 1) com velocidade zero nas pontas
4
+ // e influência de saída/entrada; o null "CAM" soma os movimentos:
5
+ // Zoom (log2) = base + soma(dZoom_k * progresso_k) -> Escala = 100 * 2^zoom
6
+ // Mira X/Y = base + soma(dMira_k * progresso_k) -> Ponto de ancoragem (o ponto do mundo no centro da tela)
7
+ // Giro = base + soma(dGiro_k * progresso_k)
8
+ // Números medidos no autor (On My Way, 40 movimentos ajustados): duração mediana 1,37 s (33 quadros; 0,98–1,82),
9
+ // influência de saída ~67%, de entrada ~77%, movimentos sobrepostos (o próximo começa antes do anterior acabar).
10
+ // Formato (o mesmo do camera/movimentos.json):
11
+ // {base: {zoom_log2, mira_x, mira_y, giro}, movimentos: [{ini, dur, infl_saida, infl_entrada, zoom_log2, mira_x, mira_y, giro}, ...]}
12
+ // Uso (ES3): $.evalFile(P + "ae/camera-movimentos.jsx"); var cam = CAMMOV_criar(comp, objetoOuCaminhoJSON);
13
+ // =====================================================================
14
+ function CAMMOV_ler(x) {
15
+ if (typeof x != "string") return x;
16
+ var f = new File(x); f.encoding = "UTF-8"; f.open("r"); var s = f.read(); f.close(); return eval("(" + s + ")");
17
+ }
18
+ function CAMMOV_criar(comp, dados) {
19
+ var d = CAMMOV_ler(dados), M = d.movimentos, i;
20
+ var termos = { z: [], x: [], y: [], g: [] };
21
+ for (i = 0; i < M.length; i++) {
22
+ var m = M[i], nome = "MOV " + (i + 1);
23
+ var n = comp.layers.addNull(comp.duration); n.name = nome; n.enabled = false; n.label = 11;
24
+ n.property("ADBE Effect Parade").addProperty("ADBE Slider Control").name = "Progresso";
25
+ var pr = n.property("ADBE Effect Parade").property("Progresso").property(1);
26
+ pr.setValuesAtTimes([m.ini, m.ini + m.dur], [0, 1]);
27
+ pr.setTemporalEaseAtKey(1, [new KeyframeEase(0, 0.1)], [new KeyframeEase(0, Math.max(0.1, Math.min(100, m.infl_saida)))]);
28
+ pr.setTemporalEaseAtKey(2, [new KeyframeEase(0, Math.max(0.1, Math.min(100, m.infl_entrada)))], [new KeyframeEase(0, 0.1)]);
29
+ var ref = 'thisComp.layer("' + nome + '").effect("Progresso")(1)';
30
+ if (m.zoom_log2) termos.z.push(m.zoom_log2 + "*" + ref);
31
+ if (m.mira_x) termos.x.push(m.mira_x + "*" + ref);
32
+ if (m.mira_y) termos.y.push(m.mira_y + "*" + ref);
33
+ if (m.giro) termos.g.push(m.giro + "*" + ref);
34
+ }
35
+ var cam = comp.layers.addNull(comp.duration); cam.name = "CAM"; cam.enabled = false; cam.label = 1;
36
+ var nomes = ["Zoom (log2)", "Mira X", "Mira Y", "Giro"], chaves = ["z", "x", "y", "g"], bases = [d.base.zoom_log2, d.base.mira_x, d.base.mira_y, d.base.giro];
37
+ for (i = 0; i < 4; i++) cam.property("ADBE Effect Parade").addProperty("ADBE Slider Control").name = nomes[i];
38
+ for (i = 0; i < 4; i++) {
39
+ var p = cam.property("ADBE Effect Parade").property(nomes[i]).property(1);
40
+ p.expression = bases[i] + (termos[chaves[i]].length ? " + " + termos[chaves[i]].join(" + ") : "") + ";";
41
+ }
42
+ var tr = cam.property("ADBE Transform Group");
43
+ tr.property("ADBE Anchor Point").expression = '[effect("Mira X")(1), effect("Mira Y")(1)]';
44
+ tr.property("ADBE Position").expression = '[thisComp.width/2, thisComp.height/2]';
45
+ tr.property("ADBE Scale").expression = 'var s = 100*Math.pow(2, effect("Zoom (log2)")(1)); [s, s]';
46
+ tr.property("ADBE Rotate Z").expression = 'effect("Giro")(1)';
47
+ return cam;
48
+ }
@@ -0,0 +1,57 @@
1
+ // =====================================================================
2
+ // Câmera por cena (recriação @subzmotion "On My Way")
3
+ // Cria o null "CAM" numa comp 1080x1080 com 4 controles e liga o transform a eles:
4
+ // Zoom (log2) -> Escala = 100 * 2^zoom (0 = tamanho do quadro de referência; 1 = 2x; -1 = metade)
5
+ // Mira X/Y -> Ponto de ancoragem: o ponto do MUNDO que fica no centro da tela
6
+ // Giro -> Rotação
7
+ // Tudo que é "mundo" (interface, textos, fotos, encaixes) vira filho do CAM, com posição em coordenadas do
8
+ // mundo (px do quadro de referência do original). Assim o mesmo mundo serve para qualquer câmera.
9
+ // Uso (ES3, dentro de um eval.run): $.evalFile(".../ae/camera.jsx"); var cam = CAMERA_criar(comp, ".../camera/cena-A-agenda.json");
10
+ // O JSON traz chaves por quadro (câmera medida no original). Para editar à mão, mexa nos keyframes dos controles.
11
+ // =====================================================================
12
+ function CAMERA_lerJSON(caminho) {
13
+ var f = new File(caminho); f.encoding = "UTF-8"; f.open("r"); var s = f.read(); f.close();
14
+ return eval("(" + s + ")");
15
+ }
16
+ function CAMERA_slider(lay, nome, valor) {
17
+ var fx = lay.property("ADBE Effect Parade").addProperty("ADBE Slider Control");
18
+ fx.name = nome; fx.property(1).setValue(valor);
19
+ }
20
+ function CAMERA_chaves(prop, lista, deMundo) {
21
+ // lista = [[t, v], ...] ; chaves lineares quadro a quadro (a curva já vem medida)
22
+ var ts = [], vs = [], i;
23
+ for (i = 0; i < lista.length; i++) { ts.push(lista[i][0]); vs.push(lista[i][1]); }
24
+ prop.setValuesAtTimes(ts, vs);
25
+ for (i = 1; i <= prop.numKeys; i++) prop.setInterpolationTypeAtKey(i, KeyframeInterpolationType.LINEAR, KeyframeInterpolationType.LINEAR);
26
+ }
27
+ function CAMERA_criar(comp, caminhoJSON) {
28
+ var d = CAMERA_lerJSON(caminhoJSON);
29
+ var cam = comp.layers.addNull(comp.duration);
30
+ cam.name = "CAM"; cam.label = 1; cam.enabled = false; // null invisível; só transforma os filhos
31
+ // adicionar efeito invalida referências antigas: cria os 4 controles primeiro, depois busca cada um pelo nome
32
+ CAMERA_slider(cam, "Zoom (log2)", 0); CAMERA_slider(cam, "Mira X", 540); CAMERA_slider(cam, "Mira Y", 540); CAMERA_slider(cam, "Giro", 0);
33
+ var fxs = cam.property("ADBE Effect Parade");
34
+ CAMERA_chaves(fxs.property("Zoom (log2)").property(1), d.chaves.zoom);
35
+ CAMERA_chaves(fxs.property("Mira X").property(1), d.chaves.mx);
36
+ CAMERA_chaves(fxs.property("Mira Y").property(1), d.chaves.my);
37
+ CAMERA_chaves(fxs.property("Giro").property(1), d.chaves.giro);
38
+ var tr = cam.property("ADBE Transform Group");
39
+ tr.property("ADBE Anchor Point").expression = '[effect("Mira X")(1), effect("Mira Y")(1)]';
40
+ tr.property("ADBE Position").expression = '[thisComp.width/2, thisComp.height/2]';
41
+ tr.property("ADBE Scale").expression = 'var s = 100*Math.pow(2, effect("Zoom (log2)")(1)); [s, s]';
42
+ tr.property("ADBE Rotate Z").expression = 'effect("Giro")(1)';
43
+ cam.inPoint = 0; cam.outPoint = comp.duration;
44
+ return cam;
45
+ }
46
+ // Encaixe: coloca uma comp (cena vizinha, 1080x1080) dentro do mundo, com centro/lado/giro do encaixes.json.
47
+ // "lado" = largura no mundo que a cena encaixada ocupa no instante da troca (preenche a tela exatamente).
48
+ function CAMERA_encaixe(comp, cam, itemCena, centro, lado, giro, nome) {
49
+ var L = comp.layers.add(itemCena); L.name = nome || ("ENCAIXE " + itemCena.name);
50
+ L.parent = cam; L.startTime = 0;
51
+ var tr = L.property("ADBE Transform Group");
52
+ tr.property("ADBE Anchor Point").setValue([itemCena.width / 2, itemCena.height / 2]);
53
+ tr.property("ADBE Position").setValue(centro);
54
+ var e = 100 * lado / itemCena.width; tr.property("ADBE Scale").setValue([e, e]);
55
+ tr.property("ADBE Rotate Z").setValue(giro || 0);
56
+ return L;
57
+ }
@@ -0,0 +1,98 @@
1
+ // =====================================================================
2
+ // Card "tocando agora" estilo Spotify no fim do vídeo, creditando a música (sugestão do autor, 17/10)
3
+ // O vídeo do original acaba em 33,917 s; a comp principal ganha uma cauda: o último quadro do Maps
4
+ // fica congelado (com deriva mínima, nada parado), escurece um pouco e o card sobe de baixo com mola e
5
+ // rastro. Capa: arte nossa (assets/card-spotify/capa.png), sem a capa oficial do disco.
6
+ // Textos trocáveis no bloco CARD. Rodar depois do montagem.jsx (usa a comp "MAIN recriacao On My Way").
7
+ // =====================================================================
8
+ var CARD = {
9
+ titulo: "On My Way",
10
+ artistas: "Alan Walker, Sabrina Carpenter, Farruko",
11
+ entra: 33.95, // s: o card começa a subir
12
+ fim: 36.5, // s: nova duração da comp principal
13
+ progresso: [0.34, 0.41] // fração da barra no começo e no fim da cauda
14
+ };
15
+ var CP = (function () { try { return File($.fileName).parent.parent.fsName.replace(/\\/g, "/") + "/"; } catch (e) { return File.decode("<HOME>/Documents/Cria%C3%A7%C3%A3o%20de%20conteudo/07-videos/projetos/2026-10-17-subzmotion-recriacao/"); } })(); // pasta do projeto = a pasta acima de ae/ (rodar com $.evalFile)
16
+ function CARD_acha(nome) { for (var i = 1; i <= app.project.numItems; i++) { var it = app.project.item(i); if (it instanceof CompItem && it.name == nome) return it; } return null; }
17
+ function CARD_texto(comp, txt, fonte, tam, cor, pos, just) {
18
+ var L = comp.layers.addText(txt), p = L.property("ADBE Text Properties").property("ADBE Text Document"), d = p.value;
19
+ d.font = fonte; d.fontSize = tam; d.fillColor = cor; d.applyFill = true; d.applyStroke = false; d.tracking = 0;
20
+ d.justification = just || ParagraphJustification.LEFT_JUSTIFY; p.setValue(d);
21
+ L.property("ADBE Transform Group").property("ADBE Position").setValue(pos); return L;
22
+ }
23
+ function CARD_ret(comp, nome, tam, raio, cor, pos) {
24
+ var L = comp.layers.addShape(); L.name = nome;
25
+ var g = L.property("ADBE Root Vectors Group").addProperty("ADBE Vector Group");
26
+ var v = g.property("ADBE Vectors Group");
27
+ var r = v.addProperty("ADBE Vector Shape - Rect"); r.property("ADBE Vector Rect Size").setValue(tam); r.property("ADBE Vector Rect Roundness").setValue(raio);
28
+ var f = v.addProperty("ADBE Vector Graphic - Fill"); f.property("ADBE Vector Fill Color").setValue(cor);
29
+ L.property("ADBE Transform Group").property("ADBE Position").setValue(pos); return L;
30
+ }
31
+ function CARD_criar() {
32
+ var main = CARD_acha("MAIN recriacao On My Way"), K = CARD_acha("CENA K-maps");
33
+ var velho = CARD_acha("CARD Spotify"); if (velho) velho.remove();
34
+ for (var v = main.numLayers; v >= 1; v--) if (main.layer(v).name == "MAPS congelado (cauda)" || main.layer(v).name == "CARD Spotify") main.layer(v).remove();
35
+ main.duration = CARD.fim;
36
+ // 1) congela o último quadro do Maps na cauda (camada extra com remapeamento fixo + deriva mínima)
37
+ var fim0 = 814 / 24, F = main.layers.add(K); F.name = "MAPS congelado (cauda)"; F.startTime = 0;
38
+ F.timeRemapEnabled = true; var tr = F.property("ADBE Time Remapping");
39
+ // apagar TODAS as chaves desliga o remapeamento: primeiro cria as novas, depois tira as antigas
40
+ tr.setValueAtTime(fim0, fim0 - 2 / 24); tr.setValueAtTime(CARD.fim, fim0 - 2 / 24);
41
+ for (var q = tr.numKeys; q >= 1; q--) if (tr.keyTime(q) < fim0 - 0.001 || (tr.keyTime(q) > fim0 + 0.001 && Math.abs(tr.keyTime(q) - CARD.fim) > 0.001)) tr.removeKey(q);
42
+ F.inPoint = fim0; F.outPoint = CARD.fim;
43
+ var fs = F.property("ADBE Transform Group").property("ADBE Scale"); fs.setValuesAtTimes([fim0, CARD.fim], [[100, 100], [103, 103]]);
44
+ // 2) comp do card
45
+ var C = app.project.items.addComp("CARD Spotify", 1080, 1080, 1, CARD.fim, 24); C.motionBlur = true; C.shutterAngle = 90; C.shutterPhase = -45;
46
+ var W = 860, H = 300, cx = 540, cy = 880; // embaixo, sem cobrir a última frase do Maps
47
+ var escuro = C.layers.addSolid([0, 0, 0], "escurece", 1080, 1080, 1, CARD.fim);
48
+ escuro.property("ADBE Transform Group").property("ADBE Opacity").setValuesAtTimes([CARD.entra, CARD.entra + 0.5], [0, 38]);
49
+ var nulo = C.layers.addNull(CARD.fim); nulo.name = "CARD sobe"; nulo.enabled = false;
50
+ nulo.property("ADBE Transform Group").property("ADBE Position").setValue([cx, cy]);
51
+ var fundo = CARD_ret(C, "fundo", [W, H], 28, [0.094, 0.11, 0.137], [cx, cy]);
52
+ var faixa = CARD_ret(C, "barra trilho", [W - 80, 7], 4, [0.33, 0.33, 0.35], [cx, cy + 104]);
53
+ var cheio = CARD_ret(C, "barra cheia", [W - 80, 7], 4, [1, 1, 1], [cx, cy + 104]);
54
+ var capaF = new ImportOptions(new File(CP + "assets/card-spotify/capa.png")), capa = C.layers.add(app.project.importFile(capaF));
55
+ capa.name = "capa"; var tc = capa.property("ADBE Transform Group"); tc.property("ADBE Scale").setValue([100 * 196 / capa.source.width, 100 * 196 / capa.source.height]);
56
+ tc.property("ADBE Position").setValue([cx - W / 2 + 40 + 98, cy - 30]);
57
+ var masc = capa.property("ADBE Mask Parade").addProperty("ADBE Mask Atom"), sh = new Shape(), s = capa.source.width, r = s * 0.06;
58
+ sh.vertices = [[r, 0], [s - r, 0], [s, r], [s, s - r], [s - r, s], [r, s], [0, s - r], [0, r]]; sh.closed = true; masc.property("ADBE Mask Shape").setValue(sh);
59
+ var tit = CARD_texto(C, CARD.titulo, "Figtree-Bold", 58, [1, 1, 1], [cx - W / 2 + 270, cy - 52]);
60
+ var art = CARD_texto(C, CARD.artistas, "Figtree-Medium", 30, [0.70, 0.70, 0.72], [cx - W / 2 + 270, cy - 2]);
61
+ var gosto = C.layers.addShape(); gosto.name = "curtido";
62
+ var gg = gosto.property("ADBE Root Vectors Group").addProperty("ADBE Vector Group").property("ADBE Vectors Group");
63
+ var el = gg.addProperty("ADBE Vector Shape - Ellipse"); el.property("ADBE Vector Ellipse Size").setValue([44, 44]);
64
+ gg.addProperty("ADBE Vector Graphic - Fill").property("ADBE Vector Fill Color").setValue([0.114, 0.725, 0.329]);
65
+ gosto.property("ADBE Transform Group").property("ADBE Position").setValue([cx + W / 2 - 64, cy - 30]);
66
+ // check desenhado como traço (o caractere de check não existe na Figtree)
67
+ var ok = C.layers.addShape(); ok.name = "check";
68
+ var og = ok.property("ADBE Root Vectors Group").addProperty("ADBE Vector Group").property("ADBE Vectors Group");
69
+ var cpth = og.addProperty("ADBE Vector Shape - Group"), chk = new Shape(); chk.vertices = [[-9, 1], [-3, 7], [9, -6]]; chk.closed = false;
70
+ cpth.property("ADBE Vector Shape").setValue(chk);
71
+ var st = og.addProperty("ADBE Vector Graphic - Stroke"); st.property("ADBE Vector Stroke Color").setValue([0, 0, 0]); st.property("ADBE Vector Stroke Width").setValue(4.5);
72
+ st.property("ADBE Vector Stroke Line Cap").setValue(2); st.property("ADBE Vector Stroke Line Join").setValue(2);
73
+ ok.property("ADBE Transform Group").property("ADBE Position").setValue([cx + W / 2 - 64, cy - 30]);
74
+ var lista = [fundo, faixa, cheio, capa, tit, art, gosto, ok], i;
75
+ for (i = 0; i < lista.length; i++) {
76
+ var L = lista[i], p = L.property("ADBE Transform Group").property("ADBE Position").value;
77
+ L.parent = nulo; L.motionBlur = true;
78
+ }
79
+ // barra cheia: escala x a partir da esquerda (âncora na ponta esquerda)
80
+ var bc = cheio.property("ADBE Transform Group");
81
+ bc.property("ADBE Anchor Point").setValue([-(W - 80) / 2, 0]); bc.property("ADBE Position").setValue([-(W - 80) / 2, 104]);
82
+ bc.property("ADBE Scale").setValuesAtTimes([CARD.entra, CARD.fim], [[100 * CARD.progresso[0], 100], [100 * CARD.progresso[1], 100]]);
83
+ // 3) entrada: sobe 260 px com mola curta (chega, passa ~2% e volta) + deriva lenta até o fim
84
+ var np = nulo.property("ADBE Transform Group").property("ADBE Position"), t0 = CARD.entra;
85
+ np.setValuesAtTimes([t0, t0 + 0.42, t0 + 0.62, CARD.fim], [[cx, cy + 420], [cx, cy - 6], [cx, cy], [cx, cy - 10]]);
86
+ var nsc = nulo.property("ADBE Transform Group").property("ADBE Scale");
87
+ nsc.setValuesAtTimes([t0, t0 + 0.5, CARD.fim], [[92, 92], [100, 100], [101.5, 101.5]]);
88
+ var nop = nulo.property("ADBE Transform Group").property("ADBE Opacity"); // nulo não tem opacidade visível: usa no fundo e filhos
89
+ for (i = 0; i < lista.length; i++) lista[i].property("ADBE Transform Group").property("ADBE Opacity").setValuesAtTimes([t0, t0 + 0.25], [0, 100]);
90
+ var eases = [np, nsc], k;
91
+ for (k = 0; k < eases.length; k++) for (i = 1; i <= eases[k].numKeys; i++) {
92
+ var pv = eases[k].propertyValueType, dims = (pv == PropertyValueType.TwoD_SPATIAL || pv == PropertyValueType.ThreeD_SPATIAL) ? 1 : eases[k].value.length, e = []; // escala tem 3 dimensões
93
+ for (var d = 0; d < dims; d++) e.push(new KeyframeEase(0, i == 1 ? 15 : 75));
94
+ eases[k].setTemporalEaseAtKey(i, e, e);
95
+ }
96
+ var LC = main.layers.add(C); LC.name = "CARD Spotify"; LC.startTime = 0; LC.inPoint = CARD.entra; LC.outPoint = CARD.fim;
97
+ return "card ok, comp principal com " + main.duration.toFixed(2) + " s";
98
+ }
@@ -0,0 +1,38 @@
1
+ // =====================================================================
2
+ // Digitação no tempo da voz (recriação @subzmotion "On My Way")
3
+ // Liga ao Texto-fonte de uma camada de texto uma expressão que digita letra a letra:
4
+ // as letras da palavra i entram entre o início da palavra i e o início da palavra i+1
5
+ // (a última termina em "fim"). Cursor "|" aparece enquanto digita e some "cursorFica" s depois.
6
+ // Uso (ES3): $.evalFile(".../ae/digitar.jsx");
7
+ // DIGITAR(camadaTexto, ["Revisar","a","timeline","do","cliente"], [0.00,0.18,0.42,0.74,0.96], 1.20, {cursor:true});
8
+ // Opções: cursor (padrão true), cursorFica (s, padrão 0.25), maiusculas (padrão false),
9
+ // ritmo: "palavra" (padrão: letras espalhadas no intervalo da palavra) ou "letra" (q quadros por letra, opção q).
10
+ // Para trocar o texto depois, edite os dois arrays no topo da expressão (ou rode DIGITAR de novo).
11
+ // =====================================================================
12
+ function DIGITAR(lay, palavras, inicios, fim, op) {
13
+ op = op || {};
14
+ var cursor = (op.cursor === undefined) ? true : op.cursor;
15
+ var fica = (op.cursorFica === undefined) ? 0.25 : op.cursorFica;
16
+ var q = op.q || 2;
17
+ var ritmo = op.ritmo || "palavra";
18
+ function arr(a, str) { var s = [], i; for (i = 0; i < a.length; i++) s.push(str ? ('"' + String(a[i]).replace(/\\/g, "\\\\").replace(/"/g, '\\"') + '"') : a[i]); return "[" + s.join(",") + "]"; }
19
+ var ex = [
20
+ "var P = " + arr(palavras, true) + ";",
21
+ "var T = " + arr(inicios, false) + ";",
22
+ "var FIM = " + fim + ", CURSOR = " + (cursor ? "true" : "false") + ", FICA = " + fica + ", RITMO = \"" + ritmo + "\", Q = " + q + ";",
23
+ "var txt = '', ativo = false, i, n;",
24
+ "for (i = 0; i < P.length; i++) {",
25
+ " var w = P[i] + (i < P.length - 1 ? ' ' : '');",
26
+ " var a = T[i], b = (i < P.length - 1) ? T[i + 1] : FIM;",
27
+ " if (time < a) break;",
28
+ " if (RITMO == 'letra') { n = Math.floor((time - a) / (Q * thisComp.frameDuration)) + 1; }",
29
+ " else { n = Math.floor((time - a) / Math.max(b - a, thisComp.frameDuration) * P[i].length) + 1; }",
30
+ " n = Math.min(n, w.length); txt += w.substr(0, n); if (n < w.length) { ativo = true; break; }",
31
+ "}",
32
+ "var fimDig = (RITMO == 'letra') ? 0 : FIM;",
33
+ "if (CURSOR && time >= T[0] && (ativo || time < FIM + FICA)) txt += '|';",
34
+ "txt;"
35
+ ].join("\n");
36
+ lay.property("ADBE Text Properties").property("ADBE Text Document").expression = ex;
37
+ return lay;
38
+ }