diff options
author | Joe Crayne <joe@jerkface.net> | 2019-04-08 09:00:03 -0400 |
---|---|---|
committer | Joe Crayne <joe@jerkface.net> | 2019-04-08 09:08:29 -0400 |
commit | fd26f9526d4208359b40c8acbf5693b4bf57a1f6 (patch) | |
tree | f4a2655478221ca54347a05234e740f4c4494e98 /LambdaHello.hs | |
parent | af59e929e402efcdf3b1303559cb216013f526d9 (diff) |
Workaround for using LambdaCube.GL with Gtk.
Diffstat (limited to 'LambdaHello.hs')
-rw-r--r-- | LambdaHello.hs | 41 |
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 | |||
4 | import GI.Gtk as Gtk | 4 | import GI.Gtk as Gtk |
5 | import GI.Gdk.Objects | 5 | import GI.Gdk.Objects |
6 | 6 | ||
7 | -- import qualified Graphics.Rendering.OpenGL as GL | 7 | import qualified Graphics.Rendering.OpenGL as GL |
8 | import Data.Function | 8 | import Data.Function |
9 | import Control.Concurrent | 9 | import Control.Concurrent |
10 | import LambdaCube.GL as LambdaCubeGL | 10 | import LambdaCube.GL as LambdaCubeGL |
@@ -17,7 +17,12 @@ import System.IO.Error | |||
17 | import qualified Data.Map as Map | 17 | import qualified Data.Map as Map |
18 | import qualified Data.Vector as V | 18 | import qualified Data.Vector as V |
19 | 19 | ||
20 | import qualified Backend as RF | 20 | -- import qualified Backend as RF |
21 | import LambdaCube.GL as RF | ||
22 | import LambdaCube.GL.Type | ||
23 | |||
24 | import Control.Monad.IO.Class | ||
25 | import qualified Unsafe.Coerce | ||
21 | 26 | ||
22 | data State = State | 27 | data 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. | ||
46 | fixupRenderTarget :: MonadIO m => GLRenderer -> m GLRenderer | ||
47 | fixupRenderTarget 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 | |||
37 | render :: State -> GLArea -> GLContext -> IO Bool | 58 | render :: State -> GLArea -> GLContext -> IO Bool |
38 | render st w _ = do -- gLAreaMakeCurrent w >> gLAreaGetError w >>= \me -> maybe id (\e _ -> print e >> return False) me $ do | 59 | render 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 | |||
89 | unrealize :: State -> GLArea -> IO () | 118 | unrealize :: State -> GLArea -> IO () |
90 | unrealize _ _ = return () | 119 | unrealize _ _ = return () |
91 | 120 | ||