From 553c0611c827887c5b4c5094bfc0995e6552f116 Mon Sep 17 00:00:00 2001 From: Josh Holtrop Date: Sun, 24 Nov 2013 22:30:48 -0500 Subject: [PATCH] move main logic into ScreenSaver class --- src/gss.d | 140 ++------------------------------------------ src/screensaver.d | 146 ++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 151 insertions(+), 135 deletions(-) create mode 100644 src/screensaver.d diff --git a/src/gss.d b/src/gss.d index 2dde04e..b8fefd6 100644 --- a/src/gss.d +++ b/src/gss.d @@ -1,147 +1,17 @@ -import std.stdio; -import derelict.sdl2.sdl; -import derelict.opengl3.gl3; -import glamour.vao; -import glamour.shader; -import glamour.vbo; -import gl3n.linalg; -static import logo; +import screensaver; extern(C) void GetDisplaySize(int * width, int * height, int * num_monitors); -int width; -int height; -GLint position_idx; -GLint view_idx; -GLint color_idx; -mat4 view_matrix; -Shader program; - -void init() -{ - logo.init(); - glClearColor (0.0, 0.0, 0.0, 0.0); - glViewport(0, 0, width, height); - immutable string shader_src = ` -vertex: - uniform mat4 view; - in vec2 position; - void main(void) - { - gl_Position = view * vec4(position, 0.0, 1.0); - } -fragment: - uniform vec3 color; - void main(void) - { - gl_FragColor = vec4(color, 1.0); - } - `; - program = new Shader("program", shader_src); - program.bind(); - position_idx = program.get_attrib_location("position"); - view_idx = program.get_uniform_location("view"); - color_idx = program.get_uniform_location("color"); -} - -void display(SDL_Window * window) -{ - glClear(GL_COLOR_BUFFER_BIT); - - view_matrix.make_identity(); - view_matrix.scale(height / cast(float)width, 1.0, 1.0); - view_matrix.scale(0.35, 0.35, 0.35); - - program.bind(); - glUniformMatrix4fv(view_idx, 1, GL_TRUE, view_matrix.value_ptr); - - float[] color = [0.0, 93.0/255.0, 171.0/255.0]; - glUniform3fv(color_idx, 1, color.ptr); - for (int i = 0; i < 6; i++) - { - logo.draw(logo.FACE, logo.GENTEX, i, position_idx); - } - - color = [187.0/255.0, 188.0/255.0, 190.0/255.0]; - glUniform3fv(color_idx, 1, color.ptr); - for (int i = 0; i < 11; i++) - { - logo.draw(logo.FACE, logo.CORPORATION, i, position_idx); - } - - color = [1.0, 1.0, 1.0]; - glUniform3fv(color_idx, 1, color.ptr); - for (int i = 0; i < 6; i++) - { - logo.draw(logo.WIRE, logo.GENTEX, i, position_idx); - } - - for (int i = 0; i < 11; i++) - { - logo.draw(logo.WIRE, logo.CORPORATION, i, position_idx); - } - - SDL_GL_SwapWindow(window); -} - int main() { + int width, height; + GetDisplaySize(&width, &height, null); if (width > 1920 * 2) width = 1920 * 2; /* restrict to two monitors */ - DerelictSDL2.load(); - - DerelictGL3.load(); - - if (SDL_Init(SDL_INIT_EVERYTHING)) - { - writeln("Failed to initialize SDL!"); - return 1; - } - - SDL_GL_SetAttribute(SDL_GL_MULTISAMPLEBUFFERS, 1); - SDL_GL_SetAttribute(SDL_GL_MULTISAMPLESAMPLES, 4); - - SDL_Window * window = SDL_CreateWindow("Gentex ScreenSaver", - SDL_WINDOWPOS_UNDEFINED, - SDL_WINDOWPOS_UNDEFINED, - width, - height, - SDL_WINDOW_OPENGL | SDL_WINDOW_BORDERLESS); - - SDL_GLContext context = SDL_GL_CreateContext(window); - - if (window == null) - { - writeln("Failed to create SDL window!"); - return 1; - } - - DerelictGL3.reload(); - - init(); - SDL_Event event; - for (;;) - { - if (SDL_PollEvent(&event)) - { - if (event.type == SDL_QUIT) - break; - else if (event.type == SDL_KEYDOWN) - { - if (event.key.keysym.scancode == SDL_SCANCODE_ESCAPE) - break; - } - } - display(window); - } - - SDL_GL_DeleteContext(context); - - SDL_DestroyWindow(window); - - SDL_Quit(); + ScreenSaver ss = new ScreenSaver(width, height); + ss.run(); return 0; } diff --git a/src/screensaver.d b/src/screensaver.d new file mode 100644 index 0000000..785fee3 --- /dev/null +++ b/src/screensaver.d @@ -0,0 +1,146 @@ +import std.stdio; +import derelict.sdl2.sdl; +import derelict.opengl3.gl3; +import glamour.vao; +import glamour.shader; +import glamour.vbo; +import gl3n.linalg; +static import logo; + +class ScreenSaver +{ + protected int m_width; + protected int m_height; + protected GLint m_position_idx; + protected GLint m_view_idx; + protected GLint m_color_idx; + protected Shader m_program; + protected SDL_Window * m_window; + protected SDL_GLContext m_context; + + protected void init() + { + logo.init(); + glClearColor (0.0, 0.0, 0.0, 0.0); + glViewport(0, 0, m_width, m_height); + immutable string shader_src = ` + vertex: + uniform mat4 view; + in vec2 position; + void main(void) + { + gl_Position = view * vec4(position, 0.0, 1.0); + } + fragment: + uniform vec3 color; + void main(void) + { + gl_FragColor = vec4(color, 1.0); + } + `; + m_program = new Shader("program", shader_src); + m_program.bind(); + m_position_idx = m_program.get_attrib_location("position"); + m_view_idx = m_program.get_uniform_location("view"); + m_color_idx = m_program.get_uniform_location("color"); + } + + protected void display() + { + mat4 view_matrix; + glClear(GL_COLOR_BUFFER_BIT); + + view_matrix.make_identity(); + view_matrix.scale(m_height / cast(float)m_width, 1.0, 1.0); + view_matrix.scale(0.35, 0.35, 0.35); + + m_program.bind(); + glUniformMatrix4fv(m_view_idx, 1, GL_TRUE, view_matrix.value_ptr); + + float[] color = [0.0, 93.0/255.0, 171.0/255.0]; + glUniform3fv(m_color_idx, 1, color.ptr); + for (int i = 0; i < 6; i++) + { + logo.draw(logo.FACE, logo.GENTEX, i, m_position_idx); + } + + color = [187.0/255.0, 188.0/255.0, 190.0/255.0]; + glUniform3fv(m_color_idx, 1, color.ptr); + for (int i = 0; i < 11; i++) + { + logo.draw(logo.FACE, logo.CORPORATION, i, m_position_idx); + } + + color = [1.0, 1.0, 1.0]; + glUniform3fv(m_color_idx, 1, color.ptr); + for (int i = 0; i < 6; i++) + { + logo.draw(logo.WIRE, logo.GENTEX, i, m_position_idx); + } + + for (int i = 0; i < 11; i++) + { + logo.draw(logo.WIRE, logo.CORPORATION, i, m_position_idx); + } + + SDL_GL_SwapWindow(m_window); + } + + this(int width, int height) + { + m_width = width; + m_height = height; + + DerelictSDL2.load(); + + DerelictGL3.load(); + + if (SDL_Init(SDL_INIT_EVERYTHING)) + { + writeln("Failed to initialize SDL!"); + return; + } + + SDL_GL_SetAttribute(SDL_GL_MULTISAMPLEBUFFERS, 1); + SDL_GL_SetAttribute(SDL_GL_MULTISAMPLESAMPLES, 4); + + m_window = SDL_CreateWindow("Gentex ScreenSaver", + SDL_WINDOWPOS_UNDEFINED, + SDL_WINDOWPOS_UNDEFINED, + m_width, + m_height, + SDL_WINDOW_OPENGL | SDL_WINDOW_BORDERLESS); + + m_context = SDL_GL_CreateContext(m_window); + + if (m_window == null) + { + writeln("Failed to create SDL window!"); + return; + } + + DerelictGL3.reload(); + } + + void run() + { + init(); + + SDL_Event event; + for (;;) + { + if (SDL_PollEvent(&event)) + { + if ((event.type == SDL_QUIT) || (event.type == SDL_KEYDOWN)) + break; + } + display(); + } + + SDL_GL_DeleteContext(m_context); + + SDL_DestroyWindow(m_window); + + SDL_Quit(); + } +}