{-# LANGUAGE MultiParamTypeClasses, TypeFamilies, FlexibleContexts,
RankNTypes, ExistentialQuantification, GeneralizedNewtypeDeriving,
FlexibleInstances, GADTs #-}
module Graphics.GPipe.Internal.Shader (
Shader(..),
ShaderM(..),
ShaderState(..),
CompiledShader,
Render(..),
getNewName,
tellDrawcall,
askUniformAlignment,
modifyRenderIO,
compileShader,
mapShader,
guard',
maybeShader,
chooseShader,
silenceShader
) where
import Graphics.GPipe.Internal.Compiler
import Graphics.GPipe.Internal.Context
import Graphics.GPipe.Internal.Buffer
import Control.Monad
import Control.Monad.Trans.State
import Control.Monad.IO.Class
import Control.Monad.Trans.Writer.Lazy (tell, WriterT(..), execWriterT)
import Control.Monad.Exception (MonadException)
import Control.Applicative (Alternative, (<|>))
import Control.Monad.Trans.Class (lift)
import Data.Maybe (fromJust, isJust, isNothing)
import Control.Monad.Trans.List (ListT(..))
import Data.Monoid (All(..))
import Data.Either
import Control.Monad.Trans.Reader
import Data.List (find)
data ShaderState s = ShaderState
Int
(RenderIOState s)
newShaderState :: ShaderState s
newShaderState :: ShaderState s
newShaderState = Int -> RenderIOState s -> ShaderState s
forall s. Int -> RenderIOState s -> ShaderState s
ShaderState Int
1 RenderIOState s
forall s. RenderIOState s
newRenderIOState
newtype ShaderM s a = ShaderM
(ReaderT
UniformAlignment
(WriterT
( [IO (Drawcall s)]
, s -> All
)
(ListT
(State
(ShaderState s)
)
)
)
a
)
deriving (Monad (ShaderM s)
Alternative (ShaderM s)
ShaderM s a
Alternative (ShaderM s)
-> Monad (ShaderM s)
-> (forall a. ShaderM s a)
-> (forall a. ShaderM s a -> ShaderM s a -> ShaderM s a)
-> MonadPlus (ShaderM s)
ShaderM s a -> ShaderM s a -> ShaderM s a
forall s. Monad (ShaderM s)
forall s. Alternative (ShaderM s)
forall a. ShaderM s a
forall a. ShaderM s a -> ShaderM s a -> ShaderM s a
forall s a. ShaderM s a
forall s a. ShaderM s a -> ShaderM s a -> ShaderM s a
forall (m :: * -> *).
Alternative m
-> Monad m
-> (forall a. m a)
-> (forall a. m a -> m a -> m a)
-> MonadPlus m
mplus :: ShaderM s a -> ShaderM s a -> ShaderM s a
$cmplus :: forall s a. ShaderM s a -> ShaderM s a -> ShaderM s a
mzero :: ShaderM s a
$cmzero :: forall s a. ShaderM s a
$cp2MonadPlus :: forall s. Monad (ShaderM s)
$cp1MonadPlus :: forall s. Alternative (ShaderM s)
MonadPlus, Applicative (ShaderM s)
a -> ShaderM s a
Applicative (ShaderM s)
-> (forall a b. ShaderM s a -> (a -> ShaderM s b) -> ShaderM s b)
-> (forall a b. ShaderM s a -> ShaderM s b -> ShaderM s b)
-> (forall a. a -> ShaderM s a)
-> Monad (ShaderM s)
ShaderM s a -> (a -> ShaderM s b) -> ShaderM s b
ShaderM s a -> ShaderM s b -> ShaderM s b
forall s. Applicative (ShaderM s)
forall a. a -> ShaderM s a
forall s a. a -> ShaderM s a
forall a b. ShaderM s a -> ShaderM s b -> ShaderM s b
forall a b. ShaderM s a -> (a -> ShaderM s b) -> ShaderM s b
forall s a b. ShaderM s a -> ShaderM s b -> ShaderM s b
forall s a b. ShaderM s a -> (a -> ShaderM s b) -> ShaderM s b
forall (m :: * -> *).
Applicative m
-> (forall a b. m a -> (a -> m b) -> m b)
-> (forall a b. m a -> m b -> m b)
-> (forall a. a -> m a)
-> Monad m
return :: a -> ShaderM s a
$creturn :: forall s a. a -> ShaderM s a
>> :: ShaderM s a -> ShaderM s b -> ShaderM s b
$c>> :: forall s a b. ShaderM s a -> ShaderM s b -> ShaderM s b
>>= :: ShaderM s a -> (a -> ShaderM s b) -> ShaderM s b
$c>>= :: forall s a b. ShaderM s a -> (a -> ShaderM s b) -> ShaderM s b
$cp1Monad :: forall s. Applicative (ShaderM s)
Monad, Applicative (ShaderM s)
ShaderM s a
Applicative (ShaderM s)
-> (forall a. ShaderM s a)
-> (forall a. ShaderM s a -> ShaderM s a -> ShaderM s a)
-> (forall a. ShaderM s a -> ShaderM s [a])
-> (forall a. ShaderM s a -> ShaderM s [a])
-> Alternative (ShaderM s)
ShaderM s a -> ShaderM s a -> ShaderM s a
ShaderM s a -> ShaderM s [a]
ShaderM s a -> ShaderM s [a]
forall s. Applicative (ShaderM s)
forall a. ShaderM s a
forall a. ShaderM s a -> ShaderM s [a]
forall a. ShaderM s a -> ShaderM s a -> ShaderM s a
forall s a. ShaderM s a
forall s a. ShaderM s a -> ShaderM s [a]
forall s a. ShaderM s a -> ShaderM s a -> ShaderM s a
forall (f :: * -> *).
Applicative f
-> (forall a. f a)
-> (forall a. f a -> f a -> f a)
-> (forall a. f a -> f [a])
-> (forall a. f a -> f [a])
-> Alternative f
many :: ShaderM s a -> ShaderM s [a]
$cmany :: forall s a. ShaderM s a -> ShaderM s [a]
some :: ShaderM s a -> ShaderM s [a]
$csome :: forall s a. ShaderM s a -> ShaderM s [a]
<|> :: ShaderM s a -> ShaderM s a -> ShaderM s a
$c<|> :: forall s a. ShaderM s a -> ShaderM s a -> ShaderM s a
empty :: ShaderM s a
$cempty :: forall s a. ShaderM s a
$cp1Alternative :: forall s. Applicative (ShaderM s)
Alternative, Functor (ShaderM s)
a -> ShaderM s a
Functor (ShaderM s)
-> (forall a. a -> ShaderM s a)
-> (forall a b. ShaderM s (a -> b) -> ShaderM s a -> ShaderM s b)
-> (forall a b c.
(a -> b -> c) -> ShaderM s a -> ShaderM s b -> ShaderM s c)
-> (forall a b. ShaderM s a -> ShaderM s b -> ShaderM s b)
-> (forall a b. ShaderM s a -> ShaderM s b -> ShaderM s a)
-> Applicative (ShaderM s)
ShaderM s a -> ShaderM s b -> ShaderM s b
ShaderM s a -> ShaderM s b -> ShaderM s a
ShaderM s (a -> b) -> ShaderM s a -> ShaderM s b
(a -> b -> c) -> ShaderM s a -> ShaderM s b -> ShaderM s c
forall s. Functor (ShaderM s)
forall a. a -> ShaderM s a
forall s a. a -> ShaderM s a
forall a b. ShaderM s a -> ShaderM s b -> ShaderM s a
forall a b. ShaderM s a -> ShaderM s b -> ShaderM s b
forall a b. ShaderM s (a -> b) -> ShaderM s a -> ShaderM s b
forall s a b. ShaderM s a -> ShaderM s b -> ShaderM s a
forall s a b. ShaderM s a -> ShaderM s b -> ShaderM s b
forall s a b. ShaderM s (a -> b) -> ShaderM s a -> ShaderM s b
forall a b c.
(a -> b -> c) -> ShaderM s a -> ShaderM s b -> ShaderM s c
forall s a b c.
(a -> b -> c) -> ShaderM s a -> ShaderM s b -> ShaderM s c
forall (f :: * -> *).
Functor f
-> (forall a. a -> f a)
-> (forall a b. f (a -> b) -> f a -> f b)
-> (forall a b c. (a -> b -> c) -> f a -> f b -> f c)
-> (forall a b. f a -> f b -> f b)
-> (forall a b. f a -> f b -> f a)
-> Applicative f
<* :: ShaderM s a -> ShaderM s b -> ShaderM s a
$c<* :: forall s a b. ShaderM s a -> ShaderM s b -> ShaderM s a
*> :: ShaderM s a -> ShaderM s b -> ShaderM s b
$c*> :: forall s a b. ShaderM s a -> ShaderM s b -> ShaderM s b
liftA2 :: (a -> b -> c) -> ShaderM s a -> ShaderM s b -> ShaderM s c
$cliftA2 :: forall s a b c.
(a -> b -> c) -> ShaderM s a -> ShaderM s b -> ShaderM s c
<*> :: ShaderM s (a -> b) -> ShaderM s a -> ShaderM s b
$c<*> :: forall s a b. ShaderM s (a -> b) -> ShaderM s a -> ShaderM s b
pure :: a -> ShaderM s a
$cpure :: forall s a. a -> ShaderM s a
$cp1Applicative :: forall s. Functor (ShaderM s)
Applicative, a -> ShaderM s b -> ShaderM s a
(a -> b) -> ShaderM s a -> ShaderM s b
(forall a b. (a -> b) -> ShaderM s a -> ShaderM s b)
-> (forall a b. a -> ShaderM s b -> ShaderM s a)
-> Functor (ShaderM s)
forall a b. a -> ShaderM s b -> ShaderM s a
forall a b. (a -> b) -> ShaderM s a -> ShaderM s b
forall s a b. a -> ShaderM s b -> ShaderM s a
forall s a b. (a -> b) -> ShaderM s a -> ShaderM s b
forall (f :: * -> *).
(forall a b. (a -> b) -> f a -> f b)
-> (forall a b. a -> f b -> f a) -> Functor f
<$ :: a -> ShaderM s b -> ShaderM s a
$c<$ :: forall s a b. a -> ShaderM s b -> ShaderM s a
fmap :: (a -> b) -> ShaderM s a -> ShaderM s b
$cfmap :: forall s a b. (a -> b) -> ShaderM s a -> ShaderM s b
Functor)
getNewName :: ShaderM s Int
getNewName :: ShaderM s Int
getNewName = do
ShaderState Int
n RenderIOState s
r <- ReaderT
Int
(WriterT
([IO (Drawcall s)], s -> All) (ListT (State (ShaderState s))))
(ShaderState s)
-> ShaderM s (ShaderState s)
forall s a.
ReaderT
Int
(WriterT
([IO (Drawcall s)], s -> All) (ListT (State (ShaderState s))))
a
-> ShaderM s a
ShaderM (ReaderT
Int
(WriterT
([IO (Drawcall s)], s -> All) (ListT (State (ShaderState s))))
(ShaderState s)
-> ShaderM s (ShaderState s))
-> ReaderT
Int
(WriterT
([IO (Drawcall s)], s -> All) (ListT (State (ShaderState s))))
(ShaderState s)
-> ShaderM s (ShaderState s)
forall a b. (a -> b) -> a -> b
$ WriterT
([IO (Drawcall s)], s -> All)
(ListT (State (ShaderState s)))
(ShaderState s)
-> ReaderT
Int
(WriterT
([IO (Drawcall s)], s -> All) (ListT (State (ShaderState s))))
(ShaderState s)
forall (t :: (* -> *) -> * -> *) (m :: * -> *) a.
(MonadTrans t, Monad m) =>
m a -> t m a
lift (WriterT
([IO (Drawcall s)], s -> All)
(ListT (State (ShaderState s)))
(ShaderState s)
-> ReaderT
Int
(WriterT
([IO (Drawcall s)], s -> All) (ListT (State (ShaderState s))))
(ShaderState s))
-> WriterT
([IO (Drawcall s)], s -> All)
(ListT (State (ShaderState s)))
(ShaderState s)
-> ReaderT
Int
(WriterT
([IO (Drawcall s)], s -> All) (ListT (State (ShaderState s))))
(ShaderState s)
forall a b. (a -> b) -> a -> b
$ ListT (State (ShaderState s)) (ShaderState s)
-> WriterT
([IO (Drawcall s)], s -> All)
(ListT (State (ShaderState s)))
(ShaderState s)
forall (t :: (* -> *) -> * -> *) (m :: * -> *) a.
(MonadTrans t, Monad m) =>
m a -> t m a
lift (ListT (State (ShaderState s)) (ShaderState s)
-> WriterT
([IO (Drawcall s)], s -> All)
(ListT (State (ShaderState s)))
(ShaderState s))
-> ListT (State (ShaderState s)) (ShaderState s)
-> WriterT
([IO (Drawcall s)], s -> All)
(ListT (State (ShaderState s)))
(ShaderState s)
forall a b. (a -> b) -> a -> b
$ StateT (ShaderState s) Identity (ShaderState s)
-> ListT (State (ShaderState s)) (ShaderState s)
forall (t :: (* -> *) -> * -> *) (m :: * -> *) a.
(MonadTrans t, Monad m) =>
m a -> t m a
lift StateT (ShaderState s) Identity (ShaderState s)
forall (m :: * -> *) s. Monad m => StateT s m s
get
ReaderT
Int
(WriterT
([IO (Drawcall s)], s -> All) (ListT (State (ShaderState s))))
()
-> ShaderM s ()
forall s a.
ReaderT
Int
(WriterT
([IO (Drawcall s)], s -> All) (ListT (State (ShaderState s))))
a
-> ShaderM s a
ShaderM (ReaderT
Int
(WriterT
([IO (Drawcall s)], s -> All) (ListT (State (ShaderState s))))
()
-> ShaderM s ())
-> ReaderT
Int
(WriterT
([IO (Drawcall s)], s -> All) (ListT (State (ShaderState s))))
()
-> ShaderM s ()
forall a b. (a -> b) -> a -> b
$ WriterT
([IO (Drawcall s)], s -> All) (ListT (State (ShaderState s))) ()
-> ReaderT
Int
(WriterT
([IO (Drawcall s)], s -> All) (ListT (State (ShaderState s))))
()
forall (t :: (* -> *) -> * -> *) (m :: * -> *) a.
(MonadTrans t, Monad m) =>
m a -> t m a
lift (WriterT
([IO (Drawcall s)], s -> All) (ListT (State (ShaderState s))) ()
-> ReaderT
Int
(WriterT
([IO (Drawcall s)], s -> All) (ListT (State (ShaderState s))))
())
-> WriterT
([IO (Drawcall s)], s -> All) (ListT (State (ShaderState s))) ()
-> ReaderT
Int
(WriterT
([IO (Drawcall s)], s -> All) (ListT (State (ShaderState s))))
()
forall a b. (a -> b) -> a -> b
$ ListT (State (ShaderState s)) ()
-> WriterT
([IO (Drawcall s)], s -> All) (ListT (State (ShaderState s))) ()
forall (t :: (* -> *) -> * -> *) (m :: * -> *) a.
(MonadTrans t, Monad m) =>
m a -> t m a
lift (ListT (State (ShaderState s)) ()
-> WriterT
([IO (Drawcall s)], s -> All) (ListT (State (ShaderState s))) ())
-> ListT (State (ShaderState s)) ()
-> WriterT
([IO (Drawcall s)], s -> All) (ListT (State (ShaderState s))) ()
forall a b. (a -> b) -> a -> b
$ StateT (ShaderState s) Identity ()
-> ListT (State (ShaderState s)) ()
forall (t :: (* -> *) -> * -> *) (m :: * -> *) a.
(MonadTrans t, Monad m) =>
m a -> t m a
lift (StateT (ShaderState s) Identity ()
-> ListT (State (ShaderState s)) ())
-> StateT (ShaderState s) Identity ()
-> ListT (State (ShaderState s)) ()
forall a b. (a -> b) -> a -> b
$ ShaderState s -> StateT (ShaderState s) Identity ()
forall (m :: * -> *) s. Monad m => s -> StateT s m ()
put (ShaderState s -> StateT (ShaderState s) Identity ())
-> ShaderState s -> StateT (ShaderState s) Identity ()
forall a b. (a -> b) -> a -> b
$ Int -> RenderIOState s -> ShaderState s
forall s. Int -> RenderIOState s -> ShaderState s
ShaderState (Int
nInt -> Int -> Int
forall a. Num a => a -> a -> a
+Int
1) RenderIOState s
r
Int -> ShaderM s Int
forall (m :: * -> *) a. Monad m => a -> m a
return Int
n
askUniformAlignment :: ShaderM s UniformAlignment
askUniformAlignment :: ShaderM s Int
askUniformAlignment = ReaderT
Int
(WriterT
([IO (Drawcall s)], s -> All) (ListT (State (ShaderState s))))
Int
-> ShaderM s Int
forall s a.
ReaderT
Int
(WriterT
([IO (Drawcall s)], s -> All) (ListT (State (ShaderState s))))
a
-> ShaderM s a
ShaderM ReaderT
Int
(WriterT
([IO (Drawcall s)], s -> All) (ListT (State (ShaderState s))))
Int
forall (m :: * -> *) r. Monad m => ReaderT r m r
ask
modifyRenderIO :: (RenderIOState s -> RenderIOState s) -> ShaderM s ()
modifyRenderIO :: (RenderIOState s -> RenderIOState s) -> ShaderM s ()
modifyRenderIO RenderIOState s -> RenderIOState s
f = ReaderT
Int
(WriterT
([IO (Drawcall s)], s -> All) (ListT (State (ShaderState s))))
()
-> ShaderM s ()
forall s a.
ReaderT
Int
(WriterT
([IO (Drawcall s)], s -> All) (ListT (State (ShaderState s))))
a
-> ShaderM s a
ShaderM (ReaderT
Int
(WriterT
([IO (Drawcall s)], s -> All) (ListT (State (ShaderState s))))
()
-> ShaderM s ())
-> ReaderT
Int
(WriterT
([IO (Drawcall s)], s -> All) (ListT (State (ShaderState s))))
()
-> ShaderM s ()
forall a b. (a -> b) -> a -> b
$ WriterT
([IO (Drawcall s)], s -> All) (ListT (State (ShaderState s))) ()
-> ReaderT
Int
(WriterT
([IO (Drawcall s)], s -> All) (ListT (State (ShaderState s))))
()
forall (t :: (* -> *) -> * -> *) (m :: * -> *) a.
(MonadTrans t, Monad m) =>
m a -> t m a
lift (WriterT
([IO (Drawcall s)], s -> All) (ListT (State (ShaderState s))) ()
-> ReaderT
Int
(WriterT
([IO (Drawcall s)], s -> All) (ListT (State (ShaderState s))))
())
-> WriterT
([IO (Drawcall s)], s -> All) (ListT (State (ShaderState s))) ()
-> ReaderT
Int
(WriterT
([IO (Drawcall s)], s -> All) (ListT (State (ShaderState s))))
()
forall a b. (a -> b) -> a -> b
$ ListT (State (ShaderState s)) ()
-> WriterT
([IO (Drawcall s)], s -> All) (ListT (State (ShaderState s))) ()
forall (t :: (* -> *) -> * -> *) (m :: * -> *) a.
(MonadTrans t, Monad m) =>
m a -> t m a
lift (ListT (State (ShaderState s)) ()
-> WriterT
([IO (Drawcall s)], s -> All) (ListT (State (ShaderState s))) ())
-> ListT (State (ShaderState s)) ()
-> WriterT
([IO (Drawcall s)], s -> All) (ListT (State (ShaderState s))) ()
forall a b. (a -> b) -> a -> b
$ StateT (ShaderState s) Identity ()
-> ListT (State (ShaderState s)) ()
forall (t :: (* -> *) -> * -> *) (m :: * -> *) a.
(MonadTrans t, Monad m) =>
m a -> t m a
lift (StateT (ShaderState s) Identity ()
-> ListT (State (ShaderState s)) ())
-> StateT (ShaderState s) Identity ()
-> ListT (State (ShaderState s)) ()
forall a b. (a -> b) -> a -> b
$ (ShaderState s -> ShaderState s)
-> StateT (ShaderState s) Identity ()
forall (m :: * -> *) s. Monad m => (s -> s) -> StateT s m ()
modify (\(ShaderState Int
a RenderIOState s
s) -> Int -> RenderIOState s -> ShaderState s
forall s. Int -> RenderIOState s -> ShaderState s
ShaderState Int
a (RenderIOState s -> RenderIOState s
f RenderIOState s
s))
tellDrawcall :: IO (Drawcall s) -> ShaderM s ()
tellDrawcall :: IO (Drawcall s) -> ShaderM s ()
tellDrawcall IO (Drawcall s)
drawcall = ReaderT
Int
(WriterT
([IO (Drawcall s)], s -> All) (ListT (State (ShaderState s))))
()
-> ShaderM s ()
forall s a.
ReaderT
Int
(WriterT
([IO (Drawcall s)], s -> All) (ListT (State (ShaderState s))))
a
-> ShaderM s a
ShaderM (ReaderT
Int
(WriterT
([IO (Drawcall s)], s -> All) (ListT (State (ShaderState s))))
()
-> ShaderM s ())
-> ReaderT
Int
(WriterT
([IO (Drawcall s)], s -> All) (ListT (State (ShaderState s))))
()
-> ShaderM s ()
forall a b. (a -> b) -> a -> b
$ WriterT
([IO (Drawcall s)], s -> All) (ListT (State (ShaderState s))) ()
-> ReaderT
Int
(WriterT
([IO (Drawcall s)], s -> All) (ListT (State (ShaderState s))))
()
forall (t :: (* -> *) -> * -> *) (m :: * -> *) a.
(MonadTrans t, Monad m) =>
m a -> t m a
lift (WriterT
([IO (Drawcall s)], s -> All) (ListT (State (ShaderState s))) ()
-> ReaderT
Int
(WriterT
([IO (Drawcall s)], s -> All) (ListT (State (ShaderState s))))
())
-> WriterT
([IO (Drawcall s)], s -> All) (ListT (State (ShaderState s))) ()
-> ReaderT
Int
(WriterT
([IO (Drawcall s)], s -> All) (ListT (State (ShaderState s))))
()
forall a b. (a -> b) -> a -> b
$ ([IO (Drawcall s)], s -> All)
-> WriterT
([IO (Drawcall s)], s -> All) (ListT (State (ShaderState s))) ()
forall (m :: * -> *) w. Monad m => w -> WriterT w m ()
tell ([IO (Drawcall s)
drawcall], s -> All
forall a. Monoid a => a
mempty)
newtype Shader os s a = Shader (ShaderM s a)
deriving (Monad (Shader os s)
Alternative (Shader os s)
Shader os s a
Alternative (Shader os s)
-> Monad (Shader os s)
-> (forall a. Shader os s a)
-> (forall a. Shader os s a -> Shader os s a -> Shader os s a)
-> MonadPlus (Shader os s)
Shader os s a -> Shader os s a -> Shader os s a
forall a. Shader os s a
forall a. Shader os s a -> Shader os s a -> Shader os s a
forall os s. Monad (Shader os s)
forall os s. Alternative (Shader os s)
forall os s a. Shader os s a
forall os s a. Shader os s a -> Shader os s a -> Shader os s a
forall (m :: * -> *).
Alternative m
-> Monad m
-> (forall a. m a)
-> (forall a. m a -> m a -> m a)
-> MonadPlus m
mplus :: Shader os s a -> Shader os s a -> Shader os s a
$cmplus :: forall os s a. Shader os s a -> Shader os s a -> Shader os s a
mzero :: Shader os s a
$cmzero :: forall os s a. Shader os s a
$cp2MonadPlus :: forall os s. Monad (Shader os s)
$cp1MonadPlus :: forall os s. Alternative (Shader os s)
MonadPlus, Applicative (Shader os s)
a -> Shader os s a
Applicative (Shader os s)
-> (forall a b.
Shader os s a -> (a -> Shader os s b) -> Shader os s b)
-> (forall a b. Shader os s a -> Shader os s b -> Shader os s b)
-> (forall a. a -> Shader os s a)
-> Monad (Shader os s)
Shader os s a -> (a -> Shader os s b) -> Shader os s b
Shader os s a -> Shader os s b -> Shader os s b
forall a. a -> Shader os s a
forall os s. Applicative (Shader os s)
forall a b. Shader os s a -> Shader os s b -> Shader os s b
forall a b. Shader os s a -> (a -> Shader os s b) -> Shader os s b
forall os s a. a -> Shader os s a
forall os s a b. Shader os s a -> Shader os s b -> Shader os s b
forall os s a b.
Shader os s a -> (a -> Shader os s b) -> Shader os s b
forall (m :: * -> *).
Applicative m
-> (forall a b. m a -> (a -> m b) -> m b)
-> (forall a b. m a -> m b -> m b)
-> (forall a. a -> m a)
-> Monad m
return :: a -> Shader os s a
$creturn :: forall os s a. a -> Shader os s a
>> :: Shader os s a -> Shader os s b -> Shader os s b
$c>> :: forall os s a b. Shader os s a -> Shader os s b -> Shader os s b
>>= :: Shader os s a -> (a -> Shader os s b) -> Shader os s b
$c>>= :: forall os s a b.
Shader os s a -> (a -> Shader os s b) -> Shader os s b
$cp1Monad :: forall os s. Applicative (Shader os s)
Monad, Applicative (Shader os s)
Shader os s a
Applicative (Shader os s)
-> (forall a. Shader os s a)
-> (forall a. Shader os s a -> Shader os s a -> Shader os s a)
-> (forall a. Shader os s a -> Shader os s [a])
-> (forall a. Shader os s a -> Shader os s [a])
-> Alternative (Shader os s)
Shader os s a -> Shader os s a -> Shader os s a
Shader os s a -> Shader os s [a]
Shader os s a -> Shader os s [a]
forall a. Shader os s a
forall a. Shader os s a -> Shader os s [a]
forall a. Shader os s a -> Shader os s a -> Shader os s a
forall os s. Applicative (Shader os s)
forall os s a. Shader os s a
forall os s a. Shader os s a -> Shader os s [a]
forall os s a. Shader os s a -> Shader os s a -> Shader os s a
forall (f :: * -> *).
Applicative f
-> (forall a. f a)
-> (forall a. f a -> f a -> f a)
-> (forall a. f a -> f [a])
-> (forall a. f a -> f [a])
-> Alternative f
many :: Shader os s a -> Shader os s [a]
$cmany :: forall os s a. Shader os s a -> Shader os s [a]
some :: Shader os s a -> Shader os s [a]
$csome :: forall os s a. Shader os s a -> Shader os s [a]
<|> :: Shader os s a -> Shader os s a -> Shader os s a
$c<|> :: forall os s a. Shader os s a -> Shader os s a -> Shader os s a
empty :: Shader os s a
$cempty :: forall os s a. Shader os s a
$cp1Alternative :: forall os s. Applicative (Shader os s)
Alternative, Functor (Shader os s)
a -> Shader os s a
Functor (Shader os s)
-> (forall a. a -> Shader os s a)
-> (forall a b.
Shader os s (a -> b) -> Shader os s a -> Shader os s b)
-> (forall a b c.
(a -> b -> c) -> Shader os s a -> Shader os s b -> Shader os s c)
-> (forall a b. Shader os s a -> Shader os s b -> Shader os s b)
-> (forall a b. Shader os s a -> Shader os s b -> Shader os s a)
-> Applicative (Shader os s)
Shader os s a -> Shader os s b -> Shader os s b
Shader os s a -> Shader os s b -> Shader os s a
Shader os s (a -> b) -> Shader os s a -> Shader os s b
(a -> b -> c) -> Shader os s a -> Shader os s b -> Shader os s c
forall a. a -> Shader os s a
forall os s. Functor (Shader os s)
forall a b. Shader os s a -> Shader os s b -> Shader os s a
forall a b. Shader os s a -> Shader os s b -> Shader os s b
forall a b. Shader os s (a -> b) -> Shader os s a -> Shader os s b
forall os s a. a -> Shader os s a
forall a b c.
(a -> b -> c) -> Shader os s a -> Shader os s b -> Shader os s c
forall os s a b. Shader os s a -> Shader os s b -> Shader os s a
forall os s a b. Shader os s a -> Shader os s b -> Shader os s b
forall os s a b.
Shader os s (a -> b) -> Shader os s a -> Shader os s b
forall os s a b c.
(a -> b -> c) -> Shader os s a -> Shader os s b -> Shader os s c
forall (f :: * -> *).
Functor f
-> (forall a. a -> f a)
-> (forall a b. f (a -> b) -> f a -> f b)
-> (forall a b c. (a -> b -> c) -> f a -> f b -> f c)
-> (forall a b. f a -> f b -> f b)
-> (forall a b. f a -> f b -> f a)
-> Applicative f
<* :: Shader os s a -> Shader os s b -> Shader os s a
$c<* :: forall os s a b. Shader os s a -> Shader os s b -> Shader os s a
*> :: Shader os s a -> Shader os s b -> Shader os s b
$c*> :: forall os s a b. Shader os s a -> Shader os s b -> Shader os s b
liftA2 :: (a -> b -> c) -> Shader os s a -> Shader os s b -> Shader os s c
$cliftA2 :: forall os s a b c.
(a -> b -> c) -> Shader os s a -> Shader os s b -> Shader os s c
<*> :: Shader os s (a -> b) -> Shader os s a -> Shader os s b
$c<*> :: forall os s a b.
Shader os s (a -> b) -> Shader os s a -> Shader os s b
pure :: a -> Shader os s a
$cpure :: forall os s a. a -> Shader os s a
$cp1Applicative :: forall os s. Functor (Shader os s)
Applicative, a -> Shader os s b -> Shader os s a
(a -> b) -> Shader os s a -> Shader os s b
(forall a b. (a -> b) -> Shader os s a -> Shader os s b)
-> (forall a b. a -> Shader os s b -> Shader os s a)
-> Functor (Shader os s)
forall a b. a -> Shader os s b -> Shader os s a
forall a b. (a -> b) -> Shader os s a -> Shader os s b
forall os s a b. a -> Shader os s b -> Shader os s a
forall os s a b. (a -> b) -> Shader os s a -> Shader os s b
forall (f :: * -> *).
(forall a b. (a -> b) -> f a -> f b)
-> (forall a b. a -> f b -> f a) -> Functor f
<$ :: a -> Shader os s b -> Shader os s a
$c<$ :: forall os s a b. a -> Shader os s b -> Shader os s a
fmap :: (a -> b) -> Shader os s a -> Shader os s b
$cfmap :: forall os s a b. (a -> b) -> Shader os s a -> Shader os s b
Functor)
mapShader :: (s -> s') -> Shader os s' a -> Shader os s a
mapShader :: (s -> s') -> Shader os s' a -> Shader os s a
mapShader s -> s'
f (Shader (ShaderM ReaderT
Int
(WriterT
([IO (Drawcall s')], s' -> All) (ListT (State (ShaderState s'))))
a
m)) = ShaderM s a -> Shader os s a
forall os s a. ShaderM s a -> Shader os s a
Shader (ShaderM s a -> Shader os s a) -> ShaderM s a -> Shader os s a
forall a b. (a -> b) -> a -> b
$ ReaderT
Int
(WriterT
([IO (Drawcall s)], s -> All) (ListT (State (ShaderState s))))
a
-> ShaderM s a
forall s a.
ReaderT
Int
(WriterT
([IO (Drawcall s)], s -> All) (ListT (State (ShaderState s))))
a
-> ShaderM s a
ShaderM (ReaderT
Int
(WriterT
([IO (Drawcall s)], s -> All) (ListT (State (ShaderState s))))
a
-> ShaderM s a)
-> ReaderT
Int
(WriterT
([IO (Drawcall s)], s -> All) (ListT (State (ShaderState s))))
a
-> ShaderM s a
forall a b. (a -> b) -> a -> b
$ do
Int
uniAl <- ReaderT
Int
(WriterT
([IO (Drawcall s)], s -> All) (ListT (State (ShaderState s))))
Int
forall (m :: * -> *) r. Monad m => ReaderT r m r
ask
WriterT
([IO (Drawcall s)], s -> All) (ListT (State (ShaderState s))) a
-> ReaderT
Int
(WriterT
([IO (Drawcall s)], s -> All) (ListT (State (ShaderState s))))
a
forall (t :: (* -> *) -> * -> *) (m :: * -> *) a.
(MonadTrans t, Monad m) =>
m a -> t m a
lift (WriterT
([IO (Drawcall s)], s -> All) (ListT (State (ShaderState s))) a
-> ReaderT
Int
(WriterT
([IO (Drawcall s)], s -> All) (ListT (State (ShaderState s))))
a)
-> WriterT
([IO (Drawcall s)], s -> All) (ListT (State (ShaderState s))) a
-> ReaderT
Int
(WriterT
([IO (Drawcall s)], s -> All) (ListT (State (ShaderState s))))
a
forall a b. (a -> b) -> a -> b
$ ListT (State (ShaderState s)) (a, ([IO (Drawcall s)], s -> All))
-> WriterT
([IO (Drawcall s)], s -> All) (ListT (State (ShaderState s))) a
forall w (m :: * -> *) a. m (a, w) -> WriterT w m a
WriterT (ListT (State (ShaderState s)) (a, ([IO (Drawcall s)], s -> All))
-> WriterT
([IO (Drawcall s)], s -> All) (ListT (State (ShaderState s))) a)
-> ListT (State (ShaderState s)) (a, ([IO (Drawcall s)], s -> All))
-> WriterT
([IO (Drawcall s)], s -> All) (ListT (State (ShaderState s))) a
forall a b. (a -> b) -> a -> b
$ StateT
(ShaderState s) Identity [(a, ([IO (Drawcall s)], s -> All))]
-> ListT (State (ShaderState s)) (a, ([IO (Drawcall s)], s -> All))
forall (m :: * -> *) a. m [a] -> ListT m a
ListT (StateT
(ShaderState s) Identity [(a, ([IO (Drawcall s)], s -> All))]
-> ListT
(State (ShaderState s)) (a, ([IO (Drawcall s)], s -> All)))
-> StateT
(ShaderState s) Identity [(a, ([IO (Drawcall s)], s -> All))]
-> ListT (State (ShaderState s)) (a, ([IO (Drawcall s)], s -> All))
forall a b. (a -> b) -> a -> b
$ do
ShaderState Int
x RenderIOState s
s <- StateT (ShaderState s) Identity (ShaderState s)
forall (m :: * -> *) s. Monad m => StateT s m s
get
let ([(a, ([IO (Drawcall s')], s' -> All))]
conditionalDrawcalls, ShaderState Int
x' RenderIOState s'
s') = State (ShaderState s') [(a, ([IO (Drawcall s')], s' -> All))]
-> ShaderState s'
-> ([(a, ([IO (Drawcall s')], s' -> All))], ShaderState s')
forall s a. State s a -> s -> (a, s)
runState (ListT (State (ShaderState s')) (a, ([IO (Drawcall s')], s' -> All))
-> State (ShaderState s') [(a, ([IO (Drawcall s')], s' -> All))]
forall (m :: * -> *) a. ListT m a -> m [a]
runListT (WriterT
([IO (Drawcall s')], s' -> All) (ListT (State (ShaderState s'))) a
-> ListT
(State (ShaderState s')) (a, ([IO (Drawcall s')], s' -> All))
forall w (m :: * -> *) a. WriterT w m a -> m (a, w)
runWriterT (ReaderT
Int
(WriterT
([IO (Drawcall s')], s' -> All) (ListT (State (ShaderState s'))))
a
-> Int
-> WriterT
([IO (Drawcall s')], s' -> All) (ListT (State (ShaderState s'))) a
forall r (m :: * -> *) a. ReaderT r m a -> r -> m a
runReaderT ReaderT
Int
(WriterT
([IO (Drawcall s')], s' -> All) (ListT (State (ShaderState s'))))
a
m Int
uniAl))) (Int -> RenderIOState s' -> ShaderState s'
forall s. Int -> RenderIOState s -> ShaderState s
ShaderState Int
x RenderIOState s'
forall s. RenderIOState s
newRenderIOState)
ShaderState s -> StateT (ShaderState s) Identity ()
forall (m :: * -> *) s. Monad m => s -> StateT s m ()
put (ShaderState s -> StateT (ShaderState s) Identity ())
-> ShaderState s -> StateT (ShaderState s) Identity ()
forall a b. (a -> b) -> a -> b
$ Int -> RenderIOState s -> ShaderState s
forall s. Int -> RenderIOState s -> ShaderState s
ShaderState Int
x' ((s -> s') -> RenderIOState s' -> RenderIOState s -> RenderIOState s
forall s s'.
(s -> s') -> RenderIOState s' -> RenderIOState s -> RenderIOState s
mapRenderIOState s -> s'
f RenderIOState s'
s' RenderIOState s
s)
[(a, ([IO (Drawcall s)], s -> All))]
-> StateT
(ShaderState s) Identity [(a, ([IO (Drawcall s)], s -> All))]
forall (m :: * -> *) a. Monad m => a -> m a
return ([(a, ([IO (Drawcall s)], s -> All))]
-> StateT
(ShaderState s) Identity [(a, ([IO (Drawcall s)], s -> All))])
-> [(a, ([IO (Drawcall s)], s -> All))]
-> StateT
(ShaderState s) Identity [(a, ([IO (Drawcall s)], s -> All))]
forall a b. (a -> b) -> a -> b
$ ((a, ([IO (Drawcall s')], s' -> All))
-> (a, ([IO (Drawcall s)], s -> All)))
-> [(a, ([IO (Drawcall s')], s' -> All))]
-> [(a, ([IO (Drawcall s)], s -> All))]
forall a b. (a -> b) -> [a] -> [b]
map (\(a
a, ([IO (Drawcall s')]
drawcalls, s' -> All
test)) -> (a
a, ((IO (Drawcall s') -> IO (Drawcall s))
-> [IO (Drawcall s')] -> [IO (Drawcall s)]
forall a b. (a -> b) -> [a] -> [b]
map (IO (Drawcall s')
-> (Drawcall s' -> IO (Drawcall s)) -> IO (Drawcall s)
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= (Drawcall s -> IO (Drawcall s)
forall (m :: * -> *) a. Monad m => a -> m a
return (Drawcall s -> IO (Drawcall s))
-> (Drawcall s' -> Drawcall s) -> Drawcall s' -> IO (Drawcall s)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (s -> s') -> Drawcall s' -> Drawcall s
forall s s'. (s -> s') -> Drawcall s' -> Drawcall s
mapDrawcall s -> s'
f)) [IO (Drawcall s')]
drawcalls, s' -> All
test (s' -> All) -> (s -> s') -> s -> All
forall b c a. (b -> c) -> (a -> b) -> a -> c
. s -> s'
f))) [(a, ([IO (Drawcall s')], s' -> All))]
conditionalDrawcalls
maybeShader :: (s -> Maybe s') -> Shader os s' () -> Shader os s ()
maybeShader :: (s -> Maybe s') -> Shader os s' () -> Shader os s ()
maybeShader s -> Maybe s'
f Shader os s' ()
m = ((s -> Bool) -> Shader os s ()
forall s os. (s -> Bool) -> Shader os s ()
guard' (Maybe s' -> Bool
forall a. Maybe a -> Bool
isJust (Maybe s' -> Bool) -> (s -> Maybe s') -> s -> Bool
forall b c a. (b -> c) -> (a -> b) -> a -> c
. s -> Maybe s'
f) Shader os s () -> Shader os s () -> Shader os s ()
forall (m :: * -> *) a b. Monad m => m a -> m b -> m b
>> (s -> s') -> Shader os s' () -> Shader os s ()
forall s s' os a. (s -> s') -> Shader os s' a -> Shader os s a
mapShader (Maybe s' -> s'
forall a. HasCallStack => Maybe a -> a
fromJust (Maybe s' -> s') -> (s -> Maybe s') -> s -> s'
forall b c a. (b -> c) -> (a -> b) -> a -> c
. s -> Maybe s'
f) Shader os s' ()
m) Shader os s () -> Shader os s () -> Shader os s ()
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> (s -> Bool) -> Shader os s ()
forall s os. (s -> Bool) -> Shader os s ()
guard' (Maybe s' -> Bool
forall a. Maybe a -> Bool
isNothing (Maybe s' -> Bool) -> (s -> Maybe s') -> s -> Bool
forall b c a. (b -> c) -> (a -> b) -> a -> c
. s -> Maybe s'
f)
chooseShader :: (s -> Either s' s'') -> Shader os s' a -> Shader os s'' a -> Shader os s a
chooseShader :: (s -> Either s' s'')
-> Shader os s' a -> Shader os s'' a -> Shader os s a
chooseShader s -> Either s' s''
f Shader os s' a
a Shader os s'' a
b = ((s -> Bool) -> Shader os s ()
forall s os. (s -> Bool) -> Shader os s ()
guard' (Either s' s'' -> Bool
forall a b. Either a b -> Bool
isLeft (Either s' s'' -> Bool) -> (s -> Either s' s'') -> s -> Bool
forall b c a. (b -> c) -> (a -> b) -> a -> c
. s -> Either s' s''
f) Shader os s () -> Shader os s a -> Shader os s a
forall (m :: * -> *) a b. Monad m => m a -> m b -> m b
>> (s -> s') -> Shader os s' a -> Shader os s a
forall s s' os a. (s -> s') -> Shader os s' a -> Shader os s a
mapShader (Either s' s'' -> s'
forall a b. Either a b -> a
fromLeft (Either s' s'' -> s') -> (s -> Either s' s'') -> s -> s'
forall b c a. (b -> c) -> (a -> b) -> a -> c
. s -> Either s' s''
f) Shader os s' a
a) Shader os s a -> Shader os s a -> Shader os s a
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> ((s -> Bool) -> Shader os s ()
forall s os. (s -> Bool) -> Shader os s ()
guard' (Either s' s'' -> Bool
forall a b. Either a b -> Bool
isRight (Either s' s'' -> Bool) -> (s -> Either s' s'') -> s -> Bool
forall b c a. (b -> c) -> (a -> b) -> a -> c
. s -> Either s' s''
f) Shader os s () -> Shader os s a -> Shader os s a
forall (m :: * -> *) a b. Monad m => m a -> m b -> m b
>> (s -> s'') -> Shader os s'' a -> Shader os s a
forall s s' os a. (s -> s') -> Shader os s' a -> Shader os s a
mapShader (Either s' s'' -> s''
forall a b. Either a b -> b
fromRight (Either s' s'' -> s'') -> (s -> Either s' s'') -> s -> s''
forall b c a. (b -> c) -> (a -> b) -> a -> c
. s -> Either s' s''
f) Shader os s'' a
b) where
fromLeft :: Either a b -> a
fromLeft (Left a
x) = a
x
fromRight :: Either a b -> b
fromRight (Right b
x) = b
x
silenceShader :: Shader os s a -> Shader os s a
silenceShader :: Shader os s a -> Shader os s a
silenceShader (Shader (ShaderM ReaderT
Int
(WriterT
([IO (Drawcall s)], s -> All) (ListT (State (ShaderState s))))
a
m)) = ShaderM s a -> Shader os s a
forall os s a. ShaderM s a -> Shader os s a
Shader (ShaderM s a -> Shader os s a) -> ShaderM s a -> Shader os s a
forall a b. (a -> b) -> a -> b
$ ReaderT
Int
(WriterT
([IO (Drawcall s)], s -> All) (ListT (State (ShaderState s))))
a
-> ShaderM s a
forall s a.
ReaderT
Int
(WriterT
([IO (Drawcall s)], s -> All) (ListT (State (ShaderState s))))
a
-> ShaderM s a
ShaderM (ReaderT
Int
(WriterT
([IO (Drawcall s)], s -> All) (ListT (State (ShaderState s))))
a
-> ShaderM s a)
-> ReaderT
Int
(WriterT
([IO (Drawcall s)], s -> All) (ListT (State (ShaderState s))))
a
-> ShaderM s a
forall a b. (a -> b) -> a -> b
$ do
Int
uniAl <- ReaderT
Int
(WriterT
([IO (Drawcall s)], s -> All) (ListT (State (ShaderState s))))
Int
forall (m :: * -> *) r. Monad m => ReaderT r m r
ask
WriterT
([IO (Drawcall s)], s -> All) (ListT (State (ShaderState s))) a
-> ReaderT
Int
(WriterT
([IO (Drawcall s)], s -> All) (ListT (State (ShaderState s))))
a
forall (t :: (* -> *) -> * -> *) (m :: * -> *) a.
(MonadTrans t, Monad m) =>
m a -> t m a
lift (WriterT
([IO (Drawcall s)], s -> All) (ListT (State (ShaderState s))) a
-> ReaderT
Int
(WriterT
([IO (Drawcall s)], s -> All) (ListT (State (ShaderState s))))
a)
-> WriterT
([IO (Drawcall s)], s -> All) (ListT (State (ShaderState s))) a
-> ReaderT
Int
(WriterT
([IO (Drawcall s)], s -> All) (ListT (State (ShaderState s))))
a
forall a b. (a -> b) -> a -> b
$ ListT (State (ShaderState s)) (a, ([IO (Drawcall s)], s -> All))
-> WriterT
([IO (Drawcall s)], s -> All) (ListT (State (ShaderState s))) a
forall w (m :: * -> *) a. m (a, w) -> WriterT w m a
WriterT (ListT (State (ShaderState s)) (a, ([IO (Drawcall s)], s -> All))
-> WriterT
([IO (Drawcall s)], s -> All) (ListT (State (ShaderState s))) a)
-> ListT (State (ShaderState s)) (a, ([IO (Drawcall s)], s -> All))
-> WriterT
([IO (Drawcall s)], s -> All) (ListT (State (ShaderState s))) a
forall a b. (a -> b) -> a -> b
$ StateT
(ShaderState s) Identity [(a, ([IO (Drawcall s)], s -> All))]
-> ListT (State (ShaderState s)) (a, ([IO (Drawcall s)], s -> All))
forall (m :: * -> *) a. m [a] -> ListT m a
ListT (StateT
(ShaderState s) Identity [(a, ([IO (Drawcall s)], s -> All))]
-> ListT
(State (ShaderState s)) (a, ([IO (Drawcall s)], s -> All)))
-> StateT
(ShaderState s) Identity [(a, ([IO (Drawcall s)], s -> All))]
-> ListT (State (ShaderState s)) (a, ([IO (Drawcall s)], s -> All))
forall a b. (a -> b) -> a -> b
$ do
ShaderState s
s <- StateT (ShaderState s) Identity (ShaderState s)
forall (m :: * -> *) s. Monad m => StateT s m s
get
let ([(a, ([IO (Drawcall s)], s -> All))]
conditionalDrawcalls, ShaderState s
s') = StateT
(ShaderState s) Identity [(a, ([IO (Drawcall s)], s -> All))]
-> ShaderState s
-> ([(a, ([IO (Drawcall s)], s -> All))], ShaderState s)
forall s a. State s a -> s -> (a, s)
runState (ListT (State (ShaderState s)) (a, ([IO (Drawcall s)], s -> All))
-> StateT
(ShaderState s) Identity [(a, ([IO (Drawcall s)], s -> All))]
forall (m :: * -> *) a. ListT m a -> m [a]
runListT (WriterT
([IO (Drawcall s)], s -> All) (ListT (State (ShaderState s))) a
-> ListT (State (ShaderState s)) (a, ([IO (Drawcall s)], s -> All))
forall w (m :: * -> *) a. WriterT w m a -> m (a, w)
runWriterT (ReaderT
Int
(WriterT
([IO (Drawcall s)], s -> All) (ListT (State (ShaderState s))))
a
-> Int
-> WriterT
([IO (Drawcall s)], s -> All) (ListT (State (ShaderState s))) a
forall r (m :: * -> *) a. ReaderT r m a -> r -> m a
runReaderT ReaderT
Int
(WriterT
([IO (Drawcall s)], s -> All) (ListT (State (ShaderState s))))
a
m Int
uniAl))) ShaderState s
s
ShaderState s -> StateT (ShaderState s) Identity ()
forall (m :: * -> *) s. Monad m => s -> StateT s m ()
put ShaderState s
s'
[(a, ([IO (Drawcall s)], s -> All))]
-> StateT
(ShaderState s) Identity [(a, ([IO (Drawcall s)], s -> All))]
forall (m :: * -> *) a. Monad m => a -> m a
return ([(a, ([IO (Drawcall s)], s -> All))]
-> StateT
(ShaderState s) Identity [(a, ([IO (Drawcall s)], s -> All))])
-> [(a, ([IO (Drawcall s)], s -> All))]
-> StateT
(ShaderState s) Identity [(a, ([IO (Drawcall s)], s -> All))]
forall a b. (a -> b) -> a -> b
$ ((a, ([IO (Drawcall s)], s -> All))
-> (a, ([IO (Drawcall s)], s -> All)))
-> [(a, ([IO (Drawcall s)], s -> All))]
-> [(a, ([IO (Drawcall s)], s -> All))]
forall a b. (a -> b) -> [a] -> [b]
map (\ (a
a, ([IO (Drawcall s)]
_, s -> All
test)) -> (a
a, ([], s -> All
test))) [(a, ([IO (Drawcall s)], s -> All))]
conditionalDrawcalls
guard' :: (s -> Bool) -> Shader os s ()
guard' :: (s -> Bool) -> Shader os s ()
guard' s -> Bool
f = ShaderM s () -> Shader os s ()
forall os s a. ShaderM s a -> Shader os s a
Shader (ShaderM s () -> Shader os s ()) -> ShaderM s () -> Shader os s ()
forall a b. (a -> b) -> a -> b
$ ReaderT
Int
(WriterT
([IO (Drawcall s)], s -> All) (ListT (State (ShaderState s))))
()
-> ShaderM s ()
forall s a.
ReaderT
Int
(WriterT
([IO (Drawcall s)], s -> All) (ListT (State (ShaderState s))))
a
-> ShaderM s a
ShaderM (ReaderT
Int
(WriterT
([IO (Drawcall s)], s -> All) (ListT (State (ShaderState s))))
()
-> ShaderM s ())
-> ReaderT
Int
(WriterT
([IO (Drawcall s)], s -> All) (ListT (State (ShaderState s))))
()
-> ShaderM s ()
forall a b. (a -> b) -> a -> b
$ WriterT
([IO (Drawcall s)], s -> All) (ListT (State (ShaderState s))) ()
-> ReaderT
Int
(WriterT
([IO (Drawcall s)], s -> All) (ListT (State (ShaderState s))))
()
forall (t :: (* -> *) -> * -> *) (m :: * -> *) a.
(MonadTrans t, Monad m) =>
m a -> t m a
lift (WriterT
([IO (Drawcall s)], s -> All) (ListT (State (ShaderState s))) ()
-> ReaderT
Int
(WriterT
([IO (Drawcall s)], s -> All) (ListT (State (ShaderState s))))
())
-> WriterT
([IO (Drawcall s)], s -> All) (ListT (State (ShaderState s))) ()
-> ReaderT
Int
(WriterT
([IO (Drawcall s)], s -> All) (ListT (State (ShaderState s))))
()
forall a b. (a -> b) -> a -> b
$ ([IO (Drawcall s)], s -> All)
-> WriterT
([IO (Drawcall s)], s -> All) (ListT (State (ShaderState s))) ()
forall (m :: * -> *) w. Monad m => w -> WriterT w m ()
tell ([IO (Drawcall s)]
forall a. Monoid a => a
mempty, Bool -> All
All (Bool -> All) -> (s -> Bool) -> s -> All
forall b c a. (b -> c) -> (a -> b) -> a -> c
. s -> Bool
f)
type CompiledShader os s = s -> Render os ()
compileShader :: (ContextHandler ctx, MonadIO m, MonadException m) => Shader os s () -> ContextT ctx os m (CompiledShader os s)
compileShader :: Shader os s () -> ContextT ctx os m (CompiledShader os s)
compileShader (Shader (ShaderM ReaderT
Int
(WriterT
([IO (Drawcall s)], s -> All) (ListT (State (ShaderState s))))
()
m)) = do
Int
uniformAlignment <- IO Int -> ContextT ctx os m Int
forall ctx (m :: * -> *) a os.
(ContextHandler ctx, MonadIO m) =>
IO a -> ContextT ctx os m a
liftNonWinContextIO IO Int
getUniformAlignment
let ([([IO (Drawcall s)], s -> All)]
conditionalDrawcalls, ShaderState Int
_ RenderIOState s
state) = State (ShaderState s) [([IO (Drawcall s)], s -> All)]
-> ShaderState s
-> ([([IO (Drawcall s)], s -> All)], ShaderState s)
forall s a. State s a -> s -> (a, s)
runState (ListT (State (ShaderState s)) ([IO (Drawcall s)], s -> All)
-> State (ShaderState s) [([IO (Drawcall s)], s -> All)]
forall (m :: * -> *) a. ListT m a -> m [a]
runListT (WriterT
([IO (Drawcall s)], s -> All) (ListT (State (ShaderState s))) ()
-> ListT (State (ShaderState s)) ([IO (Drawcall s)], s -> All)
forall (m :: * -> *) w a. Monad m => WriterT w m a -> m w
execWriterT (ReaderT
Int
(WriterT
([IO (Drawcall s)], s -> All) (ListT (State (ShaderState s))))
()
-> Int
-> WriterT
([IO (Drawcall s)], s -> All) (ListT (State (ShaderState s))) ()
forall r (m :: * -> *) a. ReaderT r m a -> r -> m a
runReaderT ReaderT
Int
(WriterT
([IO (Drawcall s)], s -> All) (ListT (State (ShaderState s))))
()
m Int
uniformAlignment))) ShaderState s
forall s. ShaderState s
newShaderState
[(CompiledShader os s, s -> All)]
conditionalRenderers <- [([IO (Drawcall s)], s -> All)]
-> (([IO (Drawcall s)], s -> All)
-> ContextT ctx os m (CompiledShader os s, s -> All))
-> ContextT ctx os m [(CompiledShader os s, s -> All)]
forall (t :: * -> *) (m :: * -> *) a b.
(Traversable t, Monad m) =>
t a -> (a -> m b) -> m (t b)
forM [([IO (Drawcall s)], s -> All)]
conditionalDrawcalls ((([IO (Drawcall s)], s -> All)
-> ContextT ctx os m (CompiledShader os s, s -> All))
-> ContextT ctx os m [(CompiledShader os s, s -> All)])
-> (([IO (Drawcall s)], s -> All)
-> ContextT ctx os m (CompiledShader os s, s -> All))
-> ContextT ctx os m [(CompiledShader os s, s -> All)]
forall a b. (a -> b) -> a -> b
$ \ ([IO (Drawcall s)]
drawcalls, s -> All
test) -> do
CompiledShader os s
renderer <- [IO (Drawcall s)]
-> RenderIOState s -> ContextT ctx os m (CompiledShader os s)
forall (m :: * -> *) ctx s os.
(Monad m, MonadIO m, MonadException m, ContextHandler ctx) =>
[IO (Drawcall s)]
-> RenderIOState s -> ContextT ctx os m (s -> Render os ())
compileDrawcalls [IO (Drawcall s)]
drawcalls RenderIOState s
state
(CompiledShader os s, s -> All)
-> ContextT ctx os m (CompiledShader os s, s -> All)
forall (m :: * -> *) a. Monad m => a -> m a
return (CompiledShader os s
renderer, s -> All
test)
CompiledShader os s -> ContextT ctx os m (CompiledShader os s)
forall (m :: * -> *) a. Monad m => a -> m a
return (CompiledShader os s -> ContextT ctx os m (CompiledShader os s))
-> CompiledShader os s -> ContextT ctx os m (CompiledShader os s)
forall a b. (a -> b) -> a -> b
$ \ s
environment -> case ((CompiledShader os s, s -> All) -> Bool)
-> [(CompiledShader os s, s -> All)]
-> Maybe (CompiledShader os s, s -> All)
forall (t :: * -> *) a. Foldable t => (a -> Bool) -> t a -> Maybe a
find (\ (CompiledShader os s
_, s -> All
test) -> All -> Bool
getAll (s -> All
test s
environment)) [(CompiledShader os s, s -> All)]
conditionalRenderers of
Maybe (CompiledShader os s, s -> All)
Nothing -> [Char] -> Render os ()
forall a. HasCallStack => [Char] -> a
error [Char]
"render: Shader evaluated to mzero (no Shader selected)"
Just (CompiledShader os s
renderer, s -> All
_) -> CompiledShader os s
renderer s
environment