Hi all,
I still have problems with this. I modify the code of cookbook like this:
Code:
class RenderThread : public QThread
{
public:
RenderThread() : QThread(), viewerPtr(0), _done(false)
{
}
virtual ~RenderThread()
{
if (viewerPtr)
viewerPtr->setDone(true);
_done = true;
wait();
}
QMutex* getMutex() { return &mutex; }
osgViewer::Viewer* viewerPtr;
bool _done;
QWaitCondition condition;
Qt::HANDLE id;
protected:
virtual void run()
{
id = QThread::currentThreadId();
yieldCurrentThread();
while( !_done )
{
if(mutex.tryLock()){
if (viewerPtr)
viewerPtr->frame();
mutex.unlock();
condition.wakeAll();
}
Sleep(10);
}
viewerPtr->setDone(true);
}
QMutex mutex;
};
class ViewerWidget : public QWidget
{
public:
ViewerWidget( osg::Camera* camera, osg::Node* scene )
: QWidget()
{
_viewer.setCamera( camera );
_viewer.setSceneData( scene );
// _viewer.addEventHandler( new osgViewer::StatsHandler );
// _viewer.setCameraManipulator( new osgGA::TrackballManipulator );
_viewer.setThreadingModel( osgViewer::Viewer::SingleThreaded );
osgQt::GraphicsWindowQt* gw = dynamic_cast<osgQt::GraphicsWindowQt*>(
camera->getGraphicsContext() );
if ( gw )
{
QVBoxLayout* layout = new QVBoxLayout;
layout->addWidget( gw->getGLWidget() );
setLayout( layout );
}
_thread.viewerPtr = &_viewer;
_thread.start();
}
void stopRendering() { _thread._done = true; }
bool isRendering() { return _thread.isRunning(); }
osg::Matrix getCameraMatrix()
{
osg::Matrix mat;
if( _thread.id != QThread::currentThreadId()){
QMutexLocker locker( _thread.getMutex() );
}
mat = _viewer.getCamera()->getViewMatrix();
return mat;
}
void setCameraMatrix(osg::Matrix mat)
{
if( _thread.id != QThread::currentThreadId()){
QMutexLocker locker( _thread.getMutex() );
}
_viewer.getCamera()->setViewMatrix(mat);
}
protected:
osgViewer::Viewer _viewer;
RenderThread _thread;
};
My intention is to load an animated model (mesh with skeleton) in the scene and
rotate their bones from the main thread:
Code:
in the constructor
...
//osg layout render thread
osg::Camera* camera = createCamera( 0, 0, 640, 480 );
m_qtOsgViewer = new ViewerWidget(camera, _sceneGroup);
_sceneGroup->setUpdateCallback( this );
...
void MyOSGSceneManager::loadScene()
{
model = new
AvatarE::AnimatedModel("../../../extras/data/models/hand.fbx");
_sceneGroup->addChild(model->getRootGroup());
setActiveCamera(m_activeCameraID);
}
void MyOSGSceneManager::operator()( osg::Node * node , osg::NodeVisitor *
nodeVisitor )
{
//update cameras
if(m_cameraController->isCamMoving()){
m_cameraController->updateCamera();
m_qtOsgViewer->setCameraMatrix(m_cameraController->getCameraMatrix());
}
}
All is loaded correctly and the camera is moved without problems.
But when I call a bone manipulator function,
Code:
m_osgSceneManager->getAnimatedModel()->getAnimationManager()->manualBonesRotate(
"radio_dcho",osg::Matrix::rotate(osg::Quat(1.0,0.0,0.0,osg::DegreesToRadians(30.0))),"proba");
Nothing happens. This does not happen if the entire application works in the
same thread.
Any suggestions?
Thank you!
Cheers,
Aitor
------------------
Read this topic online here:
http://forum.openscenegraph.org/viewtopic.php?p=53073#53073
_______________________________________________
osg-users mailing list
[email protected]
http://lists.openscenegraph.org/listinfo.cgi/osg-users-openscenegraph.org