{-# LANGUAGE FlexibleContexts, RankNTypes, TypeFamilies #-}

module Graphics.Rendering.Ombra.Shader.Language (
        -- * Types
        Shader,
        VertexShader,
        FragmentShader,
        VertexShaderOutput(Vertex),
        FragmentShaderOutput(..),
        ShaderType(zero),
        ShaderVars,
        VOShaderVars,
        Uniform,
        Attribute,
        Generic,
        SVList((:-), N),
        -- ** GPU types
        GenType,
        GenTypeGFloat,
        GMatrix,
        GBool,
        GFloat,
        GInt,
        GSampler2D,
        GSamplerCube,
        GVec2(..),
        GVec3(..),
        GVec4(..),
        GBVec2(..),
        GBVec3(..),
        GBVec4(..),
        GIVec2(..),
        GIVec3(..),
        GIVec4(..),
        GMat2(..),
        GMat3(..),
        GMat4(..),
        GArray,
        -- * Functions
        loop,
        store,
        texture2D,
        texture2DBias,
        texture2DProj,
        texture2DProjBias,
        texture2DProj4,
        texture2DProjBias4,
        texture2DLod,
        texture2DProjLod,
        texture2DProjLod4,
        arrayLength,
        -- ** Math functions
        radians,
        degrees,
        sin,
        cos,
        tan,
        asin,
        acos,
        atan,
        atan2,
        exp,
        log,
        exp2,
        log2,
        sqrt,
        inversesqrt,
        abs,
        absI,
        sign,
        signI,
        floor,
        ceil,
        fract,
        mod,
        min,
        max,
        clamp,
        mix,
        step,
        smoothstep,
        length,
        distance,
        dot,
        cross,
        normalize,
        faceforward,
        reflect,
        refract,
        matrixCompMult,
        -- *** Vector relational functions
        VecOrd,
        VecEq,
        lessThan,
        lessThanEqual,
        greaterThan,
        greaterThanEqual,
        equal,
        notEqual,
        GBoolVector,
        anyBV,
        allBV,
        notBV,
        -- ** Constructors
        true,
        false,
        ToGBool,
        bool,
        ToGInt,
        int,
        ToGFloat,
        float,
        Components,
        CompList,
        ToCompList,
        (#),
        ToGVec2,
        vec2,
        ToGVec3,
        vec3,
        ToGVec4,
        vec4,
        ToGBVec2,
        bvec2,
        ToGBVec3,
        bvec3,
        ToGBVec4,
        bvec4,
        ToGIVec2,
        ivec2,
        ToGIVec3,
        ivec3,
        ToGIVec4,
        ivec4,
        ToGMat2,
        mat2,
        ToGMat3,
        mat3,
        ToGMat4,
        mat4,
        -- ** Operators
        (*),
        (/),
        (+),
        (-),
        (^),
        (&&),
        (||),
        (==),
        (/=),
        (>=),
        (<=),
        (<),
        (>),
        (!),
        not,
        -- ** Rebinding functions
        fromInteger,
        fromRational,
        ifThenElse,
        negate,
        negateI,
        negateM,
        -- ** Prelude functions
        (.),
        id,
        const,
        flip,
        ($),
        CPU.fst,
        CPU.snd,
        -- * Variables
        position,
        fragData,
        fragCoord,
        fragFrontFacing
) where

import GHC.Generics (Generic)
import Graphics.Rendering.Ombra.Shader.CPU
import Graphics.Rendering.Ombra.Shader.Language.Types
import Graphics.Rendering.Ombra.Shader.Language.Functions
import Graphics.Rendering.Ombra.Shader.ShaderVar
import Graphics.Rendering.Ombra.Shader.Stages
import Prelude ((.), id, const, flip, ($))
import qualified Prelude as CPU