hylogen-0.1.2.2: src/Hylogen/Globals.hs
{-# LANGUAGE NoMonomorphismRestriction #-}
{-# LANGUAGE FlexibleContexts #-}
{-# LANGUAGE ScopedTypeVariables #-}
{-# LANGUAGE DataKinds #-}
module Hylogen.Globals where
import Hylogen.Types
import Hylogen.Expr
-- | Length of a vector
len :: forall n. (Veccable n) => Vec n -> Vec1
len = op1pre "length"
-- | Euclidean distance between two points
distance :: forall n. (Veccable n) => Vec n -> Vec n -> Vec n
distance = op2pre'' "distance"
cross :: Vec3 -> Vec3 -> Vec3
cross = op2pre'' "cross"
normalize :: forall n. (Veccable n) => Vec n -> Vec n
normalize = op1pre'' "normalize"
-- | Returns a vector pointing in the same direction as another
--
-- @
-- faceforward toOrient incident reference -- == oriented
-- @
faceForward :: forall n. (Veccable n) => Vec n -> Vec n -> Vec n -> Vec n
faceForward = op3pre'' "faceforward"
-- | Calculates the reflection direction for an incident vector
--
-- @
-- reflect incident normal -- == reflected
-- @
reflect :: forall n. (Veccable n) => Vec n -> Vec n -> Vec n
reflect = op2pre'' "reflect"
-- | Calculates the refraction direction direction for an incident vector
--
-- @
-- refract incident normal eta -- == reflected
-- @
--
-- where eta is the ratio of indicies of refraction
refract :: forall n. (Veccable n) => Vec n -> Vec n -> Vec1 -> Vec n
refract = op3pre "refract"
inverseSqrt :: forall n. (Veccable n) => Vec n -> Vec n
inverseSqrt = op1pre'' "inversesqrt"
-- | Fractional part
fract :: forall n. (Veccable n) => Vec n -> Vec n
fract = op1pre'' "fract"
mod_ :: forall n. (Veccable n) => Vec n -> Vec n -> Vec n
mod_ = op2pre'' "mod"
floor_:: forall n. (Veccable n) => Vec n -> Vec n
floor_ = op1pre'' "floor"
ceil_ :: forall n. (Veccable n) => Vec n -> Vec n
ceil_ = op1pre'' "ceil"
min_ :: forall n. (Veccable n) => Vec n -> Vec n -> Vec n
min_ = op2pre'' "min"
max_ :: forall n. (Veccable n) => Vec n -> Vec n -> Vec n
max_ = op2pre'' "max"
-- | Clamps x between min and max
--
-- @
-- clamp min max x -- == clamped
-- @
clamp :: forall n. (Veccable n) => Vec n -> Vec n -> Vec n -> Vec n
clamp mn mx x = op3pre'' "clamp" x mn mx
-- | Linear interpolation between x and y by p, a Vec1 from 0 to 1
--
-- @
-- mix p x y = x ^* (1 - p) + y ^* p
-- -- mix 0 x y == x
-- -- mix 1 x y == y
-- @
mix :: (Veccable n) => Vec1 -> Vec n -> Vec n -> Vec n
mix p x y = op3pre "mix" x y p
true :: Booly
true = uniform "true"
false :: Booly
false = uniform "false"
-- | Helper function to compare vectors
bcomp :: (Veccable v) => String -> Vec v -> Vec v -> Booly
bcomp str x y = product $ zipWith (op2' str) (toList x) (toList y)
eq :: (Veccable v) => Vec v -> Vec v -> Booly
eq = bcomp "=="
neq :: (Veccable v) => Vec v -> Vec v -> Booly
neq = bcomp "!="
lt :: (Veccable v) => Vec v -> Vec v -> Booly
lt = bcomp "<"
gt :: (Veccable v) => Vec v -> Vec v -> Booly
gt = bcomp ">"
leq :: (Veccable v) => Vec v -> Vec v -> Booly
leq = bcomp "<="
geq :: (Veccable v) => Vec v -> Vec v -> Booly
geq = bcomp ">="
-- | Returns rgba value given a texture and texture coordinates
-- texture coordinates start at 0 1
texture2D :: Texture -> Vec2 -> Vec4
texture2D = op2pre "texture2D"
-- | Selection function
--
-- @ sel bool x y @
-- is akin to
--
-- @ bool ? x : y @ in C-like languages
sel :: forall a
. (ToGLSLType a)
=> Booly -> Expr a -> Expr a -> Expr a
sel a b c = Expr t (Tree (Select, toGLSLType t, "") [toMono a, toMono b, toMono c])
where t = tag :: a