{-# OPTIONS_HADDOCK hide #-}

module Graphics.Gloss.Internals.Interface.Animate.State
        ( State (..) 
        , stateInit )
where

-- | Animation State
data State
        = State
        {
        -- | Whether the animation is running.
          stateAnimate                  :: !Bool

        -- | How many times we've entered the animation loop.
        , stateAnimateCount             :: !Integer

        -- | Whether this is the first frame of the animation.
        , stateAnimateStart             :: !Bool

        -- | Number of msec the animation has been running for
        , stateAnimateTime              :: !Double

        -- | The time when we entered the display callback for the current frame.
        , stateDisplayTime              :: !Double
        , stateDisplayTimeLast          :: !Double

        -- | Clamp the minimum time between frames to this value (in seconds)
        --      Setting this to < 10ms probably isn't worthwhile.
        , stateDisplayTimeClamp         :: !Double
                                                        
        -- | The time when the last call to the users render function finished.
        , stateGateTimeStart            :: !Double

        -- | The time when displayInWindow last finished (after sleeping to clamp fps).
        , stateGateTimeEnd              :: !Double
        
        -- | How long it took to draw this frame
        , stateGateTimeElapsed          :: !Double }


stateInit :: State
stateInit
        = State
        { stateAnimate                  = True
        , stateAnimateCount             = 0
        , stateAnimateStart             = True
        , stateAnimateTime              = 0
        , stateDisplayTime              = 0
        , stateDisplayTimeLast          = 0 
        , stateDisplayTimeClamp         = 0.01
        , stateGateTimeStart            = 0
        , stateGateTimeEnd              = 0 
        , stateGateTimeElapsed          = 0 }