1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
|
#include "../../include/mgl/graphics/text.h"
#include "../../include/mgl/graphics/font.h"
#include "../../include/mgl/mgl.h"
int mgl_text_init(mgl_text *self, mgl_font *font, const char *text, float x, float y) {
self->font = font;
self->text = text;
self->color = (mgl_color){ 1.0f, 1.0f, 1.0f, 1.0f };
self->position = (mgl_vec2f){ x, y };
return 0;
}
void mgl_text_deinit(mgl_text *self) {
}
static void mgl_text_draw_glyph(mgl_context *context, mgl_font_glyph *glyph, mgl_vec2f position) {
context->gl.glTexCoord2f(glyph->texture_position.x, glyph->texture_position.y);
context->gl.glVertex3f(position.x + glyph->position.x, position.y + glyph->position.y, 0.0f);
context->gl.glTexCoord2f(glyph->texture_position.x + glyph->texture_size.x, glyph->texture_position.y);
context->gl.glVertex3f(position.x + glyph->position.x + glyph->size.x, position.y + glyph->position.y, 0.0f);
context->gl.glTexCoord2f(glyph->texture_position.x + glyph->texture_size.x, glyph->texture_position.y + glyph->texture_size.y);
context->gl.glVertex3f(position.x + glyph->position.x + glyph->size.x, position.y + glyph->position.y + glyph->size.y, 0.0f);
context->gl.glTexCoord2f(glyph->texture_position.x, glyph->texture_position.y + glyph->texture_size.y);
context->gl.glVertex3f(position.x + glyph->position.x, position.y + glyph->position.y + glyph->size.y, 0.0f);
}
/* TODO: Use opengl buffer object instead */
/* TODO: Cache texture bind to not bind texture if its already bound and do not bind texture 0 */
void mgl_text_draw(mgl_context *context, mgl_text *text) {
const char *str = text->text;
mgl_font_glyph glyph;
mgl_vec2f position = text->position;
position.y += text->font->size;
context->gl.glColor4f(text->color.r, text->color.g, text->color.b, text->color.a);
context->gl.glBindTexture(GL_TEXTURE_2D, text->font->texture.id);
context->gl.glBegin(GL_QUADS);
while(*str) {
unsigned char c = *(unsigned char*)str;
if((c >= 32 && c < 128)) {
if(mgl_font_get_glyph(text->font, c, &glyph) == 0) {
mgl_text_draw_glyph(context, &glyph, position);
position.x += glyph.advance;
}
} else if(c == '\t') {
if(mgl_font_get_glyph(text->font, ' ', &glyph) == 0) {
const int tab_width = 4;
for(int i = 0; i < tab_width; ++i) {
mgl_text_draw_glyph(context, &glyph, position);
position.x += glyph.advance;
}
}
} else if(c == '\n') {
position.x = text->position.x;
position.y += text->font->size;
}
++str;
}
context->gl.glEnd();
context->gl.glBindTexture(GL_TEXTURE_2D, 0);
}
|