packages feed

mischief-render-0.1.0.0: src/Mischief/Render/Time.hs

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 = do
    runWhen
      ( do
          device <- res @RenderDevice
          queue <- res @RenderQueue
          pure $ (,) <$> device <*> queue
      )
      $ \(device, queue) -> do
        x <- createBuffer @TimeData device
        uploadBuffer queue x (TimeData 0)
        insertRes x

    schedule @Update $ systems updateTime

updateTime :: System ()
updateTime = do
  t <- timeMaybe
  case t of
    Nothing -> pure ()
    Just t' -> do
      let t = specToSecs t'.elapsed
      query_ $ do
        queue <- qres @RenderQueue
        buffer <- qres @(Buffer TimeData)
        qlift $ uploadBuffer queue buffer (TimeData t)