module Graphics.Rendering.Ombra.Stencil.Internal where
import Graphics.Rendering.Ombra.Internal.GL
data Mode = Mode (Side Function) (Side Operation) deriving Eq
data Side a = FrontBack a
| Separate a a
deriving Eq
data Function = Function FunctionType Int Word deriving Eq
data FunctionType = Never
| Always
| Less
| LessOrEqual
| Greater
| GreaterOrEqual
| Equal
| NotEqual
deriving Eq
data Operation = Operation OperationType OperationType OperationType deriving Eq
data OperationType = Keep
| Invert
| Zero
| Replace
| Increment
| Decrement
| IncWrap
| DecWrap
deriving Eq
function :: GLES => Function -> (GLEnum, GLInt, GLUInt)
function (Function ty value mask) = ( getType ty
, fromIntegral value
, fromIntegral mask )
where getType Never = gl_NEVER
getType Always = gl_ALWAYS
getType Less = gl_LESS
getType LessOrEqual = gl_LEQUAL
getType Greater = gl_GREATER
getType GreaterOrEqual = gl_GEQUAL
getType Equal = gl_EQUAL
getType NotEqual = gl_NOTEQUAL
operation :: GLES => Operation -> (GLEnum, GLEnum, GLEnum)
operation (Operation sf spdf spdp) = (getOp sf, getOp spdf, getOp spdp)
where getOp Keep = gl_KEEP
getOp Invert = gl_INVERT
getOp Zero = gl_ZERO
getOp Replace = gl_REPLACE
getOp Increment = gl_INCR
getOp Decrement = gl_DECR
getOp IncWrap = gl_INCR_WRAP
getOp DecWrap = gl_DECR_WRAP