module Stage.Loader.Scene
( Process
, spawn
) where
import RIO
import Geomancy.Transform qualified as Transform
import Engine.Camera qualified as Camera
import Engine.Worker qualified as Worker
import Render.DescSets.Set0 (Scene(..), emptyScene)
type Process = Worker.Merge Scene
spawn
:: ( MonadUnliftIO m
, Worker.HasOutput projection
, Worker.GetOutput projection ~ Camera.Projection
)
=> projection
-> m Process
spawn :: projection -> m Process
spawn = (GetOutput projection -> Scene) -> projection -> m Process
forall (m :: * -> *) i o.
(MonadUnliftIO m, HasOutput i) =>
(GetOutput i -> o) -> i -> m (Merge o)
Worker.spawnMerge1 GetOutput projection -> Scene
Projection -> Scene
mkScene
mkScene :: Camera.Projection -> Scene
mkScene :: Projection -> Scene
mkScene Camera.Projection{Transform
$sel:projectionPerspective:Projection :: Projection -> Transform
$sel:projectionOrthoUI:Projection :: Projection -> Transform
projectionOrthoUI :: Transform
projectionPerspective :: Transform
..} =
Scene
emptyScene
{ $sel:sceneProjection:Scene :: Transform
sceneProjection = Transform
projectionOrthoUI
, $sel:sceneInvProjection:Scene :: Transform
sceneInvProjection = Transform -> Transform
forall a. (Coercible Mat4 a, Coercible Mat4 a) => a -> a
Transform.inverse Transform
projectionOrthoUI
}