From 4805796fea00d5d5b01d0ef624696c3f8a63e6ad Mon Sep 17 00:00:00 2001 From: parker Date: Thu, 26 Jun 2025 19:50:15 +0100 Subject: [PATCH] refactor: create GLMesh class --- CMakeLists.txt | 1 + src/gui/viewport/GLMesh.cpp | 57 +++++++++++++++++++++++++++ src/gui/viewport/GLMesh.h | 17 ++++++++ src/gui/viewport/ViewportGLWidget.cpp | 31 +++------------ src/gui/viewport/ViewportGLWidget.h | 3 +- 5 files changed, 82 insertions(+), 27 deletions(-) create mode 100644 src/gui/viewport/GLMesh.cpp create mode 100644 src/gui/viewport/GLMesh.h diff --git a/CMakeLists.txt b/CMakeLists.txt index b7dff8b..ef9c472 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -26,6 +26,7 @@ qt_add_executable(${AppExec} src/gui/viewport/Viewport.cpp src/gui/viewport/ViewportGLWidget.cpp src/gui/viewport/GLCamera.cpp + src/gui/viewport/GLMesh.cpp src/gui/network/NetworkGraphicsView.cpp src/gui/network/NetworkGraphicsScene.cpp src/gui/network/Network.cpp diff --git a/src/gui/viewport/GLMesh.cpp b/src/gui/viewport/GLMesh.cpp new file mode 100644 index 0000000..7634494 --- /dev/null +++ b/src/gui/viewport/GLMesh.cpp @@ -0,0 +1,57 @@ +#include "gui/viewport/GLMesh.h" +#include + +GLMesh::GLMesh() +{ + initializeOpenGLFunctions(); + init(); +} + +void GLMesh::init() +{ + glGenVertexArrays(1, &vao); + glBindVertexArray(vao); + + initBuffers(); + + // unbind vertex array + glBindVertexArray(0); +} + +void GLMesh::initBuffers() +{ + + float vertices[] = { + -0.5f, -0.5f, 0.0f, + 0.5f, -0.5f, 0.0f, + 0.0f, 0.5f, 0.0f + }; + + // 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); + + // gives the shader a way to read + glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 3*sizeof(GLfloat), (void*)0); + // disable vertex attrib array + glEnableVertexAttribArray(0); +} + +void GLMesh::bind() +{ + glBindVertexArray(vao); +} + +void GLMesh::unbind() +{ + glBindVertexArray(0); +} + +void GLMesh::draw() +{ + bind(); + glDrawArrays(GL_TRIANGLES, 0, 3); +} diff --git a/src/gui/viewport/GLMesh.h b/src/gui/viewport/GLMesh.h new file mode 100644 index 0000000..40d893c --- /dev/null +++ b/src/gui/viewport/GLMesh.h @@ -0,0 +1,17 @@ +#pragma once +#include + +class GLMesh +: protected QOpenGLFunctions_3_2_Core +{ +public: + GLMesh(); + GLuint vao; + GLuint vbo; + + void init(); + void initBuffers(); + void bind(); + void unbind(); + void draw(); +}; diff --git a/src/gui/viewport/ViewportGLWidget.cpp b/src/gui/viewport/ViewportGLWidget.cpp index 0b7cca6..9d69694 100644 --- a/src/gui/viewport/ViewportGLWidget.cpp +++ b/src/gui/viewport/ViewportGLWidget.cpp @@ -1,14 +1,18 @@ #include "gui/viewport/ViewportGLWidget.h" +#include "gui/viewport/GLMesh.h" #include #include #include #include +#include #include void ViewportGLWidget::initializeGL() { initializeOpenGLFunctions(); + triangleMesh_ = std::make_unique(); + QSurfaceFormat fmt = context()->format(); std::cout << "format: " << (fmt.renderableType() == QSurfaceFormat::OpenGLES ? "GLES" : "Desktop") << "\n"; std::cout << "format: " << (fmt.renderableType() == QSurfaceFormat::OpenGL ? "true" : "false") << "\n"; @@ -23,25 +27,6 @@ void ViewportGLWidget::initializeGL() curCamera = GLCamera(); - - 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" "uniform mat4 uView;\n" @@ -101,11 +86,6 @@ void ViewportGLWidget::initializeGL() glDeleteShader(vertexShader); glDeleteShader(fragmentShader); - glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 3*sizeof(GLfloat), (void*)0); - glEnableVertexAttribArray(0); - - // unbind vertex array - glBindVertexArray(0); glClearColor(0.16f, 0.16f, 0.16f, 1.0f); @@ -140,7 +120,6 @@ void ViewportGLWidget::paintGL() curCamera.setUniform(viewMLoc); + triangleMesh_->draw(); - glBindVertexArray(vao); - glDrawArrays(GL_TRIANGLES, 0, 3); } diff --git a/src/gui/viewport/ViewportGLWidget.h b/src/gui/viewport/ViewportGLWidget.h index 11325b1..d1f1b1e 100644 --- a/src/gui/viewport/ViewportGLWidget.h +++ b/src/gui/viewport/ViewportGLWidget.h @@ -4,15 +4,16 @@ #include #include #include "gui/viewport/GLCamera.h" +#include "gui/viewport/GLMesh.h" 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; GLCamera curCamera; + std::unique_ptr triangleMesh_ ; protected: void initializeGL() override;