summaryrefslogtreecommitdiff
path: root/mainObj.hs
diff options
context:
space:
mode:
authorJoe Crayne <joe@jerkface.net>2019-04-22 03:13:44 -0400
committerJoe Crayne <joe@jerkface.net>2019-04-22 03:36:23 -0400
commitac89ee199abfe893b03cdbb89a426cd0594e06c9 (patch)
treec3542c880eb610e9a2d5d863ec9ba518a32a0b02 /mainObj.hs
parent36bd8e7133eca5d4e04252c555ee0cc2cc78106e (diff)
objdemo: pass view matrix from haskell.
Diffstat (limited to 'mainObj.hs')
-rw-r--r--mainObj.hs35
1 files changed, 27 insertions, 8 deletions
diff --git a/mainObj.hs b/mainObj.hs
index 1513075..caa4fa4 100644
--- a/mainObj.hs
+++ b/mainObj.hs
@@ -13,23 +13,31 @@ import Data.Text (Text)
13import Data.Map.Strict (Map) 13import Data.Map.Strict (Map)
14import qualified Data.Map.Strict as Map 14import qualified Data.Map.Strict as Map
15import qualified Data.Vector as V 15import qualified Data.Vector as V
16import Data.Vector.Generic as VG (init,snoc)
16import GI.Gdk.Objects 17import GI.Gdk.Objects
17import GI.GLib.Constants 18import GI.GLib.Constants
18import GI.Gtk as Gtk hiding (main) 19import GI.Gtk as Gtk hiding (main)
19import LambdaCube.GL as LC 20import LambdaCube.GL as LC
20import LambdaCube.GL.Mesh as LC 21import LambdaCube.GL.Mesh as LC
22import Numeric.LinearAlgebra hiding ((<>))
21import System.Environment 23import System.Environment
22import System.IO 24import System.IO
23import System.IO.Error 25import System.IO.Error
24 26
25import GLWidget 27import GLWidget
28import LambdaCube.GL.HMatrix
26import LambdaCubeWidget 29import LambdaCubeWidget
27import TimeKeeper 30import TimeKeeper
28import LoadMesh 31import LoadMesh
29import InfinitePlane 32import InfinitePlane
30import MtlParser (ObjMaterial(..)) 33import MtlParser (ObjMaterial(..))
34import Matrix
31 35
32type State = (TimeKeeper, TickCallbackHandle) 36-- State created by uploadState.
37data State = State
38 { stTimeKeeper :: TimeKeeper
39 , stTickCallback :: TickCallbackHandle
40 }
33 41
34addOBJToObjectArray :: GLStorage -> String -> [(GPUMesh, Maybe Text)] -> Map Text (ObjMaterial,TextureData) -> IO [LC.Object] 42addOBJToObjectArray :: GLStorage -> String -> [(GPUMesh, Maybe Text)] -> Map Text (ObjMaterial,TextureData) -> IO [LC.Object]
35addOBJToObjectArray storage slotName objMesh mtlLib = forM objMesh $ \(mesh,mat) -> do 43addOBJToObjectArray storage slotName objMesh mtlLib = forM objMesh $ \(mesh,mat) -> do
@@ -57,17 +65,28 @@ uploadState obj glarea storage = do
57 -- setup FrameClock 65 -- setup FrameClock
58 tm <- newTimeKeeper 66 tm <- newTimeKeeper
59 tickcb <- widgetAddTickCallback glarea (tick tm) 67 tickcb <- widgetAddTickCallback glarea (tick tm)
60 return (tm,tickcb) 68
69 return State
70 { stTimeKeeper = tm
71 , stTickCallback = tickcb
72 }
61 73
62destroyState :: GLArea -> State -> IO () 74destroyState :: GLArea -> State -> IO ()
63destroyState glarea (tm,tickcb) = do 75destroyState glarea st = do
64 widgetRemoveTickCallback glarea tickcb 76 widgetRemoveTickCallback glarea (stTickCallback st)
65 77
66setUniforms :: glctx -> GLStorage -> State -> IO () 78setUniforms :: glctx -> GLStorage -> State -> IO ()
67setUniforms gl storage (tm,_) = do 79setUniforms gl storage st = do
68 t <- withMVar (tmSeconds tm) return 80 t <- getSeconds $ stTimeKeeper st
81 let tf = realToFrac t :: Float
82 roZ = rotMatrixZ (-tf)
83 roX = rotMatrixX (-tf)
84 ro = roZ <> roX
85 pos = VG.init (ro #> fromList [0,0,10,0])
86 up = VG.init (ro #> fromList [0,1,0,0])
87 cam = lookat pos 0 up
69 LC.updateUniforms storage $ do 88 LC.updateUniforms storage $ do
70 "time" @= return (realToFrac t :: Float) 89 "cam" @= return (cam :: Matrix Float)
71 90
72main :: IO () 91main :: IO ()
73main = do 92main = do
@@ -82,7 +101,7 @@ main = do
82 defObjectArray "plane" Triangles $ do 101 defObjectArray "plane" Triangles $ do
83 "position" @: Attribute_V4F 102 "position" @: Attribute_V4F
84 defUniforms $ do 103 defUniforms $ do
85 "time" @: Float 104 "cam" @: M44F
86 "diffuseTexture" @: FTexture2D 105 "diffuseTexture" @: FTexture2D
87 "diffuseColor" @: V4F 106 "diffuseColor" @: V4F
88 return $ (,) <$> mobj <*> mpipeline 107 return $ (,) <$> mobj <*> mpipeline