112 } |
112 } |
113 } |
113 } |
114 )"; |
114 )"; |
115 |
115 |
116 template<typename Fn> |
116 template<typename Fn> |
117 constexpr void pointsToRender(const PolygonElement& element, Fn func) |
117 constexpr void pointsToRender(const PlainPolygonElement& element, Fn func) |
118 { |
118 { |
119 visitPolygon<void>( |
119 if (const LineSegment* edge = std::get_if<LineSegment>(&element)) |
120 [&func](const LineSegment& edge) |
120 { |
121 { |
121 func(edge->p1, glm::vec3{}); |
122 func(edge.p1, glm::vec3{}); |
122 func(edge->p2, glm::vec3{}); |
123 func(edge.p2, glm::vec3{}); |
123 } |
124 }, |
124 else if (std::holds_alternative<Triangle>(element)) |
125 [&func](const Triangle& tri) |
125 { |
126 { |
126 const Triangle& tri = std::get<Triangle>(element); |
127 func(tri.p1, normalVector({tri.p3, tri.p1, tri.p2})); |
127 func(tri.p1, normalVector({tri.p3, tri.p1, tri.p2})); |
128 func(tri.p2, normalVector({tri.p1, tri.p2, tri.p3})); |
128 func(tri.p2, normalVector(tri)); |
129 func(tri.p3, normalVector({tri.p2, tri.p3, tri.p1})); |
129 func(tri.p3, normalVector({tri.p2, tri.p3, tri.p1})); |
130 }, |
130 } |
131 [&func](const Quadrilateral& quad) |
131 else if (std::holds_alternative<Quadrilateral>(element)) |
132 { |
132 { |
133 func(quad.p1, normalVector({quad.p4, quad.p1, quad.p2})); |
133 const Quadrilateral& quad = std::get<Quadrilateral>(element); |
134 func(quad.p2, normalVector({quad.p1, quad.p2, quad.p3})); |
134 func(quad.p1, normalVector({quad.p4, quad.p1, quad.p2})); |
135 func(quad.p3, normalVector({quad.p2, quad.p3, quad.p4})); |
135 func(quad.p2, normalVector({quad.p1, quad.p2, quad.p3})); |
136 func(quad.p4, normalVector({quad.p3, quad.p4, quad.p1})); |
136 func(quad.p3, normalVector({quad.p2, quad.p3, quad.p4})); |
137 }, |
137 func(quad.p4, normalVector({quad.p3, quad.p4, quad.p1})); |
138 [&func](const ConditionalEdge& cedge) |
138 } |
139 { |
139 else |
140 func(cedge.p1, glm::vec3{}); |
140 { |
141 func(cedge.p2, glm::vec3{}); |
141 const ConditionalEdge& conditional_edge = std::get<ConditionalEdge>(element); |
142 }, |
142 func(conditional_edge.p1, glm::vec3{}); |
143 element); |
143 func(conditional_edge.p2, glm::vec3{}); |
|
144 } |
144 } |
145 } |
145 |
146 |
146 void gl::buildShaders( |
147 void gl::buildShaders( |
147 QOpenGLShaderProgram* shaderProgram, |
148 QOpenGLShaderProgram* shaderProgram, |
148 const char* vertexShaderSource, |
149 const char* vertexShaderSource, |
209 } |
210 } |
210 modelShaders->initialized = true; |
211 modelShaders->initialized = true; |
211 } |
212 } |
212 } |
213 } |
213 |
214 |
214 static constexpr gl::ArrayClass classifyPolygon(const PolygonElement& element) |
215 static constexpr gl::ArrayClass classifyPolygon(const PlainPolygonElement& element) |
215 { |
216 { |
216 return visitPolygon<gl::ArrayClass>( |
217 return visitPolygon<gl::ArrayClass>( |
217 [](const LineSegment&) { return gl::ArrayClass::Lines; }, |
218 [](const LineSegment&) { return gl::ArrayClass::Lines; }, |
218 [](const Triangle&) { return gl::ArrayClass::Triangles; }, |
219 [](const Triangle&) { return gl::ArrayClass::Triangles; }, |
219 [](const Quadrilateral&) { return gl::ArrayClass::Quads; }, |
220 [](const Quadrilateral&) { return gl::ArrayClass::Quads; }, |
285 for (gl::ModelShaders::ShaderObject& shader : shaders->shaderObjects) { |
286 for (gl::ModelShaders::ShaderObject& shader : shaders->shaderObjects) { |
286 shader.cachedData.clear(); |
287 shader.cachedData.clear(); |
287 } |
288 } |
288 iterateModelPolygons(model, context, [&](const WithId<PolygonElement>& polygon) |
289 iterateModelPolygons(model, context, [&](const WithId<PolygonElement>& polygon) |
289 { |
290 { |
290 const int index = static_cast<int>(classifyPolygon(polygon)); |
291 const int index = static_cast<int>(classifyPolygon(polygon.element)); |
291 std::vector<gl::ModelShaders::Vertex>& vertexBuffer = shaders->shaderObjects[index].cachedData; |
292 std::vector<gl::ModelShaders::Vertex>& vertexBuffer = shaders->shaderObjects[index].cachedData; |
292 const QColor color = getColorForPolygon(polygon, preferences, colorTable); |
293 const QColor color = getColorForPolygon(polygon, preferences, colorTable); |
293 pointsToRender(polygon, [&](const glm::vec3& point, const glm::vec3& normal){ |
294 pointsToRender(polygon.element, [&](const glm::vec3& point, const glm::vec3& normal){ |
294 gl::ModelShaders::Vertex& vertex = vertexBuffer.emplace_back(); |
295 gl::ModelShaders::Vertex& vertex = vertexBuffer.emplace_back(); |
295 vertex.position = point; |
296 vertex.position = point; |
296 vertex.normal = normal; |
297 vertex.normal = normal; |
297 vertex.color = glm::vec4{color.redF(), color.greenF(), color.blueF(), color.alphaF()}; |
298 vertex.color = glm::vec4{color.redF(), color.greenF(), color.blueF(), color.alphaF()}; |
298 vertex.id = polygon.linenumber; |
299 vertex.id = polygon.linenumber; |