|
|
|
@ -26,28 +26,6 @@
|
|
|
|
|
|
|
|
|
|
using namespace osgQt;
|
|
|
|
|
|
|
|
|
|
/// The object responsible for the scene re-rendering.
|
|
|
|
|
class HeartBeat : public QObject {
|
|
|
|
|
public:
|
|
|
|
|
int _timerId;
|
|
|
|
|
osg::Timer _lastFrameStartTime;
|
|
|
|
|
osg::observer_ptr< osgViewer::ViewerBase > _viewer;
|
|
|
|
|
|
|
|
|
|
virtual ~HeartBeat();
|
|
|
|
|
|
|
|
|
|
void init( osgViewer::ViewerBase *viewer );
|
|
|
|
|
void stopTimer();
|
|
|
|
|
void timerEvent( QTimerEvent *event );
|
|
|
|
|
|
|
|
|
|
static HeartBeat* instance();
|
|
|
|
|
private:
|
|
|
|
|
HeartBeat();
|
|
|
|
|
|
|
|
|
|
static QPointer<HeartBeat> heartBeat;
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
QPointer<HeartBeat> HeartBeat::heartBeat;
|
|
|
|
|
|
|
|
|
|
#if (QT_VERSION < QT_VERSION_CHECK(5, 2, 0))
|
|
|
|
|
#define GETDEVICEPIXELRATIO() 1.0
|
|
|
|
|
#else
|
|
|
|
@ -637,104 +615,3 @@ private:
|
|
|
|
|
QtWindowingSystem& operator=( const QtWindowingSystem& );
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
void osgQt::setViewer( osgViewer::ViewerBase *viewer )
|
|
|
|
|
{
|
|
|
|
|
HeartBeat::instance()->init( viewer );
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/// Constructor. Must be called from main thread.
|
|
|
|
|
HeartBeat::HeartBeat() : _timerId( 0 )
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/// Destructor. Must be called from main thread.
|
|
|
|
|
HeartBeat::~HeartBeat()
|
|
|
|
|
{
|
|
|
|
|
stopTimer();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
HeartBeat* HeartBeat::instance()
|
|
|
|
|
{
|
|
|
|
|
if (!heartBeat)
|
|
|
|
|
{
|
|
|
|
|
heartBeat = new HeartBeat();
|
|
|
|
|
}
|
|
|
|
|
return heartBeat;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void HeartBeat::stopTimer()
|
|
|
|
|
{
|
|
|
|
|
if ( _timerId != 0 )
|
|
|
|
|
{
|
|
|
|
|
killTimer( _timerId );
|
|
|
|
|
_timerId = 0;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/// Initializes the loop for viewer. Must be called from main thread.
|
|
|
|
|
void HeartBeat::init( osgViewer::ViewerBase *viewer )
|
|
|
|
|
{
|
|
|
|
|
if( _viewer == viewer )
|
|
|
|
|
return;
|
|
|
|
|
|
|
|
|
|
stopTimer();
|
|
|
|
|
|
|
|
|
|
_viewer = viewer;
|
|
|
|
|
|
|
|
|
|
if( viewer )
|
|
|
|
|
{
|
|
|
|
|
_timerId = startTimer( 0 );
|
|
|
|
|
_lastFrameStartTime.setStartTick( 0 );
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
void HeartBeat::timerEvent( QTimerEvent * /*event*/ )
|
|
|
|
|
{
|
|
|
|
|
osg::ref_ptr< osgViewer::ViewerBase > viewer;
|
|
|
|
|
if( !_viewer.lock( viewer ) )
|
|
|
|
|
{
|
|
|
|
|
// viewer has been deleted -> stop timer
|
|
|
|
|
stopTimer();
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// limit the frame rate
|
|
|
|
|
if( viewer->getRunMaxFrameRate() > 0.0)
|
|
|
|
|
{
|
|
|
|
|
double dt = _lastFrameStartTime.time_s();
|
|
|
|
|
double minFrameTime = 1.0 / viewer->getRunMaxFrameRate();
|
|
|
|
|
if (dt < minFrameTime)
|
|
|
|
|
OpenThreads::Thread::microSleep(static_cast<unsigned int>(1000000.0*(minFrameTime-dt)));
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
// avoid excessive CPU loading when no frame is required in ON_DEMAND mode
|
|
|
|
|
if( viewer->getRunFrameScheme() == osgViewer::ViewerBase::ON_DEMAND )
|
|
|
|
|
{
|
|
|
|
|
double dt = _lastFrameStartTime.time_s();
|
|
|
|
|
if (dt < 0.01)
|
|
|
|
|
OpenThreads::Thread::microSleep(static_cast<unsigned int>(1000000.0*(0.01-dt)));
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// record start frame time
|
|
|
|
|
_lastFrameStartTime.setStartTick();
|
|
|
|
|
|
|
|
|
|
// make frame
|
|
|
|
|
if( viewer->getRunFrameScheme() == osgViewer::ViewerBase::ON_DEMAND )
|
|
|
|
|
{
|
|
|
|
|
if( viewer->checkNeedToDoFrame() )
|
|
|
|
|
{
|
|
|
|
|
viewer->frame();
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
viewer->frame();
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|