move main logic into ScreenSaver class

This commit is contained in:
Josh Holtrop 2013-11-24 22:30:48 -05:00
parent 71a1fc8aac
commit 553c0611c8
2 changed files with 151 additions and 135 deletions

140
src/gss.d
View File

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

146
src/screensaver.d Normal file
View File

@ -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();
}
}