{- |
  All the provided render passes and pipelines packaged and delivered.
-}

module Render.Basic where

import RIO

import Control.Monad.Trans.Resource (ResourceT)
import Data.Tagged (Tagged(..))
import RIO.Vector.Partial as Vector (headM)
import Vulkan.Core10 qualified as Vk
import Vulkan.Zero (Zero(..))

-- keid-core

import Engine.Types (StageRIO)
import Engine.Types qualified as Engine
import Engine.Vulkan.Pipeline qualified as Pipeline
import Engine.Vulkan.Swapchain qualified as Swapchain
import Engine.Vulkan.Types (DsBindings, HasSwapchain, HasVulkan, RenderPass(..))

-- keid-render-basic

import Render.Debug.Pipeline qualified as Debug
import Render.DepthOnly.Pipeline qualified as DepthOnly
import Render.DescSets.Set0 (Scene)
import Render.DescSets.Set0 qualified as Scene
import Render.DescSets.Sun (Sun)
import Render.DescSets.Sun qualified as Sun
import Render.Font.EvanwSdf.Pipeline qualified as EvanwSdf
import Render.ForwardMsaa (ForwardMsaa)
import Render.ForwardMsaa qualified as ForwardMsaa
import Render.Lit.Colored.Pipeline qualified as LitColored
import Render.Lit.Material.Pipeline qualified as LitMaterial
import Render.Lit.Textured.Pipeline qualified as LitTextured
import Render.Samplers qualified as Samplers
import Render.ShadowMap.Pipeline qualified as ShadowPipe
import Render.ShadowMap.RenderPass (ShadowMap)
import Render.ShadowMap.RenderPass qualified as ShadowPass
import Render.Skybox.Pipeline qualified as Skybox
import Render.Unlit.Colored.Pipeline qualified as UnlitColored
import Render.Unlit.Sprite.Pipeline qualified as UnlitSprite
import Render.Unlit.Textured.Pipeline qualified as UnlitTextured
import Render.Unlit.TileMap.Pipeline qualified as UnlitTileMap

type Stage = Engine.Stage RenderPasses Pipelines
type Frame = Engine.Frame RenderPasses Pipelines
type StageFrameRIO r s a = Engine.StageFrameRIO RenderPasses Pipelines r s a

data RenderPasses = RenderPasses
  { RenderPasses -> ForwardMsaa
rpForwardMsaa :: ForwardMsaa
  , RenderPasses -> ShadowMap
rpShadowPass  :: ShadowMap
  }

instance RenderPass RenderPasses where
  updateRenderpass :: forall env swapchain.
(HasLogFunc env, HasSwapchain swapchain, HasVulkan env,
 MonadResource (RIO env)) =>
swapchain -> RenderPasses -> RIO env RenderPasses
updateRenderpass swapchain
swapchain RenderPasses{ForwardMsaa
ShadowMap
rpShadowPass :: ShadowMap
rpForwardMsaa :: ForwardMsaa
$sel:rpShadowPass:RenderPasses :: RenderPasses -> ShadowMap
$sel:rpForwardMsaa:RenderPasses :: RenderPasses -> ForwardMsaa
..} = ForwardMsaa -> ShadowMap -> RenderPasses
RenderPasses
    (ForwardMsaa -> ShadowMap -> RenderPasses)
-> RIO env ForwardMsaa -> RIO env (ShadowMap -> RenderPasses)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> swapchain -> ForwardMsaa -> RIO env ForwardMsaa
forall (m :: * -> *) env swapchain.
(MonadResource m, MonadVulkan env m, HasLogFunc env,
 HasSwapchain swapchain) =>
swapchain -> ForwardMsaa -> m ForwardMsaa
ForwardMsaa.updateMsaa swapchain
swapchain ForwardMsaa
rpForwardMsaa
    RIO env (ShadowMap -> RenderPasses)
-> RIO env ShadowMap -> RIO env RenderPasses
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> ShadowMap -> RIO env ShadowMap
forall (f :: * -> *) a. Applicative f => a -> f a
pure ShadowMap
rpShadowPass -- XXX: not a screen pass

  refcountRenderpass :: forall env. MonadResource (RIO env) => RenderPasses -> RIO env ()
refcountRenderpass RenderPasses{ForwardMsaa
ShadowMap
rpShadowPass :: ShadowMap
rpForwardMsaa :: ForwardMsaa
$sel:rpShadowPass:RenderPasses :: RenderPasses -> ShadowMap
$sel:rpForwardMsaa:RenderPasses :: RenderPasses -> ForwardMsaa
..} = do
    ForwardMsaa -> RIO env ()
forall a env.
(RenderPass a, MonadResource (RIO env)) =>
a -> RIO env ()
refcountRenderpass ForwardMsaa
rpForwardMsaa
    ShadowMap -> RIO env ()
forall a env.
(RenderPass a, MonadResource (RIO env)) =>
a -> RIO env ()
refcountRenderpass ShadowMap
rpShadowPass

data Settings = Settings
  { Settings -> Word32
sShadowSize   :: Word32
  , Settings -> Word32
sShadowLayers :: Word32
  }
  deriving (Settings -> Settings -> Bool
(Settings -> Settings -> Bool)
-> (Settings -> Settings -> Bool) -> Eq Settings
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: Settings -> Settings -> Bool
$c/= :: Settings -> Settings -> Bool
== :: Settings -> Settings -> Bool
$c== :: Settings -> Settings -> Bool
Eq, Int -> Settings -> ShowS
[Settings] -> ShowS
Settings -> String
(Int -> Settings -> ShowS)
-> (Settings -> String) -> ([Settings] -> ShowS) -> Show Settings
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [Settings] -> ShowS
$cshowList :: [Settings] -> ShowS
show :: Settings -> String
$cshow :: Settings -> String
showsPrec :: Int -> Settings -> ShowS
$cshowsPrec :: Int -> Settings -> ShowS
Show)

instance Zero Settings where
  zero :: Settings
zero = Settings :: Word32 -> Word32 -> Settings
Settings
    -- XXX: 1x1 placeholder image
    { $sel:sShadowSize:Settings :: Word32
sShadowSize   = Word32
1
    , $sel:sShadowLayers:Settings :: Word32
sShadowLayers = Word32
1
    }

allocate
  :: ( HasSwapchain swapchain
     , HasLogFunc env
     , HasVulkan env
     )
  => Settings
  -> swapchain
  -> ResourceT (RIO env) RenderPasses
allocate :: forall swapchain env.
(HasSwapchain swapchain, HasLogFunc env, HasVulkan env) =>
Settings -> swapchain -> ResourceT (RIO env) RenderPasses
allocate Settings{Word32
sShadowLayers :: Word32
sShadowSize :: Word32
$sel:sShadowLayers:Settings :: Settings -> Word32
$sel:sShadowSize:Settings :: Settings -> Word32
..} swapchain
swapchain = do
  ForwardMsaa
rpForwardMsaa <- swapchain -> ResourceT (RIO env) ForwardMsaa
forall (m :: * -> *) env swapchain.
(MonadResource m, MonadVulkan env m, HasLogFunc env,
 HasSwapchain swapchain) =>
swapchain -> m ForwardMsaa
ForwardMsaa.allocateMsaa swapchain
swapchain

  ShadowMap
rpShadowPass <- swapchain -> Word32 -> Word32 -> ResourceT (RIO env) ShadowMap
forall (m :: * -> *) env context.
(MonadResource m, MonadVulkan env m, HasLogFunc env,
 HasSwapchain context) =>
context -> Word32 -> Word32 -> m ShadowMap
ShadowPass.allocate
    swapchain
swapchain
    Word32
sShadowSize
    Word32
sShadowLayers

  pure RenderPasses :: ForwardMsaa -> ShadowMap -> RenderPasses
RenderPasses{ForwardMsaa
ShadowMap
rpShadowPass :: ShadowMap
rpForwardMsaa :: ForwardMsaa
$sel:rpShadowPass:RenderPasses :: ShadowMap
$sel:rpForwardMsaa:RenderPasses :: ForwardMsaa
..}

allocate_
  :: ( HasSwapchain swapchain
     , HasLogFunc env
     , HasVulkan env
     )
  => swapchain
  -> ResourceT (RIO env) RenderPasses
allocate_ :: forall swapchain env.
(HasSwapchain swapchain, HasLogFunc env, HasVulkan env) =>
swapchain -> ResourceT (RIO env) RenderPasses
allocate_ = Settings -> swapchain -> ResourceT (RIO env) RenderPasses
forall swapchain env.
(HasSwapchain swapchain, HasLogFunc env, HasVulkan env) =>
Settings -> swapchain -> ResourceT (RIO env) RenderPasses
allocate Settings
forall a. Zero a => a
zero

data Pipelines = Pipelines
  { Pipelines -> SampleCountFlagBits
pMSAA       :: Vk.SampleCountFlagBits
  , Pipelines -> Tagged Scene DsBindings
pSceneBinds :: Tagged Scene DsBindings

  , Pipelines -> Pipeline
pEvanwSdf :: EvanwSdf.Pipeline
  , Pipelines -> Pipeline
pSkybox   :: Skybox.Pipeline

  , Pipelines -> Pipeline
pDebugUV      :: Debug.Pipeline
  , Pipelines -> Pipeline
pDebugTexture :: Debug.Pipeline
  , Pipelines -> Pipeline
pDebugShadow  :: Debug.Pipeline

  , Pipelines -> Pipeline
pDepthOnly :: DepthOnly.Pipeline

  , Pipelines -> Pipeline
pLitColored       :: LitColored.Pipeline
  , Pipelines -> Pipeline
pLitColoredBlend  :: LitColored.Pipeline
  , Pipelines -> Pipeline
pLitMaterial      :: LitMaterial.Pipeline
  , Pipelines -> Pipeline
pLitMaterialBlend :: LitMaterial.Pipeline
  , Pipelines -> Pipeline
pLitTextured      :: LitTextured.Pipeline
  , Pipelines -> Pipeline
pLitTexturedBlend :: LitTextured.Pipeline

  , Pipelines -> Pipeline
pUnlitColored        :: UnlitColored.Pipeline
  , Pipelines -> Pipeline
pUnlitColoredNoDepth :: UnlitColored.Pipeline
  , Pipelines -> Pipeline
pUnlitTextured       :: UnlitTextured.Pipeline
  , Pipelines -> Pipeline
pUnlitTexturedBlend  :: UnlitTextured.Pipeline

  , Pipelines -> Pipeline
pSprite              :: UnlitSprite.Pipeline
  , Pipelines -> Pipeline
pSpriteOutline       :: UnlitSprite.Pipeline
  , Pipelines -> Pipeline
pTileMap             :: UnlitTileMap.Pipeline
  , Pipelines -> Pipeline
pTileMapBlend        :: UnlitTileMap.Pipeline
  , Pipelines -> Pipeline
pWireframe           :: UnlitColored.Pipeline
  , Pipelines -> Pipeline
pWireframeNoDepth    :: UnlitColored.Pipeline

  , Pipelines -> Pipeline
pShadowCast :: ShadowPipe.Pipeline
  }

allocatePipelines_
  :: HasSwapchain swapchain
  => swapchain
  -> RenderPasses
  -> ResourceT (StageRIO st) Pipelines
allocatePipelines_ :: forall swapchain st.
HasSwapchain swapchain =>
swapchain -> RenderPasses -> ResourceT (StageRIO st) Pipelines
allocatePipelines_ swapchain
swapchain RenderPasses
renderpasses = do
  (ReleaseKey
_, Collection Sampler
samplers) <- ("max anisotropy" ::: Float)
-> ResourceT (StageRIO st) (ReleaseKey, Collection Sampler)
forall env (m :: * -> *).
(MonadVulkan env m, MonadResource m) =>
("max anisotropy" ::: Float) -> m (ReleaseKey, Collection Sampler)
Samplers.allocate
    (swapchain -> "max anisotropy" ::: Float
forall a. HasSwapchain a => a -> "max anisotropy" ::: Float
Swapchain.getAnisotropy swapchain
swapchain)

  Tagged Scene DsBindings
-> SampleCountFlagBits
-> RenderPasses
-> ResourceT (StageRIO st) Pipelines
forall st.
Tagged Scene DsBindings
-> SampleCountFlagBits
-> RenderPasses
-> ResourceT (StageRIO st) Pipelines
allocatePipelines
    (Collection Sampler
-> Maybe Any -> Maybe Any -> Word32 -> Tagged Scene DsBindings
forall (samplers :: * -> *) (textures :: * -> *)
       (cubemaps :: * -> *) a b.
(Foldable samplers, Foldable textures, Foldable cubemaps) =>
samplers Sampler
-> textures a -> cubemaps b -> Word32 -> Tagged Scene DsBindings
Scene.mkBindings Collection Sampler
samplers Maybe Any
forall a. Maybe a
Nothing Maybe Any
forall a. Maybe a
Nothing Word32
0)
    (swapchain -> SampleCountFlagBits
forall a. HasSwapchain a => a -> SampleCountFlagBits
Swapchain.getMultisample swapchain
swapchain)
    RenderPasses
renderpasses

allocatePipelines
  :: Tagged Scene DsBindings
  -> Vk.SampleCountFlagBits
  -> RenderPasses
  -> ResourceT (StageRIO st) Pipelines
allocatePipelines :: forall st.
Tagged Scene DsBindings
-> SampleCountFlagBits
-> RenderPasses
-> ResourceT (StageRIO st) Pipelines
allocatePipelines Tagged Scene DsBindings
pSceneBinds SampleCountFlagBits
pMSAA RenderPasses{ForwardMsaa
ShadowMap
rpShadowPass :: ShadowMap
rpForwardMsaa :: ForwardMsaa
$sel:rpShadowPass:RenderPasses :: RenderPasses -> ShadowMap
$sel:rpForwardMsaa:RenderPasses :: RenderPasses -> ForwardMsaa
..} = do
  Pipeline
pDebugUV      <- Mode
-> SampleCountFlagBits
-> Tagged Scene DsBindings
-> ForwardMsaa
-> ResourceT (StageRIO st) Pipeline
forall env renderpass.
(HasVulkan env, HasRenderPass renderpass) =>
Mode
-> SampleCountFlagBits
-> Tagged Scene DsBindings
-> renderpass
-> ResourceT (RIO env) Pipeline
Debug.allocate Mode
Debug.UV         SampleCountFlagBits
pMSAA Tagged Scene DsBindings
pSceneBinds ForwardMsaa
rpForwardMsaa
  Pipeline
pDebugTexture <- Mode
-> SampleCountFlagBits
-> Tagged Scene DsBindings
-> ForwardMsaa
-> ResourceT (StageRIO st) Pipeline
forall env renderpass.
(HasVulkan env, HasRenderPass renderpass) =>
Mode
-> SampleCountFlagBits
-> Tagged Scene DsBindings
-> renderpass
-> ResourceT (RIO env) Pipeline
Debug.allocate Mode
Debug.Texture    SampleCountFlagBits
pMSAA Tagged Scene DsBindings
pSceneBinds ForwardMsaa
rpForwardMsaa
  Pipeline
pDebugShadow  <- Mode
-> SampleCountFlagBits
-> Tagged Scene DsBindings
-> ForwardMsaa
-> ResourceT (StageRIO st) Pipeline
forall env renderpass.
(HasVulkan env, HasRenderPass renderpass) =>
Mode
-> SampleCountFlagBits
-> Tagged Scene DsBindings
-> renderpass
-> ResourceT (RIO env) Pipeline
Debug.allocate (Word32 -> Mode
Debug.Shadow Word32
1) SampleCountFlagBits
pMSAA Tagged Scene DsBindings
pSceneBinds ForwardMsaa
rpForwardMsaa

  Pipeline
pEvanwSdf <- SampleCountFlagBits
-> Tagged Scene DsBindings
-> ForwardMsaa
-> ResourceT (StageRIO st) Pipeline
forall env renderpass.
(HasVulkan env, HasRenderPass renderpass) =>
SampleCountFlagBits
-> Tagged Scene DsBindings
-> renderpass
-> ResourceT (RIO env) Pipeline
EvanwSdf.allocate SampleCountFlagBits
pMSAA Tagged Scene DsBindings
pSceneBinds ForwardMsaa
rpForwardMsaa
  Pipeline
pSkybox   <- SampleCountFlagBits
-> Tagged Scene DsBindings
-> ForwardMsaa
-> ResourceT (StageRIO st) Pipeline
forall env renderpass.
(HasVulkan env, HasRenderPass renderpass) =>
SampleCountFlagBits
-> Tagged Scene DsBindings
-> renderpass
-> ResourceT (RIO env) Pipeline
Skybox.allocate SampleCountFlagBits
pMSAA Tagged Scene DsBindings
pSceneBinds ForwardMsaa
rpForwardMsaa

  Pipeline
pDepthOnly <- SampleCountFlagBits
-> Tagged Scene DsBindings
-> ForwardMsaa
-> ResourceT (StageRIO st) Pipeline
forall env renderpass.
(HasVulkan env, HasRenderPass renderpass) =>
SampleCountFlagBits
-> Tagged Scene DsBindings
-> renderpass
-> ResourceT (RIO env) Pipeline
DepthOnly.allocate SampleCountFlagBits
pMSAA Tagged Scene DsBindings
pSceneBinds ForwardMsaa
rpForwardMsaa

  Pipeline
pLitColored       <- SampleCountFlagBits
-> Tagged Scene DsBindings
-> ForwardMsaa
-> ResourceT (StageRIO st) Pipeline
forall env renderpass.
(HasVulkan env, HasRenderPass renderpass) =>
SampleCountFlagBits
-> Tagged Scene DsBindings
-> renderpass
-> ResourceT (RIO env) Pipeline
LitColored.allocate SampleCountFlagBits
pMSAA Tagged Scene DsBindings
pSceneBinds ForwardMsaa
rpForwardMsaa
  Pipeline
pLitColoredBlend  <- SampleCountFlagBits
-> Tagged Scene DsBindings
-> ForwardMsaa
-> ResourceT (StageRIO st) Pipeline
forall env renderpass.
(HasVulkan env, HasRenderPass renderpass) =>
SampleCountFlagBits
-> Tagged Scene DsBindings
-> renderpass
-> ResourceT (RIO env) Pipeline
LitColored.allocateBlend SampleCountFlagBits
pMSAA Tagged Scene DsBindings
pSceneBinds ForwardMsaa
rpForwardMsaa
  Pipeline
pLitMaterial      <- SampleCountFlagBits
-> Tagged Scene DsBindings
-> ForwardMsaa
-> ResourceT (StageRIO st) Pipeline
forall env renderpass.
(HasVulkan env, HasRenderPass renderpass) =>
SampleCountFlagBits
-> Tagged Scene DsBindings
-> renderpass
-> ResourceT (RIO env) Pipeline
LitMaterial.allocate SampleCountFlagBits
pMSAA Tagged Scene DsBindings
pSceneBinds ForwardMsaa
rpForwardMsaa
  Pipeline
pLitMaterialBlend <- SampleCountFlagBits
-> Tagged Scene DsBindings
-> ForwardMsaa
-> ResourceT (StageRIO st) Pipeline
forall env renderpass.
(HasVulkan env, HasRenderPass renderpass) =>
SampleCountFlagBits
-> Tagged Scene DsBindings
-> renderpass
-> ResourceT (RIO env) Pipeline
LitMaterial.allocateBlend SampleCountFlagBits
pMSAA Tagged Scene DsBindings
pSceneBinds ForwardMsaa
rpForwardMsaa
  Pipeline
pLitTextured      <- SampleCountFlagBits
-> Tagged Scene DsBindings
-> ForwardMsaa
-> ResourceT (StageRIO st) Pipeline
forall env renderpass.
(HasVulkan env, HasRenderPass renderpass) =>
SampleCountFlagBits
-> Tagged Scene DsBindings
-> renderpass
-> ResourceT (RIO env) Pipeline
LitTextured.allocate SampleCountFlagBits
pMSAA Tagged Scene DsBindings
pSceneBinds ForwardMsaa
rpForwardMsaa
  Pipeline
pLitTexturedBlend <- SampleCountFlagBits
-> Tagged Scene DsBindings
-> ForwardMsaa
-> ResourceT (StageRIO st) Pipeline
forall env renderpass.
(HasVulkan env, HasRenderPass renderpass) =>
SampleCountFlagBits
-> Tagged Scene DsBindings
-> renderpass
-> ResourceT (RIO env) Pipeline
LitTextured.allocateBlend SampleCountFlagBits
pMSAA Tagged Scene DsBindings
pSceneBinds ForwardMsaa
rpForwardMsaa

  Pipeline
pSprite              <- SampleCountFlagBits
-> Maybe ("max anisotropy" ::: Float)
-> Bool
-> Tagged Scene DsBindings
-> ForwardMsaa
-> ResourceT (StageRIO st) Pipeline
forall env renderpass.
(HasVulkan env, HasRenderPass renderpass) =>
SampleCountFlagBits
-> Maybe ("max anisotropy" ::: Float)
-> Bool
-> Tagged Scene DsBindings
-> renderpass
-> ResourceT (RIO env) Pipeline
UnlitSprite.allocate SampleCountFlagBits
pMSAA Maybe ("max anisotropy" ::: Float)
forall a. Maybe a
Nothing Bool
False Tagged Scene DsBindings
pSceneBinds ForwardMsaa
rpForwardMsaa
  Pipeline
pSpriteOutline       <- SampleCountFlagBits
-> Maybe ("max anisotropy" ::: Float)
-> Bool
-> Tagged Scene DsBindings
-> ForwardMsaa
-> ResourceT (StageRIO st) Pipeline
forall env renderpass.
(HasVulkan env, HasRenderPass renderpass) =>
SampleCountFlagBits
-> Maybe ("max anisotropy" ::: Float)
-> Bool
-> Tagged Scene DsBindings
-> renderpass
-> ResourceT (RIO env) Pipeline
UnlitSprite.allocate SampleCountFlagBits
pMSAA Maybe ("max anisotropy" ::: Float)
forall a. Maybe a
Nothing Bool
True Tagged Scene DsBindings
pSceneBinds ForwardMsaa
rpForwardMsaa
  Pipeline
pTileMap             <- SampleCountFlagBits
-> Tagged Scene DsBindings
-> ForwardMsaa
-> ResourceT (StageRIO st) Pipeline
forall env renderpass.
(HasVulkan env, HasRenderPass renderpass) =>
SampleCountFlagBits
-> Tagged Scene DsBindings
-> renderpass
-> ResourceT (RIO env) Pipeline
UnlitTileMap.allocate SampleCountFlagBits
pMSAA Tagged Scene DsBindings
pSceneBinds ForwardMsaa
rpForwardMsaa
  Pipeline
pTileMapBlend        <- SampleCountFlagBits
-> Tagged Scene DsBindings
-> ForwardMsaa
-> ResourceT (StageRIO st) Pipeline
forall env renderpass.
(HasVulkan env, HasRenderPass renderpass) =>
SampleCountFlagBits
-> Tagged Scene DsBindings
-> renderpass
-> ResourceT (RIO env) Pipeline
UnlitTileMap.allocateBlend SampleCountFlagBits
pMSAA Tagged Scene DsBindings
pSceneBinds ForwardMsaa
rpForwardMsaa
  Pipeline
pUnlitColored        <- Bool
-> SampleCountFlagBits
-> Tagged Scene DsBindings
-> ForwardMsaa
-> ResourceT (StageRIO st) Pipeline
forall env renderpass.
(HasVulkan env, HasRenderPass renderpass) =>
Bool
-> SampleCountFlagBits
-> Tagged Scene DsBindings
-> renderpass
-> ResourceT (RIO env) Pipeline
UnlitColored.allocate Bool
True SampleCountFlagBits
pMSAA Tagged Scene DsBindings
pSceneBinds ForwardMsaa
rpForwardMsaa
  Pipeline
pUnlitColoredNoDepth <- Bool
-> SampleCountFlagBits
-> Tagged Scene DsBindings
-> ForwardMsaa
-> ResourceT (StageRIO st) Pipeline
forall env renderpass.
(HasVulkan env, HasRenderPass renderpass) =>
Bool
-> SampleCountFlagBits
-> Tagged Scene DsBindings
-> renderpass
-> ResourceT (RIO env) Pipeline
UnlitColored.allocate Bool
False SampleCountFlagBits
pMSAA Tagged Scene DsBindings
pSceneBinds ForwardMsaa
rpForwardMsaa
  Pipeline
pUnlitTextured       <- SampleCountFlagBits
-> Tagged Scene DsBindings
-> ForwardMsaa
-> ResourceT (StageRIO st) Pipeline
forall env renderpass.
(HasVulkan env, HasRenderPass renderpass) =>
SampleCountFlagBits
-> Tagged Scene DsBindings
-> renderpass
-> ResourceT (RIO env) Pipeline
UnlitTextured.allocate SampleCountFlagBits
pMSAA Tagged Scene DsBindings
pSceneBinds ForwardMsaa
rpForwardMsaa
  Pipeline
pUnlitTexturedBlend  <- SampleCountFlagBits
-> Tagged Scene DsBindings
-> ForwardMsaa
-> ResourceT (StageRIO st) Pipeline
forall env renderpass.
(HasVulkan env, HasRenderPass renderpass) =>
SampleCountFlagBits
-> Tagged Scene DsBindings
-> renderpass
-> ResourceT (RIO env) Pipeline
UnlitTextured.allocateBlend SampleCountFlagBits
pMSAA Tagged Scene DsBindings
pSceneBinds ForwardMsaa
rpForwardMsaa
  Pipeline
pWireframe           <- Bool
-> SampleCountFlagBits
-> Tagged Scene DsBindings
-> ForwardMsaa
-> ResourceT (StageRIO st) Pipeline
forall env renderpass.
(HasVulkan env, HasRenderPass renderpass) =>
Bool
-> SampleCountFlagBits
-> Tagged Scene DsBindings
-> renderpass
-> ResourceT (RIO env) Pipeline
UnlitColored.allocateWireframe Bool
True SampleCountFlagBits
pMSAA Tagged Scene DsBindings
pSceneBinds ForwardMsaa
rpForwardMsaa
  Pipeline
pWireframeNoDepth    <- Bool
-> SampleCountFlagBits
-> Tagged Scene DsBindings
-> ForwardMsaa
-> ResourceT (StageRIO st) Pipeline
forall env renderpass.
(HasVulkan env, HasRenderPass renderpass) =>
Bool
-> SampleCountFlagBits
-> Tagged Scene DsBindings
-> renderpass
-> ResourceT (RIO env) Pipeline
UnlitColored.allocateWireframe Bool
False SampleCountFlagBits
pMSAA Tagged Scene DsBindings
pSceneBinds ForwardMsaa
rpForwardMsaa

  let sunBinds :: Tagged Sun DsBindings
sunBinds = Tagged Sun DsBindings
Sun.set0
  Pipeline
pShadowCast <- Tagged Sun DsBindings
-> ShadowMap -> Settings -> ResourceT (StageRIO st) Pipeline
forall env renderpass.
(HasVulkan env, HasRenderPass renderpass) =>
Tagged Sun DsBindings
-> renderpass -> Settings -> ResourceT (RIO env) Pipeline
ShadowPipe.allocate Tagged Sun DsBindings
sunBinds ShadowMap
rpShadowPass Settings
ShadowPipe.defaults

  pure Pipelines :: SampleCountFlagBits
-> Tagged Scene DsBindings
-> Pipeline
-> Pipeline
-> Pipeline
-> Pipeline
-> Pipeline
-> Pipeline
-> Pipeline
-> Pipeline
-> Pipeline
-> Pipeline
-> Pipeline
-> Pipeline
-> Pipeline
-> Pipeline
-> Pipeline
-> Pipeline
-> Pipeline
-> Pipeline
-> Pipeline
-> Pipeline
-> Pipeline
-> Pipeline
-> Pipeline
-> Pipelines
Pipelines{SampleCountFlagBits
Tagged Scene DsBindings
Pipeline
Pipeline
Pipeline
Pipeline
Pipeline
Pipeline
Pipeline
Pipeline
Pipeline
Pipeline
Pipeline
Pipeline
pShadowCast :: Pipeline
pWireframeNoDepth :: Pipeline
pWireframe :: Pipeline
pUnlitTexturedBlend :: Pipeline
pUnlitTextured :: Pipeline
pUnlitColoredNoDepth :: Pipeline
pUnlitColored :: Pipeline
pTileMapBlend :: Pipeline
pTileMap :: Pipeline
pSpriteOutline :: Pipeline
pSprite :: Pipeline
pLitTexturedBlend :: Pipeline
pLitTextured :: Pipeline
pLitMaterialBlend :: Pipeline
pLitMaterial :: Pipeline
pLitColoredBlend :: Pipeline
pLitColored :: Pipeline
pDepthOnly :: Pipeline
pSkybox :: Pipeline
pEvanwSdf :: Pipeline
pDebugShadow :: Pipeline
pDebugTexture :: Pipeline
pDebugUV :: Pipeline
pMSAA :: SampleCountFlagBits
pSceneBinds :: Tagged Scene DsBindings
$sel:pShadowCast:Pipelines :: Pipeline
$sel:pWireframeNoDepth:Pipelines :: Pipeline
$sel:pWireframe:Pipelines :: Pipeline
$sel:pTileMapBlend:Pipelines :: Pipeline
$sel:pTileMap:Pipelines :: Pipeline
$sel:pSpriteOutline:Pipelines :: Pipeline
$sel:pSprite:Pipelines :: Pipeline
$sel:pUnlitTexturedBlend:Pipelines :: Pipeline
$sel:pUnlitTextured:Pipelines :: Pipeline
$sel:pUnlitColoredNoDepth:Pipelines :: Pipeline
$sel:pUnlitColored:Pipelines :: Pipeline
$sel:pLitTexturedBlend:Pipelines :: Pipeline
$sel:pLitTextured:Pipelines :: Pipeline
$sel:pLitMaterialBlend:Pipelines :: Pipeline
$sel:pLitMaterial:Pipelines :: Pipeline
$sel:pLitColoredBlend:Pipelines :: Pipeline
$sel:pLitColored:Pipelines :: Pipeline
$sel:pDepthOnly:Pipelines :: Pipeline
$sel:pDebugShadow:Pipelines :: Pipeline
$sel:pDebugTexture:Pipelines :: Pipeline
$sel:pDebugUV:Pipelines :: Pipeline
$sel:pSkybox:Pipelines :: Pipeline
$sel:pEvanwSdf:Pipelines :: Pipeline
$sel:pSceneBinds:Pipelines :: Tagged Scene DsBindings
$sel:pMSAA:Pipelines :: SampleCountFlagBits
..}

getSceneLayout :: Pipelines -> Tagged '[Scene] Vk.DescriptorSetLayout
getSceneLayout :: Pipelines -> Tagged '[Scene] DescriptorSetLayout
getSceneLayout Pipelines{Pipeline
pLitColored :: Pipeline
$sel:pLitColored:Pipelines :: Pipelines -> Pipeline
pLitColored} =
  case Vector DescriptorSetLayout -> Maybe DescriptorSetLayout
forall (v :: * -> *) a (m :: * -> *).
(Vector v a, Monad m) =>
v a -> m a
Vector.headM (Tagged '[Scene] (Vector DescriptorSetLayout)
-> Vector DescriptorSetLayout
forall {k} (s :: k) b. Tagged s b -> b
unTagged (Tagged '[Scene] (Vector DescriptorSetLayout)
 -> Vector DescriptorSetLayout)
-> Tagged '[Scene] (Vector DescriptorSetLayout)
-> Vector DescriptorSetLayout
forall a b. (a -> b) -> a -> b
$ Pipeline -> Tagged '[Scene] (Vector DescriptorSetLayout)
forall (dsl :: [*]) vertices instances.
Pipeline dsl vertices instances
-> Tagged dsl (Vector DescriptorSetLayout)
Pipeline.pDescLayouts Pipeline
pLitColored) of
    Maybe DescriptorSetLayout
Nothing ->
      String -> Tagged '[Scene] DescriptorSetLayout
forall a. HasCallStack => String -> a
error String
"pLitColored has at least set0 in layout"
    Just DescriptorSetLayout
set0layout ->
      DescriptorSetLayout -> Tagged '[Scene] DescriptorSetLayout
forall {k} (s :: k) b. b -> Tagged s b
Tagged DescriptorSetLayout
set0layout

getSunLayout :: Pipelines -> Tagged '[Sun] Vk.DescriptorSetLayout
getSunLayout :: Pipelines -> Tagged '[Sun] DescriptorSetLayout
getSunLayout Pipelines{Pipeline
pShadowCast :: Pipeline
$sel:pShadowCast:Pipelines :: Pipelines -> Pipeline
pShadowCast} =
  case Vector DescriptorSetLayout -> Maybe DescriptorSetLayout
forall (v :: * -> *) a (m :: * -> *).
(Vector v a, Monad m) =>
v a -> m a
Vector.headM (Tagged '[Sun] (Vector DescriptorSetLayout)
-> Vector DescriptorSetLayout
forall {k} (s :: k) b. Tagged s b -> b
unTagged (Tagged '[Sun] (Vector DescriptorSetLayout)
 -> Vector DescriptorSetLayout)
-> Tagged '[Sun] (Vector DescriptorSetLayout)
-> Vector DescriptorSetLayout
forall a b. (a -> b) -> a -> b
$ Pipeline -> Tagged '[Sun] (Vector DescriptorSetLayout)
forall (dsl :: [*]) vertices instances.
Pipeline dsl vertices instances
-> Tagged dsl (Vector DescriptorSetLayout)
Pipeline.pDescLayouts Pipeline
pShadowCast) of
    Maybe DescriptorSetLayout
Nothing ->
      String -> Tagged '[Sun] DescriptorSetLayout
forall a. HasCallStack => String -> a
error String
"pShadowCast has at least set0 in layout"
    Just DescriptorSetLayout
set0layout ->
      DescriptorSetLayout -> Tagged '[Sun] DescriptorSetLayout
forall {k} (s :: k) b. b -> Tagged s b
Tagged DescriptorSetLayout
set0layout