Sun, 13 Mar 2022 14:53:14 +0200
merge
#pragma once #include "common.h" /** * @brief Base class for basic shader programs * * A basic program is a collection of a single VAO with a single VBO, * a vertex shader and a fragment shader. This program deals with these * components, leaving the program-specific details to the subclasses. */ class AbstractBasicShaderProgram : public QObject, protected QOpenGLFunctions { Q_OBJECT public: AbstractBasicShaderProgram(QObject* parent = nullptr); ~AbstractBasicShaderProgram() = default; void initialize(); Q_SLOT void setViewMatrix(const glm::mat4& newViewMatrix); Q_SLOT void setProjectionMatrix(const glm::mat4& newProjectionMatrix); Q_SLOT void setModelMatrix(const glm::mat4& newModelMatrix); void draw(); void teardown(); protected: void setMatrix(const char* name, const glm::mat4& matrix); void checkForGLErrors(); /// \returns the source code of the vertex shader virtual const char* vertexShaderSource() const = 0; /// \returns the source code of the fragment shader virtual const char* fragmentShaderSource() const = 0; /// \returns the vertex data for the VBO virtual const void* vertexData() const = 0; /// \returns the size of a single vertex in bytes virtual int vertexSize() const = 0; /// \returns the amount of vertices in the data virtual int vertexCount() const = 0; /// Called during initialization to set up the VAO. Set up your vertex array attributes here. virtual void setupVertexArrays() = 0; // \returns what kind of elements are drawn (GL_QUADS, GL_TRIANGLES, GL_LINES, etc) virtual GLenum drawMode() const = 0; virtual QOpenGLBuffer::UsagePattern usagePattern() const = 0; bool isInitialized = false; QOpenGLBuffer buffer; QOpenGLShader vertexShader; QOpenGLShader fragmentShader; std::optional<gl::ShaderProgram> program{std::nullopt}; QOpenGLVertexArrayObject vertexArrayObject; };