module Resource.Font ( Config(..) , collectionTextures , Font(..) , allocate ) where import RIO import GHC.Stack (withFrozenCallStack) import RIO.Vector qualified as Vector import UnliftIO.Resource qualified as Resource import Vulkan.Core10 qualified as Vk import Engine.Vulkan.Types (MonadVulkan, Queues) import Resource.Font.EvanW qualified as EvanW import Resource.Source (Source) import Resource.Texture (Texture, Flat) import Resource.Texture.Ktx2 qualified as Ktx2 -- * General collection tools data Config = Config { configContainer :: Source , configTexture :: Source } deriving (Show) collectionTextures :: Foldable collection => collection Font -> Vector (Texture Flat) collectionTextures = Vector.fromList . map texture . toList -- * Individual fonts data Font = Font { container :: EvanW.Container , texture :: Texture Flat } allocate :: ( HasCallStack , MonadVulkan env m , HasLogFunc env , MonadThrow m , Resource.MonadResource m ) => Queues Vk.CommandPool -> Config -> m Font allocate pools Config{..} = do container <- withFrozenCallStack $ EvanW.load configContainer texture <- withFrozenCallStack $ Ktx2.load pools configTexture pure Font{..}