;; ASCII Art FX - converts image to ASCII characters with per-character effects
(require-primitives "ascii")

(define-effect ascii_art_fx
  :params (
    ;; Basic parameters
    (char_size :type int :default 8 :range [4 32]
      :desc "Size of each character cell in pixels")
    (alphabet :type string :default "standard"
      :desc "Character set to use")
    (color_mode :type string :default "color"
      :choices [color mono invert]
      :desc "Color mode: color, mono, invert, or any color name/hex")
    (background_color :type string :default "black"
      :desc "Background color name or hex value")
    (invert_colors :type int :default 0 :range [0 1]
      :desc "Swap foreground and background colors (0/1)")
    (contrast :type float :default 1.5 :range [1 3]
      :desc "Character selection contrast")

    ;; Per-character effects
    (char_jitter :type float :default 0 :range [0 20]
      :desc "Position jitter amount in pixels")
    (char_scale :type float :default 1.0 :range [0.5 2.0]
      :desc "Character scale factor")
    (char_rotation :type float :default 0 :range [0 180]
      :desc "Rotation amount in degrees")
    (char_hue_shift :type float :default 0 :range [0 360]
      :desc "Hue shift in degrees")

    ;; Modulation sources
    (jitter_source :type string :default "none"
      :choices [none luminance inv_luminance saturation position_x position_y position_diag random center_dist]
      :desc "What drives jitter modulation")
    (scale_source :type string :default "none"
      :choices [none luminance inv_luminance saturation position_x position_y position_diag random center_dist]
      :desc "What drives scale modulation")
    (rotation_source :type string :default "none"
      :choices [none luminance inv_luminance saturation position_x position_y position_diag random center_dist]
      :desc "What drives rotation modulation")
    (hue_source :type string :default "none"
      :choices [none luminance inv_luminance saturation position_x position_y position_diag random center_dist]
      :desc "What drives hue shift modulation")
  )
  (let* ((sample (cell-sample frame char_size))
         (colors (nth sample 0))
         (luminances (nth sample 1))
         (chars (luminance-to-chars luminances alphabet contrast)))
    (render-char-grid-fx frame chars colors luminances char_size
                         color_mode background_color invert_colors
                         char_jitter char_scale char_rotation char_hue_shift
                         jitter_source scale_source rotation_source hue_source)))
