{
  "license": "CC0-1.0",
  "shader": {
    "id": "a79v3mg0",
    "title": "Sentinel",
    "license": "CC0-1.0",
    "provenance_type": "witnessed_generation",
    "made_with": "claude-code",
    "status": "active",
    "compile_ok": true,
    "tags": [
      "grid",
      "radar",
      "sonar",
      "interference",
      "isometric",
      "menacing"
    ],
    "parents": [],
    "author": "zazi5inxhmgi",
    "author_name": "ufffd",
    "author_url": "/u/ufffd",
    "created_at": "2026-06-20T06:10:17.029Z",
    "poster_url": "/posters/a79v3mg0.avif",
    "stats": {
      "slops": 0,
      "views": 120,
      "forks": 0
    },
    "self": "/api/v1/shaders/a79v3mg0",
    "isf": "/*{\n  \"DESCRIPTION\": \"Signal grid — an isometric panel field swept by radar-like interference, lighting cold cells and the occasional hot alert.\",\n  \"CREDIT\": \"claude-opus-4-8\",\n  \"INPUTS\": [\n    { \"NAME\": \"scale\",     \"TYPE\": \"float\", \"DEFAULT\": 6.0, \"MIN\": 3.0, \"MAX\": 18.0 },\n    { \"NAME\": \"scanSpeed\", \"TYPE\": \"float\", \"DEFAULT\": 1.0, \"MIN\": 0.0, \"MAX\": 3.0 },\n    { \"NAME\": \"sharp\",     \"TYPE\": \"float\", \"DEFAULT\": 0.5, \"MIN\": 0.1, \"MAX\": 0.9 },\n    { \"NAME\": \"alert\",     \"TYPE\": \"float\", \"DEFAULT\": 0.6, \"MIN\": 0.0, \"MAX\": 1.5 }\n  ]\n}*/\n\nmat2 rot(float a){ float c = cos(a), s = sin(a); return mat2(c, -s, s, c); }\nfloat hash(vec2 p){ p = fract(p * vec2(127.1, 311.7)); p += dot(p, p + 34.5); return fract(p.x * p.y); }\n\nvoid main(){\n  vec2 uv = (gl_FragCoord.xy - 0.5 * RENDERSIZE) / RENDERSIZE.y;\n\n  // 45deg rotation turns square cells into isometric diamonds\n  mat2 R = rot(0.785398);\n  vec2 p = (R * uv) * scale;\n  vec2 id = floor(p);\n  vec2 gv = fract(p) - 0.5;\n\n  // cell centre back in screen space (for interference sampling)\n  vec2 cc = rot(-0.785398) * ((id + 0.5) / scale);\n\n  // SONAR: a dominant central emitter so lit cells form expanding concentric rings\n  float t = TIME;\n  float rc = length(cc);\n  float field = sin(rc * 8.0 - t * 2.5 * scanSpeed) * 1.8;              // central rings (dominant)\n  for (int s = 0; s < 2; s++){\n    float fs = float(s);\n    vec2 src = 0.9 * vec2(sin(t * 0.4 + fs * 2.3), cos(t * 0.33 + fs * 1.9));\n    field += 0.5 * sin(length(cc - src) * 9.0 - t * 2.0 * scanSpeed + fs * 1.7);\n  }\n  field /= 2.8;\n\n  float rnd = hash(id);\n  float lit = smoothstep(sharp, 1.0 - sharp * 0.4, 0.5 + 0.5 * field);\n  lit = pow(lit, 1.4);\n  lit *= 0.82 + 0.32 * sin(t * 3.0 + rnd * 30.0);                       // flicker\n  lit *= 0.55 + 0.7 * exp(-rc * rc * 0.35);                            // energy concentrates toward core\n\n  float edge = max(abs(gv.x), abs(gv.y));\n  float panel = smoothstep(0.49, 0.40, edge);\n  float rim   = smoothstep(0.40, 0.49, edge) * smoothstep(0.5, 0.49, edge);\n  float bevel = clamp(0.75 + 0.6 * (-gv.x + gv.y), 0.4, 1.4);           // per-cell directional light\n\n  vec3 base = vec3(0.0, 0.012, 0.02);\n  vec3 cyan = vec3(0.0, 0.9, 0.85);\n  vec3 hot  = vec3(1.0, 0.2, 0.3);\n\n  // central reactor glow gives the grid a focal core\n  float core = exp(-dot(uv, uv) * 5.0);\n  vec3 col = base + core * vec3(0.0, 0.16, 0.17);\n\n  col += panel * cyan * (0.05 + 0.8 * lit * lit) * bevel;               // saturated cyan cells\n  col += rim * mix(cyan, vec3(0.8, 1.0, 1.0), lit * lit) * (0.15 + 0.9 * lit);  // white-hot bevel\n\n  // RED threat-blips: cells riding the wavefront flip to a hard red warning\n  float canAlert = step(0.55, rnd);\n  float alertPulse = 0.5 + 0.5 * sin(t * 3.0 + rnd * 50.0);\n  float aCell = canAlert * smoothstep(0.35, 0.7, lit) * alertPulse;\n  col = mix(col, hot * (0.6 + 0.8 * lit) * bevel, panel * aCell * alert);   // red replaces cyan\n  col += aCell * aCell * 0.8 * hot * alert;                                 // bloom\n\n  col *= 0.92 + 0.08 * sin(gl_FragCoord.y * 1.6);                       // faint scanlines\n  col *= 1.0 - 0.62 * dot(uv, uv);                                      // strong vignette (menace)\n  col = col / (1.0 + 0.45 * col);\n  col = pow(max(col, 0.0), vec3(0.84));\n  gl_FragColor = vec4(col, 1.0);\n}\n",
    "generator": {
      "model": "claude-opus-4-8",
      "provider": "anthropic",
      "prompt": null,
      "params": null
    }
  }
}