module Mischief.Render.Time where

import Mischief.ECS
import Mischief.ECS.Time (Time (elapsed), elapsed, specToSecs, timeMaybe)
import Mischief.Materials.Time
import Mischief.Render.Buffer
import Mischief.Render.Core

data TimeMaterialPlugin

instance Plugin TimeMaterialPlugin where
  init :: System ()
init = do
    System (Maybe (RenderDevice, RenderQueue))
-> ((RenderDevice, RenderQueue) -> System ()) -> System ()
forall a b.
Typeable a =>
System (Maybe a) -> (a -> System b) -> System ()
runWhen
      ( do
          device <- forall c (m :: * -> *) w.
(MonadSystem w m, Component c) =>
m (Maybe c)
res @RenderDevice
          queue <- res @RenderQueue
          pure $ (,) <$> device <*> queue
      )
      (((RenderDevice, RenderQueue) -> System ()) -> System ())
-> ((RenderDevice, RenderQueue) -> System ()) -> System ()
forall a b. (a -> b) -> a -> b
$ \(RenderDevice
device, RenderQueue
queue) -> do
        x <- forall (a :: * -> *).
Bufferable a =>
RenderDevice -> System (Buffer a)
createBuffer @TimeData RenderDevice
device
        uploadBuffer queue x (TimeData 0)
        insertRes x

    forall sc. Schedule sc => SystemConfig -> System ()
forall {k} (sc :: k). Schedule sc => SystemConfig -> System ()
schedule @Update (SystemConfig -> System ()) -> SystemConfig -> System ()
forall a b. (a -> b) -> a -> b
$ System () -> SystemConfig
forall a. ToSystems a => a -> SystemConfig
systems System ()
updateTime

updateTime :: System ()
updateTime :: System ()
updateTime = do
  t <- System (Maybe Time)
forall w (m :: * -> *). MonadSystem w m => m (Maybe Time)
timeMaybe
  case t of
    Maybe Time
Nothing -> () -> System ()
forall a. a -> System a
forall (f :: * -> *) a. Applicative f => a -> f a
pure ()
    Just Time
t' -> do
      let t :: Float
t = TimeSpec -> Float
specToSecs Time
t'.elapsed
      Query System () -> System ()
forall w (m :: * -> *) out. MonadSystem w m => Query m out -> m ()
query_ (Query System () -> System ()) -> Query System () -> System ()
forall a b. (a -> b) -> a -> b
$ do
        queue <- forall c (m :: * -> *) w.
(MonadSystem w m, Component c) =>
Query m c
qres @RenderQueue
        buffer <- qres @(Buffer TimeData)
        qlift $ uploadBuffer queue buffer (TimeData t)