module Graphics.LambdaCube.GpuProgram where

import Graphics.LambdaCube.GpuProgramParams

data GpuProgramType
    = GPT_VERTEX_PROGRAM
    | GPT_FRAGMENT_PROGRAM
    | GPT_GEOMETRY_PROGRAM
    deriving (Eq,Ord)

class Ord p => GpuProgram p
class Ord lp => LinkedGpuProgram lp

data GpuProgram p => GpuProgramDescriptor p
    = GpuProgramDescriptor
    { gpdName               :: String
    , gpdType               :: GpuProgramType       -- ^ The type of the program
    , gpdFilename           :: String               -- ^ The name of the file to load source from (may be blank)
    , gpdSyntaxCode         :: String               -- ^ Syntax code e.g. arbvp1, vs_2_0 etc
    , gpdAttach             :: [String]
    , gpdSkeletalAnimation  :: Bool                 -- ^ Does this (vertex) program include skeletal animation?
    , gpdMorphAnimation     :: Bool                 -- ^ Does this (vertex) program include morph animation?
    , gpdPoseAnimation      :: Int                  -- ^ Does this (vertex) program include pose animation (count of number of poses supported)
    , gpdVertexTextureFetch :: Bool                 -- ^ Does this (vertex) program require support for vertex texture fetch?
    , gpdNeedsAdjacencyInfo :: Bool                 -- ^ Does this (geometry) program require adjacency information?
    , gpdDefaultParams      :: GpuProgramParameters -- ^ The default parameters for use with this object
    , gpdGpuProgram         :: Maybe p
    }