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; 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.25, 0.25, 0.25); 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() { 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(); return 0; }