gldraw.cpp

changeset 131
3ccb10f6ed0b
parent 121
7e87c85ad092
child 132
577e8e89d8de
equal deleted inserted replaced
130:ec4b30b166fe 131:3ccb10f6ed0b
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

mercurial