summaryrefslogtreecommitdiff
path: root/LambdaHello.hs
diff options
context:
space:
mode:
authorJoe Crayne <joe@jerkface.net>2019-04-08 09:00:03 -0400
committerJoe Crayne <joe@jerkface.net>2019-04-08 09:08:29 -0400
commitfd26f9526d4208359b40c8acbf5693b4bf57a1f6 (patch)
treef4a2655478221ca54347a05234e740f4c4494e98 /LambdaHello.hs
parentaf59e929e402efcdf3b1303559cb216013f526d9 (diff)
Workaround for using LambdaCube.GL with Gtk.
Diffstat (limited to 'LambdaHello.hs')
-rw-r--r--LambdaHello.hs41
1 files changed, 35 insertions, 6 deletions
diff --git a/LambdaHello.hs b/LambdaHello.hs
index ed04598..3c15a12 100644
--- a/LambdaHello.hs
+++ b/LambdaHello.hs
@@ -4,7 +4,7 @@ module LambdaHello where
4import GI.Gtk as Gtk 4import GI.Gtk as Gtk
5import GI.Gdk.Objects 5import GI.Gdk.Objects
6 6
7-- import qualified Graphics.Rendering.OpenGL as GL 7import qualified Graphics.Rendering.OpenGL as GL
8import Data.Function 8import Data.Function
9import Control.Concurrent 9import Control.Concurrent
10import LambdaCube.GL as LambdaCubeGL 10import LambdaCube.GL as LambdaCubeGL
@@ -17,7 +17,12 @@ import System.IO.Error
17import qualified Data.Map as Map 17import qualified Data.Map as Map
18import qualified Data.Vector as V 18import qualified Data.Vector as V
19 19
20import qualified Backend as RF 20-- import qualified Backend as RF
21import LambdaCube.GL as RF
22import LambdaCube.GL.Type
23
24import Control.Monad.IO.Class
25import qualified Unsafe.Coerce
21 26
22data State = State 27data State = State
23 { stConfig :: Config 28 { stConfig :: Config
@@ -34,13 +39,36 @@ initState = do
34 } 39 }
35 40
36 41
42-- | LambdaCube.GL assumes we are rendering to the default framebuffer #0 but
43-- Gtk.GLArea actually uses an unpredictable framebuffer object target. As a
44-- workaround, we read the current framebuffer target and patch up the render
45-- commands to use it instead of 0.
46fixupRenderTarget :: MonadIO m => GLRenderer -> m GLRenderer
47fixupRenderTarget r = do
48 fbo0 <- GL.get $ GL.bindFramebuffer GL.DrawFramebuffer
49 let fbo = Unsafe.Coerce.unsafeCoerce fbo0 :: GL.GLuint -- XXX: Is there a better way to get this?
50 setFBO rt | framebufferObject rt == 0 = rt { framebufferObject = fbo }
51 | otherwise = rt
52 updateDC dc = dc { glRenderTarget = rt' } where rt' = setFBO (glRenderTarget dc)
53 update (GLClearRenderTarget rt imgs) = GLClearRenderTarget (setFBO rt) imgs
54 update (GLRenderSlot dc s p) = GLRenderSlot (updateDC dc) s p
55 update (GLRenderStream dc s p) = GLRenderStream (updateDC dc) s p
56 return r { glCommands = map update (glCommands r) }
57
37render :: State -> GLArea -> GLContext -> IO Bool 58render :: State -> GLArea -> GLContext -> IO Bool
38render st w _ = do -- gLAreaMakeCurrent w >> gLAreaGetError w >>= \me -> maybe id (\e _ -> print e >> return False) me $ do 59render st w gl = do
39 mr <- tryTakeMVar (stRealized st) 60 mr <- tryTakeMVar (stRealized st)
40 maybe (\_ -> putStrLn "Not realized!") (&) mr $ \r -> do 61 maybe (\_ -> putStrLn "Not realized!") (&) mr $ \r -> do
62 renderer <- fixupRenderTarget (rRenderer r)
63
41 -- Load input to pipeline. 64 -- Load input to pipeline.
42 -- GLFW.getWindowSize win >>= \(w,h) -> LambdaCubeGL.setScreenSize storage (fromIntegral w) (fromIntegral h) 65 -- GLFW.getWindowSize win >>= \(w,h) -> LambdaCubeGL.setScreenSize storage (fromIntegral w) (fromIntegral h)
43 return (500,500) >>= \(w,h) -> LambdaCubeGL.setScreenSize (rStorage r) (fromIntegral w) (fromIntegral h) 66 (wd,ht) <- do Just win <- getGLContextWindow gl
67 wd <- windowGetWidth win
68 ht <- windowGetHeight win
69 -- print (wd,ht)
70 return (fromIntegral wd,fromIntegral ht)
71 LambdaCubeGL.setScreenSize (rStorage r) wd ht
44 LambdaCubeGL.updateUniforms (rStorage r) $ do 72 LambdaCubeGL.updateUniforms (rStorage r) $ do
45 "diffuseTexture" @= return (rTexture r) 73 "diffuseTexture" @= return (rTexture r)
46 "time" @= do 74 "time" @= do
@@ -48,10 +76,10 @@ render st w _ = do -- gLAreaMakeCurrent w >> gLAreaGetError w >>= \me -> maybe i
48 let t = 1.0 :: Double 76 let t = 1.0 :: Double
49 return (realToFrac t :: Float) 77 return (realToFrac t :: Float)
50 78
51 putStrLn "render!" 79 -- putStrLn "render!"
52 -- GL.clearColor GL.$= GL.Color4 0 255 0 1 80 -- GL.clearColor GL.$= GL.Color4 0 255 0 1
53 -- GL.clear [GL.ColorBuffer] 81 -- GL.clear [GL.ColorBuffer]
54 RF.renderFrame (rRenderer r) 82 RF.renderFrame renderer
55 -- GL.flush 83 -- GL.flush
56 putMVar (stRealized st) r 84 putMVar (stRealized st) r
57 return True 85 return True
@@ -86,6 +114,7 @@ realize st w = gLAreaMakeCurrent w >> gLAreaGetError w >>= \me -> maybe id (\e _
86 putStrLn "realize!" 114 putStrLn "realize!"
87 maybe id (\e _ -> putStrLn e) compat $ return () 115 maybe id (\e _ -> putStrLn e) compat $ return ()
88 116
117
89unrealize :: State -> GLArea -> IO () 118unrealize :: State -> GLArea -> IO ()
90unrealize _ _ = return () 119unrealize _ _ = return ()
91 120