module Graphics.Rendering.Ombra.D3 (
module Graphics.Rendering.Ombra.Generic,
module Data.Vect.Float,
Object3D,
IsObject3D,
Group3D,
IsGroup3D,
cube,
Geometry3D,
mesh,
mkGeometry3D,
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 Control.Applicative
import Data.Vect.Float
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.Generic
import Graphics.Rendering.Ombra.Shapes
import Graphics.Rendering.Ombra.Types
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 Group3D = Group (View3 ': Uniforms3D) Geometry3D
type IsObject3D globals inputs = ( Subset Geometry3D inputs
, Subset Uniforms3D globals
, Set inputs, Set globals )
type IsGroup3D gs is = ( Subset Geometry3D is, Subset (View3 ': Uniforms3D) gs
, Set is, Set gs )
cube :: GLES => Texture -> Object3D
cube = flip mesh cubeGeometry
mesh :: (IsObject3D Uniforms3D is, GLES)
=> Texture -> Geometry is -> Object Uniforms3D is
mesh t g = Transform3 -= idmtx :~> globalTexture Texture2 t :~> geom g
view :: (GLES, Set gs, Set is)
=> Mat4 -> [Object gs is] -> Group (View3 ': gs) is
view m = viewVP $ const m
viewPersp :: (GLES, Set gs, Set is)
=> Float
-> Float
-> Float
-> Mat4
-> [Object gs is] -> Group (View3 ': gs) is
viewPersp n f fov m = viewVP $ \s -> m .*. perspectiveMat4Size n f fov s
viewOrtho :: (GLES, Set gs, Set is)
=> Float
-> Float
-> Float
-> Float
-> Float
-> Float
-> Mat4
-> [Object gs is] -> Group (View3 ': gs) is
viewOrtho n f l r b t m = view $ m .*. orthoMat4 n f l r b t
viewVP :: (GLES, Set gs, Set is)
=> (Vec2 -> Mat4) -> [Object gs is] -> Group (View3 ': gs) is
viewVP mf = globalGroup (globalFramebufferSize View3 mf) . group
layerS :: IsGroup3D gs is => Group gs is -> Layer
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