From Wang Rui, "I've encountered a strange problem that osgviewerMFC doesn't work well
with the StatsHandler. When the 's' key is pressed, the rendering window will be halted. I tried solving the problem by commenting a line in CMFC_OSG_MDIView::OnKeyDown() and it seems to work now. Another improvement here is to use a thread class derived from OpenThreads to replace the old _beginthread(). It helps a lot in keeping a high frame rate when you open more than one MDI child windows. And the application using OpenThreads in my opinion will be more compatible and portable."
This commit is contained in:
parent
c8de3b70ca
commit
5162fcc108
@ -52,6 +52,7 @@ void cOSG::InitSceneGraph(void)
|
|||||||
|
|
||||||
// Load the Model from the model name
|
// Load the Model from the model name
|
||||||
mModel = osgDB::readNodeFile(m_ModelName);
|
mModel = osgDB::readNodeFile(m_ModelName);
|
||||||
|
if (!mModel) return;
|
||||||
|
|
||||||
// Optimize the model
|
// Optimize the model
|
||||||
osgUtil::Optimizer optimizer;
|
osgUtil::Optimizer optimizer;
|
||||||
@ -141,7 +142,7 @@ void cOSG::PostFrameUpdate()
|
|||||||
// Due any postframe updates in this routine
|
// Due any postframe updates in this routine
|
||||||
}
|
}
|
||||||
|
|
||||||
void cOSG::Render(void* ptr)
|
/*void cOSG::Render(void* ptr)
|
||||||
{
|
{
|
||||||
cOSG* osg = (cOSG*)ptr;
|
cOSG* osg = (cOSG*)ptr;
|
||||||
|
|
||||||
@ -166,4 +167,33 @@ void cOSG::Render(void* ptr)
|
|||||||
AfxMessageBox("Exit Rendering Thread");
|
AfxMessageBox("Exit Rendering Thread");
|
||||||
|
|
||||||
_endthread();
|
_endthread();
|
||||||
|
}*/
|
||||||
|
|
||||||
|
CRenderingThread::CRenderingThread( cOSG* ptr )
|
||||||
|
: OpenThreads::Thread(), _ptr(ptr), _done(false)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
CRenderingThread::~CRenderingThread()
|
||||||
|
{
|
||||||
|
_done = true;
|
||||||
|
while( isRunning() )
|
||||||
|
OpenThreads::Thread::YieldCurrentThread();
|
||||||
|
}
|
||||||
|
|
||||||
|
void CRenderingThread::run()
|
||||||
|
{
|
||||||
|
if ( !_ptr )
|
||||||
|
{
|
||||||
|
_done = true;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
osgViewer::Viewer* viewer = _ptr->getViewer();
|
||||||
|
do
|
||||||
|
{
|
||||||
|
_ptr->PreFrameUpdate();
|
||||||
|
viewer->frame();
|
||||||
|
_ptr->PostFrameUpdate();
|
||||||
|
} while ( !testCancel() && !viewer->done() && !_done );
|
||||||
}
|
}
|
||||||
|
@ -27,7 +27,7 @@ public:
|
|||||||
void PostFrameUpdate(void);
|
void PostFrameUpdate(void);
|
||||||
void Done(bool value) { mDone = value; }
|
void Done(bool value) { mDone = value; }
|
||||||
bool Done(void) { return mDone; }
|
bool Done(void) { return mDone; }
|
||||||
static void Render(void* ptr);
|
//static void Render(void* ptr);
|
||||||
|
|
||||||
osgViewer::Viewer* getViewer() { return mViewer; }
|
osgViewer::Viewer* getViewer() { return mViewer; }
|
||||||
|
|
||||||
@ -41,3 +41,16 @@ private:
|
|||||||
osg::ref_ptr<osgGA::TrackballManipulator> trackball;
|
osg::ref_ptr<osgGA::TrackballManipulator> trackball;
|
||||||
osg::ref_ptr<osgGA::KeySwitchMatrixManipulator> keyswitchManipulator;
|
osg::ref_ptr<osgGA::KeySwitchMatrixManipulator> keyswitchManipulator;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
class CRenderingThread : public OpenThreads::Thread
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
CRenderingThread( cOSG* ptr );
|
||||||
|
virtual ~CRenderingThread();
|
||||||
|
|
||||||
|
virtual void run();
|
||||||
|
|
||||||
|
protected:
|
||||||
|
cOSG* _ptr;
|
||||||
|
bool _done;
|
||||||
|
};
|
||||||
|
@ -75,9 +75,10 @@ int CMFC_OSG_MDIView::OnCreate(LPCREATESTRUCT lpCreateStruct)
|
|||||||
|
|
||||||
void CMFC_OSG_MDIView::OnDestroy()
|
void CMFC_OSG_MDIView::OnDestroy()
|
||||||
{
|
{
|
||||||
|
delete mThreadHandle;
|
||||||
if(mOSG != 0) delete mOSG;
|
if(mOSG != 0) delete mOSG;
|
||||||
|
|
||||||
WaitForSingleObject(mThreadHandle, 1000);
|
//WaitForSingleObject(mThreadHandle, 1000);
|
||||||
|
|
||||||
CView::OnDestroy();
|
CView::OnDestroy();
|
||||||
}
|
}
|
||||||
@ -93,13 +94,15 @@ void CMFC_OSG_MDIView::OnInitialUpdate()
|
|||||||
mOSG->InitOSG(csFileName.GetString());
|
mOSG->InitOSG(csFileName.GetString());
|
||||||
|
|
||||||
// Start the thread to do OSG Rendering
|
// Start the thread to do OSG Rendering
|
||||||
mThreadHandle = (HANDLE)_beginthread(&cOSG::Render, 0, mOSG);
|
//mThreadHandle = (HANDLE)_beginthread(&cOSG::Render, 0, mOSG);
|
||||||
|
mThreadHandle = new CRenderingThread(mOSG);
|
||||||
|
mThreadHandle->start();
|
||||||
}
|
}
|
||||||
|
|
||||||
void CMFC_OSG_MDIView::OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags)
|
void CMFC_OSG_MDIView::OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags)
|
||||||
{
|
{
|
||||||
// Pass Key Presses into OSG
|
// Pass Key Presses into OSG
|
||||||
mOSG->getViewer()->getEventQueue()->keyPress(nChar);
|
//mOSG->getViewer()->getEventQueue()->keyPress(nChar);
|
||||||
|
|
||||||
// Close Window on Escape Key
|
// Close Window on Escape Key
|
||||||
if(nChar == VK_ESCAPE)
|
if(nChar == VK_ESCAPE)
|
||||||
|
@ -34,7 +34,8 @@ public:
|
|||||||
|
|
||||||
protected:
|
protected:
|
||||||
cOSG* mOSG;
|
cOSG* mOSG;
|
||||||
HANDLE mThreadHandle;
|
//HANDLE mThreadHandle;
|
||||||
|
CRenderingThread* mThreadHandle;
|
||||||
|
|
||||||
// Generated message map functions
|
// Generated message map functions
|
||||||
protected:
|
protected:
|
||||||
|
Loading…
Reference in New Issue
Block a user