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); |