diff --git a/src/jes/gui/package.d b/src/jes/gui/package.d index e4aff42..bf67693 100644 --- a/src/jes/gui/package.d +++ b/src/jes/gui/package.d @@ -3,10 +3,18 @@ module jes.gui; static import jtk; import derelict.opengl; import std.stdio; +import jes.gui.font; class Gui { jtk.Window[] m_windows; + gltk.Program m_text_program; + GLint m_viewport_size; + GLint m_texture; + GLint m_color; + GLint m_position; + int width; + int height; this() { @@ -30,6 +38,31 @@ class Gui } } + private void load() + { + static bool loaded = false; + if (!loaded) + { + auto v_shader = new gltk.Shader(GL_VERTEX_SHADER); + v_shader.set_source_from_file("share/jes/shaders/text.v.glsl"); + auto f_shader = new gltk.Shader(GL_FRAGMENT_SHADER); + f_shader.set_source_from_file("share/jes/shaders/text.f.glsl"); + m_text_program = new gltk.Program(); + m_text_program.attach_shader(v_shader); + m_text_program.attach_shader(f_shader); + glBindAttribLocation(m_text_program.id, 0, "coords"); + m_text_program.link(); + m_viewport_size = m_text_program.get_uniform_location("viewport_size"); + m_texture = m_text_program.get_uniform_location("texture"); + m_color = m_text_program.get_uniform_location("color"); + m_position = m_text_program.get_uniform_location("position"); + glActiveTexture(GL_TEXTURE0); + glEnable(GL_BLEND); + glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); + loaded = true; + } + } + private void event_loop() { bool running = true; @@ -43,6 +76,9 @@ class Gui break; case jtk.Event.WINDOW_RESIZE: + load(); + width = event.window_resize.width; + height = event.window_resize.height; glViewport(0, 0, event.window_resize.width, event.window_resize.height); redraw_window(event.window_resize.window); break; @@ -57,6 +93,14 @@ class Gui { glClearColor(0.5, 0.0, 1.0, 0.0); glClear(GL_COLOR_BUFFER_BIT); + auto font = new Font("share/jes/fonts/freefont-ttf-20120503/FreeMono.ttf", 20); + auto glyph = font.get_glyph('h'); + m_text_program.use(); + glUniform2i(m_viewport_size, width, height); + glUniform1i(m_texture, 0); + glUniform4f(m_color, 1.0, 1.0, 1.0, 1.0); + glUniform2i(m_position, 10, 10); + glyph.render(); m_windows[0].swap_buffers(); }