Add jes.gui.Window to own jes-related window functionality.
This commit is contained in:
parent
23cfdb1273
commit
4775435df4
@ -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
94
src/jes/gui/window.d
Normal 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];
|
||||||
|
}
|
||||||
|
}
|
Loading…
x
Reference in New Issue
Block a user