﻿// =====================================================================
// CENA G-google (16,62–18,95 s, ref 18,80) — busca do Google escura (agente w-google, 17/10). ES3.
// Mundo = quadro do original em 18,80. Câmera: camera/cena-G-google-ajustada.json (homografia; o resto
// projetivo — a página inclina ~28° em Y e ~14° em X no chicote 17,2–17,8 — vai no Corner Pin da CENA).
// Encaixe F: o ícone do chip "Estúdio Quadro" (comp provisória "ENCAIXE F-jornal1").
// Fim (18,45–18,95): página vira retângulo arredondado; o fundo é o mundo H (mapa + anel amarelo do marcador 1),
// alinhado com a câmera de H na troca (18,958); o avatar @mari.frames cresce sobre a página.
// Rodar com a comp fechada:  $.evalFile(P + "ae/G-google.jsx");
// =====================================================================
(function () {
  var P0 = File.decode("<HOME>/Documents/Cria%C3%A7%C3%A3o%20de%20conteudo/07-videos/projetos/2026-10-17-subzmotion-recriacao/");
  $.evalFile(P0 + "ae/wg-util.jsx");
  var ID = "G-google", MG = 320, TS = 16.625, TF = 18.9583;
  var pasta = WG.pasta("CENA " + ID + " (w-google)");
  var M = WG.comp("MUNDO " + ID, 1080 + 2 * MG, 1080 + 2 * MG, pasta);
  var C = WG.camera(M, ID), cam = C.cam;
  // as medidas da página foram tiradas do quadro 18,833 do original (o ffmpeg -ss pegou o quadro seguinte ao ref):
  // o nulo LAYOUT leva essas medidas para o mundo (= quadro 18,792) pela câmera daquele quadro
  var cL = WG.camEm(cam, 18.8333), sL = Math.pow(2, cL.z);
  var LAY = WG.nulo(M, cam, "LAYOUT (medidas do quadro 18,833)", [540, 540], [cL.mx, cL.my], [100 / sL, 100 / sL], -cL.g);
  function TW(p) { var r = -cL.g * Math.PI / 180, dx = (p[0] - 540) / sL, dy = (p[1] - 540) / sL; return [cL.mx + Math.cos(r) * dx - Math.sin(r) * dy, cL.my + Math.sin(r) * dx + Math.cos(r) * dy]; }
  var FG = "GoogleSansFlex120pt-Regular", FGM = "GoogleSansFlex120pt-Medium";
  var BG = "#202228", BUSCA = "#34353E", CHIP = "#2C2E34", TXT = "#E8EAED", CINZA = "#9AA0A6";

  // ---------- fundo: mundo H (mapa + anel do marcador 1), alinhado com a câmera de H em 18,958
  var dH = WG.CAMERA_lerJSON(WG.P + "camera/cena-H-mapa-ajustada.json");
  var cG = WG.camEm(cam, TF), cH = WG.camJSON(dH, TF);
  var fH = WG.nuloOutroMundo(M, cam, "FUNDO H (mundo do mapa)", cG, cH);
  var itMapa = WG.footage("assets/H-mapa/mapa-satelite.png");
  var mapa = M.layers.add(itMapa); mapa.name = "FUNDO H mapa"; mapa.parent = fH;
  WG.pos(mapa, [0, 0], [WG.H_MAPA.x, WG.H_MAPA.y], [WG.H_MAPA.k * 100, WG.H_MAPA.k * 100]);
  mapa.motionBlur = true;
  var anel = WG.forma(M, fH, "FUNDO H anel amarelo", { x: WG.H_M1[0] - 49.5, y: WG.H_M1[1] - 49.5, w: 99, h: 99, elipse: true, cor: WG.AMARELO });
  mapa.inPoint = 18.3; anel.inPoint = 18.3;
  mapa.outPoint = TF; anel.outPoint = TF;   // depois da troca o mundo H de verdade aparece em volta (G vira encaixe em H)

  // ---------- página (fundo escuro) + máscara de recorte usada por todo o conteúdo
  function pagina(nome) {
    var L = WG.forma(M, LAY, nome, { x: -700, y: -700, w: 2500, h: 2500, r: 0, cor: BG });
    var sz = WG.rectProp(L, "ADBE Vector Rect Size"), ps = WG.rectProp(L, "ADBE Vector Rect Position"), rd = WG.rectProp(L, "ADBE Vector Rect Roundness");
    // posição da forma é relativa ao centro da camada (550,550)
    // no fim a página "respira" para o tamanho que tem quando entra no marcador de H (medido em 18,80 e 18,958)
    WG.chaves(sz, [[17.95, [2500, 2500]], [18.52, [1020, 1017]], [18.80, [1020, 1017]], [TF, [1047, 1046]]], 70);
    WG.chaves(ps, [[17.95, [0, 0]], [18.52, [538 - 550, 541.5 - 550]], [18.80, [538 - 550, 541.5 - 550]], [TF, [552.5 - 550, 545 - 550]]], 70);
    WG.chaves(rd, [[17.95, 0], [18.52, 26], [TF, 30]], 70);
    return L;
  }
  var pag = pagina("PAGINA fundo");
  var matte = pagina("PAGINA recorte (matte)");
  var conteudo = [];
  function cont(L) { conteudo.push(L); return L; }

  // ---------- cabeçalho
  cont(WG.texto(M, LAY, "logo Google", "Google", { x: 80, y: 100, fonte: FGM, tam: 45, cor: "#FFFFFF", track: -12 }));
  cont(WG.forma(M, LAY, "caixa de busca", { x: 302, y: 49, w: 1150, h: 82, r: 41, cor: BUSCA }));
  var ph = cont(WG.texto(M, LAY, "busca placeholder", "Search", { x: 333, y: 100, fonte: FG, tam: 27, cor: CINZA }));
  ph.outPoint = 17.20;
  var sG1 = WG.LETRA("G1");   // letra: caixa de busca (digitada 17,20–17,60 como no original)
  var busca = cont(WG.texto(M, LAY, "busca digitada (letra G1)", sG1.texto, { x: 333, y: 101, fonte: FG, tam: 30, cor: "#FFFFFF" }));
  WG.DIGITAR(busca, sG1.palavras, WG.tempoDig("G1", sG1), WG.DIG.G1.fim, { cursor: true, cursorFica: 0.25 });
  busca.inPoint = 17.20;

  // ---------- abas (layout medido: começam em x=80, linha de base 200, espaço 40)
  var abas = ["AI Mode", "All", "Shopping", "Images", "Videos", "Short videos", "News", "More"];
  var x = 80;
  for (var i = 0; i < abas.length; i++) {
    var ativa = (i == 1);
    var L = cont(WG.texto(M, LAY, "aba " + abas[i], abas[i], { x: x, y: 200, fonte: ativa ? FGM : FG, tam: 22, cor: ativa ? "#FFFFFF" : CINZA }));
    var w = L.sourceRectAtTime(0, false).width;
    if (ativa) cont(WG.forma(M, LAY, "aba ativa sublinhado", { x: x - 2, y: 222, w: w + 4, h: 4, r: 2, cor: "#FFFFFF" }));
    if (abas[i] == "More") cont(WG.texto(M, LAY, "aba Mais seta", "\u25BE", { x: x + w + 8, y: 198, fonte: FG, tam: 16, cor: CINZA }));
    x += w + 40;
  }
  cont(WG.forma(M, LAY, "linha sob as abas", { x: 68, y: 230, w: 1500, h: 1.5, cor: "#3A3D44" }));

  // ---------- "Ver resultados sobre" + chip
  cont(WG.texto(M, LAY, "ver resultados 1", "See results", { x: 78, y: 305, fonte: FG, tam: 20, cor: TXT }));
  cont(WG.texto(M, LAY, "ver resultados 2", "about", { x: 78, y: 335, fonte: FG, tam: 20, cor: TXT }));
  var t1 = cont(WG.texto(M, LAY, "chip titulo", "Studio Quadro", { x: 305, y: 307, fonte: FGM, tam: 23, cor: TXT }));
  var t2 = cont(WG.texto(M, LAY, "chip subtitulo", "Mobile app", { x: 305, y: 335, fonte: FG, tam: 19, cor: CINZA }));
  var wchip = Math.max(t1.sourceRectAtTime(0, false).width, t2.sourceRectAtTime(0, false).width);
  var chip = cont(WG.forma(M, LAY, "chip fundo", { x: 218, y: 275, w: 305 + wchip + 22 - 218, h: 77, r: 16, cor: CHIP }));
  chip.moveAfter(t1);

  // ---------- painel: título (palavra a palavra, entra de cima), subtítulo, grade de imagens
  // no original cada palavra desce ~140 px (mundo) já no lugar em x, aparecendo, e pousa devagar (~0,55 s)
  var sG2 = WG.LETRA("G2"), palavras = sG2.palavras, tIn = WG.tempoDig("G2", sG2);   // letra: título do painel (cada palavra desce)
  var px = 75;
  for (i = 0; i < palavras.length; i++) {
    var Lw = cont(WG.texto(M, LAY, "titulo palavra " + (i + 1) + " (" + palavras[i] + ")", palavras[i], { x: px, y: 481, fonte: FG, tam: 46, cor: TXT }));
    var ww = Lw.sourceRectAtTime(0, false).width;
    var tr = WG.tr(Lw);
    WG.chave2(tr.property("ADBE Position"), tIn[i], [px, 481 - 140], tIn[i] + 0.6, [px, 481], 15, 92);
    WG.chave2(tr.property("ADBE Opacity"), tIn[i], 0, tIn[i] + 0.2, 100, 30, 60);
    Lw.inPoint = tIn[i];
    px += ww + 12;
  }
  var sub = cont(WG.texto(M, LAY, "subtitulo", "Video game", { x: 76, y: 520, fonte: FG, tam: 21, cor: "#BDC1C6" }));
  var wsub = sub.sourceRectAtTime(0, false).width;
  cont(WG.texto(M, LAY, "subtitulo menu", "\u22EE", { x: 76 + wsub + 20, y: 520, fonte: FGM, tam: 22, cor: "#BDC1C6" }));
  cont(WG.imagem(M, LAY, "grade imagem 1", "assets/G-google/motion-1.png", { x: 74, y: 563, w: 516, h: 570, r: 16, fx: 0.42 }));
  cont(WG.imagem(M, LAY, "grade imagem 2", "assets/G-google/motion-2.png", { x: 596, y: 565, w: 374, h: 257, r: 16 }));
  cont(WG.imagem(M, LAY, "grade imagem 3", "assets/G-google/motion-3.png", { x: 596, y: 826, w: 374, h: 300, r: 16 }));
  cont(WG.imagem(M, LAY, "grade imagem 4 (direita)", "assets/G-google/motion-4.png", { x: 1005, y: 565, w: 420, h: 560, r: 16, fx: 0.2 }));
  cont(WG.forma(M, LAY, "icone imagem", { x: 897, y: 1021, w: 26, h: 22, r: 4, traco: "#FFFFFF", tracoL: 2.2 }));

  for (i = 0; i < conteudo.length; i++) conteudo[i].setTrackMatte(matte, TrackMatteType.ALPHA);
  matte.enabled = false;

  // ---------- encaixe F (jornal) no ícone do chip + arte do ícone que desliza por cima
  var c0 = WG.camEm(cam, TS);
  var provF = WG.provisoria("ENCAIXE F-jornal1");
  var lado0 = 1080 / Math.pow(2, c0.z);
  var enc = WG.CAMERA_encaixe(M, cam, provF, [c0.mx, c0.my], lado0, -c0.g, "ENCAIXE F-jornal1");
  enc.motionBlur = true;
  var et = WG.tr(enc), slot = TW([255, 312]), ladoSlot = 58 / sL;
  WG.chaves(et.property("ADBE Position"), [[TS, [c0.mx, c0.my]], [16.80, slot]], 75);
  WG.chaves(et.property("ADBE Scale"), [[TS, [100 * lado0 / 1080, 100 * lado0 / 1080]], [16.80, [100 * ladoSlot / 1080, 100 * ladoSlot / 1080]]], 75);
  WG.chaves(et.property("ADBE Rotate Z"), [[TS, -c0.g], [16.80, 0]], 75);
  var mk = WG.mascara(enc, WG.formaRet(0, 0, 1080, 1080, 0), "arredonda");
  WG.chaves(mk.property("ADBE Mask Shape"), [[TS, WG.formaRet(0, 0, 1080, 1080, 0)], [16.80, WG.formaRet(0, 0, 1080, 1080, 1080 * 12.5 / 58)]], 75);
  var ico = WG.imagem(M, cam, "icone Studio Quadro (arte)", "assets/G-google/icone-estudio-quadro.png", { x: slot[0] - ladoSlot / 2, y: slot[1] - ladoSlot / 2, w: ladoSlot, h: ladoSlot, r: 12.5 / sL });
  var itI = WG.footage("assets/G-google/icone-estudio-quadro.png");
  var ip = WG.tr(ico);
  // tamanho no mundo medido no original (px do mundo): cresce enquanto a câmera recua
  var tam = [[16.42, 0.0], [16.46, 2.8], [16.54, 3.9], [16.625, 9], [16.667, 12.5], [16.708, 18], [16.75, 30], [16.792, 45], [16.833, 54], [16.875, 58 / sL]];
  var esc = [], pos = [];
  for (i = 0; i < tam.length; i++) {
    var s = 100 * tam[i][1] / itI.width; esc.push([tam[i][0], [s, s]]);
    var u = Math.min(1, Math.max(0, (tam[i][0] - 16.60) / (16.85 - 16.60))); u = u * u * (3 - 2 * u);
    pos.push([tam[i][0], [c0.mx + (slot[0] - c0.mx) * u, c0.my + 6 + (slot[1] - c0.my - 6) * u]]);
  }
  WG.chaves(ip.property("ADBE Scale"), esc, 40, true);
  WG.chaves(ip.property("ADBE Position"), pos, 40, true);
  ico.inPoint = 16.40;

  // ---------- avatar @mari.frames cresce sobre a página (18,62–18,958); termina onde fica o marcador 1 de H
  var e = Math.pow(2, cH.z - cG.z), r = (cH.g - cG.g) * Math.PI / 180;
  var dx = WG.H_M1[0] - cH.mx, dy = WG.H_M1[1] - cH.my;
  var fimAv = [cG.mx + e * (Math.cos(r) * dx - Math.sin(r) * dy), cG.my + e * (Math.sin(r) * dx + Math.cos(r) * dy)];
  var dFim = 15.4 * e;   // 15,4 px no mundo H (tamanho da foto do marcador na troca)
  var av = WG.imagem(M, cam, "avatar mari.frames (cresce)", "assets/comum/avatar-mari.png", { x: 0, y: 0, w: 100, h: 100, circulo: true, fy: 0.35 });
  var avt = WG.tr(av), itA = WG.footage("assets/comum/avatar-mari.png");
  var sA = function (d) { var k = 100 * d / (itA.width); return [k, k]; };
  WG.chaves(avt.property("ADBE Position"), [[18.62, TW([495, 541])], [18.80, TW([537, 540])], [TF, fimAv]], 50);
  WG.chaves(avt.property("ADBE Scale"), [[18.62, sA(2)], [18.70, sA(18 / sL)], [18.80, sA(64 / sL)], [TF, sA(dFim)]], 40);
  av.inPoint = 18.60;

  // ---------- CENA G-google (Corner Pin)
  var cena = WG.cena(ID, M, C.d, pasta);
  WG.limparSolidos();
  return "ok G: " + M.numLayers + " camadas no mundo; encaixe lado " + lado0.toFixed(2) + "; avatar fim " + fimAv[0].toFixed(1) + "," + fimAv[1].toFixed(1) + " d " + dFim.toFixed(1);
})();
