Created
August 21, 2012 19:29
-
-
Save disolovyov/3418545 to your computer and use it in GitHub Desktop.
Panda Canvas 2 prototyping...
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| 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