not working
parent
4f68e5afce
commit
29a7923269
|
@ -1,7 +1,7 @@
|
|||
cmake_minimum_required(VERSION 3.25)
|
||||
include(FetchContent)
|
||||
|
||||
set(BLT_GRAPHICS_VERSION 1.0.6)
|
||||
set(BLT_GRAPHICS_VERSION 1.0.7)
|
||||
set(BLT_GRAPHICS_TEST_VERSION 0.0.1)
|
||||
|
||||
project(BLT_WITH_GRAPHICS VERSION ${BLT_GRAPHICS_VERSION})
|
||||
|
|
|
@ -107,9 +107,28 @@ namespace blt::gfx
|
|||
public:
|
||||
struct compiled_text_t
|
||||
{
|
||||
std::shared_ptr<vertex_array_t> vao;
|
||||
blt::size_t render_count;
|
||||
friend font_renderer_t;
|
||||
public:
|
||||
explicit compiled_text_t(font_generator_t& generator);
|
||||
|
||||
void change_text(std::string_view str);
|
||||
|
||||
private:
|
||||
void draw();
|
||||
|
||||
struct text_render_info_t
|
||||
{
|
||||
vertex_array_t vao{};
|
||||
font_texture_atlas* texture{};
|
||||
blt::size_t render_count = 0;
|
||||
|
||||
text_render_info_t() = default;
|
||||
};
|
||||
|
||||
font_generator_t& generator;
|
||||
std::vector<std::unique_ptr<text_render_info_t>> renders;
|
||||
};
|
||||
|
||||
public:
|
||||
explicit font_renderer_t();
|
||||
|
||||
|
@ -122,11 +141,17 @@ namespace blt::gfx
|
|||
generator->add_font(file);
|
||||
}
|
||||
|
||||
compiled_text_t create_text(std::string_view str);
|
||||
compiled_text_t* create_text(std::string_view str);
|
||||
|
||||
void destroy_text(compiled_text_t* text);
|
||||
|
||||
private:
|
||||
std::unique_ptr<font_generator_t> generator;
|
||||
std::unique_ptr<shader_t> font_shader;
|
||||
|
||||
blt::hashmap_t<compiled_text_t*, blt::size_t> text_ptr_to_index;
|
||||
std::vector<std::unique_ptr<compiled_text_t>> added_texts;
|
||||
std::vector<std::unique_ptr<compiled_text_t>> cached_text_objects;
|
||||
};
|
||||
|
||||
}
|
||||
|
|
|
@ -148,8 +148,8 @@ namespace blt::gfx
|
|||
bind();
|
||||
vbo.bind();
|
||||
|
||||
glVertexAttribPointer(attribute_number, coordinate_size, type, GL_FALSE, stride < 0 ? 0 : stride, (void*) offset);
|
||||
glEnableVertexAttribArray(attribute_number);
|
||||
glVertexAttribPointer(attribute_number, coordinate_size, type, GL_FALSE, stride < 0 ? 0 : stride, (void*) offset);
|
||||
unbind();
|
||||
}
|
||||
}
|
|
@ -42,7 +42,7 @@ namespace blt::gfx
|
|||
// returns an empty optional if there is no error code
|
||||
if (file.font.load_char(i))
|
||||
continue;
|
||||
auto face = *file.font.get();
|
||||
auto& face = *file.font.get();
|
||||
|
||||
auto width = face->glyph->bitmap.width;
|
||||
auto height = face->glyph->bitmap.rows;
|
||||
|
@ -67,10 +67,11 @@ namespace blt::gfx
|
|||
auto end_width = used_width + width;
|
||||
auto end_height = used_height + height;
|
||||
used_width += width;
|
||||
|
||||
|
||||
// BLT_TRACE("%d %d %d %d", begin_width, begin_height, width, height);
|
||||
// upload the texture
|
||||
upload(face->glyph->bitmap.buffer, GL_RED, 0, static_cast<blt::i32>(begin_width), static_cast<blt::i32>(begin_height),
|
||||
static_cast<blt::i32>(width), static_cast<blt::i32>(height));
|
||||
static_cast<blt::i32>(width), static_cast<blt::i32>(height), GL_UNSIGNED_BYTE);
|
||||
|
||||
glyphs.insert(std::pair{i, bounded_t{
|
||||
font::glyph_t{
|
||||
|
@ -148,9 +149,58 @@ namespace blt::gfx
|
|||
blt::gfx::font::cleanup();
|
||||
}
|
||||
|
||||
font_renderer_t::compiled_text_t font_renderer_t::create_text(std::string_view str)
|
||||
font_renderer_t::compiled_text_t* font_renderer_t::create_text(std::string_view str)
|
||||
{
|
||||
return font_renderer_t::compiled_text_t();
|
||||
std::unique_ptr<font_renderer_t::compiled_text_t> ptr;
|
||||
if (!cached_text_objects.empty())
|
||||
{
|
||||
ptr = std::move(*cached_text_objects.begin());
|
||||
cached_text_objects.erase(cached_text_objects.begin());
|
||||
} else
|
||||
{
|
||||
ptr = std::make_unique<compiled_text_t>(*generator);
|
||||
}
|
||||
ptr->change_text(str);
|
||||
auto index = added_texts.size();
|
||||
added_texts.push_back(std::move(ptr));
|
||||
text_ptr_to_index[added_texts.back().get()] = index;
|
||||
return added_texts.back().get();
|
||||
}
|
||||
|
||||
void font_renderer_t::destroy_text(font_renderer_t::compiled_text_t* text)
|
||||
{
|
||||
auto index = text_ptr_to_index[text];
|
||||
text_ptr_to_index.erase(text);
|
||||
cached_text_objects.push_back(std::move(added_texts[index]));
|
||||
added_texts[index] = nullptr;
|
||||
added_texts.erase(added_texts.begin() + static_cast<blt::ptrdiff_t>(index));
|
||||
}
|
||||
|
||||
void font_renderer_t::compiled_text_t::change_text(std::string_view str)
|
||||
{
|
||||
static std::vector<float> vertices;
|
||||
vertices.clear();
|
||||
|
||||
for (const auto& c : str)
|
||||
{
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
font_renderer_t::compiled_text_t::compiled_text_t(font_generator_t& generator): generator(generator)
|
||||
{
|
||||
renders.emplace_back();
|
||||
auto& vao = renders.back()->vao;
|
||||
auto vbo = vertex_array_t::make_vbo({});
|
||||
vbo->vbo.create();
|
||||
vbo->vbo.bind();
|
||||
vbo->vbo.allocate(sizeof(float) * 6 * 4, GL_DYNAMIC_DRAW);
|
||||
vao.bind();
|
||||
vao.bindVBO(vbo, 0, 4, GL_FLOAT, 4 * sizeof(float), 0);
|
||||
}
|
||||
|
||||
void font_renderer_t::compiled_text_t::draw()
|
||||
{
|
||||
|
||||
}
|
||||
}
|
Loading…
Reference in New Issue