#define FONT_FIRST_CHAR ' '
#define FONT_CHAR_COUNT 96
-// NOTE(Brendan): This limits the maximum string length of a message to be 128 chars.
-#define FONT_BUFFER_SIZE 4 * 8 * 6 * 128
+// NOTE(Brendan): This limits the maximum string length of a message to be 256 chars.
+#define FONT_BUFFER_SIZE sizeof(FontQuadVertex) * 256
internal stbtt_packedchar *font_char_data;
internal GLuint font_tex;
internal GLuint font_vao;
internal GLuint font_buffer_data;
internal GLuint font_proj_mat_loc;
+internal GLuint font_color_loc;
struct FontQuadVertex
{
- V2f pos;
- V2f tex;
- struct { f32 r, g, b, a; } color;
+ V2f pos_top_left;
+ V2f pos_bottom_right;
+ V2f tex_top_left;
+ V2f tex_bottom_right;
};
void
glBindTexture(GL_TEXTURE_2D, font_tex);
glTexImage2D(GL_TEXTURE_2D, 0, GL_ALPHA, FONT_INTERNAL_IMAGE_SIZE, FONT_INTERNAL_IMAGE_SIZE, 0, GL_ALPHA, GL_UNSIGNED_BYTE, font_pixels);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
- // glBindTexture(GL_TEXTURE_2D, -1);
free(font_pixels);
glUseProgram(font_program);
font_proj_mat_loc = glGetUniformLocation(font_program, "u_proj");
+ font_color_loc = glGetUniformLocation(font_program, "u_color");
+
auto font_texture_loc = glGetUniformLocation(font_program, "u_texture");
glUniform1i(font_texture_loc, 0);
glGenVertexArrays(1, &font_vao);
glBindVertexArray(font_vao);
+ GLuint font_interp_buffer;
+ glGenBuffers(1, &font_interp_buffer);
+ glBindBuffer(GL_ARRAY_BUFFER, font_interp_buffer);
+ V2f font_interp_data[4] =
+ {
+ V2f { 0.0, 0.0 },
+ V2f { 1.0, 0.0 },
+ V2f { 1.0, 1.0 },
+ V2f { 0.0, 1.0 },
+ };
+ glBufferData(GL_ARRAY_BUFFER, sizeof(font_interp_data), font_interp_data, GL_STATIC_DRAW);
+ glEnableVertexAttribArray(0);
+ glVertexAttribPointer(0, 2, GL_FLOAT, false, sizeof(V2f), (void *) 0);
+
+ GLuint font_index_buffer;
+ glGenBuffers(1, &font_index_buffer);
+ glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, font_index_buffer);
+ u8 font_index_data[6] = { 0, 1, 2, 0, 2, 3 };
+ glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(font_index_data), font_index_data, GL_STATIC_DRAW);
+
glGenBuffers(1, &font_buffer_data);
glBindBuffer(GL_ARRAY_BUFFER, font_buffer_data);
glBufferData(GL_ARRAY_BUFFER, FONT_BUFFER_SIZE, nullptr, GL_STREAM_DRAW);
- glEnableVertexAttribArray(0);
- glEnableVertexAttribArray(1);
- glEnableVertexAttribArray(2);
- glVertexAttribPointer(0, 2, GL_FLOAT, false, sizeof(FontQuadVertex), (void *) offsetof(FontQuadVertex, pos));
- glVertexAttribPointer(1, 2, GL_FLOAT, false, sizeof(FontQuadVertex), (void *) offsetof(FontQuadVertex, tex));
- glVertexAttribPointer(2, 4, GL_FLOAT, false, sizeof(FontQuadVertex), (void *) offsetof(FontQuadVertex, color));
+ foreach (i, 1, 5)
+ {
+ glEnableVertexAttribArray(i);
+ glVertexAttribDivisor(i, 1);
+ }
+ glVertexAttribPointer(1, 2, GL_FLOAT, false, sizeof(FontQuadVertex), (void *) offsetof(FontQuadVertex, pos_top_left));
+ glVertexAttribPointer(2, 2, GL_FLOAT, false, sizeof(FontQuadVertex), (void *) offsetof(FontQuadVertex, pos_bottom_right));
+ glVertexAttribPointer(3, 2, GL_FLOAT, false, sizeof(FontQuadVertex), (void *) offsetof(FontQuadVertex, tex_top_left));
+ glVertexAttribPointer(4, 2, GL_FLOAT, false, sizeof(FontQuadVertex), (void *) offsetof(FontQuadVertex, tex_bottom_right));
+
glBindBuffer(GL_ARRAY_BUFFER, -1);
glBindVertexArray(-1);
FONT_INTERNAL_IMAGE_SIZE, FONT_INTERNAL_IMAGE_SIZE,
*msg - FONT_FIRST_CHAR,
&x, &y, &quad, 0);
- /* TOP LEFT */
- quads[quad_num * 6 + 0].pos.x = quad.x0;
- quads[quad_num * 6 + 0].pos.y = quad.y0;
- quads[quad_num * 6 + 0].tex.x = quad.s0;
- quads[quad_num * 6 + 0].tex.y = quad.t0;
- quads[quad_num * 6 + 0].color.r = r;
- quads[quad_num * 6 + 0].color.g = g;
- quads[quad_num * 6 + 0].color.b = b;
- quads[quad_num * 6 + 0].color.a = a;
-
- /* TOP RIGHT */
- quads[quad_num * 6 + 1].pos.x = quad.x1;
- quads[quad_num * 6 + 1].pos.y = quad.y0;
- quads[quad_num * 6 + 1].tex.x = quad.s1;
- quads[quad_num * 6 + 1].tex.y = quad.t0;
- quads[quad_num * 6 + 1].color.r = r;
- quads[quad_num * 6 + 1].color.g = g;
- quads[quad_num * 6 + 1].color.b = b;
- quads[quad_num * 6 + 1].color.a = a;
-
- /* BOTTOM RIGHT */
- quads[quad_num * 6 + 2].pos.x = quad.x1;
- quads[quad_num * 6 + 2].pos.y = quad.y1;
- quads[quad_num * 6 + 2].tex.x = quad.s1;
- quads[quad_num * 6 + 2].tex.y = quad.t1;
- quads[quad_num * 6 + 2].color.r = r;
- quads[quad_num * 6 + 2].color.g = g;
- quads[quad_num * 6 + 2].color.b = b;
- quads[quad_num * 6 + 2].color.a = a;
-
- /* TOP LEFT */
- quads[quad_num * 6 + 3].pos.x = quad.x0;
- quads[quad_num * 6 + 3].pos.y = quad.y0;
- quads[quad_num * 6 + 3].tex.x = quad.s0;
- quads[quad_num * 6 + 3].tex.y = quad.t0;
- quads[quad_num * 6 + 3].color.r = r;
- quads[quad_num * 6 + 3].color.g = g;
- quads[quad_num * 6 + 3].color.b = b;
- quads[quad_num * 6 + 3].color.a = a;
-
- /* BOTTOM RIGHT */
- quads[quad_num * 6 + 4].pos.x = quad.x1;
- quads[quad_num * 6 + 4].pos.y = quad.y1;
- quads[quad_num * 6 + 4].tex.x = quad.s1;
- quads[quad_num * 6 + 4].tex.y = quad.t1;
- quads[quad_num * 6 + 4].color.r = r;
- quads[quad_num * 6 + 4].color.g = g;
- quads[quad_num * 6 + 4].color.b = b;
- quads[quad_num * 6 + 4].color.a = a;
- /* BOTTOM LEFT */
- quads[quad_num * 6 + 5].pos.x = quad.x0;
- quads[quad_num * 6 + 5].pos.y = quad.y1;
- quads[quad_num * 6 + 5].tex.x = quad.s0;
- quads[quad_num * 6 + 5].tex.y = quad.t1;
- quads[quad_num * 6 + 5].color.r = r;
- quads[quad_num * 6 + 5].color.g = g;
- quads[quad_num * 6 + 5].color.b = b;
- quads[quad_num * 6 + 5].color.a = a;
+ quads[quad_num].pos_top_left = V2f { quad.x0, quad.y0 };
+ quads[quad_num].pos_bottom_right = V2f { quad.x1, quad.y1 };
+ quads[quad_num].tex_top_left = V2f { quad.s0, quad.t0 };
+ quads[quad_num].tex_bottom_right = V2f { quad.s1, quad.t1 };
msg++;
quad_num++;
}
glBindBuffer(GL_ARRAY_BUFFER, font_buffer_data);
- glBufferSubData(GL_ARRAY_BUFFER, 0, msg_len * 6 * sizeof(FontQuadVertex), quads);
+ glBufferSubData(GL_ARRAY_BUFFER, 0, msg_len * sizeof(FontQuadVertex), quads);
glBindBuffer(GL_ARRAY_BUFFER, -1);
glBindTexture(GL_TEXTURE_2D, font_tex);
glUseProgram(font_program);
+ glUniform4f(font_color_loc, r, g, b, a);
glBindVertexArray(font_vao);
- glDrawArrays(GL_TRIANGLES, 0, 6 * msg_len);
+ glDrawElementsInstanced(GL_TRIANGLES, 6, GL_UNSIGNED_BYTE, (void *) 0, msg_len);
glBindVertexArray(-1);
}
\ No newline at end of file