src/gl/compiler.h

changeset 189
815fbaae9cb2
parent 150
b6cbba6e29a1
child 200
ca23936b455b
--- a/src/gl/compiler.h	Tue May 24 16:11:10 2022 +0300
+++ b/src/gl/compiler.h	Wed May 25 12:01:58 2022 +0300
@@ -33,73 +33,66 @@
 
 namespace gl
 {
-	class Compiler;
-}
+	struct ModelShaders
+	{
+		struct Vertex
+		{
+			glm::vec3 position;
+			glm::vec4 color;
+			glm::vec3 normal;
+			glm::int32 id;
+			glm::int32 selected = 0;
+		};
+		bool initialized = false;
+		struct ShaderObject
+		{
+			std::unique_ptr<QOpenGLShaderProgram> program = nullptr;
+			QOpenGLShaderProgram* pickSceneProgram = nullptr;
+			QOpenGLBuffer buffer{QOpenGLBuffer::VertexBuffer};
+			QOpenGLVertexArrayObject vertexArray;
+			std::vector<Vertex> cachedData;
+			std::size_t vertexCount;
+		} shaderObjects[gl::NUM_POLYGON_TYPES];
+	};
 
-class gl::Compiler : public QObject, protected QOpenGLExtraFunctions
-{
-	Q_OBJECT
-public:
-	Compiler(Model* model, const ldraw::ColorTable& colorTable, QObject* parent);
-	~Compiler();
-	void build(DocumentManager* context, const RenderPreferences& preferences);
-	std::size_t vertexCount(gl::ArrayClass arrayClass) const;
-	QColor getColorForPolygon(const gl::Polygon& polygon, const RenderPreferences& preferences);
-	glm::vec3 modelCenter() const;
-	double modelDistance() const;
-	void initialize();
-	void bindVertexArray(gl::ArrayClass arrayClass);
-	void releaseVertexArray(gl::ArrayClass arrayClass);
-	void buildShaders(int arrayId);
-	void setSelectedObjects(const QSet<ldraw::id_t> ids);
-
-	static ldraw::id_t idFromColor(const std::array<GLubyte, 3>& data);
+	void build(
+		ModelShaders* shaders,
+		Model *model,
+		const ldraw::ColorTable& colorTable,
+		DocumentManager* context,
+		const RenderPreferences& preferences);
+	void initializeModelShaders(ModelShaders* modelShaders);
+	void bindModelShaderVertexArray(gl::ModelShaders* shaders, gl::ArrayClass arrayClass);
+	void releaseModelShaderVertexArray(gl::ModelShaders* shaders, gl::ArrayClass arrayClass);
+	void setModelShaderSelectedObjects(gl::ModelShaders* shaders, const QSet<ldraw::id_t>& ids);
+	std::size_t vertexCount(const ModelShaders *shaders, gl::ArrayClass arrayClass);
+	ldraw::id_t idFromColor(const std::array<GLubyte, 3>& data);
 
 	template<typename T>
-	void setUniform(const char* uniformName, T&& value)
+	void setShaderUniform(gl::ModelShaders* shaders, const char* uniformName, T&& value)
 	{
-		Q_ASSERT(this->initialized);
-		for (auto& object : this->glObjects)
+		for (gl::ModelShaders::ShaderObject& shader : shaders->shaderObjects)
 		{
-			object.program->bind();
-			const int location = glGetUniformLocation(object.program->programId(), uniformName);
+			shader.program->bind();
+			const int location = glfunc.glGetUniformLocation(shader.program->programId(), uniformName);
 			Q_ASSERT(location != -1);
-			object.program->setUniformValue(location, std::forward<T>(value));
-			object.program->release();
+			shader.program->setUniformValue(location, std::forward<T>(value));
+			shader.program->release();
 		}
 	}
 
 	template<typename Float, glm::qualifier Prec>
-	void setUniformMatrix(const char* uniformName, const glm::mat<4, 4, Float, Prec>& value)
+	void setShaderUniformMatrix(
+		gl::ModelShaders* shaders,
+		const char* uniformName,
+		const glm::mat<4, 4, Float, Prec>& value)
 	{
 		const float (*array)[4][4] = reinterpret_cast<const float(*)[4][4]>(glm::value_ptr(value));
-		this->setUniform(uniformName, *array);
+		setShaderUniform(shaders, uniformName, *array);
 	}
-private:
-	struct Vertex
-	{
-		glm::vec3 position;
-		glm::vec4 color;
-		glm::vec3 normal;
-		glm::int32 id;
-		glm::int32 selected = 0;
-	};
-	void buildPolygon(Polygon polygon, std::vector<Vertex>* vboData, const gl::RenderPreferences& preferences);
-	Model* const model;
-	std::size_t storedVertexCounts[gl::NUM_POLYGON_TYPES] = {0};
-	bool initialized = false;
-	BoundingBox boundingBox;
-	const ldraw::ColorTable& colorTable;
-	ldraw::id_t hovered = ldraw::NULL_ID;
-	struct
-	{
-		QOpenGLShaderProgram* program = nullptr;
-		QOpenGLShaderProgram* pickSceneProgram = nullptr;
-		QOpenGLBuffer buffer{QOpenGLBuffer::VertexBuffer};
-		QOpenGLVertexArrayObject vertexArray;
-		std::vector<Vertex> cachedData;
-	} glObjects[gl::NUM_POLYGON_TYPES];
-};
+
+	BoundingBox boundingBoxForModel(Model* model, DocumentManager* context);
+}
 
 #define CHECK_GL_ERROR() { checkGLError(__FILE__, __LINE__); }
 void checkGLError (QString file, int line);

mercurial