{
  "id": "video-transform",
  "name": "Video Transform",
  "description": "Zooms, pans, and rotates the video by remapping output pixels back into source UV space.",
  "category": "Transform",
  "entryPoint": "shadeVideo",
  "parameters": [
    {
      "id": "zoom",
      "label": "Zoom",
      "type": "float",
      "default": 1,
      "min": 0.1,
      "max": 8,
      "step": 0.01,
      "description": "Scales the source image before edge handling is applied."
    },
    {
      "id": "pan",
      "label": "Pan",
      "type": "vec2",
      "default": [
        0,
        0
      ],
      "min": [
        -1,
        -1
      ],
      "max": [
        1,
        1
      ],
      "step": [
        0.001,
        0.001
      ],
      "description": "Moves the source image in normalized frame units."
    },
    {
      "id": "rotationDegrees",
      "label": "Rotation",
      "type": "float",
      "default": 0,
      "min": -180,
      "max": 180,
      "step": 0.1,
      "description": "Rotates the source image around the frame center."
    },
    {
      "id": "cropAspect",
      "label": "Crop Aspect",
      "type": "enum",
      "default": "none",
      "options": [
        {
          "value": "none",
          "label": "None"
        },
        {
          "value": "4x3",
          "label": "4:3"
        },
        {
          "value": "3x2",
          "label": "3:2"
        },
        {
          "value": "1x1",
          "label": "1:1"
        },
        {
          "value": "9x16",
          "label": "9:16"
        }
      ],
      "description": "Crops the visible image to a centered preset aspect ratio without squeezing the source."
    },
    {
      "id": "edgeMode",
      "label": "Edge Mode",
      "type": "enum",
      "default": "black",
      "options": [
        {
          "value": "black",
          "label": "Black"
        },
        {
          "value": "clamp",
          "label": "Clamp"
        },
        {
          "value": "wrap",
          "label": "Wrap"
        },
        {
          "value": "mirror",
          "label": "Mirror"
        }
      ],
      "description": "Chooses how samples outside the source frame are filled."
    },
    {
      "id": "outsideColor",
      "label": "Outside Color",
      "type": "color",
      "default": [
        0,
        0,
        0,
        1
      ],
      "description": "Color used where the remapped image samples outside the source frame."
    }
  ]
}
