src/GLCompiler.cc

changeset 673
8e6f5b3f9d38
parent 672
0925d25ea32c
child 674
3d8ab0f89102
equal deleted inserted replaced
672:0925d25ea32c 673:8e6f5b3f9d38
12 extern_cfg (Bool, gl_blackedges); 12 extern_cfg (Bool, gl_blackedges);
13 static QList<short> g_warnedColors; 13 static QList<short> g_warnedColors;
14 GLCompiler g_vertexCompiler; 14 GLCompiler g_vertexCompiler;
15 15
16 // ============================================================================= 16 // =============================================================================
17 // ----------------------------------------------------------------------------- 17 //
18 GLCompiler::GLCompiler() : 18 GLCompiler::GLCompiler() :
19 m_file (null) 19 m_file (null)
20 { 20 {
21 needMerge(); 21 needMerge();
22 } 22 }
25 25
26 // ============================================================================= 26 // =============================================================================
27 // Note: we use the top level object's color but the draw object's vertices. 27 // Note: we use the top level object's color but the draw object's vertices.
28 // This is so that the index color is generated correctly - it has to reference 28 // This is so that the index color is generated correctly - it has to reference
29 // the top level object's ID. This is crucial for picking to work. 29 // the top level object's ID. This is crucial for picking to work.
30 // ----------------------------------------------------------------------------- 30 //
31 void GLCompiler::compilePolygon (LDObject* drawobj, LDObject* trueobj, QList< GLCompiler::CompiledTriangle >& data) 31 void GLCompiler::compilePolygon (LDObject* drawobj, LDObject* trueobj, QList< GLCompiler::CompiledTriangle >& data)
32 { 32 {
33 const QColor pickColor = getObjectColor (trueobj, PickColor); 33 const QColor pickColor = getObjectColor (trueobj, PickColor);
34 LDObject::Type type = drawobj->getType(); 34 LDObject::Type type = drawobj->getType();
35 LDObjectList objs; 35 LDObjectList objs;
70 data << a; 70 data << a;
71 } 71 }
72 } 72 }
73 73
74 // ============================================================================= 74 // =============================================================================
75 // ----------------------------------------------------------------------------- 75 //
76 void GLCompiler::compileObject (LDObject* obj) 76 void GLCompiler::compileObject (LDObject* obj)
77 { 77 {
78 initObject (obj); 78 initObject (obj);
79 QList<CompiledTriangle> data; 79 QList<CompiledTriangle> data;
80 QTime t0; 80 QTime t0;
125 125
126 needMerge(); 126 needMerge();
127 } 127 }
128 128
129 // ============================================================================= 129 // =============================================================================
130 // ----------------------------------------------------------------------------- 130 //
131 void GLCompiler::compileSubObject (LDObject* obj, LDObject* topobj, GLCompiler::PolygonList& data) 131 void GLCompiler::compileSubObject (LDObject* obj, LDObject* topobj, GLCompiler::PolygonList& data)
132 { 132 {
133 LDObjectList objs; 133 LDObjectList objs;
134 134
135 switch (obj->getType()) 135 switch (obj->getType())
171 {} break; 171 {} break;
172 } 172 }
173 } 173 }
174 174
175 // ============================================================================= 175 // =============================================================================
176 // ----------------------------------------------------------------------------- 176 //
177 void GLCompiler::compileDocument() 177 void GLCompiler::compileDocument()
178 { 178 {
179 for (LDObject * obj : m_file->getObjects()) 179 for (LDObject * obj : m_file->getObjects())
180 compileObject (obj); 180 compileObject (obj);
181 } 181 }
182 182
183 // ============================================================================= 183 // =============================================================================
184 // ----------------------------------------------------------------------------- 184 //
185 void GLCompiler::forgetObject (LDObject* obj) 185 void GLCompiler::forgetObject (LDObject* obj)
186 { 186 {
187 auto it = m_objArrays.find (obj); 187 auto it = m_objArrays.find (obj);
188 188
189 if (it != m_objArrays.end()) 189 if (it != m_objArrays.end())
191 191
192 m_objArrays.remove (obj); 192 m_objArrays.remove (obj);
193 } 193 }
194 194
195 // ============================================================================= 195 // =============================================================================
196 // ----------------------------------------------------------------------------- 196 //
197 void GLCompiler::setFile (LDDocument* file) 197 void GLCompiler::setFile (LDDocument* file)
198 { 198 {
199 m_file = file; 199 m_file = file;
200 } 200 }
201 201
202 // ============================================================================= 202 // =============================================================================
203 // ----------------------------------------------------------------------------- 203 //
204 const GLCompiler::Array* GLCompiler::getMergedBuffer (GL::VAOType type) 204 const GLCompiler::Array* GLCompiler::getMergedBuffer (GL::VAOType type)
205 { 205 {
206 // If there are objects staged for compilation, compile them now. 206 // If there are objects staged for compilation, compile them now.
207 if (m_staged.size() > 0) 207 if (m_staged.size() > 0)
208 { 208 {
236 return &m_mainArrays[type]; 236 return &m_mainArrays[type];
237 } 237 }
238 238
239 // ============================================================================= 239 // =============================================================================
240 // This turns a compiled triangle into usable VAO vertices 240 // This turns a compiled triangle into usable VAO vertices
241 // ----------------------------------------------------------------------------- 241 //
242 GLCompiler::Array* GLCompiler::postprocess (const CompiledTriangle& poly, GLRenderer::VAOType type) 242 GLCompiler::Array* GLCompiler::postprocess (const CompiledTriangle& poly, GLRenderer::VAOType type)
243 { 243 {
244 Array* va = new Array; 244 Array* va = new Array;
245 Array verts; 245 Array verts;
246 246
247 for (int i = 0; i < poly.numVerts; ++i) 247 for (int i = 0; i < poly.numVerts; ++i)
248 { 248 {
249 alias v0 = poly.verts[i]; 249 alias v0 = poly.verts[i];
250 Vertex v; 250 VAO v;
251 v.x = v0.x(); 251 v.x = v0.x();
252 v.y = v0.y(); 252 v.y = v0.y();
253 v.z = v0.z(); 253 v.z = v0.z();
254 254
255 switch (type) 255 switch (type)
277 277
278 if (type == GL::EBFCArray) 278 if (type == GL::EBFCArray)
279 { 279 {
280 int32 rgb = getColorRGB (getObjectColor (poly.obj, BFCFront)); 280 int32 rgb = getColorRGB (getObjectColor (poly.obj, BFCFront));
281 281
282 for (Vertex v : verts) 282 for (VAO vao : verts)
283 { 283 {
284 v.color = rgb; 284 vao.color = rgb;
285 *va << v; 285 *va << vao;
286 } 286 }
287 287
288 rgb = getColorRGB (getObjectColor (poly.obj, BFCBack)); 288 rgb = getColorRGB (getObjectColor (poly.obj, BFCBack));
289 289
290 for (int i = verts.size() - 1; i >= 0; --i) 290 for (int i = verts.size() - 1; i >= 0; --i)
291 { 291 {
292 Vertex v = verts[i]; 292 VAO vao = verts[i];
293 v.color = rgb; 293 vao.color = rgb;
294 *va << v; 294 *va << vao;
295 } 295 }
296 } 296 }
297 else 297 else
298 *va = verts; 298 *va = verts;
299 299
300 return va; 300 return va;
301 } 301 }
302 302
303 // ============================================================================= 303 // =============================================================================
304 // ----------------------------------------------------------------------------- 304 //
305 uint32 GLCompiler::getColorRGB (const QColor& color) 305 uint32 GLCompiler::getColorRGB (const QColor& color)
306 { 306 {
307 return 307 return
308 (color.red() & 0xFF) << 0x00 | 308 (color.red() & 0xFF) << 0x00 |
309 (color.green() & 0xFF) << 0x08 | 309 (color.green() & 0xFF) << 0x08 |
310 (color.blue() & 0xFF) << 0x10 | 310 (color.blue() & 0xFF) << 0x10 |
311 (color.alpha() & 0xFF) << 0x18; 311 (color.alpha() & 0xFF) << 0x18;
312 } 312 }
313 313
314 // ============================================================================= 314 // =============================================================================
315 // ----------------------------------------------------------------------------- 315 //
316 QColor GLCompiler::getObjectColor (LDObject* obj, ColorType colotype) const 316 QColor GLCompiler::getObjectColor (LDObject* obj, ColorType colotype) const
317 { 317 {
318 QColor qcol; 318 QColor qcol;
319 319
320 if (!obj->isColored()) 320 if (!obj->isColored())
401 401
402 return qcol; 402 return qcol;
403 } 403 }
404 404
405 // ============================================================================= 405 // =============================================================================
406 // ----------------------------------------------------------------------------- 406 //
407 void GLCompiler::needMerge() 407 void GLCompiler::needMerge()
408 { 408 {
409 // Set all of m_changed to true 409 // Set all of m_changed to true
410 memset (m_changed, 0xFF, sizeof m_changed); 410 memset (m_changed, 0xFF, sizeof m_changed);
411 } 411 }
412 412
413 // ============================================================================= 413 // =============================================================================
414 // ----------------------------------------------------------------------------- 414 //
415 void GLCompiler::initObject (LDObject* obj) 415 void GLCompiler::initObject (LDObject* obj)
416 { 416 {
417 if (m_objArrays.find (obj) == m_objArrays.end()) 417 if (m_objArrays.find (obj) == m_objArrays.end())
418 m_objArrays[obj] = new Array[GL::ENumArrays]; 418 m_objArrays[obj] = new Array[GL::ENumArrays];
419 } 419 }
420 420
421 // ============================================================================= 421 // =============================================================================
422 // ----------------------------------------------------------------------------- 422 //
423 void GLCompiler::stageForCompilation (LDObject* obj) 423 void GLCompiler::stageForCompilation (LDObject* obj)
424 { 424 {
425 m_staged << obj; 425 m_staged << obj;
426 removeDuplicates (m_staged); 426 removeDuplicates (m_staged);
427 } 427 }

mercurial