mirror of
				https://github.com/OpenMW/openmw.git
				synced 2025-10-31 07:26:38 +00:00 
			
		
		
		
	
		
			
				
	
	
		
			119 lines
		
	
	
	
		
			2.9 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
			
		
		
	
	
			119 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();
 | |
|     }
 | |
| }
 |