diff -r 64ea7282611e -r 815fbaae9cb2 src/gl/compiler.h --- 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 program = nullptr; + QOpenGLShaderProgram* pickSceneProgram = nullptr; + QOpenGLBuffer buffer{QOpenGLBuffer::VertexBuffer}; + QOpenGLVertexArrayObject vertexArray; + std::vector 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 ids); - - static ldraw::id_t idFromColor(const std::array& 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& ids); + std::size_t vertexCount(const ModelShaders *shaders, gl::ArrayClass arrayClass); + ldraw::id_t idFromColor(const std::array& data); template - 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(value)); - object.program->release(); + shader.program->setUniformValue(location, std::forward(value)); + shader.program->release(); } } template - 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(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* 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 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);