diff --git a/runtime/lib/widget.rb b/runtime/lib/widget.rb index dc7067a..3e7276c 100644 --- a/runtime/lib/widget.rb +++ b/runtime/lib/widget.rb @@ -34,4 +34,8 @@ module Widget def draw_rect(x, y, width, height, r, g, b, a) GL.draw_rect(@x + x, @y + y, width, height, r, g, b, a) end + + def draw_text(font, x, y, string, r, g, b, a) + GL.draw_text(font, @x + x, @y + y, string, r, g, b, a) + end end diff --git a/src/GL.cc b/src/GL.cc index 289aa5a..e4dc005 100644 --- a/src/GL.cc +++ b/src/GL.cc @@ -3,6 +3,7 @@ #include "ruby.h" #include "GLBuffer.h" #include "GLProgram.h" +#include "Font.h" enum { @@ -42,11 +43,39 @@ static VALUE GL_draw_rect(VALUE klass, return Qnil; } +static VALUE GL_draw_text(VALUE klass, + VALUE font, VALUE x, VALUE y, VALUE string, + VALUE r, VALUE g, VALUE b, VALUE a) +{ + int x_int = FIX2INT(x); + glUseProgram(programs[PROGRAM_TEXT]->id); + glUniform1i(programs[PROGRAM_TEXT]->uniforms[UNIFORM_TEXTURE], 0); + glUniform4f(programs[PROGRAM_TEXT]->uniforms[UNIFORM_COLOR], + NUM2DBL(r), + NUM2DBL(g), + NUM2DBL(b), + NUM2DBL(a)); + + int length = RSTRING_LEN(string); + const char * string_ptr = RSTRING_PTR(string); + int advance = FIX2INT(rb_iv_get(font, "@advance")); + for (int i = 0; i < length; i++) + { + glUniform2i(programs[PROGRAM_TEXT]->uniforms[UNIFORM_POSITION], x_int, FIX2INT(y)); + Font_RenderGlyph(font, string_ptr[i]); + x_int += advance; + } + + return Qnil; +} + void GL_Init() { ruby_module = rb_define_module("GL"); rb_define_singleton_method(ruby_module, "draw_rect", (VALUE(*)(...))GL_draw_rect, 8); + rb_define_singleton_method(ruby_module, "draw_text", + (VALUE(*)(...))GL_draw_text, 8); } static void load_gl_buffers()