{
  "meta": {
    "name": "dev1-new3d-v0_0_2",
    "source": [
      "webgpu/giza-drone-flight-v0_0_7.html",
      "webgpu/new3d-v0_0_28.html"
    ],
    "defaultMix": "cosmic"
  },
  "runtime": {
    "clearColor": "#061327",
    "fog": { "color": "#081b2d", "density": 0.0005 },
    "camera": {
      "fov": 58,
      "near": 0.1,
      "far": 14000,
      "position": [380, 190, 420],
      "lookAt": [0, 90, -240]
    },
    "profile": {
      "dprMin": 0.58,
      "dprMaxDesktop": 1.22,
      "dprMaxMobile": 0.95
    },
    "world": {
      "terrainSize": 5200,
      "terrainSegDesktop": 176,
      "terrainSegMobile": 112
    }
  },
  "sync": {
    "channels": [
      { "id": "basePulse", "type": "sine", "freq": 0.22, "amp": 0.42, "bias": 0.58, "phase": 0.0 },
      { "id": "holoPulse", "type": "sine", "freq": 0.66, "amp": 0.5, "bias": 0.5, "phase": 1.17 },
      { "id": "heatWave", "type": "sine", "freq": 0.19, "amp": 0.44, "bias": 0.56, "phase": 0.54 },
      { "id": "glitchGate", "type": "randomGate", "sampleRate": 30, "threshold": 0.983 },
      { "id": "tapeBurst", "type": "burst", "minInterval": 1.45, "maxInterval": 4.7, "duration": 0.46 }
    ]
  },
  "shaders": {
    "skyGradient": {
      "kind": "material",
      "uniforms": {
        "uTop": { "type": "color", "value": [0.14, 0.27, 0.42] },
        "uMid": { "type": "color", "value": [0.11, 0.2, 0.32] },
        "uBottom": { "type": "color", "value": [0.04, 0.1, 0.17] },
        "uTime": { "type": "float", "value": 0.0 }
      },
      "vertex": [
        "varying vec3 vPos;",
        "void main() {",
        "  vec4 wp = modelMatrix * vec4(position, 1.0);",
        "  vPos = wp.xyz;",
        "  gl_Position = projectionMatrix * viewMatrix * wp;",
        "}"
      ],
      "fragment": [
        "varying vec3 vPos;",
        "uniform vec3 uTop;",
        "uniform vec3 uMid;",
        "uniform vec3 uBottom;",
        "uniform float uTime;",
        "float hash(vec2 p) {",
        "  return fract(sin(dot(p, vec2(12.9898, 78.233))) * 43758.5453);",
        "}",
        "void main() {",
        "  float h = normalize(vPos).y * 0.5 + 0.5;",
        "  vec3 c = mix(uBottom, uMid, smoothstep(0.0, 0.58, h));",
        "  c = mix(c, uTop, smoothstep(0.44, 1.0, h));",
        "  vec2 uv = normalize(vPos).xz;",
        "  float flicker = (hash(uv * 140.0 + uTime * 0.02) - 0.5) * 0.03;",
        "  c += vec3(0.02, 0.03, 0.04) * flicker;",
        "  gl_FragColor = vec4(c, 1.0);",
        "}"
      ]
    },
    "hologramPulse": {
      "kind": "material",
      "uniforms": {
        "uTime": { "type": "float", "value": 0.0 },
        "uPulse": { "type": "float", "value": 0.5 },
        "uGlitch": { "type": "float", "value": 0.0 },
        "uColorA": { "type": "color", "value": [0.28, 0.88, 0.96] },
        "uColorB": { "type": "color", "value": [0.98, 0.66, 0.95] },
        "uAlpha": { "type": "float", "value": 0.42 }
      },
      "vertex": [
        "varying vec3 vNormal;",
        "varying vec3 vWorldPos;",
        "void main() {",
        "  vec4 wp = modelMatrix * vec4(position, 1.0);",
        "  vWorldPos = wp.xyz;",
        "  vNormal = normalize(normalMatrix * normal);",
        "  gl_Position = projectionMatrix * viewMatrix * wp;",
        "}"
      ],
      "fragment": [
        "varying vec3 vNormal;",
        "varying vec3 vWorldPos;",
        "uniform float uTime;",
        "uniform float uPulse;",
        "uniform float uGlitch;",
        "uniform vec3 uColorA;",
        "uniform vec3 uColorB;",
        "uniform float uAlpha;",
        "float hash(vec2 p) {",
        "  return fract(sin(dot(p, vec2(127.1, 311.7))) * 43758.5453);",
        "}",
        "void main() {",
        "  vec3 n = normalize(vNormal);",
        "  float fres = pow(1.0 - abs(dot(n, vec3(0.0, 0.0, 1.0))), 1.75);",
        "  float stripe = sin(vWorldPos.y * 0.23 + uTime * 6.2) * 0.5 + 0.5;",
        "  float scan = smoothstep(0.47, 1.0, stripe);",
        "  float noise = hash(vWorldPos.xz * 0.08 + uTime * 0.33);",
        "  float glitch = step(0.86, noise + uGlitch * 0.42);",
        "  vec3 c = mix(uColorA, uColorB, scan);",
        "  c += vec3(0.35, 0.52, 0.65) * glitch * uGlitch;",
        "  float alpha = (uAlpha + fres * 0.35 + scan * 0.18 + glitch * 0.2) * (0.6 + uPulse * 0.9);",
        "  if (alpha < 0.02) discard;",
        "  gl_FragColor = vec4(c, clamp(alpha, 0.0, 1.0));",
        "}"
      ]
    },
    "pyramidGridLine": {
      "kind": "material",
      "uniforms": {
        "uTime": { "type": "float", "value": 0.0 },
        "uPulse": { "type": "float", "value": 0.2 },
        "uColor": { "type": "color", "value": [0.4, 0.92, 1.0] }
      },
      "vertex": [
        "attribute float aSeed;",
        "attribute float aPhase;",
        "varying float vSeed;",
        "varying float vPhase;",
        "void main() {",
        "  vSeed = aSeed;",
        "  vPhase = aPhase;",
        "  gl_Position = projectionMatrix * modelViewMatrix * vec4(position, 1.0);",
        "}"
      ],
      "fragment": [
        "uniform float uTime;",
        "uniform float uPulse;",
        "uniform vec3 uColor;",
        "varying float vSeed;",
        "varying float vPhase;",
        "float hash(float x) {",
        "  return fract(sin(x) * 43758.5453123);",
        "}",
        "void main() {",
        "  float bucket = floor(uTime * 2.0 + vSeed * 6.7);",
        "  float sporadic = step(0.82, hash(bucket + vSeed * 71.2));",
        "  float sweep = sin(uTime * 1.35 + vPhase * 12.0 + vSeed * 4.1) * 0.5 + 0.5;",
        "  float activeMask = smoothstep(0.58, 0.95, sweep);",
        "  float alpha = sporadic * activeMask * (0.05 + uPulse * 0.34);",
        "  if (alpha < 0.018) discard;",
        "  vec3 c = mix(uColor * 0.62, vec3(0.72, 0.95, 1.0), 0.35 + 0.65 * activeMask);",
        "  gl_FragColor = vec4(c, alpha);",
        "}"
      ]
    },
    "starfieldPoints": {
      "kind": "material",
      "uniforms": {
        "uTime": { "type": "float", "value": 0.0 },
        "uBaseSize": { "type": "float", "value": 2.2 }
      },
      "vertex": [
        "attribute float aSeed;",
        "attribute float aSize;",
        "attribute vec3 aColor;",
        "uniform float uTime;",
        "uniform float uBaseSize;",
        "varying vec3 vColor;",
        "varying float vBlink;",
        "void main() {",
        "  vColor = aColor;",
        "  vBlink = 0.45 + 0.55 * sin(uTime * (1.0 + aSeed * 2.6) + aSeed * 9.0);",
        "  vec4 mv = modelViewMatrix * vec4(position, 1.0);",
        "  gl_PointSize = uBaseSize * (0.55 + aSize * 1.25) * vBlink * (320.0 / max(1.0, -mv.z));",
        "  gl_Position = projectionMatrix * mv;",
        "}"
      ],
      "fragment": [
        "varying vec3 vColor;",
        "varying float vBlink;",
        "void main() {",
        "  vec2 p = gl_PointCoord - 0.5;",
        "  float r = length(p);",
        "  float alpha = smoothstep(0.5, 0.0, r) * (0.32 + 0.68 * vBlink);",
        "  if (alpha < 0.01) discard;",
        "  gl_FragColor = vec4(vColor, alpha);",
        "}"
      ]
    },
    "neonGridPass": {
      "kind": "pass",
      "uniforms": {
        "tDiffuse": { "type": "texture", "value": null },
        "uTime": { "type": "float", "value": 0.0 },
        "uStrength": { "type": "float", "value": 1.0 }
      },
      "vertex": [
        "varying vec2 vUv;",
        "void main() {",
        "  vUv = uv;",
        "  gl_Position = projectionMatrix * modelViewMatrix * vec4(position, 1.0);",
        "}"
      ],
      "fragment": [
        "uniform sampler2D tDiffuse;",
        "uniform float uTime;",
        "uniform float uStrength;",
        "varying vec2 vUv;",
        "float lineField(float coord, float density, float thickness) {",
        "  float p = abs(fract(coord * density) - 0.5);",
        "  return smoothstep(thickness, 0.0, p);",
        "}",
        "float hash(vec2 p) {",
        "  return fract(sin(dot(p, vec2(127.1, 311.7))) * 43758.5453);",
        "}",
        "void main() {",
        "  vec2 uv = vUv;",
        "  vec3 base = texture2D(tDiffuse, uv).rgb;",
        "  float driftX = sin(uTime * 0.10) * 0.018;",
        "  float driftY = cos(uTime * 0.08) * 0.014;",
        "  float gx = lineField(uv.x + driftX, 44.0, 0.012);",
        "  float gy = lineField(uv.y + driftY, 24.0, 0.018);",
        "  float grid = max(gx, gy);",
        "  float wave = 0.32 + 0.68 * (0.5 + 0.5 * sin(uTime * 0.92 + uv.y * 12.0));",
        "  float fade = 0.16 + 0.84 * (0.5 + 0.5 * sin(uTime * 0.30));",
        "  float noise = (hash(uv * 420.0 + uTime * 0.11) - 0.5) * 0.04;",
        "  vec3 gridColor = mix(vec3(0.04, 0.68, 0.86), vec3(0.48, 0.97, 0.88), smoothstep(0.0, 1.0, uv.y));",
        "  float intensity = grid * wave * fade * uStrength;",
        "  base += gridColor * (intensity * 0.22 + noise * intensity);",
        "  gl_FragColor = vec4(base, 1.0);",
        "}"
      ]
    },
    "heatHazePass": {
      "kind": "pass",
      "uniforms": {
        "tDiffuse": { "type": "texture", "value": null },
        "uTime": { "type": "float", "value": 0.0 },
        "uStrength": { "type": "float", "value": 1.0 }
      },
      "vertex": [
        "varying vec2 vUv;",
        "void main() {",
        "  vUv = uv;",
        "  gl_Position = projectionMatrix * modelViewMatrix * vec4(position, 1.0);",
        "}"
      ],
      "fragment": [
        "uniform sampler2D tDiffuse;",
        "uniform float uTime;",
        "uniform float uStrength;",
        "varying vec2 vUv;",
        "float hash(vec2 p) {",
        "  return fract(sin(dot(p, vec2(127.1, 311.7))) * 43758.5453);",
        "}",
        "void main() {",
        "  vec2 uv = vUv;",
        "  float horizon = smoothstep(0.22, 0.98, uv.y);",
        "  float wavA = sin(uv.y * 170.0 + uTime * 2.5) * 0.0011;",
        "  float wavB = sin(uv.x * 130.0 - uTime * 1.8) * 0.0008;",
        "  float n = (hash(uv * 18.0 + uTime * 0.15) - 0.5) * 0.0009;",
        "  uv.x += (wavA + n) * horizon * uStrength;",
        "  uv.y += wavB * horizon * uStrength;",
        "  vec3 color = texture2D(tDiffuse, uv).rgb;",
        "  gl_FragColor = vec4(color, 1.0);",
        "}"
      ]
    },
    "tapeLensPass": {
      "kind": "pass",
      "uniforms": {
        "tDiffuse": { "type": "texture", "value": null },
        "uTime": { "type": "float", "value": 0.0 },
        "uResolution": { "type": "vec2", "value": [1280, 720] },
        "uTape": { "type": "float", "value": 0.0 },
        "uLowRes": { "type": "float", "value": 0.0 },
        "uDefocus": { "type": "float", "value": 0.0 }
      },
      "vertex": [
        "varying vec2 vUv;",
        "void main() {",
        "  vUv = uv;",
        "  gl_Position = projectionMatrix * modelViewMatrix * vec4(position, 1.0);",
        "}"
      ],
      "fragment": [
        "uniform sampler2D tDiffuse;",
        "uniform float uTime;",
        "uniform vec2 uResolution;",
        "uniform float uTape;",
        "uniform float uLowRes;",
        "uniform float uDefocus;",
        "varying vec2 vUv;",
        "float hash(vec2 p) {",
        "  return fract(sin(dot(p, vec2(127.1, 311.7))) * 43758.5453);",
        "}",
        "vec3 sampleRgbSplit(sampler2D tex, vec2 uv, vec2 offset) {",
        "  float r = texture2D(tex, uv + offset).r;",
        "  float g = texture2D(tex, uv).g;",
        "  float b = texture2D(tex, uv - offset).b;",
        "  return vec3(r, g, b);",
        "}",
        "void main() {",
        "  vec2 uv = vUv;",
        "  vec2 texel = 1.0 / max(uResolution, vec2(1.0));",
        "  float tapeBand = sin((uv.y + uTime * 2.9) * 240.0 + sin(uTime * 4.2) * 5.0) * 0.5 + 0.5;",
        "  float lineNoise = hash(vec2(floor(uv.y * uResolution.y * 0.22), floor(uTime * 52.0)));",
        "  float trackingJitter = (lineNoise - 0.5) * (0.022 * uTape);",
        "  uv.x += trackingJitter + sin(uv.y * 140.0 + uTime * 34.0) * 0.004 * uTape;",
        "  uv.y += (hash(vec2(floor(uTime * 9.0), 7.3)) - 0.5) * 0.006 * uTape;",
        "  float blockSize = 1.0 + uLowRes * 15.0;",
        "  vec2 lowResUv = (floor(uv * uResolution / blockSize) + 0.5) * blockSize / uResolution;",
        "  uv = mix(uv, lowResUv, clamp(uLowRes, 0.0, 1.0));",
        "  float chroma = (0.0008 + 0.006 * uTape + 0.0035 * uLowRes) * (1.0 + tapeBand * 0.6);",
        "  vec2 splitOffset = vec2(chroma, 0.0);",
        "  vec3 color = sampleRgbSplit(tDiffuse, uv, splitOffset);",
        "  vec2 blurStep = texel * (2.0 + uDefocus * 13.0 + uTape * 4.0);",
        "  vec3 blur = vec3(0.0);",
        "  blur += sampleRgbSplit(tDiffuse, uv + vec2( blurStep.x, 0.0), splitOffset);",
        "  blur += sampleRgbSplit(tDiffuse, uv + vec2(-blurStep.x, 0.0), splitOffset);",
        "  blur += sampleRgbSplit(tDiffuse, uv + vec2(0.0,  blurStep.y), splitOffset);",
        "  blur += sampleRgbSplit(tDiffuse, uv + vec2(0.0, -blurStep.y), splitOffset);",
        "  blur += sampleRgbSplit(tDiffuse, uv + vec2( blurStep.x,  blurStep.y), splitOffset);",
        "  blur += sampleRgbSplit(tDiffuse, uv + vec2(-blurStep.x,  blurStep.y), splitOffset);",
        "  blur += sampleRgbSplit(tDiffuse, uv + vec2( blurStep.x, -blurStep.y), splitOffset);",
        "  blur += sampleRgbSplit(tDiffuse, uv + vec2(-blurStep.x, -blurStep.y), splitOffset);",
        "  blur *= 0.125;",
        "  float focusMix = clamp(uDefocus * 0.92 + uTape * 0.16, 0.0, 1.0);",
        "  color = mix(color, blur, focusMix);",
        "  float scan = sin((uv.y * uResolution.y) * 1.18 + uTime * 80.0) * 0.5 + 0.5;",
        "  color *= 1.0 - scan * (0.08 * uTape + 0.05 * uLowRes);",
        "  float grain = hash(uv * uResolution * 0.65 + vec2(uTime * 71.3, uTime * 43.1)) - 0.5;",
        "  color += grain * (0.035 * uTape + 0.02 * uLowRes);",
        "  color *= 1.0 + (hash(vec2(floor(uTime * 60.0), 13.7)) - 0.5) * (0.18 * uTape);",
        "  gl_FragColor = vec4(clamp(color, 0.0, 1.0), 1.0);",
        "}"
      ]
    }
  },
  "effects": {
    "bloom": {
      "type": "unrealBloom",
      "strength": 0.78,
      "radius": 0.34,
      "threshold": 0.56,
      "thread": "effect.bloom"
    },
    "neonGrid": {
      "type": "shaderPass",
      "shader": "neonGridPass",
      "thread": "effect.neonGrid"
    },
    "heatHaze": {
      "type": "shaderPass",
      "shader": "heatHazePass",
      "thread": "effect.heatHaze"
    },
    "tapeLens": {
      "type": "shaderPass",
      "shader": "tapeLensPass",
      "thread": "effect.tapeLens"
    }
  },
  "objects": {
    "skyDome": {
      "type": "skyDome",
      "shader": "skyGradient",
      "thread": "scene.sky",
      "radius": 6600
    },
    "terrain": {
      "type": "terrain",
      "thread": "scene.terrain",
      "y": -38,
      "baseColor": "#30281e",
      "topColor": "#67553d"
    },
    "starfield": {
      "type": "starfield",
      "shader": "starfieldPoints",
      "thread": "object.starfield",
      "countDesktop": 4200,
      "countMobile": 1800,
      "radius": 5600
    },
    "pyramid-alpha": {
      "type": "pyramid",
      "thread": "object.pyramid.alpha",
      "position": [-180, 0, -260],
      "size": 210,
      "height": 166,
      "baseColor": "#b0885f"
    },
    "pyramid-beta": {
      "type": "pyramid",
      "thread": "object.pyramid.beta",
      "position": [120, 0, -460],
      "size": 238,
      "height": 184,
      "baseColor": "#9f7a58"
    },
    "holo-alpha": {
      "type": "holoKnot",
      "shader": "hologramPulse",
      "thread": "object.holo.alpha",
      "position": [-170, 150, -250],
      "scale": 48,
      "speed": 0.6
    },
    "holo-beta": {
      "type": "holoKnot",
      "shader": "hologramPulse",
      "thread": "object.holo.beta",
      "position": [120, 172, -440],
      "scale": 56,
      "speed": 0.48
    },
    "drone-orb": {
      "type": "droneOrb",
      "thread": "object.drone",
      "orbitRadius": 620,
      "height": 164,
      "speed": 0.07,
      "baseColor": "#9ae9ff"
    }
  },
  "transmissions": {
    "tr-base-to-neon": {
      "source": "basePulse",
      "targets": [
        { "key": "effect.neonGrid.uStrength", "scale": 1.1, "offset": 0.12, "min": 0.0, "max": 2.0 }
      ]
    },
    "tr-heat": {
      "source": "heatWave",
      "targets": [
        { "key": "effect.heatHaze.uStrength", "scale": 1.0, "offset": 0.05, "min": 0.0, "max": 1.8 }
      ]
    },
    "tr-bloom": {
      "source": "basePulse",
      "targets": [
        { "key": "effect.bloom.strength", "scale": 0.42, "offset": 0.4, "min": 0.25, "max": 1.45 }
      ]
    },
    "tr-grid-a": {
      "source": "basePulse",
      "targets": [
        { "key": "object.pyramid-alpha.uPulse", "scale": 1.18, "offset": 0.12, "min": 0.0, "max": 1.55 },
        { "key": "object.pyramid-beta.uPulse", "scale": 1.06, "offset": 0.15, "min": 0.0, "max": 1.55 }
      ]
    },
    "tr-holo-a": {
      "source": "holoPulse",
      "targets": [
        { "key": "object.holo-alpha.uPulse", "scale": 0.95, "offset": 0.18, "min": 0.0, "max": 1.6 }
      ]
    },
    "tr-holo-b": {
      "source": "holoPulse",
      "invert": true,
      "targets": [
        { "key": "object.holo-beta.uPulse", "scale": 0.9, "offset": 0.2, "min": 0.0, "max": 1.6 }
      ]
    },
    "tr-glitch": {
      "source": "glitchGate",
      "targets": [
        { "key": "object.holo-alpha.uGlitch", "scale": 1.0, "offset": 0.0, "min": 0.0, "max": 1.0 },
        { "key": "object.holo-beta.uGlitch", "scale": 1.0, "offset": 0.0, "min": 0.0, "max": 1.0 }
      ]
    },
    "tr-tape": {
      "source": "tapeBurst",
      "targets": [
        { "key": "effect.tapeLens.uTape", "scale": 1.0, "offset": 0.02, "min": 0.0, "max": 1.0 },
        { "key": "effect.tapeLens.uLowRes", "scale": 0.95, "offset": 0.0, "min": 0.0, "max": 1.0 },
        { "key": "effect.tapeLens.uDefocus", "scale": 0.82, "offset": 0.0, "min": 0.0, "max": 1.0 }
      ]
    },
    "tr-drone": {
      "source": "basePulse",
      "targets": [
        { "key": "object.drone-orb.intensity", "scale": 1.25, "offset": 0.28, "min": 0.1, "max": 2.6 }
      ]
    }
  },
  "mixes": {
    "default": {
      "objects": [
        "skyDome",
        "terrain",
        "starfield",
        "pyramid-alpha",
        "pyramid-beta",
        "holo-alpha",
        "holo-beta",
        "drone-orb"
      ],
      "effects": ["bloom", "neonGrid", "heatHaze", "tapeLens"],
      "transmissions": [
        "tr-base-to-neon",
        "tr-heat",
        "tr-bloom",
        "tr-grid-a",
        "tr-holo-a",
        "tr-holo-b",
        "tr-glitch",
        "tr-tape",
        "tr-drone"
      ]
    },
    "desert": {
      "objects": [
        "skyDome",
        "terrain",
        "pyramid-alpha",
        "pyramid-beta",
        "holo-alpha",
        "drone-orb"
      ],
      "effects": ["bloom", "neonGrid", "heatHaze"],
      "transmissions": [
        "tr-base-to-neon",
        "tr-heat",
        "tr-bloom",
        "tr-grid-a",
        "tr-holo-a",
        "tr-drone"
      ]
    },
    "cosmic": {
      "objects": [
        "skyDome",
        "starfield",
        "holo-alpha",
        "holo-beta",
        "drone-orb"
      ],
      "effects": ["bloom", "neonGrid", "tapeLens"],
      "transmissions": [
        "tr-base-to-neon",
        "tr-bloom",
        "tr-holo-a",
        "tr-holo-b",
        "tr-glitch",
        "tr-tape",
        "tr-drone"
      ]
    }
  }
}
