エンジニアのソフトウェア的愛情

または私は如何にして心配するのを止めてプログラムを・愛する・ようになったか

位置を記憶させる

昨日は再表示すると画像が消えてしまっていたけれど、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のせいなんだろうか?

2007/04/27:追記

やっぱりSafariのせいみたいですね。Firefoxで入力できました。