import std.stdio; import derelict.sdl2.sdl; import derelict.opengl3.gl3; import glamour.vao; import glamour.shader; import glamour.vbo; import gl3n.linalg; enum int WIDTH = 800; enum int HEIGHT = 600; GLint position_idx; GLint color_idx; GLint view_idx; mat4 view_matrix; void init() { glClearColor (1.0, 0.7, 0.0, 0.0); glViewport(0, 0, WIDTH, HEIGHT); immutable string shader_src = ` vertex: uniform mat4 view; in vec2 position; in vec3 color; out vec3 color_i; void main(void) { gl_Position = view * vec4(position, 0.0, 1.0); color_i = color; } fragment: in vec3 color_i; void main(void) { gl_FragColor = vec4(color_i, 1.0); } `; VAO vao = new VAO(); Shader program = new Shader("program", shader_src); program.bind(); position_idx = program.get_attrib_location("position"); color_idx = program.get_attrib_location("color"); float[] vertices = [0.4, 0.4, -0.4, 0.4, -0.4, -0.4, 0.4, -0.4]; float[] colors = [1.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0]; ushort[] indices = [0, 1, 2, 3]; Buffer vbo = new Buffer(vertices); vbo.bind(); glEnableVertexAttribArray(position_idx); glVertexAttribPointer(position_idx, 2, GL_FLOAT, GL_FALSE, 0, null); Buffer cbo = new Buffer(colors); cbo.bind(); glEnableVertexAttribArray(color_idx); glVertexAttribPointer(color_idx, 3, GL_FLOAT, GL_FALSE, 0, null); ElementBuffer ibo = new ElementBuffer(indices); ibo.bind(); view_idx = program.get_uniform_location("view"); } void display(SDL_Window * window) { glClear(GL_COLOR_BUFFER_BIT); view_matrix.make_identity(); view_matrix.rotate(SDL_GetTicks() / 500.0, vec3(0.0, 0.0, 1.0)); glUniformMatrix4fv(view_idx, 1, GL_TRUE, view_matrix.value_ptr); glDrawElements(GL_TRIANGLE_FAN, 4, GL_UNSIGNED_SHORT, null); SDL_GL_SwapWindow(window); } int main() { DerelictSDL2.load(); DerelictGL3.load(); if (SDL_Init(SDL_INIT_EVERYTHING)) { writeln("Failed to initialize SDL!"); return 1; } SDL_Window * window = SDL_CreateWindow("d-dub-derelict-sdl2-gl3-demo", SDL_WINDOWPOS_UNDEFINED, SDL_WINDOWPOS_UNDEFINED, WIDTH, HEIGHT, SDL_WINDOW_OPENGL); 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; }