Add jes.gui.Window to own jes-related window functionality.

This commit is contained in:
Josh Holtrop 2020-12-09 21:51:44 -05:00
parent 23cfdb1273
commit 4775435df4
2 changed files with 100 additions and 66 deletions

View File

@ -1,22 +1,11 @@
module jes.gui; module jes.gui;
static import jtk; static import jtk;
import derelict.opengl;
import std.stdio; import std.stdio;
import jes.gui.font; import jes.gui.window;
class Gui 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() this()
{ {
if (!jtk.init()) if (!jtk.init())
@ -29,9 +18,8 @@ class Gui
{ {
try try
{ {
m_windows ~= new jtk.Window(); new Window();
event_loop(); event_loop();
m_windows[0].close();
} }
finally 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() private void event_loop()
{ {
bool running = true; bool running = true;
@ -79,15 +36,14 @@ class Gui
switch (event.type) switch (event.type)
{ {
case jtk.Event.WINDOW_CLOSE: case jtk.Event.WINDOW_CLOSE:
Window window = Window[event.window_close.window];
window.close();
running = false; running = false;
break; break;
case jtk.Event.WINDOW_RESIZE: case jtk.Event.WINDOW_RESIZE:
load(); Window window = Window[event.window_resize.window];
width = event.window_resize.width; window.resize(event.window_resize.width, event.window_resize.height);
height = event.window_resize.height;
glViewport(0, 0, event.window_resize.width, event.window_resize.height);
redraw_window(event.window_resize.window);
break; break;
default: 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();
}
} }

94
src/jes/gui/window.d Normal file
View File

@ -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];
}
}