keid-render-basic-0.1.0.0: src/Render/Lit/Material/Model.hs
{-# OPTIONS_GHC -fplugin Foreign.Storable.Generic.Plugin #-}
module Render.Lit.Material.Model
( Model
, VertexAttrs(..)
, vkVertexAttrs
, InstanceAttrs
-- , InstanceBuffers(..)
-- , TextureParams(..)
-- , vkInstanceTexture
-- , allocateInstancesWith
, Transform
, Material
) where
import RIO
import Foreign (Storable(..))
import Geomancy (Transform, Vec2)
import Geomancy.Vec3 qualified as Vec3
import Vulkan.Core10 qualified as Vk
import Resource.Model qualified as Model
import Render.Lit.Material (Material)
type Model buf = Model.Indexed buf Vec3.Packed VertexAttrs
data VertexAttrs = VertexAttrs
{ vaTexCoord0 :: Vec2
, vaTexCoord1 :: Vec2
, vaNormal :: Vec3.Packed
, vaTangent :: Vec3.Packed
, vaMaterial :: Word32
}
deriving (Eq, Ord, Show, Generic)
instance Storable VertexAttrs where
alignment ~_ = 4
sizeOf ~_ = 8 + 8 + 12 + 12 + 4
peek ptr = do
vaTexCoord0 <- peekByteOff ptr 0
vaTexCoord1 <- peekByteOff ptr 8
vaNormal <- peekByteOff ptr 16
vaTangent <- peekByteOff ptr 28
vaMaterial <- peekByteOff ptr 40
pure VertexAttrs{..}
poke ptr VertexAttrs{..} = do
pokeByteOff ptr 0 vaTexCoord0
pokeByteOff ptr 8 vaTexCoord1
pokeByteOff ptr 16 vaNormal
pokeByteOff ptr 28 vaTangent
pokeByteOff ptr 40 vaMaterial
vkVertexAttrs :: [Vk.Format]
vkVertexAttrs =
[ Vk.FORMAT_R32G32_SFLOAT -- vTexCoord0 :: vec2
, Vk.FORMAT_R32G32_SFLOAT -- vTexCoord1 :: vec2
, Vk.FORMAT_R32G32B32_SFLOAT -- vNormal :: vec3
, Vk.FORMAT_R32G32B32_SFLOAT -- vTangent :: vec3
, Vk.FORMAT_R32_UINT -- vMaterial :: uint
]
type InstanceAttrs = Transform