shady-gen-0.5.1: src/Shady/CompileEs.hs
{-# LANGUAGE TypeOperators, ScopedTypeVariables, TypeFamilies
, FlexibleContexts, ExistentialQuantification, GADTs
#-}
{-# OPTIONS_GHC -Wall #-}
----------------------------------------------------------------------
-- |
-- Module : Shady.CompileEs
-- Copyright : (c) Conal Elliott 2009
-- License : AGPLv3
--
-- Maintainer : conal@conal.net
-- Stability : experimental
--
-- Generate and compile vertex and fragment shaders. Unlike
-- "Shady.CompileE", this version allows a looser structure to
-- the inputs & outputs of shaders, according to 'FromE'. You can use
-- the types and 'compile' in this module, or just 'shaders', along with
-- "Shady.CompileE", e.g., @compile (shaders sh)@.
----------------------------------------------------------------------
module Shady.CompileEs
( shaders
, Pos, (:->)(..), ShaderVF
, GLSL
, shaderProgram
-- , ShaderExe(..), compile
) where
import Text.PrettyPrint.Leijen.PrettyPrec (PrettyPrec)
import Text.PrettyPrint.Leijen.DocExpr (HasExpr)
import Shady.Language.Exp
import qualified Shady.CompileE as C
import Shady.CompileE (Pos, GLSL)
-- import Shady.CompileE (ShaderExe(..))
-- import Shady.Misc (Sink)
{--------------------------------------------------------------------
Generate and compile shader programs
--------------------------------------------------------------------}
infixr 7 :->, :-^, :-*
-- | Vertex shader
type a' :-^ v' = a' -> (E Pos,v')
-- | Fragment shader
type v' :-* o' = v' -> (E R4,o')
-- | General vertex/fragment shader pair.
data a' :-> o' =
forall v' v. ( FromE v', v ~ ExpT v'
, HasType v, HasExpr v, PrettyPrec v ) =>
ShaderVF (a' :-^ v') (v' :-* o')
-- | Vertex/fragment pair with no extra output besides color
type ShaderVF a' = a' :-> ()
-- | Convert loosely structured shaders into single-exp shader
shaders :: forall u' a' o'.
(FromE u', FromE a', FromE o') =>
(o ~ ExpT o',a ~ ExpT a',u ~ ExpT u') =>
( HasExpr o, HasType o, Show o) =>
(u' -> (a' :-> o'))
-> u :=> (a C.:-> o)
shaders f u = case f (fromE u) of
ShaderVF vert frag ->
C.ShaderVF (toFromE vert) (toFromE frag)
-- | Compile a parameterized shader program. TODO: generalize to non-()
-- outputs, i.e., to @u :=> a :-> o@.
shaderProgram :: forall u' a' u a.
( FromE u', u ~ ExpT u', FromE a', a ~ ExpT a') =>
( HasType a, HasExpr a, HasType u, HasExpr u ) =>
(u' -> ShaderVF a') -> GLSL u a
shaderProgram = C.shaderProgram . shaders
{-
-- | Compile a parameterized shader program. Set up a static (for now)
-- vertex mesh, and give a sink for setting uniforms and rendering.
compile :: forall u' a' u a.
( FromE u', u ~ ExpT u', FromE a', a ~ ExpT a') =>
( HasType a, HasExpr a, HasType u, HasExpr u ) =>
(u' -> ShaderVF a') -> IO () -> [a] -> IO (Sink u)
compile = C.compile . shaders
-}