fonts
parent
b84d29ee9b
commit
04cf8158c4
|
@ -1,7 +1,7 @@
|
|||
cmake_minimum_required(VERSION 3.25)
|
||||
include(FetchContent)
|
||||
|
||||
set(BLT_GRAPHICS_VERSION 1.0.8)
|
||||
set(BLT_GRAPHICS_VERSION 1.0.9)
|
||||
set(BLT_GRAPHICS_TEST_VERSION 0.0.1)
|
||||
|
||||
project(BLT_WITH_GRAPHICS VERSION ${BLT_GRAPHICS_VERSION})
|
||||
|
@ -39,16 +39,26 @@ else ()
|
|||
find_package(OpenGL REQUIRED)
|
||||
endif ()
|
||||
|
||||
#set(MSDFGEN_CORE_ONLY ON CACHE BOOL "" FORCE)
|
||||
#set(MSDFGEN_BUILD_STANDALONE OFF CACHE BOOL "" FORCE)
|
||||
#set(MSDFGEN_USE_VCPKG OFF CACHE BOOL "" FORCE)
|
||||
#set(MSDFGEN_USE_CPP11 ON CACHE BOOL "" FORCE)
|
||||
|
||||
FetchContent_Declare(freetype
|
||||
GIT_REPOSITORY https://github.com/freetype/freetype.git
|
||||
GIT_TAG VER-2-13-3
|
||||
FIND_PACKAGE_ARGS)
|
||||
#FetchContent_Declare(msdfgen
|
||||
# GIT_REPOSITORY https://github.com/Chlumsky/msdfgen.git
|
||||
# GIT_TAG v1.12
|
||||
# FIND_PACKAGE_ARGS)
|
||||
FetchContent_Declare(imgui
|
||||
GIT_REPOSITORY https://github.com/ocornut/imgui.git
|
||||
GIT_TAG v1.91.4
|
||||
FIND_PACKAGE_ARGS)
|
||||
|
||||
FetchContent_MakeAvailable(freetype)
|
||||
#FetchContent_MakeAvailable(msdfgen)
|
||||
FetchContent_MakeAvailable(imgui)
|
||||
|
||||
set(IMGUI_SOURCE_FILES "${imgui_SOURCE_DIR}/imgui.cpp" "${imgui_SOURCE_DIR}/imgui_demo.cpp"
|
||||
|
@ -64,6 +74,7 @@ add_library(BLT_WITH_GRAPHICS ${PROJECT_BUILD_FILES} ${IMGUI_SOURCE_FILES})
|
|||
|
||||
target_link_libraries(BLT_WITH_GRAPHICS PUBLIC BLT)
|
||||
target_link_libraries(BLT_WITH_GRAPHICS PUBLIC freetype)
|
||||
#target_link_libraries(BLT_WITH_GRAPHICS PUBLIC msdfgen-core)
|
||||
target_include_directories(BLT_WITH_GRAPHICS PUBLIC include/)
|
||||
target_include_directories(BLT_WITH_GRAPHICS PUBLIC "${imgui_SOURCE_DIR}")
|
||||
|
||||
|
|
|
@ -47,7 +47,7 @@ namespace blt::gfx
|
|||
blt::u64 max_index_used;
|
||||
};
|
||||
public:
|
||||
explicit font_texture_atlas(blt::i32 dimensions);
|
||||
explicit font_texture_atlas(blt::i32 dimensions, blt::u32 padding);
|
||||
|
||||
added_font_results_t add_font(const font::font_file_t& file, float size);
|
||||
|
||||
|
@ -63,6 +63,7 @@ namespace blt::gfx
|
|||
blt::hashmap_t<float, blt::hashmap_t<blt::u64, bounded_t>> glyphs;
|
||||
blt::u32 used_width = 0;
|
||||
blt::u32 used_height = 0;
|
||||
blt::u32 padding;
|
||||
};
|
||||
|
||||
class font_generator_t
|
||||
|
@ -80,7 +81,7 @@ namespace blt::gfx
|
|||
};
|
||||
|
||||
public:
|
||||
explicit font_generator_t(blt::i32 dimensions, const std::vector<float>& sizes_to_generate);
|
||||
explicit font_generator_t(blt::i32 dimensions, blt::u32 padding, const std::vector<float>& sizes_to_generate);
|
||||
|
||||
void add_font(const font::font_file_t& file);
|
||||
|
||||
|
@ -101,7 +102,9 @@ namespace blt::gfx
|
|||
|
||||
private:
|
||||
blt::i32 dimensions;
|
||||
blt::u32 padding;
|
||||
std::vector<bounded_font_t> atlases;
|
||||
// doesn't make sense to store this.
|
||||
std::vector<float> sizes_to_generate;
|
||||
};
|
||||
|
||||
|
|
|
@ -18,18 +18,22 @@
|
|||
#include <blt/gfx/renderer/font_renderer.h>
|
||||
#include <blt/gfx/renderer/shaders/2d_font.vert>
|
||||
#include <blt/gfx/renderer/shaders/2d_font.frag>
|
||||
#include "blt/gfx/shader.h"
|
||||
#include <blt/gfx/shader.h>
|
||||
|
||||
// TODO: signed distance fonts
|
||||
//#include <msdfgen.h>
|
||||
|
||||
#include <utility>
|
||||
|
||||
namespace blt::gfx
|
||||
{
|
||||
font_texture_atlas::font_texture_atlas(blt::i32 dimensions): texture_gl2D(dimensions, dimensions, GL_R8)
|
||||
|
||||
font_texture_atlas::font_texture_atlas(blt::i32 dimensions, blt::u32 padding): texture_gl2D(dimensions, dimensions, GL_R8), padding(padding)
|
||||
{
|
||||
bind();
|
||||
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
|
||||
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
|
||||
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAX_LEVEL, 4);
|
||||
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAX_LEVEL, 0);
|
||||
}
|
||||
|
||||
font_texture_atlas::added_font_results_t font_texture_atlas::add_font(const font::font_file_t& file, float size)
|
||||
|
@ -44,8 +48,6 @@ namespace blt::gfx
|
|||
blt::u64 max_index_used = start;
|
||||
file.font.set_pixel_sizes(0, static_cast<blt::u32>(size));
|
||||
|
||||
const blt::u32 padding = 2;
|
||||
|
||||
for (auto i = start; i < file.character_max_index; i++)
|
||||
{
|
||||
// returns an empty optional if there is no error code
|
||||
|
@ -56,15 +58,12 @@ namespace blt::gfx
|
|||
auto width = face->glyph->bitmap.width;
|
||||
auto height = face->glyph->bitmap.rows;
|
||||
|
||||
auto texture_width = width + padding;
|
||||
auto texture_height = height + padding;
|
||||
|
||||
max_height = std::max(max_height, texture_height);
|
||||
max_height = std::max(max_height, height);
|
||||
|
||||
// if adding this width overflows, we need to move to the next row.
|
||||
if (used_width + texture_width > static_cast<blt::u32>(getWidth()))
|
||||
if (used_width + width > static_cast<blt::u32>(getWidth()))
|
||||
{
|
||||
used_height += max_height;
|
||||
used_height += max_height + padding;
|
||||
max_height = 0;
|
||||
used_width = 0;
|
||||
}
|
||||
|
@ -79,7 +78,7 @@ namespace blt::gfx
|
|||
auto begin_height = used_height;
|
||||
auto end_width = used_width + width;
|
||||
auto end_height = used_height + height;
|
||||
used_width += texture_width;
|
||||
used_width += width + padding;
|
||||
|
||||
// BLT_TRACE("%d %d %d %d", begin_width, begin_height, width, height);
|
||||
// upload the texture
|
||||
|
@ -99,8 +98,8 @@ namespace blt::gfx
|
|||
return {-1ul, min_index_used, max_index_used};
|
||||
}
|
||||
|
||||
font_generator_t::font_generator_t(blt::i32 dimensions, const std::vector<float>& sizes_to_generate):
|
||||
dimensions(dimensions), sizes_to_generate(sizes_to_generate)
|
||||
font_generator_t::font_generator_t(blt::i32 dimensions, blt::u32 padding, const std::vector<float>& sizes_to_generate):
|
||||
dimensions(dimensions), padding(padding), sizes_to_generate(sizes_to_generate)
|
||||
{}
|
||||
|
||||
void font_generator_t::add_font(const font::font_file_t& file)
|
||||
|
@ -115,7 +114,7 @@ namespace blt::gfx
|
|||
auto& vec = atlases;
|
||||
|
||||
if (vec.empty())
|
||||
vec.emplace_back(std::make_unique<font_texture_atlas>(dimensions), min_size, max_size, file.character_min_index, 0);
|
||||
vec.emplace_back(std::make_unique<font_texture_atlas>(dimensions, padding), min_size, max_size, file.character_min_index, 0);
|
||||
|
||||
blt::u64 start_index = file.character_min_index;
|
||||
while (start_index != -1ul)
|
||||
|
@ -127,7 +126,7 @@ namespace blt::gfx
|
|||
vec.back().max_size = max_size;
|
||||
if (results.last_inserted_index != -1ul)
|
||||
{
|
||||
vec.emplace_back(std::make_unique<font_texture_atlas>(dimensions), min_size, max_size, start_index, 0);
|
||||
vec.emplace_back(std::make_unique<font_texture_atlas>(dimensions, padding), min_size, max_size, start_index, 0);
|
||||
min_size = size;
|
||||
max_size = size;
|
||||
}
|
||||
|
@ -154,10 +153,10 @@ namespace blt::gfx
|
|||
{
|
||||
int size;
|
||||
glGetIntegerv(GL_MAX_TEXTURE_SIZE, &size);
|
||||
dimensions = std::min(size, 4096);
|
||||
dimensions = std::min(size, 2048);
|
||||
BLT_INFO("Max texture size %d, font renderer will use size %d", size, dimensions);
|
||||
}
|
||||
generator = std::make_unique<font_generator_t>(dimensions, generated_font_sizes);
|
||||
generator = std::make_unique<font_generator_t>(dimensions, 2, generated_font_sizes);
|
||||
}
|
||||
|
||||
void font_renderer_t::cleanup()
|
||||
|
|
Loading…
Reference in New Issue