module Graphics.Rendering.Ombra.D2 (
module Graphics.Rendering.Ombra.Generic,
module Data.Vect.Float,
Object2D,
IsObject2D,
Group2D,
IsGroup2D,
rect,
image,
sprite,
depth,
Geometry2D,
poly,
mkGeometry2D,
trans,
rot,
scale,
scaleV,
scaleTex,
scaleTexAR,
transform,
view,
viewScreen,
viewVP,
layerS,
transMat3,
rotMat3,
scaleMat3,
screenMat3,
Uniforms2D,
Image(..),
Depth(..),
Transform2(..),
View2(..),
) where
import Data.Vect.Float
import Graphics.Rendering.Ombra.Backend hiding (Texture, Program)
import Graphics.Rendering.Ombra.Geometry
import Graphics.Rendering.Ombra.Generic
import Graphics.Rendering.Ombra.Draw
import Graphics.Rendering.Ombra.Shapes
import Graphics.Rendering.Ombra.Types
import Graphics.Rendering.Ombra.Internal.TList
import Graphics.Rendering.Ombra.Shader.Default2D (Image(..), Depth(..), Transform2(..), View2(..))
import Graphics.Rendering.Ombra.Shader.Program
import Graphics.Rendering.Ombra.Transformation
type Uniforms2D = '[Image, Depth, Transform2]
type Object2D = Object Uniforms2D Geometry2D
type Group2D = Group (View2 ': Uniforms2D) Geometry2D
type IsObject2D globals inputs = ( Subset Geometry2D inputs
, Subset Uniforms2D globals
, ShaderVars inputs, ShaderVars globals
)
type IsGroup2D gs is = ( Subset Geometry2D is, Subset (View2 ': Uniforms2D) gs
, ShaderVars is, ShaderVars gs )
rect :: GLES => Texture -> Object2D
rect = flip poly . rectGeometry $ Vec2 1 1
poly :: GLES => Texture -> Geometry is -> Object Uniforms2D is
poly t g = globalTexture Image t :~>
Depth -= 0 :~>
Transform2 -= idmtx :~>
geom g
image :: GLES => Texture -> Object2D
image t = scaleTexAR t $ rect t
depth :: (MemberGlobal Depth gs, GLES)
=> Float -> Object gs is -> Object gs is
depth d obj = const (Depth -= d) ~~> obj
sprite :: GLES => Texture -> Object2D
sprite t = scaleTex t $ rect t
view :: (ShaderVars gs, ShaderVars is, GLES)
=> Mat3 -> [Object gs is] -> Group (View2 ': gs) is
view m = viewVP $ const m
viewScreen :: (ShaderVars gs, ShaderVars is, GLES)
=> Mat3 -> [Object gs is] -> Group (View2 ': gs) is
viewScreen m = viewVP $ \s -> screenMat3 s .*. m
viewVP :: (ShaderVars gs, ShaderVars is, GLES)
=> (Vec2 -> Mat3) -> [Object gs is] -> Group (View2 ': gs) is
viewVP mf = groupGlobal (globalFramebufferSize View2 mf) . group
layerS :: IsGroup2D gs is => Group gs is -> Layer
layerS = layer defaultProgram2D
trans :: (MemberGlobal Transform2 gs, GLES)
=> Vec2 -> Object gs is -> Object gs is
trans v = transform $ transMat3 v
rot :: (MemberGlobal Transform2 gs, GLES)
=> Float -> Object gs is -> Object gs is
rot a = transform $ rotMat3 a
scale :: (MemberGlobal Transform2 gs, GLES)
=> Float -> Object gs is -> Object gs is
scale f = transform $ scaleMat3 (Vec2 f f)
scaleV :: (MemberGlobal Transform2 gs, GLES)
=> Vec2 -> Object gs is -> Object gs is
scaleV v = transform $ scaleMat3 v
scaleTex :: (MemberGlobal Transform2 gs, GLES)
=> Texture -> Object gs is -> Object gs is
scaleTex t = transformDraw $
(\(w, h) -> scaleMat3 $ Vec2 w h) <$> textureSize t
scaleTexAR :: (MemberGlobal Transform2 gs, GLES)
=> Texture -> Object gs is -> Object gs is
scaleTexAR t = transformDraw $
(\(w, h) -> scaleMat3 $ Vec2 1 (h / w)) <$> textureSize t
transform :: (MemberGlobal Transform2 gs, GLES)
=> Mat3 -> Object gs is -> Object gs is
transform m' o = (\m -> Transform2 := (.*. m') <$> m) ~~> o
transformDraw :: (MemberGlobal Transform2 gs, GLES)
=> Draw Mat3 -> Object gs is -> Object gs is
transformDraw m' o = (\m -> Transform2 := (.*.) <$> m <*> m') ~~> o
screenMat3 :: Vec2
-> Mat3
screenMat3 (Vec2 w h) = Mat3 (Vec3 (2 / w) 0 0 )
(Vec3 0 ( 2 / h) 0 )
(Vec3 ( 1) 1 1 )