|
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 }; |