luminance-0.11.0.4: Type-safe, type-level and stateless graphics framework

Copyright(C) 2015, 2016 Dimitri Sabadie
LicenseBSD3
MaintainerDimitri Sabadie <dimitri.sabadie@gmail.com>
Stabilityexperimental
Portabilityportable
Safe HaskellNone
LanguageHaskell2010

Graphics.Luminance.Shader.Program

Contents

Description

 

Synopsis

Shader program creation

data Program u Source #

Shader program.

Instances

Eq u => Eq (Program u) Source # 

Methods

(==) :: Program u -> Program u -> Bool #

(/=) :: Program u -> Program u -> Bool #

Show u => Show (Program u) Source # 

Methods

showsPrec :: Int -> Program u -> ShowS #

show :: Program u -> String #

showList :: [Program u] -> ShowS #

createProgram :: (HasProgramError e, MonadError e m, MonadResource m) => [Stage] -> ((forall a. UniformName a -> UniformInterface m (U a)) -> UniformInterface m i) -> m (Program i) Source #

Create a new shader Program.

That function takes a list of Stages and a uniform interface builder function and yields a Program and the interface.

The builder function takes a function you can use to retrieve uniforms. You can pass values of type UniformName to identify the uniform you want to retrieve. If the uniform can’t be retrieved, throws InactiveUniform.

In the end, you get the new Program and a polymorphic value you can choose the type of in the function you pass as argument. You can use that value to gather uniforms for instance.

createProgram_ :: (HasProgramError e, MonadError e m, MonadIO m, MonadResource m) => [Stage] -> m (Program ()) Source #

A simpler version of createProgram. That function assumes you don’t need a uniform interface and then just returns the Program.

Uniform

class Uniform a Source #

Class of types that can be sent down to shaders. That class is closed because shaders cannot handle a lot of uniform types. However, you should have a look at the U documentation for further information about how to augment the scope of the types you can send down to shaders.

Minimal complete definition

toU

Instances

Uniform Float Source # 

Methods

toU :: Monad m => GLuint -> GLint -> UniformInterface m (U Float)

Uniform Int32 Source # 

Methods

toU :: Monad m => GLuint -> GLint -> UniformInterface m (U Int32)

Uniform Word32 Source # 

Methods

toU :: Monad m => GLuint -> GLint -> UniformInterface m (U Word32)

Uniform () Source # 

Methods

toU :: Monad m => GLuint -> GLint -> UniformInterface m (U ())

Uniform [Float] Source # 

Methods

toU :: Monad m => GLuint -> GLint -> UniformInterface m (U [Float])

Uniform [Int32] Source # 

Methods

toU :: Monad m => GLuint -> GLint -> UniformInterface m (U [Int32])

Uniform [Word32] Source # 

Methods

toU :: Monad m => GLuint -> GLint -> UniformInterface m (U [Word32])

Uniform [(Float, Float)] Source # 

Methods

toU :: Monad m => GLuint -> GLint -> UniformInterface m (U [(Float, Float)])

Uniform [(Int32, Int32)] Source # 

Methods

toU :: Monad m => GLuint -> GLint -> UniformInterface m (U [(Int32, Int32)])

Uniform [(Word32, Word32)] Source # 

Methods

toU :: Monad m => GLuint -> GLint -> UniformInterface m (U [(Word32, Word32)])

Uniform [(Float, Float, Float)] Source # 

Methods

toU :: Monad m => GLuint -> GLint -> UniformInterface m (U [(Float, Float, Float)])

Uniform [(Int32, Int32, Int32)] Source # 

Methods

toU :: Monad m => GLuint -> GLint -> UniformInterface m (U [(Int32, Int32, Int32)])

Uniform [(Word32, Word32, Word32)] Source # 

Methods

toU :: Monad m => GLuint -> GLint -> UniformInterface m (U [(Word32, Word32, Word32)])

Uniform [(Float, Float, Float, Float)] Source # 

Methods

toU :: Monad m => GLuint -> GLint -> UniformInterface m (U [(Float, Float, Float, Float)])

Uniform [(Int32, Int32, Int32, Int32)] Source # 

Methods

toU :: Monad m => GLuint -> GLint -> UniformInterface m (U [(Int32, Int32, Int32, Int32)])

Uniform [(Word32, Word32, Word32, Word32)] Source # 

Methods

toU :: Monad m => GLuint -> GLint -> UniformInterface m (U [(Word32, Word32, Word32, Word32)])

Uniform [M44 Float] Source # 

Methods

toU :: Monad m => GLuint -> GLint -> UniformInterface m (U [M44 Float])

Uniform [V Nat 2 Float] Source # 

Methods

toU :: Monad m => GLuint -> GLint -> UniformInterface m (U [V Nat 2 Float])

Uniform [V Nat 2 Int32] Source # 

Methods

toU :: Monad m => GLuint -> GLint -> UniformInterface m (U [V Nat 2 Int32])

Uniform [V Nat 2 Word32] Source # 

Methods

toU :: Monad m => GLuint -> GLint -> UniformInterface m (U [V Nat 2 Word32])

Uniform [V Nat 3 Float] Source # 

Methods

toU :: Monad m => GLuint -> GLint -> UniformInterface m (U [V Nat 3 Float])

Uniform [V Nat 3 Int32] Source # 

Methods

toU :: Monad m => GLuint -> GLint -> UniformInterface m (U [V Nat 3 Int32])

Uniform [V Nat 3 Word32] Source # 

Methods

toU :: Monad m => GLuint -> GLint -> UniformInterface m (U [V Nat 3 Word32])

Uniform [V Nat 4 Float] Source # 

Methods

toU :: Monad m => GLuint -> GLint -> UniformInterface m (U [V Nat 4 Float])

Uniform [V Nat 4 Int32] Source # 

Methods

toU :: Monad m => GLuint -> GLint -> UniformInterface m (U [V Nat 4 Int32])

Uniform [V Nat 4 Word32] Source # 

Methods

toU :: Monad m => GLuint -> GLint -> UniformInterface m (U [V Nat 4 Word32])

Uniform [V4 Float] Source # 

Methods

toU :: Monad m => GLuint -> GLint -> UniformInterface m (U [V4 Float])

Uniform [V4 Int32] Source # 

Methods

toU :: Monad m => GLuint -> GLint -> UniformInterface m (U [V4 Int32])

Uniform [V4 Word32] Source # 

Methods

toU :: Monad m => GLuint -> GLint -> UniformInterface m (U [V4 Word32])

Uniform [V3 Float] Source # 

Methods

toU :: Monad m => GLuint -> GLint -> UniformInterface m (U [V3 Float])

Uniform [V3 Int32] Source # 

Methods

toU :: Monad m => GLuint -> GLint -> UniformInterface m (U [V3 Int32])

Uniform [V3 Word32] Source # 

Methods

toU :: Monad m => GLuint -> GLint -> UniformInterface m (U [V3 Word32])

Uniform [V2 Float] Source # 

Methods

toU :: Monad m => GLuint -> GLint -> UniformInterface m (U [V2 Float])

Uniform [V2 Int32] Source # 

Methods

toU :: Monad m => GLuint -> GLint -> UniformInterface m (U [V2 Int32])

Uniform [V2 Word32] Source # 

Methods

toU :: Monad m => GLuint -> GLint -> UniformInterface m (U [V2 Word32])

Uniform (M44 Float) Source # 

Methods

toU :: Monad m => GLuint -> GLint -> UniformInterface m (U (M44 Float))

Uniform (V4 Float) Source # 

Methods

toU :: Monad m => GLuint -> GLint -> UniformInterface m (U (V4 Float))

Uniform (V4 Int32) Source # 

Methods

toU :: Monad m => GLuint -> GLint -> UniformInterface m (U (V4 Int32))

Uniform (V4 Word32) Source # 

Methods

toU :: Monad m => GLuint -> GLint -> UniformInterface m (U (V4 Word32))

Uniform (V3 Float) Source # 

Methods

toU :: Monad m => GLuint -> GLint -> UniformInterface m (U (V3 Float))

Uniform (V3 Int32) Source # 

Methods

toU :: Monad m => GLuint -> GLint -> UniformInterface m (U (V3 Int32))

Uniform (V3 Word32) Source # 

Methods

toU :: Monad m => GLuint -> GLint -> UniformInterface m (U (V3 Word32))

Uniform (V2 Float) Source # 

Methods

toU :: Monad m => GLuint -> GLint -> UniformInterface m (U (V2 Float))

Uniform (V2 Int32) Source # 

Methods

toU :: Monad m => GLuint -> GLint -> UniformInterface m (U (V2 Int32))

Uniform (V2 Word32) Source # 

Methods

toU :: Monad m => GLuint -> GLint -> UniformInterface m (U (V2 Word32))

Pixel f => Uniform (Cubemap f) Source # 

Methods

toU :: Monad m => GLuint -> GLint -> UniformInterface m (U (Cubemap f))

Pixel f => Uniform (Texture1D f) Source # 

Methods

toU :: Monad m => GLuint -> GLint -> UniformInterface m (U (Texture1D f))

Pixel f => Uniform (Texture2D f) Source # 

Methods

toU :: Monad m => GLuint -> GLint -> UniformInterface m (U (Texture2D f))

Pixel f => Uniform (Texture3D f) Source # 

Methods

toU :: Monad m => GLuint -> GLint -> UniformInterface m (U (Texture3D f))

Uniform (Float, Float) Source # 

Methods

toU :: Monad m => GLuint -> GLint -> UniformInterface m (U (Float, Float))

Uniform (Int32, Int32) Source # 

Methods

toU :: Monad m => GLuint -> GLint -> UniformInterface m (U (Int32, Int32))

Uniform (Word32, Word32) Source # 

Methods

toU :: Monad m => GLuint -> GLint -> UniformInterface m (U (Word32, Word32))

Uniform (Float, Float, Float) Source # 

Methods

toU :: Monad m => GLuint -> GLint -> UniformInterface m (U (Float, Float, Float))

Uniform (Int32, Int32, Int32) Source # 

Methods

toU :: Monad m => GLuint -> GLint -> UniformInterface m (U (Int32, Int32, Int32))

Uniform (Word32, Word32, Word32) Source # 

Methods

toU :: Monad m => GLuint -> GLint -> UniformInterface m (U (Word32, Word32, Word32))

Uniform (V Nat 2 Float) Source # 

Methods

toU :: Monad m => GLuint -> GLint -> UniformInterface m (U (V Nat 2 Float))

Uniform (V Nat 2 Int32) Source # 

Methods

toU :: Monad m => GLuint -> GLint -> UniformInterface m (U (V Nat 2 Int32))

Uniform (V Nat 2 Word32) Source # 

Methods

toU :: Monad m => GLuint -> GLint -> UniformInterface m (U (V Nat 2 Word32))

Uniform (V Nat 3 Float) Source # 

Methods

toU :: Monad m => GLuint -> GLint -> UniformInterface m (U (V Nat 3 Float))

Uniform (V Nat 3 Int32) Source # 

Methods

toU :: Monad m => GLuint -> GLint -> UniformInterface m (U (V Nat 3 Int32))

Uniform (V Nat 3 Word32) Source # 

Methods

toU :: Monad m => GLuint -> GLint -> UniformInterface m (U (V Nat 3 Word32))

Uniform (V Nat 4 Float) Source # 

Methods

toU :: Monad m => GLuint -> GLint -> UniformInterface m (U (V Nat 4 Float))

Uniform (V Nat 4 Int32) Source # 

Methods

toU :: Monad m => GLuint -> GLint -> UniformInterface m (U (V Nat 4 Int32))

Uniform (V Nat 4 Word32) Source # 

Methods

toU :: Monad m => GLuint -> GLint -> UniformInterface m (U (V Nat 4 Word32))

Uniform (Float, Float, Float, Float) Source # 

Methods

toU :: Monad m => GLuint -> GLint -> UniformInterface m (U (Float, Float, Float, Float))

Uniform (Int32, Int32, Int32, Int32) Source # 

Methods

toU :: Monad m => GLuint -> GLint -> UniformInterface m (U (Int32, Int32, Int32, Int32))

Uniform (Word32, Word32, Word32, Word32) Source # 

data U a Source #

A shader uniform. U a doesn’t hold any value. It’s more like a mapping between the host code and the shader the uniform was retrieved from.

U is contravariant in its argument. That means that you can use contramap to build more interesting uniform types.

Another interesting part is the fact that U is also monoidal. You can accumulate several of them with '(<>)' if they have the same type. That means that you can join them so that when you pass an actual value, it gets shared inside the resulting value.

The '()' instance doesn’t do anything and doesn’t even use its argument.

Instances

Contravariant U Source # 

Methods

contramap :: (a -> b) -> U b -> U a #

(>$) :: b -> U b -> U a #

data U' Source #

Instances

Semigroup U' Source # 

Methods

(<>) :: U' -> U' -> U' #

sconcat :: NonEmpty U' -> U' #

stimes :: Integral b => b -> U' -> U' #

Monoid U' Source # 

Methods

mempty :: U' #

mappend :: U' -> U' -> U' #

mconcat :: [U'] -> U' #

(.=) :: U a -> a -> U' Source #

Feed U a with a value.

updateUniforms :: MonadIO m => Program a -> (a -> U') -> m () Source #

Update uniforms in a program. That function enables you to update only the uniforms you want and not the whole.

If you want to update several uniforms (not only one), you can use the 'Semigroup'/'Monoid' instances (use '(<>)' or 'sconcat'/'mconcat' for instance).

data UniformName :: * -> * where Source #

Possible way to name uniform values.

data SomeUniformName Source #

A uniform name with type-erasure. You can only access the constructors and the carried name but you can’t reconstruct the phantom type.

Constructors

SomeUniformName (UniformName a) 

Uniform block

class UniformBlock a Source #

Instances

UniformBlock Bool Source # 

Methods

isStruct :: proxy Bool -> Bool

alignmentSTD140 :: proxy Bool -> Int

sizeOfSTD140 :: proxy Bool -> Int

peekSTD140 :: MonadIO m => Ptr b -> Int -> m Bool

pokeSTD140 :: MonadIO m => Ptr b -> Int -> Bool -> m ()

UniformBlock Float Source # 

Methods

isStruct :: proxy Float -> Bool

alignmentSTD140 :: proxy Float -> Int

sizeOfSTD140 :: proxy Float -> Int

peekSTD140 :: MonadIO m => Ptr b -> Int -> m Float

pokeSTD140 :: MonadIO m => Ptr b -> Int -> Float -> m ()

UniformBlock Int32 Source # 

Methods

isStruct :: proxy Int32 -> Bool

alignmentSTD140 :: proxy Int32 -> Int

sizeOfSTD140 :: proxy Int32 -> Int

peekSTD140 :: MonadIO m => Ptr b -> Int -> m Int32

pokeSTD140 :: MonadIO m => Ptr b -> Int -> Int32 -> m ()

UniformBlock Word32 Source # 

Methods

isStruct :: proxy Word32 -> Bool

alignmentSTD140 :: proxy Word32 -> Int

sizeOfSTD140 :: proxy Word32 -> Int

peekSTD140 :: MonadIO m => Ptr b -> Int -> m Word32

pokeSTD140 :: MonadIO m => Ptr b -> Int -> Word32 -> m ()

(Storable a, UniformBlock a) => UniformBlock (V4 a) Source # 

Methods

isStruct :: proxy (V4 a) -> Bool

alignmentSTD140 :: proxy (V4 a) -> Int

sizeOfSTD140 :: proxy (V4 a) -> Int

peekSTD140 :: MonadIO m => Ptr b -> Int -> m (V4 a)

pokeSTD140 :: MonadIO m => Ptr b -> Int -> V4 a -> m ()

(Storable a, UniformBlock a) => UniformBlock (V3 a) Source # 

Methods

isStruct :: proxy (V3 a) -> Bool

alignmentSTD140 :: proxy (V3 a) -> Int

sizeOfSTD140 :: proxy (V3 a) -> Int

peekSTD140 :: MonadIO m => Ptr b -> Int -> m (V3 a)

pokeSTD140 :: MonadIO m => Ptr b -> Int -> V3 a -> m ()

(Storable a, UniformBlock a) => UniformBlock (V2 a) Source # 

Methods

isStruct :: proxy (V2 a) -> Bool

alignmentSTD140 :: proxy (V2 a) -> Int

sizeOfSTD140 :: proxy (V2 a) -> Int

peekSTD140 :: MonadIO m => Ptr b -> Int -> m (V2 a)

pokeSTD140 :: MonadIO m => Ptr b -> Int -> V2 a -> m ()

(UniformBlock a, UniformBlock b) => UniformBlock (a, b) Source # 

Methods

isStruct :: proxy (a, b) -> Bool

alignmentSTD140 :: proxy (a, b) -> Int

sizeOfSTD140 :: proxy (a, b) -> Int

peekSTD140 :: MonadIO m => Ptr b -> Int -> m (a, b)

pokeSTD140 :: MonadIO m => Ptr b -> Int -> (a, b) -> m ()

(UniformBlock a, UniformBlock b) => UniformBlock ((:.) a b) Source # 

Methods

isStruct :: proxy (a :. b) -> Bool

alignmentSTD140 :: proxy (a :. b) -> Int

sizeOfSTD140 :: proxy (a :. b) -> Int

peekSTD140 :: MonadIO m => Ptr b -> Int -> m (a :. b)

pokeSTD140 :: MonadIO m => Ptr b -> Int -> (a :. b) -> m ()

(UniformBlock a, UniformBlock b, UniformBlock c) => UniformBlock (a, b, c) Source # 

Methods

isStruct :: proxy (a, b, c) -> Bool

alignmentSTD140 :: proxy (a, b, c) -> Int

sizeOfSTD140 :: proxy (a, b, c) -> Int

peekSTD140 :: MonadIO m => Ptr b -> Int -> m (a, b, c)

pokeSTD140 :: MonadIO m => Ptr b -> Int -> (a, b, c) -> m ()

(UniformBlock a, UniformBlock b, UniformBlock c, UniformBlock d) => UniformBlock (a, b, c, d) Source # 

Methods

isStruct :: proxy (a, b, c, d) -> Bool

alignmentSTD140 :: proxy (a, b, c, d) -> Int

sizeOfSTD140 :: proxy (a, b, c, d) -> Int

peekSTD140 :: MonadIO m => Ptr b -> Int -> m (a, b, c, d)

pokeSTD140 :: MonadIO m => Ptr b -> Int -> (a, b, c, d) -> m ()

newtype UB a Source #

Constructors

UB 

Fields

Instances

Functor UB Source # 

Methods

fmap :: (a -> b) -> UB a -> UB b #

(<$) :: a -> UB b -> UB a #

Foldable UB Source # 

Methods

fold :: Monoid m => UB m -> m #

foldMap :: Monoid m => (a -> m) -> UB a -> m #

foldr :: (a -> b -> b) -> b -> UB a -> b #

foldr' :: (a -> b -> b) -> b -> UB a -> b #

foldl :: (b -> a -> b) -> b -> UB a -> b #

foldl' :: (b -> a -> b) -> b -> UB a -> b #

foldr1 :: (a -> a -> a) -> UB a -> a #

foldl1 :: (a -> a -> a) -> UB a -> a #

toList :: UB a -> [a] #

null :: UB a -> Bool #

length :: UB a -> Int #

elem :: Eq a => a -> UB a -> Bool #

maximum :: Ord a => UB a -> a #

minimum :: Ord a => UB a -> a #

sum :: Num a => UB a -> a #

product :: Num a => UB a -> a #

Traversable UB Source # 

Methods

traverse :: Applicative f => (a -> f b) -> UB a -> f (UB b) #

sequenceA :: Applicative f => UB (f a) -> f (UB a) #

mapM :: Monad m => (a -> m b) -> UB a -> m (UB b) #

sequence :: Monad m => UB (m a) -> m (UB a) #

Eq a => Eq (UB a) Source # 

Methods

(==) :: UB a -> UB a -> Bool #

(/=) :: UB a -> UB a -> Bool #

Ord a => Ord (UB a) Source # 

Methods

compare :: UB a -> UB a -> Ordering #

(<) :: UB a -> UB a -> Bool #

(<=) :: UB a -> UB a -> Bool #

(>) :: UB a -> UB a -> Bool #

(>=) :: UB a -> UB a -> Bool #

max :: UB a -> UB a -> UB a #

min :: UB a -> UB a -> UB a #

Show a => Show (UB a) Source # 

Methods

showsPrec :: Int -> UB a -> ShowS #

show :: UB a -> String #

showList :: [UB a] -> ShowS #

UniformBlock a => Storable (UB a) Source # 

Methods

sizeOf :: UB a -> Int #

alignment :: UB a -> Int #

peekElemOff :: Ptr (UB a) -> Int -> IO (UB a) #

pokeElemOff :: Ptr (UB a) -> Int -> UB a -> IO () #

peekByteOff :: Ptr b -> Int -> IO (UB a) #

pokeByteOff :: Ptr b -> Int -> UB a -> IO () #

peek :: Ptr (UB a) -> IO (UB a) #

poke :: Ptr (UB a) -> UB a -> IO () #

Error handling

data ProgramError Source #

Shader program error.

'LinkFailed reason' happens when a program fails to link. reason contains the error message.

'InactiveUniform uni' happens at linking when a uniform is inactive in the program; that is, unused or semantically set to a negative value.

class HasProgramError a where Source #

Types that can handle ProgramError – read as, “have”.

Minimal complete definition

fromProgramError

Re-exported

(<>) :: Semigroup a => a -> a -> a #

An associative operation.

(a <> b) <> c = a <> (b <> c)

If a is also a Monoid we further require

(<>) = mappend

sconcat :: Semigroup a => NonEmpty a -> a #

Reduce a non-empty list with <>

The default definition should be sufficient, but this can be overridden for efficiency.