module MouseMoveC (mouseMove) where import Graphics.Rendering.OpenGL import Graphics.UI.GLUT import States import Data.IORef ------ passiveMotionCallbackに渡す関数 mouseMove :: (IORef CState) -> Position -> IO() mouseMove cst position = do cst' <- readIORef cst let dCurPos = dCalcPos (cursorPos cst') (Just position) curPos = Just position cst $= (CState curPos dCurPos) ------カーソルのPositionの変化量をmaxノルムで返す dCalcPos :: Maybe Position -> Maybe Position -> GLint dCalcPos Nothing _ = 0 dCalcPos _ Nothing = 0 dCalcPos (Just ( Position x1 y1)) (Just (Position x2 y2)) = max (abs (x1 - x2)) (abs (y1 - y2))