From 40b7639c6651858b7b6b1675098863daf55c1ce0 Mon Sep 17 00:00:00 2001 From: Pablo Rodriguez Date: Thu, 31 Jul 2025 00:46:52 -0400 Subject: [PATCH] Added some transformations --- assets/shaders/shader.vert | 8 +++-- source/app/src/App.cpp | 60 +++++++++++++++++++++++++++++--------- 2 files changed, 52 insertions(+), 16 deletions(-) diff --git a/assets/shaders/shader.vert b/assets/shaders/shader.vert index 99e40aa..3882ee6 100644 --- a/assets/shaders/shader.vert +++ b/assets/shaders/shader.vert @@ -1,14 +1,18 @@ #version 150 core -in vec2 inPos; +in vec3 inPos; in vec3 inColor; in vec2 inCoord; out vec3 color; out vec2 coord; +uniform mat4 model; +uniform mat4 view; +uniform mat4 proj; + void main() { color = inColor; coord = inCoord; - gl_Position = vec4(inPos, 0.0, 1.0); + gl_Position = proj * view * model * vec4(inPos, 1.0); } diff --git a/source/app/src/App.cpp b/source/app/src/App.cpp index aa3c7fe..f0dac6d 100644 --- a/source/app/src/App.cpp +++ b/source/app/src/App.cpp @@ -4,6 +4,9 @@ #include #include +#include +#include +#include #include "LogUtils.hpp" #include "ShaderProgramBuilder.hpp" @@ -59,14 +62,14 @@ App::App(GLFWwindow *window): glfwSetKeyCallback(mpWindow, key_callback_s); float vertices[] = { - // Position(3), Color(2), TexCoord(2) - -0.75f, 0.75f, 1.0f, 0.0f, 0.0f, 0.0f, 0.0f, // Top-left - 0.75f, 0.75f, 0.0f, 1.0f, 0.0f, 1.0f, 0.0f, // Top-right - 0.75f, -0.75f, 0.0f, 0.0f, 1.0f, 1.0f, 1.0f, // Bottom-right + // Position(3), Color(3), TexCoord(2) + -1.0f, 1.0f, 0.0f, 1.0f, 0.0f, 0.0f, 0.0f, 0.0f, // Top-left + 1.0f, 1.0f, 0.0f, 0.f, 1.0f, 0.0f, 1.0f, 0.0f, // Top-right + 1.0f, -1.0f, 0.0f, 0.f, 0.0f, 1.0f, 1.0f, 1.0f, // Bottom-right - 0.75f, -0.75f, 0.0f, 0.0f, 1.0f, 1.0f, 1.0f, // Bottom-right - -0.75f, -0.75f, 1.0f, 1.0f, 1.0f, 0.0f, 1.0f, // Bottom-left - -0.75f, 0.75f, 1.0f, 0.0f, 0.0f, 0.0f, 0.0f // Top-left + 1.0f, -1.0f, 0.0f, 0.0f, 0.0f, 1.0f, 1.0f, 1.0f, // Bottom-right + -1.0f, -1.0f, 0.0f, 1.0f, 1.0f, 1.0f, 0.0f, 1.0f, // Bottom-left + -1.0f, 1.0f, 0.0f, 1.0f, 0.0f, 0.0f, 0.0f, 0.0f // Top-left }; GLuint vbo; @@ -100,9 +103,9 @@ App::App(GLFWwindow *window): GLint posAttrib = glGetAttribLocation(shaderProgram, "inPos"); GLint colorAttrib = glGetAttribLocation(shaderProgram, "inColor"); GLint coordAttrib = glGetAttribLocation(shaderProgram, "inCoord"); - glVertexAttribPointer(posAttrib, 2, GL_FLOAT, GL_FALSE, 7*sizeof(float), 0); - glVertexAttribPointer(colorAttrib, 3, GL_FLOAT, GL_FALSE, 7*sizeof(float), (void*)(2*sizeof(float))); - glVertexAttribPointer(coordAttrib, 2, GL_FLOAT, GL_FALSE, 7*sizeof(float), (void*)(5*sizeof(float))); + glVertexAttribPointer(posAttrib, 3, GL_FLOAT, GL_FALSE, 8*sizeof(float), 0); + glVertexAttribPointer(colorAttrib, 3, GL_FLOAT, GL_FALSE, 8*sizeof(float), (void*)(3*sizeof(float))); + glVertexAttribPointer(coordAttrib, 2, GL_FLOAT, GL_FALSE, 8*sizeof(float), (void*)(6*sizeof(float))); glEnableVertexAttribArray(posAttrib); glEnableVertexAttribArray(colorAttrib); glEnableVertexAttribArray(coordAttrib); @@ -111,15 +114,44 @@ App::App(GLFWwindow *window): void App::game_loop() { GLint timeUniform = glGetUniformLocation(mShaderProgram, "time"); + GLint modelUniform = glGetUniformLocation(mShaderProgram, "model"); + GLint viewUniform = glGetUniformLocation(mShaderProgram, "view"); + GLint projUniform = glGetUniformLocation(mShaderProgram, "proj"); - auto startTime = glfwGetTime(); + int width, height; + glfwGetWindowSize(mpWindow, &width, &height); + auto projMatrix = glm::perspective(60.0f, float(width) / height, 0.01f, 1000.f); + + auto viewMatrix = glm::lookAt( + glm::vec3{0.f, 0.f, 0.f}, + glm::vec3{0.f, 0.f, -1.f}, + glm::vec3{0.f, -1.f, 0.f} + ); + + auto modelMatrix = glm::identity(); + modelMatrix = glm::translate(modelMatrix, glm::vec3{0.f, 0.f, -.2f}); + + glUniformMatrix4fv(viewUniform, 1, GL_FALSE, glm::value_ptr(viewMatrix)); + glUniformMatrix4fv(projUniform, 1, GL_FALSE, glm::value_ptr(projMatrix)); + glUniformMatrix4fv(modelUniform, 1, GL_FALSE, glm::value_ptr(modelMatrix)); + glEnable(GL_DEPTH_TEST); + + auto prevTime = glfwGetTime(); + auto elapsed = 0.0; while(!glfwWindowShouldClose(mpWindow)) { glfwPollEvents(); - glUniform1f(timeUniform, glfwGetTime() - startTime); - glClear(GL_COLOR_BUFFER_BIT); - glDrawArrays(GL_TRIANGLES, 0, 6); + auto now = glfwGetTime(); + auto dt = now - prevTime; + elapsed += dt; + prevTime = now; + modelMatrix = glm::rotate(modelMatrix, glm::radians(float(dt) * 18.0f), glm::vec3{0.08f, 0.05f, 1.f}); + glUniformMatrix4fv(modelUniform, 1, GL_FALSE, glm::value_ptr(modelMatrix)); + glUniform1f(timeUniform, 4.f * elapsed); + + glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); + glDrawArrays(GL_TRIANGLES, 0, 6); glfwSwapBuffers(mpWindow); } }