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 -- FIXME: move to cell output
    }