From 24b7ee9f16139ed481c8e59d1425c85c2204e0f9 Mon Sep 17 00:00:00 2001 From: Josh Holtrop Date: Thu, 10 Dec 2020 20:21:17 -0500 Subject: [PATCH] Add Gl class to manage OpenGL drawing operations for a Window. --- src/jes/gui/gl.d | 66 +++++++++++++++++++++++++++++++++++++++++ src/jes/gui/window.d | 70 ++++++++++---------------------------------- 2 files changed, 82 insertions(+), 54 deletions(-) create mode 100644 src/jes/gui/gl.d diff --git a/src/jes/gui/gl.d b/src/jes/gui/gl.d new file mode 100644 index 0000000..bd024c9 --- /dev/null +++ b/src/jes/gui/gl.d @@ -0,0 +1,66 @@ +module jes.gui.gl; + +static import gltk; +import derelict.opengl; +import jes.gui.font; + +class Gl +{ + 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 FlatProgram m_flat_program; + private TextProgram m_text_program; + private RectProgram m_rect_program; + + this() + { + 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_text_program.set_texture(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); + } + + void resize(int width, int height) + { + glViewport(0, 0, width, height); + m_flat_program.use(); + m_flat_program.set_viewport_size(width, height); + m_text_program.use(); + m_text_program.set_viewport_size(width, height); + m_rect_program.use(); + m_rect_program.set_viewport_size(width, height); + } + + void draw_character(Font font, uint char_code, int x, int y, float r, float g, float b, float a) + { + m_text_program.use(); + m_text_program.set_color(r, g, b, a); + m_text_program.set_position(x, y); + auto glyph = font.get_glyph(char_code); + glyph.render(); + } + + 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; + } +} diff --git a/src/jes/gui/window.d b/src/jes/gui/window.d index 28cb1f8..7ad7fa8 100644 --- a/src/jes/gui/window.d +++ b/src/jes/gui/window.d @@ -1,23 +1,15 @@ module jes.gui.window; -static import gltk; static import jtk; -import derelict.opengl; import jes.gui.font; +import jes.gui.gl; +import derelict.opengl; 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; + private Gl m_gl; + Font m_font; static Window[jtk.Window] jtk_windows; @@ -25,6 +17,7 @@ class Window { m_window = new jtk.Window(); jtk_windows[m_window] = this; + m_font = new Font("share/jes/fonts/freefont-ttf-20120503/FreeMono.ttf", 20); } void close() @@ -33,42 +26,10 @@ class Window 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); + load_gl(); + m_gl.resize(width, height); draw(); } @@ -76,17 +37,18 @@ class 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(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_gl.draw_character(m_font, 'h', 50, 50, 1.0, 0.9, 0.8, 1.0); m_window.swap_buffers(); } + private void load_gl() + { + if (m_gl is null) + { + m_gl = new Gl(); + } + } + static Window opIndex(jtk.Window jtk_window) { return jtk_windows[jtk_window];