content: module LambdaCube.Core.Type where
  
  import Data.Typeable
  
  import Data.Int
  import Data.Word
  
  data V2 a = V2 !a !a deriving (Read,Eq,Ord,Show,Typeable)
  data V3 a = V3 !a !a !a deriving (Read,Eq,Ord,Show,Typeable)
  data V4 a = V4 !a !a !a !a deriving (Read,Eq,Ord,Show,Typeable)
  
  -- matrices are stored in column major order
  type M22F = V2 V2F
  type M23F = V3 V2F
  type M24F = V4 V2F
  type M32F = V2 V3F
  type M33F = V3 V3F
  type M34F = V4 V3F
  type M42F = V2 V4F
  type M43F = V3 V4F
  type M44F = V4 V4F
  
  type V2F = V2 Float
  type V3F = V3 Float
  type V4F = V4 Float
  type V2I = V2 Int32
  type V3I = V3 Int32
  type V4I = V4 Int32
  type V2U = V2 Word32
  type V3U = V3 Word32
  type V4U = V4 Word32
  type V2B = V2 Bool
  type V3B = V3 Bool
  type V4B = V4 Bool
  
  -- GPU type value reification, needed for shader codegen
  data Value
      = VBool     !Bool
      | VV2B      !V2B
      | VV3B      !V3B
      | VV4B      !V4B
      | VWord     !Word32
      | VV2U      !V2U
      | VV3U      !V3U
      | VV4U      !V4U
      | VInt      !Int32
      | VV2I      !V2I
      | VV3I      !V3I
      | VV4I      !V4I
      | VFloat    !Float
      | VV2F      !V2F
      | VV3F      !V3F
      | VV4F      !V4F
      | VM22F     !M22F
      | VM23F     !M23F
      | VM24F     !M24F
      | VM32F     !M32F
      | VM33F     !M33F
      | VM34F     !M34F
      | VM42F     !M42F
      | VM43F     !M43F
      | VM44F     !M44F
      deriving (Read,Typeable,Show,Eq,Ord)
  
  data Ty
      = Single !InputType
      | Tuple [Ty]
      | Unknown String
      deriving (Read,Typeable,Show,Eq,Ord)
  
  tySize :: Ty -> Int
  tySize (Tuple a)  = sum $ map tySize a
  tySize _ = 1
  
  -- describes a stream type (in GPU side)
  data InputType
      = Bool
      | V2B
      | V3B
      | V4B
      | Word
      | V2U
      | V3U
      | V4U
      | Int
      | V2I
      | V3I
      | V4I
      | Float
      | V2F
      | V3F
      | V4F
      | M22F
      | M23F
      | M24F
      | M32F
      | M33F
      | M34F
      | M42F
      | M43F
      | M44F
      -- shadow textures
      | STexture1D
      | STexture2D
      | STextureCube
      | STexture1DArray
      | STexture2DArray
      | STexture2DRect
      -- float textures
      | FTexture1D
      | FTexture2D
      | FTexture3D
      | FTextureCube
      | FTexture1DArray
      | FTexture2DArray
      | FTexture2DMS
      | FTexture2DMSArray
      | FTextureBuffer
      | FTexture2DRect
      -- int textures
      | ITexture1D
      | ITexture2D
      | ITexture3D
      | ITextureCube
      | ITexture1DArray
      | ITexture2DArray
      | ITexture2DMS
      | ITexture2DMSArray
      | ITextureBuffer
      | ITexture2DRect
      -- uint textures
      | UTexture1D
      | UTexture2D
      | UTexture3D
      | UTextureCube
      | UTexture1DArray
      | UTexture2DArray
      | UTexture2DMS
      | UTexture2DMSArray
      | UTextureBuffer
      | UTexture2DRect
      deriving (Read,Typeable,Show,Eq,Ord)
  
  data PointSpriteCoordOrigin = LowerLeft | UpperLeft deriving (Read,Typeable,Show, Eq, Ord)
  data PointSize              = PointSize Float | ProgramPointSize deriving (Read,Typeable,Eq,Ord,Show)
  data PolygonOffset          = NoOffset | Offset Float Float  deriving (Read,Typeable,Eq,Ord,Show)
  data FrontFace              = CCW | CW deriving (Read,Typeable,Eq,Ord,Show)
  data PolygonMode            = PolygonPoint PointSize | PolygonLine Float | PolygonFill deriving (Read,Typeable,Eq,Ord,Show)
  data ProvokingVertex        = FirstVertex | LastVertex deriving (Read,Typeable,Eq,Ord,Bounded,Enum,Show)
  data CullMode               = CullNone | CullFront FrontFace | CullBack FrontFace deriving (Read,Typeable,Eq,Ord,Show)
  type DepthFunction          = ComparisonFunction
  data ComparisonFunction     = Never | Less | Equal | Lequal | Greater | Notequal | Gequal | Always deriving (Read,Typeable, Eq, Ord, Show )
  data StencilOperation       = OpZero | OpKeep | OpReplace | OpIncr | OpIncrWrap | OpDecr | OpDecrWrap | OpInvert deriving (Read,Typeable, Eq, Ord, Show )
  data BlendEquation          = FuncAdd | FuncSubtract | FuncReverseSubtract | Min | Max deriving (Read,Typeable, Eq, Ord, Show )
  data BlendingFactor         = Zero | One | SrcColor | OneMinusSrcColor | DstColor | OneMinusDstColor | SrcAlpha | OneMinusSrcAlpha | DstAlpha | OneMinusDstAlpha | ConstantColor | OneMinusConstantColor | ConstantAlpha | OneMinusConstantAlpha | SrcAlphaSaturate deriving (Read,Typeable, Eq, Ord, Show )
  data LogicOperation         = Clear | And | AndReverse | Copy | AndInverted | Noop | Xor | Or | Nor | Equiv | Invert | OrReverse | CopyInverted | OrInverted | Nand | Set deriving (Read,Typeable, Eq, Ord, Show )
  
  data StencilOps
      = StencilOps
      { frontStencilOp    :: StencilOperation -- ^ Used for front faced triangles and other primitives.
      , backStencilOp     :: StencilOperation -- ^ Used for back faced triangles.
      } deriving (Read,Typeable,Eq,Ord,Show)
  
  data StencilTests = StencilTests StencilTest StencilTest  deriving (Read,Typeable,Eq,Ord,Show)
  data StencilTest
      = StencilTest
      { stencilComparision    :: ComparisonFunction   -- ^ The function used to compare the @stencilReference@ and the stencil buffers value with.
      , stencilReference      :: Int32                -- ^ The value to compare with the stencil buffer's value.
      , stencilMask           :: Word32               -- ^ A bit mask with ones in each position that should be compared and written to the stencil buffer.
      } deriving (Read,Typeable,Eq,Ord,Show)
  
  -- sampler and texture specification
  data Filter = PointFilter | LinearFilter    deriving (Read,Typeable,Show,Eq,Ord)
  data EdgeMode = Repeat | MirroredRepeat | ClampToEdge | ClampToBorder       deriving (Read,Typeable,Show,Eq,Ord)
  
  -- primitive types
  data FetchPrimitive
      = Points
      | Lines
      | Triangles
      | LinesAdjacency
      | TrianglesAdjacency
      deriving (Read,Show,Eq,Ord)
  
  data OutputPrimitive
      = TrianglesOutput
      | LinesOutput
      | PointsOutput
      deriving (Read,Show,Eq,Ord)
  
  data ColorArity = Red | RG | RGB | RGBA deriving (Read,Show,Eq,Ord)
  
  data Blending
      = NoBlending
      | BlendLogicOp  LogicOperation
      | Blend         (BlendEquation, BlendEquation) 
                      ((BlendingFactor, BlendingFactor), (BlendingFactor, BlendingFactor))
                      V4F
      deriving (Read,Show,Eq,Ord)
  
  data RasterContext
      = PointCtx      PointSize Float PointSpriteCoordOrigin
      | LineCtx       Float ProvokingVertex
      | TriangleCtx   CullMode PolygonMode PolygonOffset ProvokingVertex
      deriving (Read,Show, Eq, Ord)
  
  data FragmentOperation
      = DepthOp       DepthFunction Bool
      | StencilOp     StencilTests StencilOps StencilOps
      | ColorOp       Blending Value
      deriving (Read,Show, Eq, Ord)
  
  data Image
      = DepthImage      Int Float
      | StencilImage    Int Int32
      | ColorImage      Int Value
      | UnclearedImage  Int
      deriving (Read,Show, Eq, Ord)
  
  data TextureDataType
      = FloatT        ColorArity
      | IntT          ColorArity
      | WordT         ColorArity
      | ShadowT
      deriving (Read,Show, Eq, Ord)
  
  data TextureType
      = Texture1D     TextureDataType Int
      | Texture2D     TextureDataType Int
      | Texture3D     TextureDataType
      | TextureCube   TextureDataType
      | TextureRect   TextureDataType
      | Texture2DMS   TextureDataType Int
      | TextureBuffer TextureDataType
      deriving (Read,Show, Eq, Ord)
  
  data MipMap
      = Mip           Int Int -- Base level, Max level
      | NoMip 
      | AutoMip       Int Int -- Base level, Max level
      deriving (Read,Show,Eq,Ord)
  