QtBaseViewer.cc 75.4 KB
Newer Older
Jan Möbius's avatar
Jan Möbius committed
1
2
3
/*===========================================================================*\
*                                                                            *
*                              OpenFlipper                                   *
Martin Schultz's avatar
Martin Schultz committed
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
 *           Copyright (c) 2001-2015, RWTH-Aachen University                 *
 *           Department of Computer Graphics and Multimedia                  *
 *                          All rights reserved.                             *
 *                            www.openflipper.org                            *
 *                                                                           *
 *---------------------------------------------------------------------------*
 * This file is part of OpenFlipper.                                         *
 *---------------------------------------------------------------------------*
 *                                                                           *
 * Redistribution and use in source and binary forms, with or without        *
 * modification, are permitted provided that the following conditions        *
 * are met:                                                                  *
 *                                                                           *
 * 1. Redistributions of source code must retain the above copyright notice, *
 *    this list of conditions and the following disclaimer.                  *
 *                                                                           *
 * 2. Redistributions in binary form must reproduce the above copyright      *
 *    notice, this list of conditions and the following disclaimer in the    *
 *    documentation and/or other materials provided with the distribution.   *
 *                                                                           *
 * 3. Neither the name of the copyright holder nor the names of its          *
 *    contributors may be used to endorse or promote products derived from   *
 *    this software without specific prior written permission.               *
 *                                                                           *
 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS       *
 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED *
 * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A           *
 * PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER *
 * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,  *
 * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,       *
 * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR        *
 * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF    *
 * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING      *
 * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS        *
 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.              *
Jan Möbius's avatar
Jan Möbius committed
39
*                                                                            *
40
41
42
\*===========================================================================*/

/*===========================================================================*\
Jan Möbius's avatar
Jan Möbius committed
43
44
45
46
47
*                                                                            *
*   $Revision$                                                       *
*   $LastChangedBy$                                                *
*   $Date$                     *
*                                                                            *
48
\*===========================================================================*/
Jan Möbius's avatar
   
Jan Möbius committed
49
50
51
52
53
54




//=============================================================================
//
Jan Möbius's avatar
   
Jan Möbius committed
55
//  CLASS glViewer - IMPLEMENTATION
Jan Möbius's avatar
   
Jan Möbius committed
56
57
58
59
60
61
//
//=============================================================================


//== INCLUDES =================================================================

Christopher Tenter's avatar
Christopher Tenter committed
62
63
#include <ACG/GL/acg_glew.hh>

Jan Möbius's avatar
   
Jan Möbius committed
64
#include "QtBaseViewer.hh"
Jan Möbius's avatar
Jan Möbius committed
65
#include "QtGLViewerLayout.hh"
Christopher Tenter's avatar
Christopher Tenter committed
66
#include "PostProcessing.hh"
Jan Möbius's avatar
Jan Möbius committed
67

Jan Möbius's avatar
   
Jan Möbius committed
68
#include <ACG/QtWidgets/QtWheel.hh>
69
#include <ACG/Scenegraph/CoordsysNode.hh>
Jan Möbius's avatar
Jan Möbius committed
70
#include <ACG/Scenegraph/SceneGraphAnalysis.hh>
71
#include <ACG/GL/GLError.hh>
72
#include <ACG/GL/IRenderer.hh>
Jan Möbius's avatar
   
Jan Möbius committed
73

Martin Schultz's avatar
Martin Schultz committed
74
75
#include <QGraphicsWidget>
#include <QString>
Hans-Christian Ebke's avatar
Hans-Christian Ebke committed
76
77
78
79
80
81
#include <QBoxLayout>
#include <QtNetwork/QUdpSocket>
#include <QToolBar>
#include <QGraphicsSceneDragDropEvent>
#include <QPropertyAnimation>

Jan Möbius's avatar
   
Jan Möbius committed
82
83
84
85
86
87
88
#include <QMimeData>

#include <QClipboard>
#include <QApplication>
#include <QSplitter>
#include <QColorDialog>

89
#include <QGraphicsView>
Jan Möbius's avatar
   
Jan Möbius committed
90
91
#include <QGraphicsProxyWidget>

92
93
#include <QImageWriter>

94
#if QT_VERSION < 0x050000
Hans-Christian Ebke's avatar
Hans-Christian Ebke committed
95
#include <QGLFramebufferObject>
96
97
98
#else
#include <QOpenGLFramebufferObject>
#endif
99

Jan Möbius's avatar
   
Jan Möbius committed
100
101
102
103
104
105
106
107
#ifdef max
#  undef max
#endif

#ifdef min
#  undef min
#endif

108
#include <OpenFlipper/BasePlugin/PluginFunctions.hh>
Jan Möbius's avatar
Jan Möbius committed
109
#include <OpenFlipper/common/ViewObjectMarker.hh>
Jan Möbius's avatar
   
Jan Möbius committed
110

Jan Möbius's avatar
Dennis:    
Jan Möbius committed
111
112
#include <OpenFlipper/common/GlobalOptions.hh>

113
#include <OpenFlipper/common/RendererInfo.hh>
114

Jan Möbius's avatar
   
Jan Möbius committed
115
116
117
118
119
120
//== NAMESPACES ===============================================================



//== IMPLEMENTATION ==========================================================

121
static const char          COPY_PASTE_VIEW_START_STRING[] =
Jan Möbius's avatar
   
Jan Möbius committed
122
123
124
125
126
  "ACG::QtWidgets::QGLViewerWidget encoded view";

//== IMPLEMENTATION ==========================================================


127
glViewer::glViewer( QGraphicsScene* _scene,
128
                    OFGLWidget* _glWidget,
129
                    Viewer::ViewerProperties& _properties,
130
                    QGraphicsWidget* _parent) :
Jan Möbius's avatar
   
Jan Möbius committed
131
  QGraphicsWidget(_parent),
Jan Möbius's avatar
   
Jan Möbius committed
132
133
  glareaGrabbed_(false),
  projectionUpdateLocked_(false),
Jan Möbius's avatar
   
Jan Möbius committed
134
135
  glScene_(_scene),
  glWidget_(_glWidget),
Jan Möbius's avatar
Jan Möbius committed
136
137
138
  pickCache_(0),
  updatePickCache_(true),
  pickCacheSupported_(true),
139
  constrainedRotationAxis_(std::numeric_limits<double>::quiet_NaN(), 0, 0),
140
  clickEvent_(QEvent::MouseButtonPress, QPoint (), Qt::NoButton, Qt::NoButton, Qt::NoModifier),
Dirk Wilden's avatar
Dirk Wilden committed
141
  properties_(_properties),
142
  glstate_(0),
Jan Möbius's avatar
Jan Möbius committed
143
144
145
146
147
  initialized_(false),
  flyAnimationPerspective_(0),
  flyAnimationOrthogonal_(0),
  flyAngle_(0.0),
  currentAnimationPos_(0.0),
Christopher Tenter's avatar
Christopher Tenter committed
148
149
  flyMoveBack_(false),
  postproc_(0)
Jan Möbius's avatar
   
Jan Möbius committed
150
151
152
{

  // widget stuff
153
  createWidgets();
Jan Möbius's avatar
   
Jan Möbius committed
154
155
156

  // bind GL context to GL state class
  glstate_ = new ACG::GLState();
157
158
  properties_.setglState( glstate_ );

Jan Möbius's avatar
   
Jan Möbius committed
159
160
  // state
  isRotating_       = false;
Mike Kremer's avatar
Mike Kremer committed
161
  lookAround_       = false;
Jan Möbius's avatar
   
Jan Möbius committed
162
163
164

  sceneGraphRoot_   = 0;

165
  normalsMode_      = NORMALIZE_NORMALS;
Jan Möbius's avatar
   
Jan Möbius committed
166
  projectionMode_   = PERSPECTIVE_PROJECTION;
Jan Möbius's avatar
Jan Möbius committed
167
  navigationMode_   = NORMAL_NAVIGATION;
168

Jan Möbius's avatar
   
Jan Möbius committed
169
170
171
172
173
174
175
176
177
178
179
180
181
182
  trackMouse_ = false;

  // Note: we start locked (initialization of updateLocked_)
  // will be unlocked in initializeGL()

  QSizePolicy sp = sizePolicy();
  sp.setHorizontalPolicy( QSizePolicy::Expanding );
  sp.setVerticalPolicy( QSizePolicy::Expanding );
  sp.setHorizontalStretch( 1 );
  sp.setVerticalStretch( 1 );
  setSizePolicy( sp );

  redrawTime_.start ();

183
184
185
186
  // timer for animation
  timer_ = new QTimer( this );
  connect( timer_, SIGNAL(timeout()), this, SLOT( slotAnimation()) );

187
188
  fovyModifier_ = 1.0;

189
190
191
  allowRotation_ = true;


Jan Möbius's avatar
   
Jan Möbius committed
192
193
194
  connect( &properties_,SIGNAL(updated()), this, SLOT( slotPropertiesUpdated() ) );


Dirk Wilden's avatar
Dirk Wilden committed
195
196
197
  //check for updated properties once
  slotPropertiesUpdated();

Jan Möbius's avatar
   
Jan Möbius committed
198
  setAcceptDrops(true);
Jan Möbius's avatar
Dennis:    
Jan Möbius committed
199

200
  setHome();
Jan Möbius's avatar
Dennis:    
Jan Möbius committed
201

202
203
  clickTimer_.setSingleShot (true);
  connect (&clickTimer_, SIGNAL(timeout ()), this, SLOT(slotClickTimeout ()));
Jan Möbius's avatar
   
Jan Möbius committed
204
205
206
207
208
209
}


//-----------------------------------------------------------------------------


Jan Möbius's avatar
   
Jan Möbius committed
210
glViewer::~glViewer()
Jan Möbius's avatar
   
Jan Möbius committed
211
212
213
214
215
216
217
218
{
  delete glstate_;
}


//-----------------------------------------------------------------------------


219
220
221
222
223
//QSizeF
//glViewer::sizeHint(Qt::SizeHint which, const QSizeF & constraint) const
//{
//  return QSizeF( 600, 600 );
//}
Jan Möbius's avatar
   
Jan Möbius committed
224
225
226
227

//-----------------------------------------------------------------------------


Jan Möbius's avatar
   
Jan Möbius committed
228
void glViewer::makeCurrent() {
229
230
231
232
233
#if (QT_VERSION >= QT_VERSION_CHECK(5,4,4))
  const GLuint prevFbo = ACG::GLState::getFramebufferDraw();
#endif

  // calling makeCurrent binds the default FBO when QOpenGLWidget is used
Jan Möbius's avatar
   
Jan Möbius committed
234
  glWidget_->makeCurrent();
235
236
237
238
239
240

#if (QT_VERSION >= QT_VERSION_CHECK(5,4,4))
  //restore the previously bound FBO, if it was not 0 as Qt Documentation says we shall not bind 0
  if(prevFbo != 0)
    ACG::GLState::bindFramebuffer(GL_FRAMEBUFFER, prevFbo);
#endif
Jan Möbius's avatar
   
Jan Möbius committed
241
242
243
244
245
}


//-----------------------------------------------------------------------------

Jan Möbius's avatar
Jan Möbius committed
246
247
248
249
250
void glViewer::sceneGraph(ACG::SceneGraph::BaseNode* _root,
                          unsigned int               _maxPasses,
                          ACG::Vec3d                 _bbmin,
                          ACG::Vec3d                 _bbmax,
                          const bool _resetTrackBall)
Jan Möbius's avatar
   
Jan Möbius committed
251
252
253
{
  sceneGraphRoot_ = _root;

Jan Möbius's avatar
Jan Möbius committed
254
  if (sceneGraphRoot_ )
Jan Möbius's avatar
   
Jan Möbius committed
255
256
  {

Jan Möbius's avatar
Jan Möbius committed
257
258
    // set max number of render pass
    glstate_->set_max_render_passes(_maxPasses);
Jan Möbius's avatar
Jan Möbius committed
259
    
Jan Möbius's avatar
Jan Möbius committed
260
261
262
    if ( ( _bbmin[0] > _bbmax[0] ) ||
         ( _bbmin[1] > _bbmax[1] ) ||
         ( _bbmin[2] > _bbmax[2] )   ) {
263
264
      
      // Invalid bounding box, try to recover
265
      setScenePos( properties_.sceneCenter() , properties_.sceneRadius(), _resetTrackBall );
266
267
    
      // Update bounding box to match the scene geometry after recovery
Jan Möbius's avatar
Jan Möbius committed
268
269
      _bbmin = ACG::Vec3d(-1.0,-1.0,-1.0);
      _bbmax = ACG::Vec3d( 1.0, 1.0, 1.0);
Jan Möbius's avatar
Jan Möbius committed
270
271
    } else {
      
272
      // For very small scenes, we set the scene radius to 0.1
Jan Möbius's avatar
Jan Möbius committed
273
      // otherwise we take the real radius
Jan Möbius's avatar
Jan Möbius committed
274
275
      if ( ( _bbmax - _bbmin ).max() < OpenFlipperSettings().value("Core/Gui/glViewer/minimalSceneSize",0.1).toDouble() )  {
        setScenePos( ( _bbmin + _bbmax )        * 0.5,
276
                     OpenFlipperSettings().value("Core/Gui/glViewer/minimalSceneSize",0.1).toDouble(),
Jan Möbius's avatar
Jan Möbius committed
277
278
279
                     _resetTrackBall);
                   
      } else {
Jan Möbius's avatar
Jan Möbius committed
280
281
        setScenePos( ( _bbmin + _bbmax )        * 0.5,
                     ( _bbmax - _bbmin ).norm() * 0.5,
Jan Möbius's avatar
Jan Möbius committed
282
283
284
285
                     _resetTrackBall); 
      }
                   
    }
286
287
                   
    // remember the new bounding box for the state
Jan Möbius's avatar
Jan Möbius committed
288
    glstate_->set_bounding_box(_bbmin,_bbmax);
289
    
Jan Möbius's avatar
   
Jan Möbius committed
290
  }
291
  
Jan Möbius's avatar
   
Jan Möbius committed
292
293
294
295
296
297
298
299
300
301

  updateGL();

  emit(signalSceneGraphChanged(sceneGraphRoot_));
}


//-----------------------------------------------------------------------------


Jan Möbius's avatar
   
Jan Möbius committed
302
void glViewer::trackMouse(bool _track)
Jan Möbius's avatar
   
Jan Möbius committed
303
304
305
306
307
308
309
{
  trackMouse_ = _track;
}


//-----------------------------------------------------------------------------

310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
void glViewer::setCoordSysProjection(ProjectionMode _mode) {
  // Find coordsys node
  ACG::SceneGraph::BaseNode* node = 0;
  node = PluginFunctions::getSceneGraphRootNode()->find("Core Coordsys Node");

  // set the projection mode for the coordinate system node
  if (node != 0) {
    ACG::SceneGraph::CoordsysNode* cnode = dynamic_cast<ACG::SceneGraph::CoordsysNode*> (node);
    if (_mode ==  ORTHOGRAPHIC_PROJECTION) {
      cnode->setProjectionMode(ACG::SceneGraph::CoordsysNode::ORTHOGRAPHIC_PROJECTION);
    } else {
      cnode->setProjectionMode(ACG::SceneGraph::CoordsysNode::PERSPECTIVE_PROJECTION);
    }
  }
}


//-----------------------------------------------------------------------------


Jan Möbius's avatar
   
Jan Möbius committed
330
void glViewer::perspectiveProjection()
Jan Möbius's avatar
   
Jan Möbius committed
331
332
333
334
335
336
{
  projectionMode(PERSPECTIVE_PROJECTION);
  updateGL();
}


Jan Möbius's avatar
   
Jan Möbius committed
337
void glViewer::orthographicProjection()
Jan Möbius's avatar
   
Jan Möbius committed
338
339
340
341
342
343
{
  projectionMode(ORTHOGRAPHIC_PROJECTION);
  updateGL();
}


Jan Möbius's avatar
   
Jan Möbius committed
344
void glViewer::toggleProjectionMode()
Jan Möbius's avatar
   
Jan Möbius committed
345
346
347
348
349
350
351
352
353
354
{
  if (projectionMode_ == ORTHOGRAPHIC_PROJECTION)
    projectionMode(PERSPECTIVE_PROJECTION);
  else
    projectionMode(ORTHOGRAPHIC_PROJECTION);

  updateGL();
}


Jan Möbius's avatar
   
Jan Möbius committed
355
void glViewer::projectionMode(ProjectionMode _p)
Jan Möbius's avatar
   
Jan Möbius committed
356
357
{
  if ((projectionMode_ = _p) == ORTHOGRAPHIC_PROJECTION)
358
    emit projectionModeChanged( true );
Jan Möbius's avatar
   
Jan Möbius committed
359
  else
360
    emit projectionModeChanged( false );
Jan Möbius's avatar
   
Jan Möbius committed
361
362

  updateProjectionMatrix();
363

364
365
  setCoordSysProjection(_p);

366
  emit viewChanged();
Jan Möbius's avatar
   
Jan Möbius committed
367
368
}

369
370
371
void glViewer::toggleNavigationMode()
{
  if (navigationMode_ == NORMAL_NAVIGATION)
Mike Kremer's avatar
Mike Kremer committed
372
    navigationMode(FIRSTPERSON_NAVIGATION);
373
374
375
376
377
378
379
380
381
382
383
384
385
  else
    navigationMode(NORMAL_NAVIGATION);
}


void glViewer::navigationMode(NavigationMode _n)
{
  if ((navigationMode_ = _n) == NORMAL_NAVIGATION)
    emit navigationModeChanged( true );
  else
    emit navigationModeChanged( false );
}

386
387
388
389
390
391
392
393
394
395
396
void glViewer::setFOVY(double _fovy) {
    
  if(_fovy <= 0.0 || _fovy >= 180) {
    std::cerr << "Error: Minimum or maximum fovy angle exceeded!" << std::endl;
    return;
  }
  
  OpenFlipperSettings().setValue("Core/Projection/FOVY", _fovy);
  updateProjectionMatrix();
}

397
void glViewer::updateProjectionMatrix(double _aspect)
Jan Möbius's avatar
   
Jan Möbius committed
398
399
400
401
402
403
404
405
{
  if( projectionUpdateLocked_ )
    return;

  makeCurrent();

  glstate_->reset_projection();

406
  const double aspect = _aspect ? _aspect : this->aspect_ratio();
407
  // In stereo mode we have to use a perspective matrix
408
  if ( projectionMode_ == PERSPECTIVE_PROJECTION)
Jan Möbius's avatar
   
Jan Möbius committed
409
  {
410

411
    // Get fovy
412
    const double fovy = this->field_of_view_vertical();
413
414

    glstate_->perspective(fovy, (GLdouble) aspect,
415
                          near_plane(), far_plane());
Jan Möbius's avatar
Jan Möbius committed
416
417
418
  }
  else
  {
Jan Möbius's avatar
   
Jan Möbius committed
419

420
421
422
    glstate_->ortho( -ortho_width(), ortho_width(),
                     -ortho_width() / aspect, ortho_width() / aspect,
                     near_plane(), far_plane() );
Jan Möbius's avatar
   
Jan Möbius committed
423
  }
424

Jan Möbius's avatar
   
Jan Möbius committed
425
426
427
428
429
430
}


//-----------------------------------------------------------------------------


431
void glViewer::setScenePos(const ACG::Vec3d& _center, double _radius, const bool _resetTrackBall)
Jan Möbius's avatar
   
Jan Möbius committed
432
{
433
  if(_resetTrackBall) {
434
    properties_.trackballCenter(_center);
435
436
  }

437
  properties_.sceneCenter(_center);
438

439
440
  properties_.sceneRadius(_radius);
  properties_.trackballRadius(_radius);
441

442
  ACG::Vec3d c = glstate_->modelview().transform_point(properties_.sceneCenter());
443

Jan Möbius's avatar
Jan Möbius committed
444
445
  double nearPlane = std::max(0.0001f * properties_.sceneRadius(),  -(c[2] + properties_.sceneRadius()));
  double farPlane  = std::max(0.0002f * properties_.sceneRadius(),  -(c[2] - properties_.sceneRadius()));
446
447

   // Safety check, if near < 0
Jan Möbius's avatar
Jan Möbius committed
448
   if ( nearPlane <= 0.0 ) {
449
     std::cerr << "Error in BaseViewer drawScene, nearplane <= 0.0" << std::endl;
Jan Möbius's avatar
Jan Möbius committed
450
     nearPlane = 0.000000000000001;
451
452
453
   }

  // Safety check. Make sure that they are in the right order
Jan Möbius's avatar
Typo    
Jan Möbius committed
454
  if ( nearPlane > farPlane ) {
455
    std::cerr << "Error in BaseViewer setScenePos, Nearplane > Farplane" << std::endl;
Jan Möbius's avatar
Jan Möbius committed
456
    std::swap(nearPlane,farPlane);
457
458
  }

Jan Möbius's avatar
Jan Möbius committed
459
  properties_.setPlanes(nearPlane,farPlane);
Jan Möbius's avatar
   
Jan Möbius committed
460

461
462
463
464
  updateProjectionMatrix();
  updateGL();

  emit viewChanged();
465
466
467
468
469
470
}


//----------------------------------------------------------------------------


Jan Möbius's avatar
   
Jan Möbius committed
471
void glViewer::viewingDirection( const ACG::Vec3d& _dir, const ACG::Vec3d& _up )
Jan Möbius's avatar
   
Jan Möbius committed
472
473
{
  // calc eye point for this direction
474
  ACG::Vec3d eye = properties_.sceneCenter() - _dir * ( 3.0 * properties_.sceneRadius());
Jan Möbius's avatar
   
Jan Möbius committed
475
476

  glstate_->reset_modelview();
477
  glstate_->lookAt((ACG::Vec3d)eye, (ACG::Vec3d)properties_.sceneCenter(), (ACG::Vec3d)_up);
478

479
  emit viewChanged();
Jan Möbius's avatar
   
Jan Möbius committed
480
481
}

482
483
484
485
486
487
488
//-----------------------------------------------------------------------------

void glViewer::lookAt(const ACG::Vec3d& _eye, const ACG::Vec3d& _center, const ACG::Vec3d& _up) {
    
    glstate_->reset_modelview();
    glstate_->lookAt(_eye, _center, _up);
    
489
490
    properties_.sceneCenter( _center );
    properties_.sceneRadius( (properties_.sceneCenter() - _eye).norm() );
491
492
493
    
    emit viewChanged();
}
Jan Möbius's avatar
   
Jan Möbius committed
494
495
496

//-----------------------------------------------------------------------------

Jan Möbius's avatar
   
Jan Möbius committed
497
void glViewer::normalsMode(NormalsMode _mode)
Jan Möbius's avatar
   
Jan Möbius committed
498
499
500
501
502
503
{
  makeCurrent();

  switch(normalsMode_ = _mode)
  {
    case DONT_TOUCH_NORMALS:
504
      ACG::GLState::disable(GL_NORMALIZE);
Jan Möbius's avatar
   
Jan Möbius committed
505
506
507
      break;

    case NORMALIZE_NORMALS:
508
      ACG::GLState::enable(GL_NORMALIZE);
Jan Möbius's avatar
   
Jan Möbius committed
509
510
511
512
513
514
515
516
517
518
519
      break;
  }

  updateGL();
}


//-----------------------------------------------------------------------------


void
Jan Möbius's avatar
   
Jan Möbius committed
520
glViewer::copyToImage( QImage& _image,
Jan Möbius's avatar
Jan Möbius committed
521
522
		       unsigned int _l, unsigned int _t,
		       unsigned int _w, unsigned int _h,
523
			     GLenum /* _buffer */ )
Jan Möbius's avatar
   
Jan Möbius committed
524
{
525
526
527

//    makeCurrent();

528
#if (QT_VERSION >= QT_VERSION_CHECK(5, 4, 4))
529
530
531
532
533
  _image = glWidget_->grabFramebuffer()
#else
  _image = glWidget_->grabFrameBuffer(true)
#endif
    .copy(_l, _t, _w, _h).convertToFormat(QImage::Format_RGB32);
Jan Möbius's avatar
   
Jan Möbius committed
534
535
536
537
538
539
}


//-----------------------------------------------------------------------------


Jan Möbius's avatar
   
Jan Möbius committed
540
void glViewer::updateGL()
Jan Möbius's avatar
   
Jan Möbius committed
541
{
Jan Möbius's avatar
   
Jan Möbius committed
542
  if (!properties_.updateLocked() && isVisible() )
Jan Möbius's avatar
   
Jan Möbius committed
543
  {
Jan Möbius's avatar
Jan Möbius committed
544
    updatePickCache_ = true;
Jan Möbius's avatar
   
Jan Möbius committed
545
    update();
546
547

    emit viewUpdated();
Jan Möbius's avatar
   
Jan Möbius committed
548
549
550
551
552
553
554
555
  }
}



//-----------------------------------------------------------------------------


556
void glViewer::drawScene(double _aspect)
Jan Möbius's avatar
   
Jan Möbius committed
557
{
558
559
560
561
  
  // Inside the glWidget rendering, the system should not send extra updates
  properties_.blockSignals(true);
  
Jan Möbius's avatar
   
Jan Möbius committed
562
563
564
  QTime  timer;
  timer.start();

Jan Möbius's avatar
   
Jan Möbius committed
565
566
567
568
  // *****************************************************************
  // Adjust clipping planes
  // *****************************************************************
  // Far plane
569
  ACG::Vec3d c = glstate_->modelview().transform_point(properties_.sceneCenter());
Jan Möbius's avatar
   
Jan Möbius committed
570

Jan Möbius's avatar
Jan Möbius committed
571
572
  double nearPlane = std::max(0.0001f * properties_.sceneRadius(),  -(c[2] + properties_.sceneRadius()));
  double farPlane  = std::max(0.0002f * properties_.sceneRadius(),  -(c[2] - properties_.sceneRadius()));
573
574

  // Safety check, if near < 0
Jan Möbius's avatar
Jan Möbius committed
575
  if ( nearPlane <= 0.0 ) {
576
    std::cerr << "Error in BaseViewer