
robert dockins wrote:
yin wrote:
Hello all!
I'm doing a 3D simulation. Now I need something like variables in imperative languages. My mainLoop check for new events and renders scene.
Then you want IORef. http://www.haskell.org/ghc/docs/latest/html/libraries/base/Data.IORef.html
Consider, however, that this kind of construct can be done without mutable variables. (warning, made-up code ahead)
main = loop 0 0 0 -- initial values where loop loop_num xpos ypos = do e <- pollEvent let xpos' = <calculate new xpos> ypos' = <calculate new ypos> someActionInvolvingPosition xpos' ypos' when breakCondition (return ()) loop (loop_num+1) xpos' ypos'
I saw it. The problem is, I need an amount of 100*X of mutable variables to implement the system (camera position, rotation, aceleration, ..., position and deformetion infomations for every object, ..., renderer situations [like temprary fading and other efects], ... and more) I tried something like this: main = withInit [InitVideo] $ do progname <- getProgName createAWindow progname mainLoop 0 mainLoop :: Int -> IO () mainLoop ll = do event <- pollEvent quit <- case event of VideoResize w h -> resizeGLScene w h >> return False KeyDown (Keysym SDLK_q _ _) -> return True Quit -> return True _ -> drawGLScreen ((fromIntegral ll) / 10) >> return False when (not quit) (mainLoop (ll + 1)) drawGLScreen :: Double -> IO () drawGLScreen = do clear [ColorBuffer,DepthBuffer] loadIdentity translate $ (\(x,y,z) -> Vector3 x y z) getCameraPos rotate blah, blah, ... renderPrimitive Polygon $ mapM_ (\(x,y,z) -> vertex$Vertex3 x y z) polygonPoints glSwapBuffers getCameraPos :: (GLfloat, GLfloat, GLfloat) getCameraPos = readIORef refCameraPos setCameraPos :: (GLfloat, GLfloat, GLfloat) -> IO () setCameraPos (a, b, c) = writeIORef refCameraPos (a, b, c) And there si the problem - how to initialize refCameraPos with newIORef, and then using it. If I write "refCameraPos = newIORef (0, 0, 0)" it will initialize new IORef every time. I need Just persistent, mutualy variable. I was covered on this list , but I've deleted the messages. Matej 'Yin' Gagyi