Skip to content

Instantly share code, notes, and snippets.

@disolovyov
Created August 21, 2012 19:29
Show Gist options
  • Select an option

  • Save disolovyov/3418545 to your computer and use it in GitHub Desktop.

Select an option

Save disolovyov/3418545 to your computer and use it in GitHub Desktop.
Panda Canvas 2 prototyping...
import Control.Monad.Writer
import Data.IORef
import Data.List.Zipper (Zipper(..))
import qualified Data.List.Zipper as Zipper
import Graphics.Rendering.OpenGL hiding (flush)
import Graphics.UI.GLUT hiding (flush)
data CanvasAction = PointAction GLfloat GLfloat | FlushAction
type Canvas = Writer [CanvasAction] ()
pixel :: GLfloat -> GLfloat -> Canvas
pixel x y = writer ((), [PointAction x y])
flush :: Canvas
flush = writer ((), [FlushAction])
drawActions :: Zipper CanvasAction -> [(GLfloat, GLfloat)]
drawActions (Zip actions _) =
foldr drawable [] $ reverse actions
where
drawable (PointAction x y) acc = (x, y):acc
drawable FlushAction acc = acc
flushActions :: Zipper CanvasAction -> Zipper CanvasAction
flushActions z = if Zipper.endp z then z
else case Zipper.cursor z of
PointAction x y -> flushActions $ Zipper.right z
FlushAction -> Zipper.right z
draw :: String -> Canvas -> IO ()
draw title canvas = do
getArgsAndInitialize
initialWindowSize $= Size 640 480
initialDisplayMode $= [DoubleBuffered, WithAlphaComponent]
createWindow title
actions <- newIORef $ Zipper.fromList points
displayCallback $= display actions
reshapeCallback $= Just reshape
mainLoop
where
((), points) = runWriter canvas
display :: IORef (Zipper CanvasAction) -> IO ()
display actionsRef = do
clear [ColorBuffer]
actions <- get actionsRef
let flushedActions = flushActions actions
renderPrimitive Points $ mapM_ pointToVertex (drawActions flushedActions)
swapBuffers
actionsRef $= flushedActions
where
pointToVertex (x, y) = vertex $ Vertex3 x y 0
reshape :: Size -> IO ()
reshape size = do
viewport $= (Position 0 0, size)
postRedisplay Nothing
main :: IO ()
main = draw "Hello World" $ do
pixel 0 0
pixel 0 0.25
flush
pixel 0 0.5
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment