module Graphics.Rendering.Ombra.D3 (
module Graphics.Rendering.Ombra.Generic,
module Data.Vect.Float,
Object3D,
IsObject3D,
Group3D,
IsGroup3D,
cube,
Geometry3D,
mesh,
mkGeometry3D,
positionOnly,
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 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.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
, ShaderVars inputs, ShaderVars globals )
type IsGroup3D 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 :~> globalTexture Texture2 t :~> geom g
view :: (GLES, ShaderVars gs, ShaderVars is)
=> Mat4 -> [Object gs is] -> Group (View3 ': gs) is
view m = viewVP $ const m
viewPersp :: (GLES, ShaderVars gs, ShaderVars 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, ShaderVars gs, ShaderVars 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, ShaderVars gs, ShaderVars is)
=> (Vec2 -> Mat4) -> [Object gs is] -> Group (View3 ': gs) is
viewVP mf = groupGlobal (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