{-# LANGUAGE OverloadedLists #-}

module Render.Pass
  ( usePass
  , setViewportScissor

  , beginInfo
  ) where

import RIO

import RIO.Vector.Partial ((!))
import Vulkan.Core10 qualified as Vk
import Vulkan.Zero (zero)

import Engine.Vulkan.Types (HasRenderPass(..))

usePass :: (MonadIO io, HasRenderPass a) => a -> Word32 -> Vk.CommandBuffer -> io r -> io r
usePass :: forall (io :: * -> *) a r.
(MonadIO io, HasRenderPass a) =>
a -> Word32 -> CommandBuffer -> io r -> io r
usePass a
render Word32
imageIndex CommandBuffer
cb =
  CommandBuffer
-> RenderPassBeginInfo '[] -> SubpassContents -> io r -> io r
forall (a :: [*]) (io :: * -> *) r.
(Extendss RenderPassBeginInfo a, PokeChain a, MonadIO io) =>
CommandBuffer
-> RenderPassBeginInfo a -> SubpassContents -> io r -> io r
Vk.cmdUseRenderPass
    CommandBuffer
cb
    (a -> Word32 -> RenderPassBeginInfo '[]
forall a. HasRenderPass a => a -> Word32 -> RenderPassBeginInfo '[]
beginInfo a
render Word32
imageIndex)
    SubpassContents
Vk.SUBPASS_CONTENTS_INLINE

beginInfo :: HasRenderPass a => a -> Word32 -> Vk.RenderPassBeginInfo '[]
beginInfo :: forall a. HasRenderPass a => a -> Word32 -> RenderPassBeginInfo '[]
beginInfo a
rp Word32
imageIndex = RenderPassBeginInfo '[]
forall a. Zero a => a
zero
  { $sel:renderPass:RenderPassBeginInfo :: RenderPass
Vk.renderPass  = a -> RenderPass
forall a. HasRenderPass a => a -> RenderPass
getRenderPass a
rp
  , $sel:framebuffer:RenderPassBeginInfo :: Framebuffer
Vk.framebuffer = a -> Vector Framebuffer
forall a. HasRenderPass a => a -> Vector Framebuffer
getFramebuffers a
rp Vector Framebuffer -> Int -> Framebuffer
forall (v :: * -> *) a. Vector v a => v a -> Int -> a
! Word32 -> Int
forall a b. (Integral a, Num b) => a -> b
fromIntegral Word32
imageIndex
  , $sel:renderArea:RenderPassBeginInfo :: Rect2D
Vk.renderArea  = a -> Rect2D
forall a. HasRenderPass a => a -> Rect2D
getRenderArea a
rp
  , $sel:clearValues:RenderPassBeginInfo :: Vector ClearValue
Vk.clearValues = a -> Vector ClearValue
forall a. HasRenderPass a => a -> Vector ClearValue
getClearValues a
rp
  }

setViewportScissor
  :: ( HasRenderPass rp
     , MonadIO io
     )
  => Vk.CommandBuffer
  -> Vk.Extent2D
  -> rp
  -> io ()
setViewportScissor :: forall rp (io :: * -> *).
(HasRenderPass rp, MonadIO io) =>
CommandBuffer -> Extent2D -> rp -> io ()
setViewportScissor CommandBuffer
cb Vk.Extent2D{Word32
$sel:width:Extent2D :: Extent2D -> Word32
width :: Word32
width, Word32
$sel:height:Extent2D :: Extent2D -> Word32
height :: Word32
height} rp
rp = do
  CommandBuffer
-> Word32 -> ("viewports" ::: Vector Viewport) -> io ()
forall (io :: * -> *).
MonadIO io =>
CommandBuffer
-> Word32 -> ("viewports" ::: Vector Viewport) -> io ()
Vk.cmdSetViewport
    CommandBuffer
cb
    Word32
0
    [ Viewport :: Float -> Float -> Float -> Float -> Float -> Float -> Viewport
Vk.Viewport
        { $sel:x:Viewport :: Float
x        = Float
0
        , $sel:y:Viewport :: Float
y        = Float
0
        , $sel:width:Viewport :: Float
width    = Word32 -> Float
forall a b. (Real a, Fractional b) => a -> b
realToFrac Word32
width
        , $sel:height:Viewport :: Float
height   = Word32 -> Float
forall a b. (Real a, Fractional b) => a -> b
realToFrac Word32
height
        , $sel:minDepth:Viewport :: Float
minDepth = Float
0
        , $sel:maxDepth:Viewport :: Float
maxDepth = Float
1
        }
    ]
  CommandBuffer -> Word32 -> ("scissors" ::: Vector Rect2D) -> io ()
forall (io :: * -> *).
MonadIO io =>
CommandBuffer -> Word32 -> ("scissors" ::: Vector Rect2D) -> io ()
Vk.cmdSetScissor
    CommandBuffer
cb
    Word32
0
    [ rp -> Rect2D
forall a. HasRenderPass a => a -> Rect2D
getRenderArea rp
rp
    ]