src/gl/abstractshaderprogram.h

changeset 102
9f435f66bd0c
equal deleted inserted replaced
101:910890292639 102:9f435f66bd0c
1 #pragma once
2 #include "common.h"
3
4 /**
5 * @brief Base class for shader programs
6 */
7 class AbstractShaderProgram : public QObject, protected QOpenGLFunctions
8 {
9 Q_OBJECT
10 public:
11 struct ArraySpecification
12 {
13 GLenum drawMode;
14 std::size_t vertexSize;
15 QOpenGLBuffer::UsagePattern bufferUsagePattern = QOpenGLBuffer::StaticDraw;
16 };
17 struct Array
18 {
19 const ArraySpecification specification;
20 QOpenGLBuffer buffer;
21 QOpenGLVertexArrayObject vertexArrayObject;
22 int count;
23 };
24 AbstractShaderProgram(const QVector<ArraySpecification>& arraySpecifications, QObject* parent = nullptr);
25 ~AbstractShaderProgram() = default;
26 void initialize();
27 Q_SLOT void setViewMatrix(const glm::mat4& newViewMatrix);
28 Q_SLOT void setProjectionMatrix(const glm::mat4& newProjectionMatrix);
29 Q_SLOT void setModelMatrix(const glm::mat4& newModelMatrix);
30 void draw();
31 void teardown();
32 protected:
33 void setMatrix(const char* name, const glm::mat4& matrix);
34 void upload(Array* array, const void* data, int count);
35 void checkForGLErrors();
36 /// \returns the source code of the vertex shader
37 virtual const char* vertexShaderSource() const = 0;
38 /// \returns the source code of the fragment shader
39 virtual const char* fragmentShaderSource() const = 0;
40 /// Called during initialization to set up the VAO. Set up your vertex array attributes here.
41 virtual void setupVertexArrays() = 0;
42
43 bool isInitialized = false;
44 QOpenGLShader vertexShader;
45 QOpenGLShader fragmentShader;
46 std::optional<gl::ShaderProgram> program{std::nullopt};
47 QVector<Array> arrays;
48 };

mercurial