packages feed

mischief-render-0.1.0.0: src/Mischief/Shader/Functions.hs

{-# LANGUAGE AllowAmbiguousTypes #-}
{-# LANGUAGE OverloadedStrings #-}
{-# OPTIONS_GHC -Wno-redundant-constraints #-}

module Mischief.Shader.Functions where

import Data.Data
import Data.Singletons (SingI)
import Data.Text (Text)
import GHC.TypeLits hiding (Div)
import Mischief.Render.Core
import Mischief.Render.Texture
import Mischief.Shader.Internal.Bindings
import Mischief.Shader.Internal.Singletons
import Mischief.Shader.Internal.State
import Mischief.Shader.Types
import Prelude (Bool (..), undefined, ($), type (~))

sample :: Expr TTexture -> Expr TSampler -> Vec 2 Float -> Vec 4 Float
sample tex sampler v =
  Function
    "textureSample"
    [ Param tex,
      Param sampler,
      Param v
    ]

unsafeCall :: (SingI a) => Text -> [Param] -> Expr a
unsafeCall = Function

-- Binary
(&) :: (Algebric a ~ True, Integral a ~ True) => Expr a -> Expr a -> Expr a
(&) = CustomOperator "&"

-- Arithmetics

class Num a where
  (+) :: Expr a -> Expr a -> Expr a
  (+) = CustomOperator "+"

  (-) :: Expr a -> Expr a -> Expr a
  (-) = CustomOperator "-"

  (*) :: Expr a -> Expr a -> Expr a
  (*) = CustomOperator "*"

instance Num (Primitive a)

instance Num (VectorType n a)

instance Num (MatrixType n m)

(^+) :: Expr (VectorType n a) -> Expr (Primitive a) -> Expr (VectorType n a)
(^+) = CustomOperator "+"

(+^) :: Expr (Primitive a) -> Expr (VectorType n a) -> Expr (VectorType n a)
(+^) = CustomOperator "+"

(^-) :: Expr (VectorType n a) -> Expr (Primitive a) -> Expr (VectorType n a)
(^-) = CustomOperator "-"

(-^) :: Expr (Primitive a) -> Expr (VectorType n a) -> Expr (VectorType n a)
(-^) = CustomOperator "-"

(^*) :: Expr (VectorType n a) -> Expr (Primitive a) -> Expr (VectorType n a)
(^*) = CustomOperator "*"

(*^) :: Expr (Primitive a) -> Expr (VectorType n a) -> Expr (VectorType n a)
(*^) = CustomOperator "*"

(*!) :: Float -> Mat n m -> Mat n m
(*!) = CustomOperator "*"

(!*) :: Mat n m -> Float -> Mat n m
(!*) = CustomOperator "*"

(^*!) :: Vec m Float -> Mat n m -> Vec n Float
(^*!) = CustomOperator "*"

(!*^) :: Mat n m -> Vec n Float -> Vec m Float
(!*^) = CustomOperator "*"

(!*!) :: Mat k r -> Mat c k -> Mat c r
(!*!) = CustomOperator "*"

class Div a where
  (/) :: Expr a -> Expr a -> Expr a
  (/) = CustomOperator "/"

instance {-# OVERLAPPABLE #-} (Algebric a ~ True) => Div a

(^/) :: Expr (VectorType n a) -> Expr (Primitive a) -> Expr (VectorType n a)
(^/) = CustomOperator "/"

(/^) :: Expr (Primitive a) -> Expr (VectorType n a) -> Expr (VectorType n a)
(/^) = CustomOperator "/"

class Modulo a where
  (%) :: Expr a -> Expr a -> Expr a
  (%) = CustomOperator "%"

instance {-# OVERLAPPABLE #-} (Integral a ~ True) => Modulo a

(^%) :: (Integral (Primitive a) ~ True) => Expr (VectorType n a) -> Expr (Primitive a) -> Expr (VectorType n a)
(^%) = CustomOperator "%"

(%^) :: (Integral (Primitive a) ~ True) => Expr (Primitive a) -> Expr (VectorType n a) -> Expr (VectorType n a)
(%^) = CustomOperator "%"

-- Numeric Functions

abs :: (SingI a, Algebric a ~ True) => Expr a -> Expr a
abs = Abs

acos :: (SingI a, Fractional (Expr a) ~ True) => Expr a -> Expr a
acos x = Function "acos" [Param x]

acosh :: (SingI a, Fractional (Expr a) ~ True) => Expr a -> Expr a
acosh x = Function "acosh" [Param x]

asin :: (SingI a, Algebric a ~ True) => Expr a -> Expr a
asin x = Function "asin" [Param x]

asinh :: (SingI a, Algebric a ~ True) => Expr a -> Expr a
asinh x = Function "asinh" [Param x]

atan :: (SingI a, Fractional (Expr a) ~ True) => Expr a -> Expr a
atan x = Function "atan" [Param x]

atanh :: (SingI a, Fractional (Expr a) ~ True) => Expr a -> Expr a
atanh x = Function "atanh" [Param x]

atan2 :: (SingI a, Fractional (Expr a) ~ True) => Expr a -> Expr a -> Expr a
atan2 x y = Function "atan2" [Param x, Param y]

ceil :: (SingI a, Fractional (Expr a) ~ True) => Expr a -> Expr a
ceil x = Function "ceil" [Param x]

clamp :: (SingI a, Algebric a ~ True) => Expr a -> Expr a -> Expr a -> Expr a
clamp e low high = Function "clamp" [Param e, Param low, Param high]

cos :: (SingI a, Fractional (Expr a) ~ True) => Expr a -> Expr a
cos x = Function "cos" [Param x]

cosh :: (SingI a, Fractional (Expr a) ~ True) => Expr a -> Expr a
cosh x = Function "cosh" [Param x]

countLeadingZeros :: (SingI a, Integral a ~ True) => Expr a -> Expr a
countLeadingZeros x = Function "countLeadingZeros" [Param x]

countOneBits :: (SingI a, Integral a ~ True) => Expr a -> Expr a
countOneBits x = Function "countOneBits" [Param x]

countTrailingZeros :: (SingI a, Integral a ~ True) => Expr a -> Expr a
countTrailingZeros x = Function "countTrailingZeros" [Param x]

cross :: (SingI (VectorType 3 a), Fractional (Expr (Primitive a)) ~ True) => Expr (VectorType 3 a) -> Expr (VectorType 3 a) -> Expr (VectorType 3 a)
cross a b = Function "cross" [Param a, Param b]

degrees :: (SingI a, Fractional (Expr a) ~ True) => Expr a -> Expr a
degrees x = Function "degrees" [Param x]

determinant :: (SingI n) => Expr (MatrixType n n) -> Float
determinant x = Function "determinant" [Param x]

distance :: (SingI a, Fractional (Expr a) ~ True, VectorOrSingleOf a ~ b) => Expr a -> Expr a -> Expr (Primitive b)
distance a b = Function "distance" [Param a, Param b]

dot :: (SingI (Expr (VectorType n a)), SingI a, SingI n, Algebric (Primitive a) ~ True) => Expr (VectorType n a) -> Expr (VectorType n a) -> Expr (Primitive a)
dot a b = Function "dot" [Param a, Param b]

dot4U8Packed :: Uint -> Uint -> Uint
dot4U8Packed a b = Function "dot4U8Packed" [Param a, Param b]

dot4I8Packed :: Uint -> Uint -> Int
dot4I8Packed a b = Function "dot4I8Packed" [Param a, Param b]

exp :: (SingI a, Fractional (Expr a) ~ True) => Expr a -> Expr a
exp a = Function "exp" [Param a]

exp2 :: (SingI a, Fractional (Expr a) ~ True) => Expr a -> Expr a
exp2 a = Function "exp2" [Param a]

extractBits :: (SingI a, Integral a ~ True) => Expr a -> Uint -> Uint -> Expr a
extractBits e offset count = Function "extractBits" [Param e, Param offset, Param count]

faceForward :: (SingI a, SingI n, Fractional (Expr (Primitive a)) ~ True) => Expr (VectorType n a) -> Expr (VectorType n a) -> Expr (VectorType n a) -> Expr (VectorType n a)
faceForward a b c = Function "faceForward" [Param a, Param b, Param c]

firstLeadingBit :: (SingI a, SingI n, Integral a ~ True) => Expr a -> Expr a
firstLeadingBit a = Function "firstLeadingBit" [Param a]

firstTrailingBit :: (SingI a, SingI n, Integral a ~ True) => Expr a -> Expr a
firstTrailingBit a = Function "firstTrailingBit" [Param a]

floor :: (SingI a, Fractional (Expr a) ~ True) => Expr a -> Expr a
floor x = Function "floor" [Param x]

fma :: (SingI a, Fractional (Expr a) ~ True) => Expr a -> Expr a -> Expr a -> Expr a
fma a b c = Function "fma" [Param a, Param b, Param c]

fract :: (SingI a, Fractional (Expr a) ~ True) => Expr a -> Expr a
fract a = Function "fract" [Param a]

-- TODO: frexp (custom struct)

insertBits :: (SingI a, Integral a ~ True) => Expr a -> Expr a -> Uint -> Uint -> Expr a
insertBits e newbits offset count = Function "insertBits" [Param e, Param newbits, Param offset, Param count]

inverseSqrt :: (SingI a, Fractional (Expr a) ~ True) => Expr a -> Expr a
inverseSqrt a = Function "inverseSqrt" [Param a]

-- TODO: ldexp

length :: (SingI a, SingI b, SingI n, VectorOrSingleOf b ~ a) => Expr b -> Expr (Primitive a)
length a = Function "length" [Param a]

log :: (SingI a, Fractional (Expr a) ~ True) => Expr a -> Expr a
log a = Function "log" [Param a]

log2 :: (SingI a, Fractional (Expr a) ~ True) => Expr a -> Expr a
log2 a = Function "log2" [Param a]

max :: (SingI a, Algebric a ~ True) => Expr a -> Expr a -> Expr a
max a b = Function "max" [Param a, Param b]

min :: (SingI a, Algebric a ~ True) => Expr a -> Expr a -> Expr a
min a b = Function "min" [Param a, Param b]

class Mix a b

instance Mix a a

instance Mix (VectorType n a) (Primitive a)

mix :: (SingI a, SingI b, Fractional (Expr a) ~ True, Fractional (Expr b) ~ True, Mix a b) => Expr a -> Expr a -> Expr b -> Expr a
mix a b c = Function "mix" [Param a, Param b, Param c]

-- TODO: modf (custom struct)

normalize :: (SingI n, SingI a, Fractional (Expr (VectorType n a)) ~ True) => Expr (VectorType n a) -> Expr (VectorType n a)
normalize a = Function "normalize" [Param a]

pow :: (SingI a, Fractional (Expr a) ~ True) => Expr a -> Expr a -> Expr a
pow a b = Function "pow" [Param a, Param b]

quantizeToF16 :: (SingI a, VectorOrSingleOf a ~ TFloat) => Expr a -> Expr a
quantizeToF16 a = Function "quantizeToF16" [Param a]

radians :: (SingI a, Fractional (Expr a) ~ True) => Expr a -> Expr a
radians a = Function "radians" [Param a]

reflect :: (SingI n, SingI a, Fractional (Expr (VectorType n a)) ~ True) => Expr (VectorType n a) -> Expr (VectorType n a) -> Expr (VectorType n a)
reflect a b = Function "reflect" [Param a, Param b]

refract :: (SingI a, SingI b, VectorOrSingleOf a ~ b) => Expr a -> Expr a -> Expr (Primitive b) -> Expr a
refract a b c = Function "refract" [Param a, Param b, Param c]

reverseBits :: (SingI a, Integral a ~ True) => Expr a -> Expr a
reverseBits a = Function "reverseBits" [Param a]

round :: (SingI a, Fractional (Expr a) ~ True) => Expr a -> Expr a
round a = Function "round" [Param a]

saturate :: (SingI a, Fractional (Expr a) ~ True) => Expr a -> Expr a
saturate a = Function "saturate" [Param a]

sign :: (SingI a, Algebric a ~ True) => Expr a -> Expr a
sign a = Function "sign" [Param a]

sin :: (SingI a, Fractional (Expr a) ~ True) => Expr a -> Expr a
sin a = Function "sin" [Param a]

sinh :: (SingI a, Fractional (Expr a) ~ True) => Expr a -> Expr a
sinh a = Function "sinh" [Param a]

smoothstep :: (SingI a, Fractional (Expr a) ~ True) => Expr a -> Expr a -> Expr a -> Expr a
smoothstep a b c = Function "smoothstep" [Param a, Param b, Param c]

sqrt :: (SingI a, Fractional (Expr a) ~ True) => Expr a -> Expr a
sqrt a = Function "sqrt" [Param a]

step :: (SingI a, Fractional (Expr a) ~ True) => Expr a -> Expr a -> Expr a
step a b = Function "step" [Param a, Param b]

tan :: (SingI a, Fractional (Expr a) ~ True) => Expr a -> Expr a
tan a = Function "tan" [Param a]

tanh :: (SingI a, Fractional (Expr a) ~ True) => Expr a -> Expr a
tanh a = Function "tanh" [Param a]

transpose :: (SingI n, SingI m) => Expr (MatrixType n m) -> Expr (MatrixType m n)
transpose a = Function "transpose" [Param a]

trunc :: (SingI a, Fractional (Expr a) ~ True) => Expr a -> Expr a
trunc a = Function "trunc" [Param a]

-- TODO: Bit Reinterpretation Functions

-- TODO: Logical Functions

-- TODO: Array Functions

-- TODO: Derivative Functions

-- TODO: Texture Functions

-- TODO: Atomic Functions

-- TODO: Data Packing Functions

-- TODO: Data Unpacking Functions

-- TODO: Synchronization Functions