{
  "id": "fisheye-reproject",
  "name": "Fisheye Reproject",
  "description": "Inverse-projects a cropped fisheye source into a virtual rectilinear or cylindrical camera view with pan, tilt, and roll controls.",
  "category": "Projection",
  "entryPoint": "shadeVideo",
  "parameters": [
    {
      "id": "lensFovDegrees",
      "label": "Lens FOV",
      "type": "float",
      "default": 190,
      "min": 1,
      "max": 220,
      "step": 0.1,
      "description": "Actual fisheye lens field of view in degrees."
    },
    {
      "id": "center",
      "label": "Optical Center",
      "type": "vec2",
      "default": [
        0.5,
        0.5
      ],
      "min": [
        0,
        0
      ],
      "max": [
        1,
        1
      ],
      "step": [
        0.001,
        0.001
      ],
      "description": "Normalized position in the frame, where 0.5, 0.5 is center."
    },
    {
      "id": "radius",
      "label": "Fisheye Radius",
      "type": "vec2",
      "default": [
        0.5,
        0.885
      ],
      "min": [
        0.001,
        0.001
      ],
      "max": [
        2,
        2
      ],
      "step": [
        0.001,
        0.001
      ],
      "description": "Normalized fisheye radius; adjust X/Y when the image is cropped or squeezed."
    },
    {
      "id": "sourceEdgeCut",
      "label": "Source Edge Cut",
      "type": "float",
      "default": 0.01,
      "min": 0,
      "max": 0.2,
      "step": 0.001,
      "description": "Cuts slightly inward from all four source-frame edges before sampling to hide empty border regions."
    },
    {
      "id": "sourceEdgeFeather",
      "label": "Source Edge Feather",
      "type": "float",
      "default": 0.02,
      "min": 0,
      "max": 0.2,
      "step": 0.001,
      "description": "Softens the trimmed source edges into the outside color for easier background blending."
    },
    {
      "id": "virtualFovDegrees",
      "label": "Virtual FOV",
      "type": "float",
      "default": 75,
      "min": 1,
      "max": 175,
      "step": 0.1,
      "description": "Field of view of the generated virtual camera."
    },
    {
      "id": "basePanDegrees",
      "label": "Base Pan",
      "type": "float",
      "default": 0,
      "min": -180,
      "max": 180,
      "step": 0.1,
      "description": "Permanent horizontal alignment offset before live pan."
    },
    {
      "id": "baseTiltDegrees",
      "label": "Base Tilt",
      "type": "float",
      "default": 0,
      "min": -120,
      "max": 120,
      "step": 0.1,
      "description": "Permanent vertical alignment offset before live tilt."
    },
    {
      "id": "baseRollDegrees",
      "label": "Base Roll",
      "type": "float",
      "default": 0,
      "min": -180,
      "max": 180,
      "step": 0.1,
      "description": "Permanent roll alignment offset before live roll."
    },
    {
      "id": "panDegrees",
      "label": "Pan",
      "type": "float",
      "default": 0,
      "min": -180,
      "max": 180,
      "step": 0.1,
      "description": "Live horizontal view rotation."
    },
    {
      "id": "tiltDegrees",
      "label": "Tilt",
      "type": "float",
      "default": 0,
      "min": -120,
      "max": 120,
      "step": 0.1,
      "description": "Live vertical view rotation."
    },
    {
      "id": "rollDegrees",
      "label": "Roll",
      "type": "float",
      "default": 0,
      "min": -180,
      "max": 180,
      "step": 0.1,
      "description": "Live roll rotation around the viewing axis."
    },
    {
      "id": "fisheyeModel",
      "label": "Fisheye Model",
      "type": "enum",
      "default": "equidistant",
      "options": [
        {
          "value": "equidistant",
          "label": "Equidistant"
        },
        {
          "value": "equisolid",
          "label": "Equisolid"
        },
        {
          "value": "stereographic",
          "label": "Stereographic"
        },
        {
          "value": "orthographic",
          "label": "Orthographic"
        }
      ],
      "description": "Projection model used by the physical fisheye lens."
    },
    {
      "id": "outputProjection",
      "label": "Output Projection",
      "type": "enum",
      "default": "rectilinear",
      "options": [
        {
          "value": "rectilinear",
          "label": "Rectilinear"
        },
        {
          "value": "cylindrical",
          "label": "Cylindrical"
        }
      ],
      "description": "Chooses rectilinear perspective or cylindrical reprojection."
    },
    {
      "id": "outsideColor",
      "label": "Outside Color",
      "type": "color",
      "default": [
        0,
        0,
        0,
        1
      ],
      "description": "Color used where the remapped image samples outside the source frame."
    }
  ]
}
