module Graphics.Rendering.Ombra.D3 (
Object3D,
IsObject3D,
cube,
mesh,
trans,
rotX,
rotY,
rotZ,
rot,
scale,
scaleV,
transform,
view,
proj,
viewPersp,
viewOrtho,
viewProj,
layerS,
perspectiveMat4,
perspectiveMat4Size,
orthoMat4,
cameraMat4,
lookAtMat4,
transMat4,
rotXMat4,
rotYMat4,
rotZMat4,
rotMat4,
scaleMat4,
Uniforms3D,
Texture2(..),
Transform3(..),
View3(..),
Project3(..)
) 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(..), Project3(..))
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 (Project3 ': View3 ': Uniforms3D) gs
, ShaderVars is
, ShaderVars gs )
cube :: GLES => Texture -> Object3D
cube = flip mesh cubeGeometry
mesh :: GLES => Texture -> Geometry (i ': is) -> Object Uniforms3D (i ': is)
mesh t g = Transform3 -= idmtx :~> withTexture t (Texture2 -=) :~> geom g
view :: (GLES, ShaderVars gs, ShaderVars is)
=> Mat4 -> [Object gs is] -> Object (Project3 ': View3 ': gs) is
view m = viewProj (const m) (const idmtx)
proj :: (GLES, ShaderVars gs, ShaderVars is)
=> Mat4 -> [Object gs is] -> Object (Project3 ': View3 ': gs) is
proj m = viewProj (const idmtx) (const m)
viewPersp :: (GLES, ShaderVars gs, ShaderVars is)
=> Float
-> Float
-> Float
-> Mat4
-> [Object gs is]
-> Object (Project3 ': View3 ': gs) is
viewPersp n f fov m = viewProj (const m) (perspectiveMat4Size n f fov)
viewOrtho :: (GLES, ShaderVars gs, ShaderVars is)
=> Float
-> Float
-> Float
-> Float
-> Float
-> Float
-> Mat4
-> [Object gs is]
-> Object (Project3 ': View3 ': gs) is
viewOrtho n f l r b t m = viewProj (const m) (const $ orthoMat4 n f l r b t)
viewProj :: (GLES, ShaderVars gs, ShaderVars is)
=> (Vec2 -> Mat4)
-> (Vec2 -> Mat4)
-> [Object gs is]
-> Object (Project3 ': View3 ': gs) is
viewProj v p o = withFramebufferSize (\s -> Project3 -= p (tupleToVec s))
:~> withFramebufferSize (\s -> View3 -= v (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