summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJoe Crayne <joe@jerkface.net>2019-04-29 21:40:21 -0400
committerJoe Crayne <joe@jerkface.net>2019-04-29 21:40:21 -0400
commit4e754c89fdaed5f57dacaa5d67bfad7b498ceba3 (patch)
treeb797bef5900f3dfa97b5fa5acc0b1d62317c3dbd
parent051f60000748548b04084aca77bc30b11d7bf2db (diff)
Switched camera flight to use Animator utility.
-rw-r--r--MeshSketch.hs35
1 files changed, 19 insertions, 16 deletions
diff --git a/MeshSketch.hs b/MeshSketch.hs
index 675c388..7d0392f 100644
--- a/MeshSketch.hs
+++ b/MeshSketch.hs
@@ -33,7 +33,7 @@ import LambdaCube.Gtk
33import GLWidget (nullableContext, withCurrentGL) 33import GLWidget (nullableContext, withCurrentGL)
34import LambdaCube.GL.HMatrix 34import LambdaCube.GL.HMatrix
35import LambdaCubeWidget (loadPipeline,DynamicPipeline(..)) 35import LambdaCubeWidget (loadPipeline,DynamicPipeline(..))
36import TimeKeeper 36import Animator
37import LoadMesh 37import LoadMesh
38import InfinitePlane 38import InfinitePlane
39import MtlParser (ObjMaterial(..)) 39import MtlParser (ObjMaterial(..))
@@ -41,9 +41,8 @@ import Matrix
41 41
42-- State created by uploadState. 42-- State created by uploadState.
43data State = State 43data State = State
44 { stTimeKeeper :: TimeKeeper 44 { stAnimator :: Animator
45 , stTickCallback :: TickCallbackHandle 45 , stCamera :: IORef Camera
46 , stCamera :: IORef Camera
47 } 46 }
48 47
49data Camera = Camera 48data Camera = Camera
@@ -107,27 +106,28 @@ uploadState obj glarea storage = do
107 uploadMeshToGPU xzplane >>= addMeshToObjectArray storage "plane" [] 106 uploadMeshToGPU xzplane >>= addMeshToObjectArray storage "plane" []
108 107
109 -- setup FrameClock 108 -- setup FrameClock
110 tm <- newTimeKeeper 109 tm <- newAnimator =<< toWidget glarea
111 cam <- newIORef initCamera 110 cam <- newIORef initCamera
112 tickcb <- widgetAddTickCallback glarea (tick tm) 111 let st = State
112 { stAnimator = tm
113 , stCamera = cam
114 }
115 _ <- addAnimation tm (whirlingCamera st)
116
117 return st
113 118
114 return State
115 { stTimeKeeper = tm
116 , stTickCallback = tickcb
117 , stCamera = cam
118 }
119 119
120destroyState :: GLArea -> State -> IO () 120destroyState :: GLArea -> State -> IO ()
121destroyState glarea st = do 121destroyState glarea st = do
122 widgetRemoveTickCallback glarea (stTickCallback st) 122 -- widgetRemoveTickCallback glarea (stTickCallback st)
123 return ()
123 124
124deg30 :: Float 125deg30 :: Float
125deg30 = pi/6 126deg30 = pi/6
126 127
127setUniforms :: glctx -> GLStorage -> State -> IO () 128whirlingCamera :: State -> Animation
128setUniforms gl storage st = do 129whirlingCamera st = Animation $ \_ t -> do
129 t <- (/ 10.0) <$> getSeconds (stTimeKeeper st) 130 let tf = realToFrac (t/10.0) :: Float
130 let tf = realToFrac t :: Float
131 rot = rotMatrixZ (-tf) <> rotMatrixX (-tf) 131 rot = rotMatrixZ (-tf) <> rotMatrixX (-tf)
132 modifyIORef (stCamera st) $ \cam -> cam 132 modifyIORef (stCamera st) $ \cam -> cam
133 { camUp = rot #> fromList [0,1,0] 133 { camUp = rot #> fromList [0,1,0]
@@ -135,7 +135,10 @@ setUniforms gl storage st = do
135 , camWorldToScreen = Nothing 135 , camWorldToScreen = Nothing
136 , camScreenToWorld = Nothing 136 , camScreenToWorld = Nothing
137 } 137 }
138 return $ Just (whirlingCamera st)
138 139
140setUniforms :: glctx -> GLStorage -> State -> IO ()
141setUniforms gl storage st = do
139 (mvp,pos) <- atomicModifyIORef' (stCamera st) viewProjection 142 (mvp,pos) <- atomicModifyIORef' (stCamera st) viewProjection
140 143
141 {- 144 {-