ghostyles/cv-dazzle-1.jsjavascript
/**
 * ==Ghostyle==
 * @name         CV-Dazzle example 1
 * @version      1.0.0
 * @author       vecna, but actually a dump of random points
 * @release_date 2026-04-13
 * @description  Pattern ad alto contrasto ispirato al CV-Dazzle per rottura simmetrica del volto.
 * ==/Ghostyle==
 */

export function onInit() {
  gstmxx.log('Caricato Ghostyle: CV-Dazzle example 1.', 'CV-Dazzle example 1');
}

/**
 * Applica una composizione ispirata al lavoro CV-Dazzle di Adam Harvey (2010).
 *
 * Strategia adversarial usata qui:
 * 1. Rottura della simmetria bilaterale con diagonali e sbordi extra-volto.
 * 2. Copertura di feature biometriche stabili (ponte nasale, zigomo, contorni occhio).
 * 3. Contrasto alto e alternanza chiaro/scuro per destabilizzare i descrittori locali.
 * 4. Sovrapposizioni opache su regioni semantiche forti che i modelli pesano molto.
 * 5. Etichette e forme "non anatomiche" per indebolire i cue faciali classici.
 */
export function onDraw(ctx, landmarks) {
  const nose = landmarks.getNose();
  const jaw = landmarks.getJawOutline();
  const leftEye = landmarks.getLeftEye();
  const rightEye = landmarks.getRightEye();
  const leftBrow = landmarks.getLeftEyeBrow();

  const baseMask = [
    gstmxx.lerp(jaw[0], leftBrow[0], 1.2),
    nose[0],
    nose[5],
    jaw[7],
    jaw[4],
    jaw[1],
    jaw[0]
  ];
  gstmxx.drawClosedPath(ctx, baseMask, 'rgba(255, 20, 147, 0.25)', 'rgba(255, 20, 147, 0.45)', 4);

  const taglioCyan = [
    jaw[7],
    nose[6],
    nose[2],
    leftBrow[4],
    gstmxx.lerp(leftBrow[4], jaw[0], -0.6)
  ];
  gstmxx.drawOpenPath(ctx, taglioCyan, 'rgba(0, 255, 255, 0.2)', 16);

  const taglioYellow = [
    jaw[2],
    leftEye[3],
    nose[1],
    rightEye[0],
    gstmxx.lerp(rightEye[0], jaw[15], 0.3)
  ];
  gstmxx.drawOpenPath(ctx, taglioYellow, 'rgba(240, 255, 0, 0.25)', 8);

  const contrastoNero1 = [jaw[5], gstmxx.lerp(jaw[5], nose[4], 0.6), leftEye[0]];
  gstmxx.drawOpenPath(ctx, contrastoNero1, 'rgba(15, 17, 21, 0.25)', 24);

  const contrastoNero2 = [nose[5], nose[3], rightEye[3], gstmxx.lerp(rightEye[3], jaw[14], 0.5)];
  gstmxx.drawOpenPath(ctx, contrastoNero2, 'rgba(15, 17, 21, 0.25)', 18);

  gstmxx.drawEyeWing(ctx, leftEye, leftBrow, 'CV-DAZZLE', {
    scale: 1.8,
    brow: 0.8,
    fill: 'rgba(57, 255, 20, 0.35)',
    stroke: 'rgba(57, 255, 20, 0.35)',
    line: 'rgba(255, 255, 255, 0.2)',
    side: 'left',
    tailX: -45,
    tailY: 20
  });

  gstmxx.drawLabel(ctx, 'SECTOR-01-ANOMALY', nose[4].x - 85, nose[4].y + 35);
}

export function onClear() {
  gstmxx.log('Modulo CV-Dazzle example 1 disattivato.', 'CV-Dazzle example 1');
}