packages feed

keid-render-basic-0.1.12.0: src/Render/Lit/Specialization.hs

module Render.Lit.Specialization
  ( Specialization(..)
  , defaultSpec
  ) where

import RIO

import Engine.Vulkan.Shader qualified as Shader

import Global.Resource.Texture.Base qualified as Base
import Render.Samplers qualified as Samplers

defaultSpec :: Specialization
defaultSpec = Specialization
  { sBRDF_LUT           = Base.indices.ibl_brdf_lut
  , sBRDF_LUT_SAMPLER   = Samplers.indices.linear
  , sMAX_REFLECTION_LOD = 9.0
  , sIRRADIANCE_LOD     = 10.0
  , sIRRADIANCE_OFFSET  = 0
  , sIRRADIANCE_SAMPLER = Samplers.indices.linearMipRepeat
  , sMAX_LIGHTS         = 255
  , sPCF_STEP           = 1.5 / 4096
  , sMAX_MATERIALS      = 2048
  }

data Specialization = Specialization
  { sBRDF_LUT           :: Int32
  , sBRDF_LUT_SAMPLER   :: Int32
  , sMAX_REFLECTION_LOD :: Float
  , sIRRADIANCE_LOD     :: Float
  , sIRRADIANCE_OFFSET  :: Int32
  , sIRRADIANCE_SAMPLER :: Int32
  , sMAX_LIGHTS         :: Word32
  , sPCF_STEP           :: Float
  , sMAX_MATERIALS      :: Word32
  }
  deriving (Eq, Ord, Show, Generic)

instance Shader.Specialization Specialization where
  {-# INLINE specializationData #-}
  specializationData Specialization{..} =
    [ Shader.packConstData sBRDF_LUT
    , Shader.packConstData sBRDF_LUT_SAMPLER
    , Shader.packConstData sMAX_REFLECTION_LOD
    , Shader.packConstData sIRRADIANCE_LOD
    , Shader.packConstData sIRRADIANCE_OFFSET
    , Shader.packConstData sIRRADIANCE_SAMPLER
    , Shader.packConstData sMAX_LIGHTS
    , Shader.packConstData sPCF_STEP
    , Shader.packConstData sMAX_MATERIALS
    ]