EDIT : En fait, je ne suis plus sûr. Plusieurs versions plus tard, il semble que GLFW ne fonctionne plus dans GHCi sous OS X.
Il s'avère que GLFW+OpenGL remplit ces quatre conditions !
- Vous devez invoquer ghci avec
ghci -framework Carbon
.
- Vous avez besoin de la
EnableGUI.hs
que vous pouvez obtenir ici . Notez que vous ne pouvez pas le charger directement dans GHCi, vous devez d'abord le compiler.
- OpenGL possède un mode de projection 2D où vous pouvez dessiner des lignes et des polygones.
- Les bitmaps peuvent être chargés comme des textures et placés sur des polygones.
Voici un petit exemple qui affiche un bitmap à l'écran. Il y a quelques restrictions sur le bitmap : ses dimensions doivent être une puissance de deux (ici 256) et il doit s'agir d'un fichier de type .tga
(ici "Bitmap.tga"
). Mais comme la transparence est prise en charge, ce n'est pas un gros problème.
Vous devriez être en mesure d'appeler main
plusieurs fois sans problème. Le point essentiel est que vous ne devez pas appeler GLFW.terminate
.
import Graphics.Rendering.OpenGL as GL
import qualified Graphics.UI.GLFW as GLFW
import Graphics.Rendering.OpenGL (($=))
import Control.Monad
import EnableGUI
main = do
enableGUI
GLFW.initialize
-- open window
GLFW.openWindow (GL.Size 400 400) [GLFW.DisplayAlphaBits 8] GLFW.Window
GLFW.windowTitle $= "Bitmap Test"
-- enable alpha channel
GL.blend $= GL.Enabled
GL.blendFunc $= (GL.SrcAlpha, GL.OneMinusSrcAlpha)
-- set the color to clear background
GL.clearColor $= GL.Color4 0.8 0.8 0.8 0
-- set 2D orthogonal view inside windowSizeCallback because
-- any change to the Window size should result in different
-- OpenGL Viewport.
GLFW.windowSizeCallback $= \ size@(GL.Size w h) ->
do
GL.viewport $= (GL.Position 0 0, size)
GL.matrixMode $= GL.Projection
GL.loadIdentity
GL.ortho2D 0 (realToFrac w) (realToFrac h) 0
render <- initialize
loop render
GLFW.closeWindow
loop render = do
-- draw the entire screen
render
-- swap buffer
GLFW.swapBuffers
-- check whether ESC is pressed for termination
p <- GLFW.getKey GLFW.ESC
unless (p == GLFW.Press) $ do
-- sleep for 1ms to yield CPU to other applications
GLFW.sleep 0.001
-- only continue when the window is not closed
windowOpenStatus <- GLFW.getParam GLFW.Opened
unless (windowOpenStatus == False) $
loop render
-- rendering
initialize = do
-- load texture from file
GL.texture GL.Texture2D $= Enabled
[textureName] <- GL.genObjectNames 1
GL.textureBinding GL.Texture2D $= Just textureName
GL.textureFilter GL.Texture2D $= ((GL.Nearest, Nothing), GL.Nearest)
GLFW.loadTexture2D "Bitmap.tga" []
return $ do
GL.clear [GL.ColorBuffer]
GL.renderPrimitive GL.Quads $ do
GL.texCoord $ texCoord2 0 0
GL.vertex $ vertex3 (0) 256 0
GL.texCoord $ texCoord2 0 1
GL.vertex $ vertex3 (0) (0) 0
GL.texCoord $ texCoord2 1 1
GL.vertex $ vertex3 256 (0) 0
GL.texCoord $ texCoord2 1 0
GL.vertex $ vertex3 256 256 0
-- type signatures to avoid ambiguity
vertex3 :: GLfloat -> GLfloat -> GLfloat -> GL.Vertex3 GLfloat
vertex3 = GL.Vertex3
texCoord2 :: GLfloat -> GLfloat -> GL.TexCoord2 GLfloat
texCoord2 = GL.TexCoord2
color3 :: GLfloat -> GLfloat -> GLfloat -> GL.Color3 GLfloat
color3 = GL.Color3
Voici un exemple de bitmap (qu'il faut convertir en .tga
).
0 votes
Il y a évidemment plusieurs candidats : gtk/cairo ; sdl ; opengl ; wx ; qt ; gd ; ... le défi consiste à écrire des programmes de test pour chacun d'entre eux, puis à les tester sur un Mac.
1 votes
Wx est connu pour ne pas fonctionner dans GHCi (problème avec
libstdc++
ou autre). Sdl ne fonctionne pas non plus car il fait de la macro magie avecmain
. J'ai essayé OpenGL et GLFW, mais je peux invoquermain
seulement une fois. C'est le bordel, vraiment. J'envie Python, ils ont réussi à obtenir une liaison Tk qui fonctionne aussi sur le Mac.0 votes
J'ai fait fonctionner OpenVG sur Mac, mais il échoue au point 1. OpenVG n'a pas non plus de support pour le rendu de texte, bien que ce ne soit pas dans les attributions d'OpenVG, c'est un défaut fatal à son adoption. Ce serait bien s'il y avait une liaison Tk maintenue...
0 votes
Pour info, je n'ai pas réussi à faire fonctionner gtk à partir de ghci sous OS X. Je suis cependant assez content pour compiler.
0 votes
@John : Quelle saveur des bibliothèques C de gtk, X11 ou Quartz ?
0 votes
( pour Référence X ) wx : maintenant résolu ghci -fno-ghci-sandbox fonctionne pour moi sur OSX 10.8 , wx 0.90.0.1 merci à Heinrich ! !! : github.com/jodonoghue/wxHaskell/pull/6