src/gl/abstractshaderprogram.h

Wed, 17 Feb 2021 16:49:35 +0200

author
Teemu Piippo <teemu@hecknology.net>
date
Wed, 17 Feb 2021 16:49:35 +0200
changeset 102
9f435f66bd0c
permissions
-rw-r--r--

stuff

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

mercurial