﻿// =====================================================================
// Câmera por MOVIMENTOS (o rig do @subzmotion, para escrever a câmera de qualquer música)
// Um null "MOV k" por movimento, cada um com 2 keyframes (Progresso 0 -> 1) com velocidade zero nas pontas
// e influência de saída/entrada; o null "CAM" soma os movimentos:
//   Zoom (log2) = base + soma(dZoom_k * progresso_k)   -> Escala = 100 * 2^zoom
//   Mira X/Y    = base + soma(dMira_k * progresso_k)   -> Ponto de ancoragem (o ponto do mundo no centro da tela)
//   Giro        = base + soma(dGiro_k * progresso_k)
// Números medidos no autor (On My Way, 40 movimentos ajustados): duração mediana 1,37 s (33 quadros; 0,98–1,82),
// influência de saída ~67%, de entrada ~77%, movimentos sobrepostos (o próximo começa antes do anterior acabar).
// Formato (o mesmo do camera/movimentos.json):
//   {base: {zoom_log2, mira_x, mira_y, giro}, movimentos: [{ini, dur, infl_saida, infl_entrada, zoom_log2, mira_x, mira_y, giro}, ...]}
// Uso (ES3): $.evalFile(P + "ae/camera-movimentos.jsx"); var cam = CAMMOV_criar(comp, objetoOuCaminhoJSON);
// =====================================================================
function CAMMOV_ler(x) {
  if (typeof x != "string") return x;
  var f = new File(x); f.encoding = "UTF-8"; f.open("r"); var s = f.read(); f.close(); return eval("(" + s + ")");
}
function CAMMOV_criar(comp, dados) {
  var d = CAMMOV_ler(dados), M = d.movimentos, i;
  var termos = { z: [], x: [], y: [], g: [] };
  for (i = 0; i < M.length; i++) {
    var m = M[i], nome = "MOV " + (i + 1);
    var n = comp.layers.addNull(comp.duration); n.name = nome; n.enabled = false; n.label = 11;
    n.property("ADBE Effect Parade").addProperty("ADBE Slider Control").name = "Progresso";
    var pr = n.property("ADBE Effect Parade").property("Progresso").property(1);
    pr.setValuesAtTimes([m.ini, m.ini + m.dur], [0, 1]);
    pr.setTemporalEaseAtKey(1, [new KeyframeEase(0, 0.1)], [new KeyframeEase(0, Math.max(0.1, Math.min(100, m.infl_saida)))]);
    pr.setTemporalEaseAtKey(2, [new KeyframeEase(0, Math.max(0.1, Math.min(100, m.infl_entrada)))], [new KeyframeEase(0, 0.1)]);
    var ref = 'thisComp.layer("' + nome + '").effect("Progresso")(1)';
    if (m.zoom_log2) termos.z.push(m.zoom_log2 + "*" + ref);
    if (m.mira_x) termos.x.push(m.mira_x + "*" + ref);
    if (m.mira_y) termos.y.push(m.mira_y + "*" + ref);
    if (m.giro) termos.g.push(m.giro + "*" + ref);
  }
  var cam = comp.layers.addNull(comp.duration); cam.name = "CAM"; cam.enabled = false; cam.label = 1;
  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];
  for (i = 0; i < 4; i++) cam.property("ADBE Effect Parade").addProperty("ADBE Slider Control").name = nomes[i];
  for (i = 0; i < 4; i++) {
    var p = cam.property("ADBE Effect Parade").property(nomes[i]).property(1);
    p.expression = bases[i] + (termos[chaves[i]].length ? " + " + termos[chaves[i]].join(" + ") : "") + ";";
  }
  var tr = cam.property("ADBE Transform Group");
  tr.property("ADBE Anchor Point").expression = '[effect("Mira X")(1), effect("Mira Y")(1)]';
  tr.property("ADBE Position").expression = '[thisComp.width/2, thisComp.height/2]';
  tr.property("ADBE Scale").expression = 'var s = 100*Math.pow(2, effect("Zoom (log2)")(1)); [s, s]';
  tr.property("ADBE Rotate Z").expression = 'effect("Giro")(1)';
  return cam;
}
