{-# LANGUAGE TypeOperators, DataKinds, GeneralizedNewtypeDeriving, DeriveDataTypeable, RankNTypes, FlexibleContexts #-} module FWGL.Shader.Stages ( VertexShader, FragmentShader, putVertex, putFragment ) where import Data.Typeable import FWGL.Shader.Language import FWGL.Shader.Monad type VertexShader g i o = Shader g i (VertexShaderOutput ': o) () type FragmentShader g i = Shader g i (FragmentShaderOutput ': '[]) () newtype VertexShaderOutput = VSO V4 deriving (Typeable, ShaderType) newtype FragmentShaderOutput = FSO V4 deriving (Typeable, ShaderType) putVertex :: Member VertexShaderOutput o => V4 -> Shader g i o () -- putVertex :: V4 -> Shader '[] '[] (VertexShaderOutput ': '[]) () putVertex = put . VSO putFragment :: Member FragmentShaderOutput o => V4 -> Shader g i o () -- putFragment :: V4 -> Shader '[] '[] (FragmentShaderOutput ': '[]) () putFragment = put . FSO