Add Gl class to manage OpenGL drawing operations for a Window.
This commit is contained in:
parent
4775435df4
commit
24b7ee9f16
66
src/jes/gui/gl.d
Normal file
66
src/jes/gui/gl.d
Normal file
@ -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;
|
||||
}
|
||||
}
|
@ -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];
|
||||
|
Loading…
x
Reference in New Issue
Block a user