diff --git a/box.f.glsl b/box.f.glsl new file mode 100644 index 0000000..b51cfff --- /dev/null +++ b/box.f.glsl @@ -0,0 +1,6 @@ +uniform vec4 color; + +void main(void) +{ + gl_FragColor = color; +} diff --git a/box.v.glsl b/box.v.glsl new file mode 100644 index 0000000..03734a1 --- /dev/null +++ b/box.v.glsl @@ -0,0 +1,9 @@ +uniform float size; +uniform vec2 position; + +attribute vec2 coord; + +void main(void) +{ + gl_Position = vec4(position + size * coord, 0, 1); +} diff --git a/sdl-game-controller.cc b/sdl-game-controller.cc index 27f7508..ae547e5 100644 --- a/sdl-game-controller.cc +++ b/sdl-game-controller.cc @@ -1,41 +1,78 @@ #include -#include -#include +#include "glcxx.hpp" +#include "GL3/gl3w.h" +#include #include -#define WIDTH 500 -#define HEIGHT 500 +using namespace std; -void init(void) +#define WIDTH 800 +#define HEIGHT 800 + +std::shared_ptr program; +std::shared_ptr box_buffer; +std::shared_ptr box_array; +static struct +{ + GLint size; + GLint color; + GLint position; +} uniforms; +int color = 0; +GLfloat size = 0.2; +GLfloat position[2] = {0.0, 0.0}; +GLfloat colors[][4] = { + {1.0, 0.7, 0.0, 1.0}, + {0.0, 0.5, 1.0, 1.0}, + {1.0, 1.0, 0.0, 1.0}, + {0.2, 0.2, 1.0, 1.0}, +}; + +bool init(void) { glClearColor (0.0, 0.0, 0.0, 0.0); - glEnable(GL_DEPTH_TEST); - glShadeModel(GL_FLAT); glViewport(0, 0, WIDTH, HEIGHT); - glMatrixMode(GL_PROJECTION); - glLoadIdentity(); - glOrtho(-0.5, WIDTH - 0.5, -0.5, HEIGHT - 0.5, -1, 1); - glMatrixMode(GL_MODELVIEW); - glLoadIdentity(); + try + { + program = glcxx::Program::create( + glcxx::Shader::create_from_file(GL_VERTEX_SHADER, "box.v.glsl"), + glcxx::Shader::create_from_file(GL_FRAGMENT_SHADER, "box.f.glsl"), + "coord", 0); + uniforms.size = program->get_uniform_location("size"); + uniforms.color = program->get_uniform_location("color"); + uniforms.position = program->get_uniform_location("position"); + + box_buffer = glcxx::Buffer::create(GL_ARRAY_BUFFER, GL_STATIC_DRAW, + {-1.0, -1.0, + 1.0, -1.0, + 1.0, 1.0, + -1.0, 1.0}); + box_array = glcxx::Array::create(); + box_array->bind(); + box_buffer->bind(); + glEnableVertexAttribArray(0); + glVertexAttribPointer(0, 2, GL_FLOAT, GL_FALSE, + 2 * sizeof(GLfloat), NULL); + } + catch (glcxx::Error & e) + { + cerr << "glcxx error: " << e.what() << endl; + return false; + } + return true; } void display(SDL_Window * window) { glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); - glColor3f(1, 1, 1); - glBegin(GL_QUADS); - glVertex3f(10, HEIGHT / 2, 0.0); - glVertex3f(10, 3 * HEIGHT / 4, 0.0); - glVertex3f(WIDTH / 2, 3 * HEIGHT / 4, 0.0); - glVertex3f(WIDTH / 2, HEIGHT / 2, 0.0); - glEnd(); - glColor3f(1, 0.6, 0); - glBegin(GL_LINE_LOOP); - glVertex2f(0, 0); - glVertex2f(WIDTH - 1, 0); - glVertex2f(WIDTH - 1, HEIGHT - 1); - glVertex2f(0, HEIGHT - 1); - glEnd(); + + program->use(); + box_array->bind(); + glUniform4fv(uniforms.color, 1, colors[color]); + glUniform2fv(uniforms.position, 1, position); + glUniform1f(uniforms.size, size); + glDrawArrays(GL_TRIANGLE_FAN, 0, 4); + SDL_GL_SwapWindow(window); } @@ -62,9 +99,25 @@ int main(int argc, char *argv[]) return 2; } - SDL_GLContext gl_context = SDL_GL_CreateContext(window); + (void)SDL_GL_CreateContext(window); + + if (gl3wInit()) + { + cerr << "Failed to initialize GL3W" << endl; + return 2; + } + + if (!gl3wIsSupported(3, 0)) + { + cerr << "OpenGL 3.0 is not supported!" << endl; + return 2; + } + + if (!init()) + { + return 2; + } - init(); display(window); SDL_Event event; while (SDL_WaitEvent(&event))