keid-render-basic-0.1.3.0: src/Stage/Loader/Render.hs
{-# LANGUAGE OverloadedLists #-}
module Stage.Loader.Render
( updateBuffers
, recordCommands
) where
import RIO
import Engine.Types qualified as Engine
import Engine.Vulkan.Pipeline qualified as Pipeline
import Engine.Vulkan.Swapchain qualified as Swapchain
import Engine.Worker qualified as Worker
import Render.Draw qualified as Draw
import Render.Pass (usePass)
import RIO.State (gets)
import Vulkan.Core10 qualified as Vk
import Render.Basic qualified as Basic
import Render.DescSets.Set0 qualified as Set0
import Stage.Loader.Types (FrameResources(..), RunState(..))
import Stage.Loader.UI qualified as UI
updateBuffers
:: RunState
-> FrameResources
-> Basic.StageFrameRIO FrameResources RunState ()
updateBuffers RunState{..} FrameResources{..} = do
Set0.observe rsSceneUiP frSceneUi
UI.observe rsUI frUI
recordCommands
:: Vk.CommandBuffer
-> FrameResources
-> Word32
-> Basic.StageFrameRIO FrameResources RunState ()
recordCommands cb FrameResources{..} imageIndex = do
(_context, Engine.Frame{fSwapchainResources, fRenderpass, fPipelines}) <- ask
let Basic.Pipelines{..} = fPipelines
ui <- gets rsUI
uiMessages <- traverse Worker.readObservedIO (UI.messages frUI)
background <- Worker.readObservedIO (UI.background frUI)
spinner <- Worker.readObservedIO (UI.spinner frUI)
usePass (Basic.rpForwardMsaa fRenderpass) imageIndex cb do
Swapchain.setDynamicFullscreen cb fSwapchainResources
Set0.withBoundSet0 frSceneUi pWireframe cb do
-- Render UI
Pipeline.bind cb pUnlitTexturedBlend do
Draw.indexed cb (UI.quadUV ui) background
Draw.indexed cb (UI.quadUV ui) spinner
Pipeline.bind cb pEvanwSdf $
traverse_ (Draw.quads cb) uiMessages