From d123f2945f7ec896a504b117509ad95fb134b89e Mon Sep 17 00:00:00 2001 From: parker Date: Thu, 26 Jun 2025 13:46:13 +0100 Subject: [PATCH] feat(viewport): basic proj and view matrix --- CMakeLists.txt | 4 +- src/gui/viewport/OpenGLWidget.cpp | 91 --------------------------- src/gui/viewport/OpenGLWidget.h | 19 ------ src/gui/viewport/Viewport.h | 2 +- src/gui/viewport/ViewportGLWidget.cpp | 68 +++++++++++++++++--- src/gui/viewport/ViewportGLWidget.h | 1 + 6 files changed, 66 insertions(+), 119 deletions(-) delete mode 100644 src/gui/viewport/OpenGLWidget.cpp delete mode 100644 src/gui/viewport/OpenGLWidget.h diff --git a/CMakeLists.txt b/CMakeLists.txt index fb26877..dcfa027 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -16,6 +16,8 @@ project(enzo_project) find_package(Qt6 REQUIRED COMPONENTS Core Widgets SvgWidgets OpenGLWidgets) qt_standard_project_setup() +# glm +find_package(glm REQUIRED) qt_add_executable(${AppExec} static/resources.qrc @@ -34,7 +36,7 @@ qt_add_executable(${AppExec} src/gui/network/NodeIconGraphic.cpp ) -target_link_libraries(${AppExec} PRIVATE Qt6::Core Qt6::Widgets Qt6::SvgWidgets Qt6::OpenGLWidgets GLU) +target_link_libraries(${AppExec} PRIVATE Qt6::Core Qt6::Widgets Qt6::SvgWidgets Qt6::OpenGLWidgets glm::glm) target_include_directories(${AppExec} PUBLIC src) # tests diff --git a/src/gui/viewport/OpenGLWidget.cpp b/src/gui/viewport/OpenGLWidget.cpp deleted file mode 100644 index e69cf99..0000000 --- a/src/gui/viewport/OpenGLWidget.cpp +++ /dev/null @@ -1,91 +0,0 @@ -#include "gui/viewport/OpenGLWidget.h" - -void ViewportGLWidget::initializeGL() -{ - initializeOpenGLFunctions(); - - glGenVertexArrays(1, &vao); - glBindVertexArray(vao); - - float vertices[] = { - -0.5f, -0.5f, 0.0f, - 0.5f, -0.5f, 0.0f, - 0.0f, 0.5f, 0.0f - }; - - GLuint vbo; - // create buffer of vertices - glGenBuffers(1, &vbo); - // set purpose - glBindBuffer(GL_ARRAY_BUFFER, vbo); - // store data in the buffer - glBufferData(GL_ARRAY_BUFFER, sizeof(vertices), vertices, GL_STATIC_DRAW); - - - // vertex shader - const std::string vertexShaderSource = "#version 330 core\n" - "layout (location = 0) in vec3 aPos;\n" - "void main()\n" - "{\n" - " gl_Position = vec4(aPos.x, aPos.y, aPos.z, 1.0);\n" - "}\n"; - // shader type - GLuint vertexShader = glCreateShader(GL_VERTEX_SHADER); - // convert source - const GLchar* vertexShaderSourceC = vertexShaderSource.c_str(); - // create shader object - glShaderSource(vertexShader, 1, &vertexShaderSourceC, NULL); - // compile shader object - glCompileShader(vertexShader); - - - // fragment shader - const std::string fragmentShaderSource = "#version 330 core\n" - "out vec4 FragColor;\n" - "void main()\n" - "{\n" - " FragColor = vec4(1.0f, 0.5f, 0.2f, 1.0f);\n" - "}\n"; - GLuint fragmentShader = glCreateShader(GL_FRAGMENT_SHADER); - const GLchar* fragmentShaderSourceC = fragmentShaderSource.c_str(); - glShaderSource(fragmentShader, 1, &fragmentShaderSourceC, NULL); - glCompileShader(fragmentShader); - - // create shader program - shaderProgram = glCreateProgram(); - // attach shaders - glAttachShader(shaderProgram, vertexShader); - glAttachShader(shaderProgram, fragmentShader); - // link program - glLinkProgram(shaderProgram); - - // delete shaders now that the program is complete - glDeleteShader(vertexShader); - glDeleteShader(fragmentShader); - - glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 3*sizeof(GLfloat), (void*)0); - glEnableVertexAttribArray(0); - - // unbind vertex array - glBindVertexArray(0); - - QSurfaceFormat fmt = context()->format(); - std::cout << "format: " << (fmt.renderableType() == QSurfaceFormat::OpenGLES ? "GLES" : "Desktop") << "\n"; - std::cout << "format: " << (fmt.renderableType() == QSurfaceFormat::OpenGL ? "true" : "false") << "\n"; - - glClearColor(0.16f, 0.16f, 0.16f, 1.0f); -} - - - -void ViewportGLWidget::resizeGL(int w, int h) -{ -} - -void ViewportGLWidget::paintGL() -{ - glClear(GL_COLOR_BUFFER_BIT); - glUseProgram(shaderProgram); - glBindVertexArray(vao); - glDrawArrays(GL_TRIANGLES, 0, 3); -} diff --git a/src/gui/viewport/OpenGLWidget.h b/src/gui/viewport/OpenGLWidget.h deleted file mode 100644 index 3526ddf..0000000 --- a/src/gui/viewport/OpenGLWidget.h +++ /dev/null @@ -1,19 +0,0 @@ -#include -#include -#include -#include -#include - -class ViewportGLWidget : public QOpenGLWidget, protected QOpenGLFunctions_3_2_Core -{ -public: - ViewportGLWidget(QWidget *parent) : QOpenGLWidget(parent) { } - QSize sizeHint() const override { return QSize(-1, -1); } - GLuint vao; - GLuint shaderProgram; - -protected: - void initializeGL() override; - void resizeGL(int w, int h) override; - void paintGL() override; -}; diff --git a/src/gui/viewport/Viewport.h b/src/gui/viewport/Viewport.h index 2994da4..7022f2a 100644 --- a/src/gui/viewport/Viewport.h +++ b/src/gui/viewport/Viewport.h @@ -1,7 +1,7 @@ #pragma once #include #include -#include "gui/viewport/OpenGLWidget.h" +#include "gui/viewport/ViewportGLWidget.h" class Viewport : public QWidget diff --git a/src/gui/viewport/ViewportGLWidget.cpp b/src/gui/viewport/ViewportGLWidget.cpp index 5efb11b..67c9185 100644 --- a/src/gui/viewport/ViewportGLWidget.cpp +++ b/src/gui/viewport/ViewportGLWidget.cpp @@ -1,10 +1,21 @@ -#include "gui/viewport/OpenGLWidget.h" +#include "gui/viewport/ViewportGLWidget.h" +#include +#include +#include +#include void ViewportGLWidget::initializeGL() { - // Set up the rendering context, load shaders and other resources, etc.: initializeOpenGLFunctions(); + QSurfaceFormat fmt = context()->format(); + std::cout << "format: " << (fmt.renderableType() == QSurfaceFormat::OpenGLES ? "GLES" : "Desktop") << "\n"; + std::cout << "format: " << (fmt.renderableType() == QSurfaceFormat::OpenGL ? "true" : "false") << "\n"; + std::cout << "hello\n"; + + + + glGenVertexArrays(1, &vao); glBindVertexArray(vao); @@ -25,10 +36,12 @@ void ViewportGLWidget::initializeGL() // vertex shader const std::string vertexShaderSource = "#version 330 core\n" + "uniform mat4 uView;\n" + "uniform mat4 uProj;\n" "layout (location = 0) in vec3 aPos;\n" "void main()\n" "{\n" - " gl_Position = vec4(aPos.x, aPos.y, aPos.z, 1.0);\n" + " gl_Position = uProj * uView * vec4(aPos.x, aPos.y, aPos.z, 1.0);\n" "}\n"; // shader type GLuint vertexShader = glCreateShader(GL_VERTEX_SHADER); @@ -38,6 +51,22 @@ void ViewportGLWidget::initializeGL() glShaderSource(vertexShader, 1, &vertexShaderSourceC, NULL); // compile shader object glCompileShader(vertexShader); + + + // log shader error + int success; + char infoLog[512]; + glGetShaderiv(vertexShader, GL_COMPILE_STATUS, &success); + if(!success) + { + glGetShaderInfoLog(vertexShader, 512, NULL, infoLog); + std::cout << "ERROR::SHADER::VERTEX::COMPILATION_FAILED\n" << infoLog << std::endl; + } + else + { + std::cout << "success\n"; + + } // fragment shader @@ -70,9 +99,6 @@ void ViewportGLWidget::initializeGL() // unbind vertex array glBindVertexArray(0); - QSurfaceFormat fmt = context()->format(); - std::cout << "format: " << (fmt.renderableType() == QSurfaceFormat::OpenGLES ? "GLES" : "Desktop") << "\n"; - std::cout << "format: " << (fmt.renderableType() == QSurfaceFormat::OpenGL ? "true" : "false") << "\n"; glClearColor(0.16f, 0.16f, 0.16f, 1.0f); } @@ -85,9 +111,37 @@ void ViewportGLWidget::resizeGL(int w, int h) void ViewportGLWidget::paintGL() { - initializeOpenGLFunctions(); + + glClear(GL_COLOR_BUFFER_BIT); + + angle_+=0.01; + std::cout << "angle\n"; + glUseProgram(shaderProgram); + + glm::mat4 projMatrix = glm::perspective( + glm::radians(45.0f), // FOV + float(width()) / height(), // aspect ratio + 0.1f, // near plane + 100.0f // far plane + ); + + + glm::mat4 viewMatrix = glm::lookAt( + glm::vec3(sin(angle_)*5, 1, cos(angle_)*5), + glm::vec3(0,0,0), + glm::vec3(0,1,0) + ); + + GLint projMLoc = glGetUniformLocation(shaderProgram, "uProj"); + glUniformMatrix4fv(projMLoc, 1, GL_FALSE, glm::value_ptr(projMatrix)); + + GLint viewMLoc = glGetUniformLocation(shaderProgram, "uView"); + glUniformMatrix4fv(viewMLoc, 1, GL_FALSE, glm::value_ptr(viewMatrix)); + + + glBindVertexArray(vao); glDrawArrays(GL_TRIANGLES, 0, 3); } diff --git a/src/gui/viewport/ViewportGLWidget.h b/src/gui/viewport/ViewportGLWidget.h index 3526ddf..6eded6f 100644 --- a/src/gui/viewport/ViewportGLWidget.h +++ b/src/gui/viewport/ViewportGLWidget.h @@ -11,6 +11,7 @@ public: QSize sizeHint() const override { return QSize(-1, -1); } GLuint vao; GLuint shaderProgram; + float angle_ = 0.0f; protected: void initializeGL() override;