diff options
author | Joe Crayne <joe@jerkface.net> | 2019-04-22 03:13:44 -0400 |
---|---|---|
committer | Joe Crayne <joe@jerkface.net> | 2019-04-22 03:36:23 -0400 |
commit | ac89ee199abfe893b03cdbb89a426cd0594e06c9 (patch) | |
tree | c3542c880eb610e9a2d5d863ec9ba518a32a0b02 /mainObj.hs | |
parent | 36bd8e7133eca5d4e04252c555ee0cc2cc78106e (diff) |
objdemo: pass view matrix from haskell.
Diffstat (limited to 'mainObj.hs')
-rw-r--r-- | mainObj.hs | 35 |
1 files changed, 27 insertions, 8 deletions
@@ -13,23 +13,31 @@ import Data.Text (Text) | |||
13 | import Data.Map.Strict (Map) | 13 | import Data.Map.Strict (Map) |
14 | import qualified Data.Map.Strict as Map | 14 | import qualified Data.Map.Strict as Map |
15 | import qualified Data.Vector as V | 15 | import qualified Data.Vector as V |
16 | import Data.Vector.Generic as VG (init,snoc) | ||
16 | import GI.Gdk.Objects | 17 | import GI.Gdk.Objects |
17 | import GI.GLib.Constants | 18 | import GI.GLib.Constants |
18 | import GI.Gtk as Gtk hiding (main) | 19 | import GI.Gtk as Gtk hiding (main) |
19 | import LambdaCube.GL as LC | 20 | import LambdaCube.GL as LC |
20 | import LambdaCube.GL.Mesh as LC | 21 | import LambdaCube.GL.Mesh as LC |
22 | import Numeric.LinearAlgebra hiding ((<>)) | ||
21 | import System.Environment | 23 | import System.Environment |
22 | import System.IO | 24 | import System.IO |
23 | import System.IO.Error | 25 | import System.IO.Error |
24 | 26 | ||
25 | import GLWidget | 27 | import GLWidget |
28 | import LambdaCube.GL.HMatrix | ||
26 | import LambdaCubeWidget | 29 | import LambdaCubeWidget |
27 | import TimeKeeper | 30 | import TimeKeeper |
28 | import LoadMesh | 31 | import LoadMesh |
29 | import InfinitePlane | 32 | import InfinitePlane |
30 | import MtlParser (ObjMaterial(..)) | 33 | import MtlParser (ObjMaterial(..)) |
34 | import Matrix | ||
31 | 35 | ||
32 | type State = (TimeKeeper, TickCallbackHandle) | 36 | -- State created by uploadState. |
37 | data State = State | ||
38 | { stTimeKeeper :: TimeKeeper | ||
39 | , stTickCallback :: TickCallbackHandle | ||
40 | } | ||
33 | 41 | ||
34 | addOBJToObjectArray :: GLStorage -> String -> [(GPUMesh, Maybe Text)] -> Map Text (ObjMaterial,TextureData) -> IO [LC.Object] | 42 | addOBJToObjectArray :: GLStorage -> String -> [(GPUMesh, Maybe Text)] -> Map Text (ObjMaterial,TextureData) -> IO [LC.Object] |
35 | addOBJToObjectArray storage slotName objMesh mtlLib = forM objMesh $ \(mesh,mat) -> do | 43 | addOBJToObjectArray 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 | ||
62 | destroyState :: GLArea -> State -> IO () | 74 | destroyState :: GLArea -> State -> IO () |
63 | destroyState glarea (tm,tickcb) = do | 75 | destroyState glarea st = do |
64 | widgetRemoveTickCallback glarea tickcb | 76 | widgetRemoveTickCallback glarea (stTickCallback st) |
65 | 77 | ||
66 | setUniforms :: glctx -> GLStorage -> State -> IO () | 78 | setUniforms :: glctx -> GLStorage -> State -> IO () |
67 | setUniforms gl storage (tm,_) = do | 79 | setUniforms 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 | ||
72 | main :: IO () | 91 | main :: IO () |
73 | main = do | 92 | main = 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 |