HaskellとOpenGLをつかって四角形を描画する

うまく動いたら雛形にでも使ってやってください。



参考サイト
   GLUTによる「手抜き」OpenGL入門
   プログラミング/Haskell/HSDL - Flightless wing


import Graphics.UI.GLUT
import Graphics.Rendering.OpenGL.GLU
import System.Exit
import Data.IORef

--タイマの間隔
timerInterval = 40

main = do 
    --回転の角度を初期化
    rot <- newIORef 0.0
    arg <- newIORef 10.4
    
    --GLUTの初期化
    initialDisplayMode $= [RGBAMode, DoubleBuffered]
    initialWindowSize $= Size 640 480
    initialize "" []

    --ウィンドウを作る
    createWindow "GLUTpractice"

    --表示に使うコールバック関数の指定
    displayCallback $= display rot arg
    
    --ウィンドウのサイズが変更された時に呼ぶコールバック関数の指定
    reshapeCallback $= Just reshape
    
    --キーボードやマウスのコールバック
    keyboardMouseCallback $= Just (keyboardProc arg)
    
    --タイマを作る
    addTimerCallback timerInterval $ timerProc (display rot arg)

    --GLUTのメインループに入る
    mainLoop

display rot arg= do
    --回転させる
    w<-readIORef arg 
    --w <- readIORef hoge
    modifyIORef rot (+w)
    r <- readIORef rot
 
    --背景を黒にする
    clearColor $= Color4 0.0 0.0 0.0 0.0
    clear [ColorBuffer]
    
    --単位行列を読み込む
    loadIdentity
    
    --表示
    currentColor $= Color4 0 0 1 0  -- 描写する直前に色を指定するようだ
    preservingMatrix $ do
        translate (Vector3 100 100 (0::Double))
        rotate r (Vector3 0.0 0.0 1.0 :: Vector3 GLdouble) -- rotate 度数法での角度
        {-- renderPrimitive Quads $ mapM_ vertex [
                    Vertex3 0.10 0.10 0.0,
                    Vertex3 (-0.10) 0.10 0.0,
            Vertex3 (-0.10) (-0.10) 0.0,
            Vertex3 0.10 (-0.10) 0.0 :: Vertex3 GLfloat] --}       
        renderPrimitive Quads $ mapM_ vertex [
                    Vertex3 50 50 0.0,
                    Vertex3 (-50) 50 0.0,
            Vertex3 (-50) (-50) 0.0,
            Vertex3 50 (-50) 0.0 :: Vertex3 GLfloat]
    
    --バッファの入れ替え
    swapBuffers

--タイマが呼ばれるたびにactを繰り返す
timerProc act = do
    act
    addTimerCallback timerInterval $ timerProc act

--ウィンドウのサイズが変更された時の処理
reshape (Size w h)=do
    viewport $= (Position 0 0, (Size w h)) --ウィンドウ全体を使う
    
    --ビューボリュームの設定-
    matrixMode $= Projection
    loadIdentity
    ortho 0.0 640.0 0.0 480.0 (-1000.0) 1000.0
    -- ortho2D 0.0 640.0 0.0 480.0
    
    matrixMode $= Modelview 0 -- これ大事
    
    {- --少し後ろから撮影
    lookAt (Vertex3 0.0 0.0 (600.0)) (Vertex3 0.0 0.0 0.0) (Vector3 0.0 1.0 0.0)
    matrixMode $= Modelview 0 -}
    

--キー入力の処理
keyboardProc arg ch state _ _
    | ch     == Char 'q'    = exitWith ExitSuccess        --qが押されたら終了
    | ch    == Char 'a'     = modifyIORef arg (*(2))
    | ch    == Char 's'     = modifyIORef arg (*(0.5))
    | state    == Down        = modifyIORef arg (*(-1))    --それ以外なら回転の方向を変える
    | otherwise            = return ()