|     31 class Model; | 
    31 class Model; | 
|     32 class DocumentManager; | 
    32 class DocumentManager; | 
|     33  | 
    33  | 
|     34 namespace gl | 
    34 namespace gl | 
|     35 { | 
    35 { | 
|     36 	class Compiler; | 
    36 	struct ModelShaders | 
|     37 } | 
    37 	{ | 
|         | 
    38 		struct Vertex | 
|         | 
    39 		{ | 
|         | 
    40 			glm::vec3 position; | 
|         | 
    41 			glm::vec4 color; | 
|         | 
    42 			glm::vec3 normal; | 
|         | 
    43 			glm::int32 id; | 
|         | 
    44 			glm::int32 selected = 0; | 
|         | 
    45 		}; | 
|         | 
    46 		bool initialized = false; | 
|         | 
    47 		struct ShaderObject | 
|         | 
    48 		{ | 
|         | 
    49 			std::unique_ptr<QOpenGLShaderProgram> program = nullptr; | 
|         | 
    50 			QOpenGLShaderProgram* pickSceneProgram = nullptr; | 
|         | 
    51 			QOpenGLBuffer buffer{QOpenGLBuffer::VertexBuffer}; | 
|         | 
    52 			QOpenGLVertexArrayObject vertexArray; | 
|         | 
    53 			std::vector<Vertex> cachedData; | 
|         | 
    54 			std::size_t vertexCount; | 
|         | 
    55 		} shaderObjects[gl::NUM_POLYGON_TYPES]; | 
|         | 
    56 	}; | 
|     38  | 
    57  | 
|     39 class gl::Compiler : public QObject, protected QOpenGLExtraFunctions | 
    58 	void build( | 
|     40 { | 
    59 		ModelShaders* shaders, | 
|     41 	Q_OBJECT | 
    60 		Model *model, | 
|     42 public: | 
    61 		const ldraw::ColorTable& colorTable, | 
|     43 	Compiler(Model* model, const ldraw::ColorTable& colorTable, QObject* parent); | 
    62 		DocumentManager* context, | 
|     44 	~Compiler(); | 
    63 		const RenderPreferences& preferences); | 
|     45 	void build(DocumentManager* context, const RenderPreferences& preferences); | 
    64 	void initializeModelShaders(ModelShaders* modelShaders); | 
|     46 	std::size_t vertexCount(gl::ArrayClass arrayClass) const; | 
    65 	void bindModelShaderVertexArray(gl::ModelShaders* shaders, gl::ArrayClass arrayClass); | 
|     47 	QColor getColorForPolygon(const gl::Polygon& polygon, const RenderPreferences& preferences); | 
    66 	void releaseModelShaderVertexArray(gl::ModelShaders* shaders, gl::ArrayClass arrayClass); | 
|     48 	glm::vec3 modelCenter() const; | 
    67 	void setModelShaderSelectedObjects(gl::ModelShaders* shaders, const QSet<ldraw::id_t>& ids); | 
|     49 	double modelDistance() const; | 
    68 	std::size_t vertexCount(const ModelShaders *shaders, gl::ArrayClass arrayClass); | 
|     50 	void initialize(); | 
    69 	ldraw::id_t idFromColor(const std::array<GLubyte, 3>& data); | 
|     51 	void bindVertexArray(gl::ArrayClass arrayClass); | 
        | 
|     52 	void releaseVertexArray(gl::ArrayClass arrayClass); | 
        | 
|     53 	void buildShaders(int arrayId); | 
        | 
|     54 	void setSelectedObjects(const QSet<ldraw::id_t> ids); | 
        | 
|     55  | 
        | 
|     56 	static ldraw::id_t idFromColor(const std::array<GLubyte, 3>& data); | 
        | 
|     57  | 
    70  | 
|     58 	template<typename T> | 
    71 	template<typename T> | 
|     59 	void setUniform(const char* uniformName, T&& value) | 
    72 	void setShaderUniform(gl::ModelShaders* shaders, const char* uniformName, T&& value) | 
|     60 	{ | 
    73 	{ | 
|     61 		Q_ASSERT(this->initialized); | 
    74 		for (gl::ModelShaders::ShaderObject& shader : shaders->shaderObjects) | 
|     62 		for (auto& object : this->glObjects) | 
        | 
|     63 		{ | 
    75 		{ | 
|     64 			object.program->bind(); | 
    76 			shader.program->bind(); | 
|     65 			const int location = glGetUniformLocation(object.program->programId(), uniformName); | 
    77 			const int location = glfunc.glGetUniformLocation(shader.program->programId(), uniformName); | 
|     66 			Q_ASSERT(location != -1); | 
    78 			Q_ASSERT(location != -1); | 
|     67 			object.program->setUniformValue(location, std::forward<T>(value)); | 
    79 			shader.program->setUniformValue(location, std::forward<T>(value)); | 
|     68 			object.program->release(); | 
    80 			shader.program->release(); | 
|     69 		} | 
    81 		} | 
|     70 	} | 
    82 	} | 
|     71  | 
    83  | 
|     72 	template<typename Float, glm::qualifier Prec> | 
    84 	template<typename Float, glm::qualifier Prec> | 
|     73 	void setUniformMatrix(const char* uniformName, const glm::mat<4, 4, Float, Prec>& value) | 
    85 	void setShaderUniformMatrix( | 
|         | 
    86 		gl::ModelShaders* shaders, | 
|         | 
    87 		const char* uniformName, | 
|         | 
    88 		const glm::mat<4, 4, Float, Prec>& value) | 
|     74 	{ | 
    89 	{ | 
|     75 		const float (*array)[4][4] = reinterpret_cast<const float(*)[4][4]>(glm::value_ptr(value)); | 
    90 		const float (*array)[4][4] = reinterpret_cast<const float(*)[4][4]>(glm::value_ptr(value)); | 
|     76 		this->setUniform(uniformName, *array); | 
    91 		setShaderUniform(shaders, uniformName, *array); | 
|     77 	} | 
    92 	} | 
|     78 private: | 
    93  | 
|     79 	struct Vertex | 
    94 	BoundingBox boundingBoxForModel(Model* model, DocumentManager* context); | 
|     80 	{ | 
    95 } | 
|     81 		glm::vec3 position; | 
        | 
|     82 		glm::vec4 color; | 
        | 
|     83 		glm::vec3 normal; | 
        | 
|     84 		glm::int32 id; | 
        | 
|     85 		glm::int32 selected = 0; | 
        | 
|     86 	}; | 
        | 
|     87 	void buildPolygon(Polygon polygon, std::vector<Vertex>* vboData, const gl::RenderPreferences& preferences); | 
        | 
|     88 	Model* const model; | 
        | 
|     89 	std::size_t storedVertexCounts[gl::NUM_POLYGON_TYPES] = {0}; | 
        | 
|     90 	bool initialized = false; | 
        | 
|     91 	BoundingBox boundingBox; | 
        | 
|     92 	const ldraw::ColorTable& colorTable; | 
        | 
|     93 	ldraw::id_t hovered = ldraw::NULL_ID; | 
        | 
|     94 	struct | 
        | 
|     95 	{ | 
        | 
|     96 		QOpenGLShaderProgram* program = nullptr; | 
        | 
|     97 		QOpenGLShaderProgram* pickSceneProgram = nullptr; | 
        | 
|     98 		QOpenGLBuffer buffer{QOpenGLBuffer::VertexBuffer}; | 
        | 
|     99 		QOpenGLVertexArrayObject vertexArray; | 
        | 
|    100 		std::vector<Vertex> cachedData; | 
        | 
|    101 	} glObjects[gl::NUM_POLYGON_TYPES]; | 
        | 
|    102 }; | 
        | 
|    103  | 
    96  | 
|    104 #define CHECK_GL_ERROR() { checkGLError(__FILE__, __LINE__); } | 
    97 #define CHECK_GL_ERROR() { checkGLError(__FILE__, __LINE__); } | 
|    105 void checkGLError (QString file, int line); | 
    98 void checkGLError (QString file, int line); |