summaryrefslogtreecommitdiff
path: root/LambdaCube
diff options
context:
space:
mode:
authorJoe Crayne <joe@jerkface.net>2019-04-13 00:51:51 -0400
committerJoe Crayne <joe@jerkface.net>2019-04-13 00:51:51 -0400
commit3899b660b11bf1d3179965ac92a039b8d449306f (patch)
tree9337ae45c733e0dd7237acdc4fd6353a515a20aa /LambdaCube
parent705842f6dbbec605d26cd2d7a167f85d18e8275f (diff)
Switched away from gtk-declarative.
Diffstat (limited to 'LambdaCube')
-rw-r--r--LambdaCube/Gtk.hs25
1 files changed, 25 insertions, 0 deletions
diff --git a/LambdaCube/Gtk.hs b/LambdaCube/Gtk.hs
new file mode 100644
index 0000000..1a9c1b9
--- /dev/null
+++ b/LambdaCube/Gtk.hs
@@ -0,0 +1,25 @@
1module LambdaCube.Gtk where
2
3import Control.Monad.IO.Class
4import qualified Graphics.Rendering.OpenGL as GL
5import qualified Unsafe.Coerce
6
7import LambdaCube.GL.Type
8
9
10-- | LambdaCube.GL assumes we are rendering to the default framebuffer #0 but
11-- Gtk.GLArea actually uses an unpredictable framebuffer object target. As a
12-- workaround, we read the current framebuffer target and patch up the render
13-- commands to use it instead of 0.
14fixupRenderTarget :: MonadIO m => GLRenderer -> m GLRenderer
15fixupRenderTarget r = do
16 fbo0 <- GL.get $ GL.bindFramebuffer GL.DrawFramebuffer
17 let fbo = Unsafe.Coerce.unsafeCoerce fbo0 :: GL.GLuint -- XXX: Is there a better way to get this?
18 setFBO rt | framebufferObject rt == 0 = rt { framebufferObject = fbo }
19 | otherwise = rt
20 updateDC dc = dc { glRenderTarget = rt' } where rt' = setFBO (glRenderTarget dc)
21 update (GLClearRenderTarget rt imgs) = GLClearRenderTarget (setFBO rt) imgs
22 update (GLRenderSlot dc s p) = GLRenderSlot (updateDC dc) s p
23 update (GLRenderStream dc s p) = GLRenderStream (updateDC dc) s p
24 return r { glCommands = map update (glCommands r) }
25