{
  "format": "xsf-plugin",
  "formatVersion": 1,
  "id": "me.my-first-plugin",
  "name": "My First Plugin",
  "version": "1.0.0",
  "author": "Me",
  "icon": "✨",
  "description": "My Shader Forge plugin.",
  "_help": [
    "Edit this file in any text editor, then enable it in Plugins (or click Reload).",
    "Effects: stage code is shader code (HLSL style). Stages: vertex, uv, base, normal, surface, diffuse, direct, emit, post, alpha.",
    "Useful variables: col (color), emit (glow), n (normal), uv, t (time), d.viewDirWS, d.posWS, d.posOS, d.uv.zw (mesh UV).",
    "Always write float numbers with a dot (2.0, not 2). Give every local variable a unique prefix.",
    "Param types: range, float, color, vec2, vec3, toggle, enum, tex. Param ids must start with _ and be unique.",
    "Helpers you can use: XSFNoise(float2), XSFFbm(float2), XSFVoronoi(float2, time), XSFHash21(float2), XSFRotate(float2, angle), XSFLum(float3).",
    "Script (optional) runs with an `xsf` object: xsf.addCommand({ label, icon, run }), xsf.getConfig(), xsf.setConfig(cfg), xsf.toast(text), xsf.registerTheme({...})."
  ],
  "category": {
    "id": "mine",
    "label": "My effects",
    "icon": "✨"
  },
  "effects": [
    {
      "id": "myPulseGlow",
      "cat": "mine",
      "label": "My pulse glow",
      "desc": "A starter effect: a colored glow that pulses.",
      "helpers": [
        "noise"
      ],
      "params": [
        {
          "id": "_MyGlowColor",
          "label": "Color",
          "type": "color",
          "hdr": true,
          "def": [
            1,
            0.4,
            0.8,
            1
          ]
        },
        {
          "id": "_MyGlowSpeed",
          "label": "Speed",
          "type": "range",
          "min": 0,
          "max": 10,
          "def": 3
        },
        {
          "id": "_MyGlowAmount",
          "label": "Amount",
          "type": "range",
          "min": 0,
          "max": 5,
          "def": 1
        }
      ],
      "emit": "float mgN = XSFNoise(d.uv.zw * 6.0 + t * 0.5);\nemit += _MyGlowColor.rgb * (0.5 + 0.5 * sin(t * _MyGlowSpeed)) * mgN * _MyGlowAmount;"
    }
  ],
  "presets": [],
  "themes": [
    {
      "id": "my-theme",
      "name": "My theme",
      "dark": true,
      "vars": {
        "--bg": "#101418",
        "--panel": "#161c22",
        "--accent": "#ff8a3d"
      }
    }
  ],
  "script": "xsf.addCommand({ label: 'Say hello', icon: '👋', run() { xsf.toast('Hello from my plugin!'); } });"
}