src/gl/basicshaderprogram.h

Tue, 21 Sep 2021 16:00:15 +0300

author
Teemu Piippo <teemu@hecknology.net>
date
Tue, 21 Sep 2021 16:00:15 +0300
changeset 132
488d0ba6070b
parent 118
8e1c9f18ae15
child 215
34c6e7bc4ee1
permissions
-rw-r--r--

Begin work with serialization

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

mercurial