module Graphics.Rendering.Ombra.D3 (
Object3D,
IsObject3D,
cube,
mesh,
trans,
rotX,
rotY,
rotZ,
rot,
scale,
scaleV,
transform,
view,
viewPersp,
viewOrtho,
viewVP,
layerS,
perspectiveMat4,
perspectiveMat4Size,
orthoMat4,
cameraMat4,
lookAtMat4,
transMat4,
rotXMat4,
rotYMat4,
rotZMat4,
rotMat4,
scaleMat4,
Uniforms3D,
Texture2(..),
Transform3(..),
View3(..),
) where
import Graphics.Rendering.Ombra.Backend hiding (Texture, Program)
import Graphics.Rendering.Ombra.Geometry
import Graphics.Rendering.Ombra.Color
import Graphics.Rendering.Ombra.Draw
import Graphics.Rendering.Ombra.Layer
import Graphics.Rendering.Ombra.Object
import Graphics.Rendering.Ombra.Shapes
import Graphics.Rendering.Ombra.Vector
import Graphics.Rendering.Ombra.Internal.TList
import Graphics.Rendering.Ombra.Shader.Default3D (Texture2(..), Transform3(..), View3(..))
import Graphics.Rendering.Ombra.Shader.Program hiding (program)
import Graphics.Rendering.Ombra.Texture
import Graphics.Rendering.Ombra.Transformation
type Uniforms3D = '[Transform3, Texture2]
type Object3D = Object Uniforms3D Geometry3D
type IsObject3D gs is = ( Subset Geometry3D is, Subset (View3 ': Uniforms3D) gs
, ShaderVars is, ShaderVars gs )
cube :: GLES => Texture -> Object3D
cube = flip mesh cubeGeometry
mesh :: GLES => Texture -> Geometry is -> Object Uniforms3D is
mesh t g = Transform3 -= idmtx :~> withTexture t (Texture2 -=) :~> geom g
view :: (GLES, ShaderVars gs, ShaderVars is)
=> Mat4 -> [Object gs is] -> Object (View3 ': gs) is
view m = viewVP $ const m
viewPersp :: (GLES, ShaderVars gs, ShaderVars is)
=> Float
-> Float
-> Float
-> Mat4
-> [Object gs is]
-> Object (View3 ': gs) is
viewPersp n f fov m = viewVP $ \s -> m .*. perspectiveMat4Size n f fov s
viewOrtho :: (GLES, ShaderVars gs, ShaderVars is)
=> Float
-> Float
-> Float
-> Float
-> Float
-> Float
-> Mat4
-> [Object gs is]
-> Object (View3 ': gs) is
viewOrtho n f l r b t m = view $ m .*. orthoMat4 n f l r b t
viewVP :: (GLES, ShaderVars gs, ShaderVars is)
=> (Vec2 -> Mat4) -> [Object gs is] -> Object (View3 ': gs) is
viewVP mf o = withFramebufferSize (\s -> View3 -= mf (tupleToVec s))
:~> mconcat o
where tupleToVec (w, h) = Vec2 (fromIntegral w) (fromIntegral h)
layerS :: IsObject3D gs is => Object gs is -> Layer' s t ()
layerS = layer defaultProgram3D
trans :: (MemberGlobal Transform3 gs, GLES) => Vec3
-> Object gs is -> Object gs is
trans v = transform $ transMat4 v
rotX :: (MemberGlobal Transform3 gs, GLES) => Float
-> Object gs is -> Object gs is
rotX a = transform $ rotXMat4 a
rotY :: (MemberGlobal Transform3 gs, GLES) => Float
-> Object gs is -> Object gs is
rotY a = transform $ rotYMat4 a
rotZ :: (MemberGlobal Transform3 gs, GLES) => Float
-> Object gs is -> Object gs is
rotZ a = transform $ rotZMat4 a
rot :: (MemberGlobal Transform3 gs, GLES) => Vec3
-> Float
-> Object gs is -> Object gs is
rot ax ag = transform $ rotMat4 ax ag
scale :: (MemberGlobal Transform3 gs, GLES) => Float
-> Object gs is -> Object gs is
scale f = transform $ scaleMat4 (Vec3 f f f)
scaleV :: (MemberGlobal Transform3 gs, GLES) => Vec3
-> Object gs is -> Object gs is
scaleV v = transform $ scaleMat4 v
transform :: (MemberGlobal Transform3 gs, GLES) => Mat4
-> Object gs is -> Object gs is
transform m' o = (\m -> Transform3 -= m .*. m') ~~> o
perspectiveMat4Size :: Float
-> Float
-> Float
-> Vec2
-> Mat4
perspectiveMat4Size n f fov (Vec2 w h) = perspectiveMat4 n f fov $ w / h