#ifndef PKE_FONT_TYPE_HPP #define PKE_FONT_TYPE_HPP #include "asset-manager.hpp" #include "components.hpp" #include "pk.h" #include "vendor-glm-include.hpp" TypeSafeInt_H(FontTypeIndex, uint16_t, 0xFFFF); TypeSafeInt_H(FontRenderIndex, uint16_t, 0xFFFF); enum FONT_GLYPH_CHAR_FLAGS : uint8_t { FONT_GLYPH_CHAR_FLAGS_NONE = (0 << 0), FONT_GLYPH_CHAR_FLAGS_CONTROL = (1 << 0), FONT_GLYPH_CHAR_FLAGS_WHITESPACE = (1 << 1), FONT_GLYPH_CHAR_FLAGS_ALIGN_ADVANCE = (1 << 2), FONT_GLYPH_CHAR_FLAGS_NEW_LINE = (1 << 3), }; enum FONT_RENDER_SURFACE_AREA_TYPE_FLAGS : uint8_t { FONT_RENDER_SURFACE_AREA_TYPE_FLAGS_NONE = 0, FONT_RENDER_SURFACE_AREA_TYPE_FLAGS_GROW_VERTICAL = (1 << 0), FONT_RENDER_SURFACE_AREA_TYPE_FLAGS_GROW_HORIZONTAL = (1 << 1), FONT_RENDER_SURFACE_AREA_TYPE_FLAGS_STATIC = 0, FONT_RENDER_SURFACE_AREA_TYPE_FLAGS_FLUID = (1 << 0) | (1 << 1), }; struct FontRenderHandle { FontTypeIndex index_ft; FontRenderIndex index_fr; }; struct FontGlyphChar { double advance; glm::vec2 sprite_region_min; glm::vec2 sprite_region_max; glm::dvec4 plane_bounds; uint32_t unicode; FONT_GLYPH_CHAR_FLAGS flags; }; struct FontRenderSettings { float char_scale; float line_height_scale; float char_spacing_scale; glm::ivec2 surface_area_size; // TODO glm::ivec2 surface_area_pos; FONT_RENDER_SURFACE_AREA_TYPE_FLAGS surface_area_type_flags; // TODO }; struct FontRender { FontRenderHandle handle; uint32_t *glyph_indices; uint32_t n_glyphs; uint32_t buffer_start_index; FontRenderSettings settings; }; struct FontTypeMSDFSettings { float minimum_scale; float px_range; }; struct FontTypeSpacing { double geometry_scale; double em_size; double ascender_y; double descender_y; double line_height; double underline_y; double underline_thickness; }; struct FontType : public Entity_Base { uint64_t last_graphics_resize_index; pk_cstr title; AssetHandle fontTextureAssetHandle; AssetHandle glyphDetailsAssetHandle; FontGlyphChar *glyphs; FontRender *renders = nullptr; glm::vec2 atlas_size; uint32_t n_glyphs; FontRenderIndex n_render = FontRenderIndex{0}; FontRenderIndex h_render = FontRenderIndex{0}; FontTypeIndex index_ft = FontTypeIndex{0}; struct FontTypeMSDFSettings msdf_settings; struct FontTypeSpacing spacing; struct FontTypeGraphics { VkDeviceMemory deviceMemoryVert = VK_NULL_HANDLE; VkDeviceMemory deviceMemoryTexture = VK_NULL_HANDLE; VkDeviceMemory deviceMemoryInst = VK_NULL_HANDLE; VkImage textureImage = VK_NULL_HANDLE; VkImageView textureImageView = VK_NULL_HANDLE; VkDescriptorPool vkDescriptorPool = VK_NULL_HANDLE; VkDescriptorSet *vkDescriptorSets = nullptr; } gr; struct FontTypeBindings { BufferBindingDetails vertexBD; BufferBindingDetails uvBD; BufferBindingDetails atlasSizeBD; BufferBindingDetails indexBD; BufferBindingDetails instanceBD; uint32_t indexCount = 0; uint32_t instanceCounter = 0; uint32_t instanceLength = 0; } bindings; }; void FontType_Init(); void FontType_Teardown(); void FontType_Tick(double delta); void FontType_Serialize(std::ofstream &stream, FontType *ft); void FontType_Deserialize(std::ifstream &stream); FontType* FontType_GetFonts(FontTypeIndex &count); FontTypeIndex FontType_RegisterFont(pk_cstr title, AssetHandle fontTextureHandle, AssetHandle glyphsHandle, FontTypeMSDFSettings *msdf_settings, FontTypeSpacing *spacing); void FontType_Unload(FontTypeIndex idx); FontRenderHandle FontType_AddStringRender(FontTypeIndex idx_ft, pk_str str, FontRenderSettings *settings); void FontType_RemoveStringRender(FontRenderHandle fr); #endif /* PKE_FONT_TYPE_HPP */