refactor font code into classes
This commit is contained in:
@@ -107,35 +107,12 @@ void App::init()
|
||||
printf("error loading image\n");
|
||||
|
||||
#if _WIN32
|
||||
FILE* font_file = fopen("C:\\Windows\\Fonts\\arial.ttf", "rb");
|
||||
const char* ttf = "C:\\Windows\\Fonts\\arial.ttf";
|
||||
#else
|
||||
FILE* font_file = fopen("/Library/Fonts/Arial.ttf", "rb");
|
||||
const char* ttf = "/Library/Fonts/Arial.ttf";
|
||||
#endif
|
||||
if (font_file)
|
||||
{
|
||||
fseek(font_file, 0, SEEK_END);
|
||||
long sz = ftell(font_file);
|
||||
auto data = std::make_unique<uint8_t[]>(sz);
|
||||
fseek(font_file, 0, SEEK_SET);
|
||||
auto bytes = fread(data.get(), 1, sz, font_file);
|
||||
assert(bytes==sz);
|
||||
auto bitmap = std::make_unique<uint8_t[]>(w*h);
|
||||
chars.resize(num_chars);
|
||||
int ret = stbtt_BakeFontBitmap(data.get(), 0, 50, bitmap.get(), w, h, start_char, num_chars, chars.data());
|
||||
font_tex.create(w, h, GL_RED, bitmap.get());
|
||||
|
||||
glGenBuffers(2, font_buffers);
|
||||
glGenVertexArrays(1, &font_array);
|
||||
|
||||
glBindVertexArray(font_array);
|
||||
glEnableVertexAttribArray(0);
|
||||
glEnableVertexAttribArray(1);
|
||||
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, font_buffers[1]);
|
||||
glBindBuffer(GL_ARRAY_BUFFER, font_buffers[0]);
|
||||
glVertexAttribPointer(0, 2, GL_FLOAT, GL_FALSE, sizeof(glm::vec4), (GLvoid*)0);
|
||||
glVertexAttribPointer(1, 2, GL_FLOAT, GL_FALSE, sizeof(glm::vec4), (GLvoid*)(sizeof(float)*2));
|
||||
glBindVertexArray(0);
|
||||
}
|
||||
FontManager::load(kFont::Arial_11, ttf);
|
||||
text.create();
|
||||
plane.create<1>(400, 400);
|
||||
|
||||
glEnable(GL_TEXTURE_2D);
|
||||
@@ -172,7 +149,6 @@ void App::update(float dt)
|
||||
layout[main_id].update(width, height);
|
||||
}
|
||||
|
||||
/*
|
||||
glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);
|
||||
glEnable(GL_SCISSOR_TEST);
|
||||
for (auto& n : layout[main_id])
|
||||
@@ -185,48 +161,10 @@ void App::update(float dt)
|
||||
}
|
||||
}
|
||||
glDisable(GL_SCISSOR_TEST);
|
||||
*/
|
||||
|
||||
glm::mat4 proj = glm::ortho(0.f, width, height, 0.f, -1.f, 1.f);
|
||||
glm::mat4 tran = glm::translate(glm::vec3(200, 200, 0));
|
||||
|
||||
|
||||
if (chars.size())
|
||||
{
|
||||
static char str[64];
|
||||
static int counter = 0;
|
||||
counter++;
|
||||
sprintf(str, "frame %04d", counter);
|
||||
const auto len = strlen(str);
|
||||
float x = 0;
|
||||
float y = 0;
|
||||
std::vector<glm::vec4> v;
|
||||
std::vector<GLushort> idx;
|
||||
for (int i = 0; i < len; i++)
|
||||
{
|
||||
int c = str[i] - start_char;
|
||||
stbtt_aligned_quad q;
|
||||
stbtt_GetBakedQuad(chars.data(), w, h, c, &x, &y, &q, true);
|
||||
auto n = v.size();
|
||||
v.emplace_back(q.x0, q.y1, q.s0, q.t1);
|
||||
v.emplace_back(q.x0, q.y0, q.s0, q.t0);
|
||||
v.emplace_back(q.x1, q.y0, q.s1, q.t0);
|
||||
v.emplace_back(q.x1, q.y1, q.s1, q.t1);
|
||||
idx.push_back(n+0);
|
||||
idx.push_back(n+1);
|
||||
idx.push_back(n+2);
|
||||
idx.push_back(n+0);
|
||||
idx.push_back(n+2);
|
||||
idx.push_back(n+3);
|
||||
}
|
||||
font_array_count = (int)idx.size();
|
||||
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, font_buffers[1]);
|
||||
glBufferData(GL_ELEMENT_ARRAY_BUFFER, idx.size() * sizeof(GLushort), idx.data(), GL_STATIC_DRAW);
|
||||
glBindBuffer(GL_ARRAY_BUFFER, font_buffers[0]);
|
||||
glBufferData(GL_ARRAY_BUFFER, v.size() * sizeof(glm::vec4), v.data(), GL_STATIC_DRAW);
|
||||
glBindBuffer(GL_ARRAY_BUFFER, 0);
|
||||
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0);
|
||||
}
|
||||
|
||||
glActiveTexture(GL_TEXTURE0);
|
||||
font_tex.bind();
|
||||
sampler.bind(0);
|
||||
|
||||
Reference in New Issue
Block a user