{
  "format": "field",
  "version": 1,
  "meta": {
    "name": "Hyperbolic Kaleidoscope",
    "author": "Infinite",
    "description": "Non-Euclidean Poincaré disk hyperbolic kaleidoscope with conformal geodesic folding, infinite fractal reflections, and audio-reactive curvature.",
    "domain": "pixel"
  },
  "device": {
    "code": "param float folds = 7.0 [3.0, 12.0];\nparam float curvature = 1.3 [0.5, 3.5];\nparam float zoom = 1.1 [0.4, 3.0];\nparam float speed = 0.8 [0.1, 3.0];\np = (uv - 0.5) * 2.2 * zoom;\np.x = p.x * aspect;\nr = length(p);\na = atan2(p.y, p.x);\npoincare = smoothstep(1.0, 0.96, r);\ninversion = p / max(r * r, 0.04);\np = mix(p, inversion, curvature * 0.4);\nr = length(p);\na = atan2(p.y, p.x);\nsector = 6.2831853 / folds;\nfolded_a = abs(mod(a + t * speed * 0.3, sector) - sector * 0.5);\nfp = vec2(cos(folded_a), sin(folded_a)) * r;\ngrid = sin(fp.x * 12.0 + t) * sin(fp.y * 12.0 - t * 0.7);\nglow = pow(abs(grid), 0.35);\nsignal = vec3(0.655, 0.694, 1.0);\nember = vec3(1.0, 0.42, 0.21);\nground = vec3(0.082, 0.098, 0.188);\ncol = mix(ground, signal, glow * 0.75);\ncol = mix(col, ember, sin(r * 9.0 - t * 1.5) * 0.5 + 0.5);\ncol = col * poincare;\nalpha = 1.0;\n",
    "params": {
      "folds": 7.0,
      "curvature": 1.3,
      "zoom": 1.1,
      "speed": 0.8
    },
    "nodeSettings": {
      "width": 1280.0,
      "height": 720.0,
      "animate": 1.0
    }
  }
}
