move main logic into ScreenSaver class
This commit is contained in:
parent
71a1fc8aac
commit
553c0611c8
140
src/gss.d
140
src/gss.d
@ -1,147 +1,17 @@
|
|||||||
import std.stdio;
|
import screensaver;
|
||||||
import derelict.sdl2.sdl;
|
|
||||||
import derelict.opengl3.gl3;
|
|
||||||
import glamour.vao;
|
|
||||||
import glamour.shader;
|
|
||||||
import glamour.vbo;
|
|
||||||
import gl3n.linalg;
|
|
||||||
static import logo;
|
|
||||||
|
|
||||||
extern(C) void GetDisplaySize(int * width, int * height, int * num_monitors);
|
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 main()
|
||||||
{
|
{
|
||||||
|
int width, height;
|
||||||
|
|
||||||
GetDisplaySize(&width, &height, null);
|
GetDisplaySize(&width, &height, null);
|
||||||
if (width > 1920 * 2)
|
if (width > 1920 * 2)
|
||||||
width = 1920 * 2; /* restrict to two monitors */
|
width = 1920 * 2; /* restrict to two monitors */
|
||||||
|
|
||||||
DerelictSDL2.load();
|
ScreenSaver ss = new ScreenSaver(width, height);
|
||||||
|
ss.run();
|
||||||
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();
|
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
146
src/screensaver.d
Normal file
146
src/screensaver.d
Normal 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();
|
||||||
|
}
|
||||||
|
}
|
Loading…
x
Reference in New Issue
Block a user