diff --git a/source/app/src/App.cpp b/source/app/src/App.cpp index 9d7438a..73ed021 100644 --- a/source/app/src/App.cpp +++ b/source/app/src/App.cpp @@ -32,11 +32,17 @@ App::App(): glfwSetErrorCallback(error_callback_s); glfwInit(); + glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3); + glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 2); + glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE); + glfwWindowHint(GLFW_OPENGL_FORWARD_COMPAT, GL_TRUE); + mpWindow = glfwCreateWindow(640, 480, "uGLy", NULL, NULL); glfwSetWindowUserPointer(mpWindow, this); glfwSetKeyCallback(mpWindow, key_callback_s); glfwMakeContextCurrent(mpWindow); + glewExperimental = GL_TRUE; if(glewInit() != GLEW_OK) { error_callback_s(GLFW_NO_ERROR, "glewInit() failed"); } @@ -50,8 +56,71 @@ App::~App() { void App::game_loop() { + float vertices[] = { + .0f, .5f, + .5f, -.5f, + -.5f, -.5f + }; + + GLuint vbo; + glGenBuffers(1, &vbo); + glBindBuffer(GL_ARRAY_BUFFER, vbo); + glBufferData(GL_ARRAY_BUFFER, sizeof(vertices), vertices, GL_STATIC_DRAW); + + auto vertexSource = R"glsl( + #version 150 core + in vec2 position; + void main() { gl_Position = vec4(position, 0.0, 1.0); } + )glsl"; + + GLint status; + GLuint vertexShader = glCreateShader(GL_VERTEX_SHADER); + glShaderSource(vertexShader, 1, &vertexSource, NULL); + glCompileShader(vertexShader); + glGetShaderiv(vertexShader, GL_COMPILE_STATUS, &status); + if(!status) { + error_callback_s(GLFW_NO_ERROR, "glShaderSource() failed"); + } + + auto fragmentSource = R"glsl( + #version 150 core + uniform vec3 triangleColor; + out vec4 color; + void main() { color = vec4(triangleColor, 1.0); } + )glsl"; + + + GLuint fragmentShader = glCreateShader(GL_FRAGMENT_SHADER); + glShaderSource(fragmentShader, 1, &fragmentSource, NULL); + glCompileShader(fragmentShader); + glGetShaderiv(fragmentShader, GL_COMPILE_STATUS, &status); + if(!status) { + error_callback_s(GLFW_NO_ERROR, "glShaderSource() failed"); + } + + GLuint shaderProgram = glCreateProgram(); + glAttachShader(shaderProgram, vertexShader); + glAttachShader(shaderProgram, fragmentShader); + glLinkProgram(shaderProgram); + glUseProgram(shaderProgram); + + GLuint vao; + glGenVertexArrays(1, &vao); + glBindVertexArray(vao); + glVertexAttribPointer(0, 2, GL_FLOAT, GL_FALSE, 0, 0); + glEnableVertexAttribArray(0); + + auto start = glfwGetTime(); + while(!glfwWindowShouldClose(mpWindow)) { glfwPollEvents(); + + glDrawArrays(GL_TRIANGLES, 0, 3); + + auto now = glfwGetTime(); + glUniform3f(glGetUniformLocation(shaderProgram, "triangleColor"), (sin(now-start) + 1.0f) / 2.0f, 0.0f, 0.0f); + + glfwSwapBuffers(mpWindow); } }