diff --git a/src/jes/gui/package.d b/src/jes/gui/package.d index 4e6c654..47570e4 100644 --- a/src/jes/gui/package.d +++ b/src/jes/gui/package.d @@ -1,22 +1,11 @@ module jes.gui; static import jtk; -import derelict.opengl; import std.stdio; -import jes.gui.font; +import jes.gui.window; class Gui { - jtk.Window[] m_windows; - alias FlatProgram = gltk.Program!("viewport_size", "2i", "color", "4f", "position", "2i"); - alias TextProgram = gltk.Program!("viewport_size", "2i", "texture", "1i", "color", "4f", "position", "2i"); - alias RectProgram = gltk.Program!("viewport_size", "2i", "color", "4f", "position", "2i", "size", "2i"); - FlatProgram m_flat_program; - TextProgram m_text_program; - RectProgram m_rect_program; - int width; - int height; - this() { if (!jtk.init()) @@ -29,9 +18,8 @@ class Gui { try { - m_windows ~= new jtk.Window(); + new Window(); event_loop(); - m_windows[0].close(); } finally { @@ -39,37 +27,6 @@ class Gui } } - private gltk.Shader build_shader(GLenum shader_type, string filename) - { - auto shader = new gltk.Shader(shader_type); - shader.set_source_from_file(filename); - return shader; - } - - private void load() - { - static bool loaded = false; - if (!loaded) - { - m_flat_program = new FlatProgram( - build_shader(GL_VERTEX_SHADER, "share/jes/shaders/flat.v.glsl"), - build_shader(GL_FRAGMENT_SHADER, "share/jes/shaders/flat.f.glsl"), - "coords", 0); - m_text_program = new TextProgram( - build_shader(GL_VERTEX_SHADER, "share/jes/shaders/text.v.glsl"), - build_shader(GL_FRAGMENT_SHADER, "share/jes/shaders/text.f.glsl"), - "coords", 0); - m_rect_program = new RectProgram( - build_shader(GL_VERTEX_SHADER, "share/jes/shaders/rect.v.glsl"), - build_shader(GL_FRAGMENT_SHADER, "share/jes/shaders/rect.f.glsl"), - "coords", 0); - glActiveTexture(GL_TEXTURE0); - glEnable(GL_BLEND); - glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); - loaded = true; - } - } - private void event_loop() { bool running = true; @@ -79,15 +36,14 @@ class Gui switch (event.type) { case jtk.Event.WINDOW_CLOSE: + Window window = Window[event.window_close.window]; + window.close(); running = false; 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); + Window window = Window[event.window_resize.window]; + window.resize(event.window_resize.width, event.window_resize.height); break; default: @@ -95,20 +51,4 @@ class Gui } } } - - private void redraw_window(jtk.Window window) - { - 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(); - m_text_program.set_viewport_size(width, height); - m_text_program.set_texture(0); - m_text_program.set_color(1.0, 1.0, 1.0, 1.0); - m_text_program.set_position(100, 10); - glyph.render(); - m_windows[0].swap_buffers(); - } - } diff --git a/src/jes/gui/window.d b/src/jes/gui/window.d new file mode 100644 index 0000000..28cb1f8 --- /dev/null +++ b/src/jes/gui/window.d @@ -0,0 +1,94 @@ +module jes.gui.window; + +static import gltk; +static import jtk; +import derelict.opengl; +import jes.gui.font; + +class Window +{ + alias FlatProgram = gltk.Program!("viewport_size", "2i", "color", "4f", "position", "2i"); + alias TextProgram = gltk.Program!("viewport_size", "2i", "texture", "1i", "color", "4f", "position", "2i"); + alias RectProgram = gltk.Program!("viewport_size", "2i", "color", "4f", "position", "2i", "size", "2i"); + + private jtk.Window m_window; + private FlatProgram m_flat_program; + private TextProgram m_text_program; + private RectProgram m_rect_program; + private int m_width; + private int m_height; + private bool m_loaded; + + static Window[jtk.Window] jtk_windows; + + this() + { + m_window = new jtk.Window(); + jtk_windows[m_window] = this; + } + + void close() + { + m_window.close(); + jtk_windows.remove(m_window); + } + + private gltk.Shader build_shader(GLenum shader_type, string filename) + { + auto shader = new gltk.Shader(shader_type); + shader.set_source_from_file(filename); + return shader; + } + + private void load() + { + if (!m_loaded) + { + m_flat_program = new FlatProgram( + build_shader(GL_VERTEX_SHADER, "share/jes/shaders/flat.v.glsl"), + build_shader(GL_FRAGMENT_SHADER, "share/jes/shaders/flat.f.glsl"), + "coords", 0); + m_text_program = new TextProgram( + build_shader(GL_VERTEX_SHADER, "share/jes/shaders/text.v.glsl"), + build_shader(GL_FRAGMENT_SHADER, "share/jes/shaders/text.f.glsl"), + "coords", 0); + m_rect_program = new RectProgram( + build_shader(GL_VERTEX_SHADER, "share/jes/shaders/rect.v.glsl"), + build_shader(GL_FRAGMENT_SHADER, "share/jes/shaders/rect.f.glsl"), + "coords", 0); + glActiveTexture(GL_TEXTURE0); + glEnable(GL_BLEND); + glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); + m_loaded = true; + } + } + + void resize(int width, int height) + { + m_width = width; + m_height = height; + load(); + glViewport(0, 0, width, height); + draw(); + } + + void draw() + { + 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(); + m_text_program.set_viewport_size(m_width, m_height); + m_text_program.set_texture(0); + m_text_program.set_color(1.0, 1.0, 1.0, 1.0); + m_text_program.set_position(100, 10); + glyph.render(); + m_window.swap_buffers(); + } + + static Window opIndex(jtk.Window jtk_window) + { + return jtk_windows[jtk_window]; + } +}