昨日は再表示すると画像が消えてしまっていたけれど、IORefを使ってポイントを覚えさせておいて、再表示のときに全てのポイントを再描画させることに成功。
細かいところがいろいろ変わっているけれど気にせずに。
import Graphics.UI.GLUT import Control.Exception import System.Exit import Data.IORef main = do getArgsAndInitialize createWindow "Sample" points <- newIORef [] initialDisplayMode $= [RGBAMode] displayCallback $= display points keyboardMouseCallback $= Just (keyboardMouse points) clearColor $= Color4 0.0 0.0 1.0 1.0 mainLoop display points = do clear [ColorBuffer] ps <- readIORef points mapM_ drawPoint ps flush keyboardMouse points key keystate modifiers position = do case (key, keystate, position) of (MouseButton LeftButton, Down, Position x y) -> do (pos, Size width height) <- get viewport let x' = (fromIntegral $ x * 2 - width) / fromIntegral width let y' = (fromIntegral $ y * (-2) + height) / fromIntegral height drawPoint (x', y') flush modifyIORef points (\ps -> (x', y'):ps) (Char 'q', _, _) -> throwIO $ ExitException ExitSuccess (_, _, _) -> return () drawPoint (x, y) = renderPrimitive Polygon $ mapM_ vertex [ Vertex3 (-0.07 + x) (-0.07 + y) 0.0, Vertex3 ( 0.00 + x) (-0.10 + y) 0.0, Vertex3 ( 0.07 + x) (-0.07 + y) 0.0, Vertex3 ( 0.10 + x) ( 0.00 + y) 0.0, Vertex3 ( 0.07 + x) ( 0.07 + y) 0.0, Vertex3 ( 0.00 + x) ( 0.10 + y) 0.0, Vertex3 (-0.07 + x) ( 0.07 + y) 0.0, Vertex3 (-0.10 + x) ( 0.00 + y) (0.0 :: GLfloat) ]
2007/04/25:ちょっと訂正
うすうす気がついていたのだけれど、これだと再表示した時に描画順が逆になってしまう(今は同じ色だからばれないけど)。
modifyIORef points (\ps -> (x', y'):ps)
ちゃんと後ろに追加するようにしないといけませんね。
modifyIORef points (\ps -> ps ++ [(x', y')])
しかし…「¥」が入力できない(?になってしまう)のはSafariのせいなんだろうか?