module Hylogen.WithHylide.Util where

import Hylogen

black :: Vec3
black = vec3 (0, 0, 0)

white :: Vec3
white = vec3 (1, 1, 1)

-- | Given an alpha value, sets it for the alpha channel for a given color
--
-- @
-- setAlpha alpha color -- == n newColor
-- @
setAlpha :: Vec1 -> Vec4 -> Vec4
setAlpha alpha v = vec4 (xyz_ v, alpha)

-- TODO: hsl


-- | Linear to exponential map
--
-- @
-- linexp (a, b, c, d) a           -- == c
-- linexp (a, b, c, d) b           -- == d
-- linexp (a, b, c, d) ((a + b)\/2) -- == c * sqrt(d/c)
-- @
linexp :: (Floating a) => (a, a, a, a) -> a -> a
linexp (a, b, c, d) x = c * ((d / c) ** ((x - a) / (b - a)))

-- | Linear to linear map
--
-- @
-- linexp (a, b, c, d) a           -- == c
-- linexp (a, b, c, d) b           -- == d
-- linexp (a, b, c, d) ((a + b)\/2) -- == ((c + d)/2)
-- @
linlin :: (Floating a) => (a, a, a, a) -> a -> a
linlin (a, b, c, d) x = c + (d - c) * ((x - a) / (b - a))