;; Vignette effect using xector operations
;; Demonstrates α (element-wise) and β (reduction) patterns

(require-primitives "xector")

(define-effect xector_vignette
  :params (
    (strength :type float :default 0.5 :range [0 1])
    (radius :type float :default 1.0 :range [0.5 2])
  )
  (let* (
         ;; Get normalized distance from center for each pixel
         (dist (dist-from-center frame))

         ;; Calculate max distance (corner distance)
         (max-dist (* (βmax dist) radius))

         ;; Calculate brightness factor per pixel: 1 - (dist/max-dist * strength)
         ;; Using explicit α operators
         (factor (α- 1 (α* (α/ dist max-dist) strength)))

         ;; Clamp factor to [0, 1]
         (factor (αclamp factor 0 1))

         ;; Extract channels as xectors
         (r (red frame))
         (g (green frame))
         (b (blue frame))

         ;; Apply factor to each channel (implicit element-wise via Xector operators)
         (r-out (* r factor))
         (g-out (* g factor))
         (b-out (* b factor)))

    ;; Combine back to frame
    (rgb r-out g-out b-out)))
