You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
openmw/extern/osgQt/CompositeOsgRenderer.cpp

120 lines
2.9 KiB
C++

#include "CompositeOsgRenderer.hpp"
#include "osgQOpenGLWidget.hpp"
#include <mutex>
#include <osgViewer/View>
#include <thread>
CompositeOsgRenderer::CompositeOsgRenderer(QObject* parent)
: QObject(parent), osgViewer::CompositeViewer(), mSimulationTime(0.0)
{
_firstFrame = true;
}
CompositeOsgRenderer::CompositeOsgRenderer(osg::ArgumentParser* arguments, QObject* parent)
: QObject(parent), osgViewer::CompositeViewer(*arguments), mSimulationTime(0.0)
{
_firstFrame = true;
}
CompositeOsgRenderer::~CompositeOsgRenderer()
{
}
void CompositeOsgRenderer::update()
{
double dt = mFrameTimer.time_s();
mFrameTimer.setStartTick();
emit simulationUpdated(dt);
mSimulationTime += dt;
osgQOpenGLWidget* osgWidget = dynamic_cast<osgQOpenGLWidget*>(parent());
if (osgWidget)
{
osgWidget->update();
}
double minFrameTime = _runMaxFrameRate > 0.0 ? 1.0 / _runMaxFrameRate : 0.0;
if (dt < minFrameTime)
{
std::this_thread::sleep_for(std::chrono::duration<double>(minFrameTime - dt));
}
}
void CompositeOsgRenderer::resize(int windowWidth, int windowHeight)
{
if(!m_osgInitialized)
return;
for(RefViews::iterator itr = _views.begin();
itr != _views.end();
++itr)
{
osgViewer::View* view = itr->get();
if(view)
{
m_osgWinEmb->resized(0, 0, windowWidth, windowHeight);
m_osgWinEmb->getEventQueue()->windowResize(0, 0, windowWidth, windowHeight);
}
}
update();
}
void CompositeOsgRenderer::setGraphicsWindowEmbedded(osg::ref_ptr<osgViewer::GraphicsWindowEmbedded> osgWinEmb)
{
m_osgWinEmb = osgWinEmb;
}
void CompositeOsgRenderer::setupOSG()
{
m_osgInitialized = true;
m_osgWinEmb->getEventQueue()->syncWindowRectangleWithGraphicsContext();
// disable key event (default is Escape key) that the viewer checks on each
// frame to see
// if the viewer's done flag should be set to signal end of viewers main
// loop.
setKeyEventSetsDone(0);
setReleaseContextAtEndOfFrameHint(false);
setThreadingModel(osgViewer::CompositeViewer::SingleThreaded);
setRunFrameScheme(osgViewer::ViewerBase::ON_DEMAND);
connect( &mTimer, SIGNAL(timeout()), this, SLOT(update()) );
mTimer.start( 10 );
osgViewer::CompositeViewer::Windows windows;
getWindows(windows);
}
// called from ViewerWidget paintGL() method
void CompositeOsgRenderer::frame(double simulationTime)
{
if(_done) return;
if(_firstFrame)
{
viewerInit();
realize();
_firstFrame = false;
}
advance(simulationTime);
eventTraversal();
updateTraversal();
renderingTraversals();
}
void CompositeOsgRenderer::timerEvent(QTimerEvent* /*event*/)
{
// ask ViewerWidget to update 3D view
if(getRunFrameScheme() != osgViewer::ViewerBase::ON_DEMAND || checkNeedToDoFrame())
{
update();
}
}