packages feed

accelerate-examples-0.13.0.0: examples/n-body/Gloss/Simulate.hs

{-# LANGUAGE TemplateHaskell #-}

module Gloss.Simulate (

  Simulate(..), simulateWorld, simulateDrawTree, simulatePause,
  initialise, simulate,

) where


import Common.Type
import Common.World

import Data.Label


data Simulate = Simulate
  {
    _simulateWorld      :: {-# UNPACK #-} !World

    -- parameters to control the visualisation
    --
  , _simulateDrawTree   :: !Bool
  , _simulatePause      :: !Bool
  }


-- | Populate the universe with a set of bodies
--
initialise :: World -> Simulate
initialise world
  = Simulate
  {
    _simulateWorld      = world
  , _simulateDrawTree   = False
  , _simulatePause      = False
  }

$(mkLabels [''Simulate])


-- | Advance the simulation state
--
simulate :: (Time -> World -> World) -> Float -> Simulate -> Simulate
simulate advance timeStep state
  | _simulatePause state        = state
  | otherwise                   = modify simulateWorld (advance (realToFrac timeStep)) state