keid-render-basic-0.1.0.0: src/Render/Font/EvanwSdf/Model.hs
module Render.Font.EvanwSdf.Model
( Model
, VertexAttrs
, InstanceAttrs(..)
, vkInstanceAttrs
, InstanceBuffer
) where
import RIO
import Foreign (Storable(..))
import Geomancy (Vec2, Vec4)
import Geomancy.Vec3 qualified as Vec3
import Vulkan.Core10 qualified as Vk
import Vulkan.NamedType ((:::))
import Resource.Buffer qualified as Buffer
import Resource.Model qualified as Model
type Model buf = Model.Indexed buf Vec3.Packed VertexAttrs
type VertexAttrs = "uv" ::: Vec2
data InstanceAttrs = InstanceAttrs
{ vertRect :: Vec4
, fragRect :: Vec4
, color :: Vec4
, outlineColor :: Vec4
, samplerId :: Int32
, textureId :: Int32
, smoothing :: Float
, outlineWidth :: Float
}
deriving (Eq, Show)
vkInstanceAttrs :: [Vk.Format]
vkInstanceAttrs =
[ Vk.FORMAT_R32G32B32A32_SFLOAT -- Quad scale+offset
, Vk.FORMAT_R32G32B32A32_SFLOAT -- UV scale+offset
, Vk.FORMAT_R32G32B32A32_SFLOAT -- Color
, Vk.FORMAT_R32G32B32A32_SFLOAT -- Outline color
, Vk.FORMAT_R32G32_SINT -- Sampler + texture IDs
, Vk.FORMAT_R32G32_SFLOAT -- Smoothing + outline width
]
instance Storable InstanceAttrs where
alignment ~_ = 4
sizeOf ~_ = 16 + 16 + 16 + 16 + 4 + 4 + 4 + 4
peek ptr = do
vertRect <- peekByteOff ptr 0 -- +16
fragRect <- peekByteOff ptr 16 -- +16
color <- peekByteOff ptr 32 -- +16
outlineColor <- peekByteOff ptr 48 -- +16
samplerId <- peekByteOff ptr 64 -- +4
textureId <- peekByteOff ptr 68 -- +4
smoothing <- peekByteOff ptr 72 -- +4
outlineWidth <- peekByteOff ptr 76 -- +4
pure InstanceAttrs{..}
poke ptr InstanceAttrs{..} = do
pokeByteOff ptr 0 vertRect
pokeByteOff ptr 16 fragRect
pokeByteOff ptr 32 color
pokeByteOff ptr 48 outlineColor
pokeByteOff ptr 64 samplerId
pokeByteOff ptr 68 textureId
pokeByteOff ptr 72 smoothing
pokeByteOff ptr 76 outlineWidth
type InstanceBuffer stage = Buffer.Allocated stage InstanceAttrs