diff options
Diffstat (limited to 'LambdaCube/Gtk.hs')
-rw-r--r-- | LambdaCube/Gtk.hs | 25 |
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 @@ | |||
1 | module LambdaCube.Gtk where | ||
2 | |||
3 | import Control.Monad.IO.Class | ||
4 | import qualified Graphics.Rendering.OpenGL as GL | ||
5 | import qualified Unsafe.Coerce | ||
6 | |||
7 | import 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. | ||
14 | fixupRenderTarget :: MonadIO m => GLRenderer -> m GLRenderer | ||
15 | fixupRenderTarget 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 | |||