[WIP] Add render text functionality
This commit is contained in:
1 parent
c1a8b14a90
commit
d59d8c640e
6 files changed
+61
-27
No files matched your search
@@ -17,15 +17,20 @@
|
||||
|
||||
/* Load only ASCII characters that are needed. TODO: Add unicode characters */
|
||||
#define FONT_CHARACTERS_COUNT 94
|
||||
#define FONT_START_CHARACTER 33U
|
||||
|
||||
#define FONT_SIZE 200
|
||||
/* Use this to scale font to 0.0 <-> 1.0 range */
|
||||
#define FONT_SCALING 1.0f/FONT_SIZE
|
||||
|
||||
struct font_data_t {
|
||||
uint16_t mesh_id;
|
||||
uint16_t texture_id;
|
||||
uint16_t width;
|
||||
uint16_t height;
|
||||
uint16_t bearing_x;
|
||||
uint16_t bearing_y;
|
||||
uint16_t advance;
|
||||
float width;
|
||||
float height;
|
||||
float bearing_x;
|
||||
float bearing_y;
|
||||
int advance;
|
||||
};
|
||||
|
||||
struct font_data_t g_fonts_data[FONT_CHARACTERS_COUNT];
|
||||
@@ -53,7 +58,7 @@ rse_err_t rse_fonts_load_from_file(const char* file_path)
|
||||
FT_Face face;
|
||||
size_t iter = 0U;
|
||||
struct rse_vertex_t font_vertices[4];
|
||||
const uint16_t font_indices[] = {0, 1, 2, 2, 3, 0};
|
||||
uint16_t font_indices[] = {0, 1, 2, 2, 3, 0};
|
||||
|
||||
error = FT_New_Face(g_library, file_path, 0, &face);
|
||||
|
||||
@@ -62,8 +67,8 @@ rse_err_t rse_fonts_load_from_file(const char* file_path)
|
||||
return FONT_ERROR_LOAD_FAILED;
|
||||
}
|
||||
|
||||
/* By default we set font size to 200px. TODO: change later? It looks OK though.. It looks OK though.... */
|
||||
error = FT_Set_Pixel_Sizes(face, 0, 200);
|
||||
/* By default we set font size to FONT_SIZE.*/
|
||||
error = FT_Set_Pixel_Sizes(face, 0, FONT_SIZE);
|
||||
|
||||
if (error) {
|
||||
LOGF(font_messages[FONT_CHANGE_SIZE_FAILED]);
|
||||
@@ -73,7 +78,7 @@ rse_err_t rse_fonts_load_from_file(const char* file_path)
|
||||
/* Convert font face to textured image */
|
||||
/* Loading only needed ascii characters, from 40 (space) to 126 (~) */
|
||||
for (iter = 0U; iter < face->num_glyphs && iter < FONT_CHARACTERS_COUNT; ++iter) {
|
||||
error = FT_Load_Char(face, iter + 33U, FT_LOAD_RENDER);
|
||||
error = FT_Load_Char(face, iter + FONT_START_CHARACTER, FT_LOAD_RENDER);
|
||||
|
||||
if (error) {
|
||||
LOGF(font_messages[FONT_LOAD_GLYPH_FAILED]);
|
||||
@@ -86,16 +91,27 @@ rse_err_t rse_fonts_load_from_file(const char* file_path)
|
||||
g_fonts_data[iter].bearing_y = face->glyph->bitmap_top;
|
||||
g_fonts_data[iter].advance = face->glyph->advance.x;
|
||||
|
||||
LOGI("Width: %f, advance: %f", g_fonts_data[iter].width, g_fonts_data[iter].advance);
|
||||
font_vertices[0] = (struct rse_vertex_t) {
|
||||
{0.0f, 0.0f, 0.0f}, {1.0f, 1.0f, 1.0f}, {0.0f, 0.0f}
|
||||
{g_fonts_data[iter].bearing_x, 0.0f, 0.0f}, {1.0f, 1.0f, 1.0f}, {0.0f, 0.0f}
|
||||
};
|
||||
font_vertices[1] = (struct rse_vertex_t) {
|
||||
{0.0f, 0.0f, 0.0f}, {1.0f, 1.0f, 1.0f}, {0.0f, 0.0f}
|
||||
{g_fonts_data[iter].bearing_x + g_fonts_data[iter].width, 0.0f, 0.0f}, {1.0f, 1.0f, 1.0f}, {1.0f, 0.0f}
|
||||
};
|
||||
font_vertices[2] = (struct rse_vertex_t) {
|
||||
{g_fonts_data[iter].bearing_x + g_fonts_data[iter].width, g_fonts_data[iter].height, 0.0f}, {1.0f, 1.0f, 1.0f}, {1.0f, 1.0f}
|
||||
};
|
||||
font_vertices[3] = (struct rse_vertex_t) {
|
||||
{g_fonts_data[iter].bearing_x, g_fonts_data[iter].height, 0.0f}, {1.0f, 1.0f, 1.0f}, {0.0f, 1.0f}
|
||||
};
|
||||
|
||||
g_fonts_data[iter].mesh_id = create_mesh(font_vertices, font_indices, 8, 6);
|
||||
|
||||
STATUS_CHECK(rse_load_texture_from_bitmat(face->glyph->bitmap.buffer,
|
||||
face->glyph->bitmap.width,
|
||||
face->glyph->bitmap.rows,
|
||||
&g_fonts_data[iter].texture_id, VK_FORMAT_R8_UNORM));
|
||||
|
||||
}
|
||||
return status;
|
||||
}
|
||||
@@ -103,7 +119,23 @@ rse_err_t rse_fonts_load_from_file(const char* file_path)
|
||||
rse_err_t rse_print_text(const char* text)
|
||||
{
|
||||
rse_err_t status = RSE_ERROR_NO_ERROR;
|
||||
size_t iter = 0U;
|
||||
size_t charactet_code = 0U;
|
||||
float advance = 0.0f;
|
||||
|
||||
for (iter = 0U; iter < strlen(text); ++iter) {
|
||||
charactet_code = (size_t)text[iter] - FONT_START_CHARACTER;
|
||||
|
||||
create_mesh_instance(g_fonts_data[charactet_code].mesh_id, (struct rse_instance_data_t){
|
||||
{advance, 0.0f, 0.0f},
|
||||
{0.0f, 0.0f, rse_math_deg_to_radians(0.0f)},
|
||||
FONT_SCALING,
|
||||
g_fonts_data[charactet_code].texture_id
|
||||
});
|
||||
|
||||
advance += (g_fonts_data[charactet_code].advance >> 6) * FONT_SCALING;
|
||||
LOGI("Advance: %f", advance);
|
||||
}
|
||||
|
||||
return status;
|
||||
}
|
||||
Reference in new issue
Block a user