packages feed

mischief-ecs-0.1.0.0: src/Mischief/ECS/Time.hs

module Mischief.ECS.Time where

import Control.Monad.IO.Class
import GHC.Records (HasField (getField))
import Mischief.ECS.App
import Mischief.ECS.App.Plugins
import Mischief.ECS.App.Schedules
import Mischief.ECS.Components
import Mischief.ECS.Resources
import Mischief.ECS.Systems qualified as Systems
import Mischief.ECS.Tables
import Mischief.ECS.Utils
import Mischief.ECS.World
import Mischief.ECS.World.Insert
import Mischief.ECS.World.Modify
import Mischief.ECS.World.Query
import Mischief.ECS.World.Query.Queryable
import System.Clock

data Time = Time
  { delta :: TimeSpec,
    elapsed :: TimeSpec
  }
  deriving (Show, Component)

time :: System Time
time = unwrap <$> res @Time

deltaTime :: System Float
deltaTime = deltaSecs <$> time

deltaSecs :: Time -> Float
deltaSecs Time {delta} = fromIntegral delta.sec + fromIntegral delta.nsec / 1000000000

data TimePlugin = TimePlugin deriving (Eq)

instance Plugin TimePlugin where
  init _ = do
    currentTime <- liftIO $ getTime Monotonic
    insertRes $ Time {delta = TimeSpec {sec = 0, nsec = 0}, elapsed = currentTime}
    Systems.add First updateTime

updateTime :: System ()
updateTime = do
  Just time <- res @Time
  currentTime <- liftIO $ getTime Monotonic
  insertRes Time {delta = currentTime - time.elapsed, elapsed = currentTime}