39 cfg (float, gl_maincolor_alpha, 1.0); |
39 cfg (float, gl_maincolor_alpha, 1.0); |
40 cfg (int, gl_linethickness, 2); |
40 cfg (int, gl_linethickness, 2); |
41 cfg (bool, gl_colorbfc, true); |
41 cfg (bool, gl_colorbfc, true); |
42 cfg (bool, gl_selflash, false); |
42 cfg (bool, gl_selflash, false); |
43 |
43 |
44 // ========================================================================= // |
44 // ============================================================================= |
45 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // |
45 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * |
46 // ========================================================================= // |
46 // ============================================================================= |
47 GLRenderer::GLRenderer (QWidget* parent) { |
47 GLRenderer::GLRenderer (QWidget* parent) { |
48 parent = parent; // shhh, GCC |
48 parent = parent; // shhh, GCC |
49 fRotX = fRotY = fRotZ = 0.0f; |
49 fRotX = fRotY = fRotZ = 0.0f; |
50 fZoom = 1.0f; |
50 fZoom = 1.0f; |
51 bPicking = false; |
51 bPicking = false; |
52 |
52 |
53 qPulseTimer = new QTimer (this); |
53 qPulseTimer = new QTimer (this); |
54 connect (qPulseTimer, SIGNAL (timeout ()), this, SLOT (slot_timerUpdate ())); |
54 connect (qPulseTimer, SIGNAL (timeout ()), this, SLOT (slot_timerUpdate ())); |
55 } |
55 } |
56 |
56 |
57 // ========================================================================= // |
57 // ============================================================================= |
58 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // |
58 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * |
59 // ========================================================================= // |
59 // ============================================================================= |
60 void GLRenderer::initializeGL () { |
60 void GLRenderer::initializeGL () { |
61 glLoadIdentity(); |
61 glLoadIdentity(); |
62 glMatrixMode (GL_MODELVIEW); |
62 glMatrixMode (GL_MODELVIEW); |
63 |
63 |
64 setBackground (); |
64 setBackground (); |
80 |
80 |
81 setMouseTracking (true); |
81 setMouseTracking (true); |
82 compileObjects (); |
82 compileObjects (); |
83 } |
83 } |
84 |
84 |
85 // ========================================================================= // |
85 // ============================================================================= |
86 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // |
86 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * |
87 // ========================================================================= // |
87 // ============================================================================= |
88 QColor GLRenderer::getMainColor () { |
88 QColor GLRenderer::getMainColor () { |
89 QColor col (gl_maincolor.value.chars()); |
89 QColor col (gl_maincolor.value.chars()); |
90 |
90 |
91 if (!col.isValid ()) |
91 if (!col.isValid ()) |
92 return QColor (0, 0, 0); // shouldn't happen |
92 return QColor (0, 0, 0); // shouldn't happen |
93 |
93 |
94 col.setAlpha (gl_maincolor_alpha * 255.f); |
94 col.setAlpha (gl_maincolor_alpha * 255.f); |
95 return col; |
95 return col; |
96 } |
96 } |
97 |
97 |
98 // ------------------------------------------------------------------------- // |
98 // ----------------------------------------------------------------------------- |
99 void GLRenderer::setBackground () { |
99 void GLRenderer::setBackground () { |
100 QColor col (gl_bgcolor.value.chars()); |
100 QColor col (gl_bgcolor.value.chars()); |
101 |
101 |
102 if (!col.isValid ()) |
102 if (!col.isValid ()) |
103 return; |
103 return; |
210 ((double) g) / 255.0f, |
210 ((double) g) / 255.0f, |
211 ((double) b) / 255.0f, |
211 ((double) b) / 255.0f, |
212 ((double) a) / 255.0f); |
212 ((double) a) / 255.0f); |
213 } |
213 } |
214 |
214 |
215 // ========================================================================= // |
215 // ============================================================================= |
216 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // |
216 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * |
217 // ========================================================================= // |
217 // ============================================================================= |
218 void GLRenderer::refresh () { |
218 void GLRenderer::refresh () { |
219 paintGL (); |
219 paintGL (); |
220 swapBuffers (); |
220 swapBuffers (); |
221 } |
221 } |
222 |
222 |
223 // ========================================================================= // |
223 // ============================================================================= |
224 void GLRenderer::hardRefresh () { |
224 void GLRenderer::hardRefresh () { |
225 compileObjects (); |
225 compileObjects (); |
226 refresh (); |
226 refresh (); |
227 |
227 |
228 glLineWidth (gl_linethickness); |
228 glLineWidth (gl_linethickness); |
229 } |
229 } |
230 |
230 |
231 // ========================================================================= // |
231 // ============================================================================= |
232 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // |
232 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * |
233 // ========================================================================= // |
233 // ============================================================================= |
234 void GLRenderer::resizeGL (int w, int h) { |
234 void GLRenderer::resizeGL (int w, int h) { |
235 glViewport (0, 0, w, h); |
235 glViewport (0, 0, w, h); |
236 glLoadIdentity (); |
236 glLoadIdentity (); |
237 glMatrixMode (GL_PROJECTION); |
237 glMatrixMode (GL_PROJECTION); |
238 gluPerspective (45.0f, (double)w / (double)h, 0.1f, 100.0f); |
238 gluPerspective (45.0f, (double)w / (double)h, 0.1f, 100.0f); |
239 } |
239 } |
240 |
240 |
241 // ========================================================================= // |
241 // ============================================================================= |
242 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // |
242 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * |
243 // ========================================================================= // |
243 // ============================================================================= |
244 void GLRenderer::paintGL () { |
244 void GLRenderer::paintGL () { |
245 glClear (GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); |
245 glClear (GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); |
246 glMatrixMode (GL_MODELVIEW); |
246 glMatrixMode (GL_MODELVIEW); |
247 |
247 |
248 if (g_CurrentFile == null) |
248 if (g_CurrentFile == null) |
261 for (LDObject* obj : g_CurrentFile->objects) |
261 for (LDObject* obj : g_CurrentFile->objects) |
262 glCallList ((bPicking == false) ? obj->uGLList : obj->uGLPickList); |
262 glCallList ((bPicking == false) ? obj->uGLList : obj->uGLPickList); |
263 glPopMatrix (); |
263 glPopMatrix (); |
264 } |
264 } |
265 |
265 |
266 // ========================================================================= // |
266 // ============================================================================= |
267 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // |
267 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * |
268 // ========================================================================= // |
268 // ============================================================================= |
269 void GLRenderer::compileObjects () { |
269 void GLRenderer::compileObjects () { |
270 uaObjLists.clear (); |
270 uaObjLists.clear (); |
271 |
271 |
272 g_faObjectOffset[0] = -(g_BBox.v0.x + g_BBox.v1.x) / 2; |
272 g_faObjectOffset[0] = -(g_BBox.v0.x + g_BBox.v1.x) / 2; |
273 g_faObjectOffset[1] = -(g_BBox.v0.y + g_BBox.v1.y) / 2; |
273 g_faObjectOffset[1] = -(g_BBox.v0.y + g_BBox.v1.y) / 2; |
299 |
299 |
300 uaObjLists.push_back (obj->uGLList); |
300 uaObjLists.push_back (obj->uGLList); |
301 } |
301 } |
302 } |
302 } |
303 |
303 |
304 // ========================================================================= // |
304 // ============================================================================= |
305 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // |
305 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * |
306 // ========================================================================= // |
306 // ============================================================================= |
307 template<class T> void GLRenderer::compileSubObject (LDObject* obj, |
307 template<class T> void GLRenderer::compileSubObject (LDObject* obj, |
308 const GLenum eGLType, const short dVerts) |
308 const GLenum eGLType, const short dVerts) |
309 { |
309 { |
310 T* newobj = static_cast<T*> (obj); |
310 T* newobj = static_cast<T*> (obj); |
311 glBegin (eGLType); |
311 glBegin (eGLType); |
314 compileVertex (newobj->vaCoords[i]); |
314 compileVertex (newobj->vaCoords[i]); |
315 |
315 |
316 glEnd (); |
316 glEnd (); |
317 } |
317 } |
318 |
318 |
319 // ========================================================================= // |
319 // ============================================================================= |
320 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // |
320 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * |
321 // ========================================================================= // |
321 // ============================================================================= |
322 void GLRenderer::compileOneObject (LDObject* obj) { |
322 void GLRenderer::compileOneObject (LDObject* obj) { |
323 setObjectColor (obj); |
323 setObjectColor (obj); |
324 |
324 |
325 switch (obj->getType ()) { |
325 switch (obj->getType ()) { |
326 case OBJ_Line: |
326 case OBJ_Line: |
405 default: |
405 default: |
406 break; |
406 break; |
407 } |
407 } |
408 } |
408 } |
409 |
409 |
410 // ========================================================================= // |
410 // ============================================================================= |
411 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // |
411 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * |
412 // ========================================================================= // |
412 // ============================================================================= |
413 void GLRenderer::compileVertex (vertex& vrt) { |
413 void GLRenderer::compileVertex (vertex& vrt) { |
414 glVertex3d ( |
414 glVertex3d ( |
415 (vrt.x + g_faObjectOffset[0]) / g_StoredBBoxSize, |
415 (vrt.x + g_faObjectOffset[0]) / g_StoredBBoxSize, |
416 -(vrt.y + g_faObjectOffset[1]) / g_StoredBBoxSize, |
416 -(vrt.y + g_faObjectOffset[1]) / g_StoredBBoxSize, |
417 -(vrt.z + g_faObjectOffset[2]) / g_StoredBBoxSize); |
417 -(vrt.z + g_faObjectOffset[2]) / g_StoredBBoxSize); |
418 } |
418 } |
419 |
419 |
420 // ========================================================================= // |
420 // ============================================================================= |
421 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // |
421 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * |
422 // ========================================================================= // |
422 // ============================================================================= |
423 void GLRenderer::clampAngle (double& fAngle) { |
423 void GLRenderer::clampAngle (double& fAngle) { |
424 while (fAngle < 0) |
424 while (fAngle < 0) |
425 fAngle += 360.0; |
425 fAngle += 360.0; |
426 while (fAngle > 360.0) |
426 while (fAngle > 360.0) |
427 fAngle -= 360.0; |
427 fAngle -= 360.0; |
428 } |
428 } |
429 |
429 |
430 // ========================================================================= // |
430 // ============================================================================= |
431 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // |
431 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * |
432 // ========================================================================= // |
432 // ============================================================================= |
433 void GLRenderer::mouseReleaseEvent (QMouseEvent* event) { |
433 void GLRenderer::mouseReleaseEvent (QMouseEvent* event) { |
434 if ((qMouseButtons & Qt::LeftButton) && !(event->buttons() & Qt::LeftButton)) { |
434 if ((qMouseButtons & Qt::LeftButton) && !(event->buttons() & Qt::LeftButton)) { |
435 if (ulTotalMouseMove < 10) |
435 if (ulTotalMouseMove < 10) |
436 pick (event->x(), event->y(), (qKeyMods & Qt::ControlModifier)); |
436 pick (event->x(), event->y(), (qKeyMods & Qt::ControlModifier)); |
437 |
437 |
438 ulTotalMouseMove = 0; |
438 ulTotalMouseMove = 0; |
439 } |
439 } |
440 } |
440 } |
441 |
441 |
442 // ========================================================================= // |
442 // ============================================================================= |
443 void GLRenderer::mousePressEvent (QMouseEvent* event) { |
443 void GLRenderer::mousePressEvent (QMouseEvent* event) { |
444 qMouseButtons = event->buttons(); |
444 qMouseButtons = event->buttons(); |
445 if (event->buttons() & Qt::LeftButton) |
445 if (event->buttons() & Qt::LeftButton) |
446 ulTotalMouseMove = 0; |
446 ulTotalMouseMove = 0; |
447 } |
447 } |
448 |
448 |
449 // ========================================================================= // |
449 // ============================================================================= |
450 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // |
450 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * |
451 // ========================================================================= // |
451 // ============================================================================= |
452 void GLRenderer::mouseMoveEvent (QMouseEvent *event) { |
452 void GLRenderer::mouseMoveEvent (QMouseEvent *event) { |
453 int dx = event->x () - lastPos.x (); |
453 int dx = event->x () - lastPos.x (); |
454 int dy = event->y () - lastPos.y (); |
454 int dy = event->y () - lastPos.y (); |
455 ulTotalMouseMove += abs (dx) + abs (dy); |
455 ulTotalMouseMove += abs (dx) + abs (dy); |
456 |
456 |
466 fRotZ = fRotZ + (dx); |
466 fRotZ = fRotZ + (dx); |
467 clampAngle (fRotX); |
467 clampAngle (fRotX); |
468 clampAngle (fRotZ); |
468 clampAngle (fRotZ); |
469 } |
469 } |
470 |
470 |
471 if (event->buttons () & Qt::MidButton) { |
|
472 fZoom += (dy / 100.0); |
|
473 fZoom = clamp (fZoom, 0.01, 100.0); |
|
474 } |
|
475 |
|
476 lastPos = event->pos(); |
471 lastPos = event->pos(); |
477 updateGL (); |
472 updateGL (); |
478 } |
473 } |
479 |
474 |
480 // ========================================================================= // |
475 // ============================================================================= |
481 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // |
476 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * |
482 // ========================================================================= // |
477 // ============================================================================= |
483 void GLRenderer::keyPressEvent (QKeyEvent* qEvent) { |
478 void GLRenderer::keyPressEvent (QKeyEvent* qEvent) { |
484 qKeyMods = qEvent->modifiers (); |
479 qKeyMods = qEvent->modifiers (); |
485 } |
480 } |
486 |
481 |
487 void GLRenderer::keyReleaseEvent (QKeyEvent* qEvent) { |
482 void GLRenderer::keyReleaseEvent (QKeyEvent* qEvent) { |
488 qKeyMods = qEvent->modifiers (); |
483 qKeyMods = qEvent->modifiers (); |
489 } |
484 } |
490 |
485 |
491 // ========================================================================= // |
486 // ============================================================================= |
492 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // |
487 void GLRenderer::wheelEvent (QWheelEvent* ev) { |
493 // ========================================================================= // |
488 fZoom += (-ev->delta () / 100.0); |
|
489 fZoom = clamp (fZoom, 0.01, 100.0); |
|
490 ev->accept (); |
|
491 updateGL (); |
|
492 } |
|
493 |
|
494 // ============================================================================= |
|
495 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * |
|
496 // ============================================================================= |
494 void GLRenderer::updateSelFlash () { |
497 void GLRenderer::updateSelFlash () { |
495 if (gl_selflash && g_ForgeWindow->paSelection.size() > 0) { |
498 if (gl_selflash && g_ForgeWindow->paSelection.size() > 0) { |
496 qPulseTimer->start (g_dPulseInterval); |
499 qPulseTimer->start (g_dPulseInterval); |
497 g_dPulseTick = 0; |
500 g_dPulseTick = 0; |
498 } else |
501 } else |