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)