src/gl/compiler.h

changeset 189
815fbaae9cb2
parent 150
b6cbba6e29a1
child 200
ca23936b455b
equal deleted inserted replaced
188:64ea7282611e 189:815fbaae9cb2
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);

mercurial