Added camera event callback support into osgViewer
This commit is contained in:
@@ -119,6 +119,26 @@ public:
|
||||
}
|
||||
};
|
||||
|
||||
class CameraUpdateCallback : public osg::NodeCallback
|
||||
{
|
||||
virtual void operator()(osg::Node* node, osg::NodeVisitor* nv)
|
||||
{
|
||||
std::cout<<"Camera update callback - pre traverse"<<node<<std::endl;
|
||||
traverse(node,nv);
|
||||
std::cout<<"Camera update callback - post traverse"<<node<<std::endl;
|
||||
}
|
||||
};
|
||||
|
||||
class CameraEventCallback : public osg::NodeCallback
|
||||
{
|
||||
virtual void operator()(osg::Node* node, osg::NodeVisitor* nv)
|
||||
{
|
||||
std::cout<<"Camera event callback - pre traverse"<<node<<std::endl;
|
||||
traverse(node,nv);
|
||||
std::cout<<"Camera event callback - post traverse"<<node<<std::endl;
|
||||
}
|
||||
};
|
||||
|
||||
int main( int argc, char **argv )
|
||||
{
|
||||
// use an ArgumentParser object to manage the program arguments.
|
||||
@@ -147,6 +167,9 @@ int main( int argc, char **argv )
|
||||
InsertCallbacksVisitor icv;
|
||||
rootnode->accept(icv);
|
||||
|
||||
viewer.getCamera()->setUpdateCallback(new CameraUpdateCallback());
|
||||
viewer.getCamera()->setEventCallback(new CameraEventCallback());
|
||||
|
||||
// set the scene to render
|
||||
viewer.setSceneData(rootnode);
|
||||
|
||||
|
||||
@@ -628,6 +628,11 @@ int main(int argc, char **argv)
|
||||
unsigned int testCase = 0;
|
||||
if (arguments.read("-t", testCase)) {}
|
||||
|
||||
osgSim::OverlayNode::OverlayTechnique technique = osgSim::OverlayNode::OBJECT_DEPENDENT_WITH_ORTHOGRAPHIC_OVERLAY;
|
||||
while (arguments.read("--object")) technique = osgSim::OverlayNode::OBJECT_DEPENDENT_WITH_ORTHOGRAPHIC_OVERLAY;
|
||||
while (arguments.read("--ortho") || arguments.read("--orthographic")) technique = osgSim::OverlayNode::VIEW_DEPENDENT_WITH_ORTHOGRAPHIC_OVERLAY;
|
||||
while (arguments.read("--persp") || arguments.read("--perspective")) technique = osgSim::OverlayNode::VIEW_DEPENDENT_WITH_PERSPECTIVE_OVERLAY;
|
||||
|
||||
|
||||
// if user request help write it out to cout.
|
||||
if (arguments.read("-h") || arguments.read("--help"))
|
||||
|
||||
@@ -50,9 +50,9 @@ class OSGVIEWER_EXPORT Scene : public virtual osg::Referenced
|
||||
const osgUtil::UpdateVisitor* getUpdateVisitor() const { return _updateVisitor.get(); }
|
||||
|
||||
|
||||
virtual void frameAdvance();
|
||||
virtual void advance();
|
||||
|
||||
virtual void frameUpdateTraversal();
|
||||
virtual void updateTraversal();
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -1136,9 +1136,26 @@ void CompositeViewer::eventTraversal()
|
||||
_eventVisitor->addEvent( event );
|
||||
|
||||
view->getSceneData()->accept(*_eventVisitor);
|
||||
|
||||
// call any camera update callbacks, but only traverse that callback, don't traverse its subgraph
|
||||
// leave that to the scene update traversal.
|
||||
osg::NodeVisitor::TraversalMode tm = _eventVisitor->getTraversalMode();
|
||||
_eventVisitor->setTraversalMode(osg::NodeVisitor::TRAVERSE_NONE);
|
||||
|
||||
if (view->getCamera() && view->getCamera()->getEventCallback()) view->getCamera()->accept(*_eventVisitor);
|
||||
|
||||
for(unsigned int i=0; i<view->getNumSlaves(); ++i)
|
||||
{
|
||||
osg::Camera* camera = view->getSlave(i)._camera.get();
|
||||
if (camera && camera->getEventCallback()) camera->accept(*_eventVisitor);
|
||||
}
|
||||
|
||||
_eventVisitor->setTraversalMode(tm);
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1153,7 +1170,8 @@ void CompositeViewer::updateTraversal()
|
||||
sitr != scenes.end();
|
||||
++sitr)
|
||||
{
|
||||
(*sitr)->frameUpdateTraversal();
|
||||
(*sitr)->updateTraversal();
|
||||
|
||||
}
|
||||
|
||||
|
||||
@@ -1162,6 +1180,28 @@ void CompositeViewer::updateTraversal()
|
||||
++vitr)
|
||||
{
|
||||
View* view = vitr->get();
|
||||
|
||||
Scene* scene = view->getScene();
|
||||
osgUtil::UpdateVisitor* uv = scene ? scene->getUpdateVisitor() : 0;
|
||||
if (uv)
|
||||
{
|
||||
// call any camera update callbacks, but only traverse that callback, don't traverse its subgraph
|
||||
// leave that to the scene update traversal.
|
||||
osg::NodeVisitor::TraversalMode tm = uv->getTraversalMode();
|
||||
uv->setTraversalMode(osg::NodeVisitor::TRAVERSE_NONE);
|
||||
|
||||
if (view->getCamera() && view->getCamera()->getUpdateCallback()) view->getCamera()->accept(*uv);
|
||||
|
||||
for(unsigned int i=0; i<view->getNumSlaves(); ++i)
|
||||
{
|
||||
osg::Camera* camera = view->getSlave(i)._camera.get();
|
||||
if (camera && camera->getUpdateCallback()) camera->accept(*uv);
|
||||
}
|
||||
|
||||
uv->setTraversalMode(tm);
|
||||
}
|
||||
|
||||
|
||||
if (view->getCameraManipulator())
|
||||
{
|
||||
view->setFusionDistance( view->getCameraManipulator()->getFusionDistanceMode(),
|
||||
|
||||
@@ -71,20 +71,20 @@ void Scene::setDatabasePager(osgDB::DatabasePager* dp)
|
||||
_databasePager = dp;
|
||||
}
|
||||
|
||||
void Scene::frameAdvance()
|
||||
void Scene::advance()
|
||||
{
|
||||
// double previousTime = _frameStamp->getReferenceTime();
|
||||
|
||||
_frameStamp->setReferenceTime(osg::Timer::instance()->time_s());
|
||||
_frameStamp->setFrameNumber(_frameStamp->getFrameNumber()+1);
|
||||
|
||||
_updateVisitor->setTraversalNumber(_frameStamp->getFrameNumber());
|
||||
|
||||
// osg::notify(osg::NOTICE)<<"Frame rate = "<<1.0/(_frameStamp->getReferenceTime()-previousTime)<<std::endl;
|
||||
}
|
||||
|
||||
void Scene::frameUpdateTraversal()
|
||||
void Scene::updateTraversal()
|
||||
{
|
||||
_updateVisitor->setTraversalNumber(_frameStamp->getFrameNumber());
|
||||
|
||||
if (!getSceneData()) return;
|
||||
|
||||
getSceneData()->accept(*_updateVisitor);
|
||||
|
||||
@@ -2033,10 +2033,25 @@ void Viewer::eventTraversal()
|
||||
_eventVisitor->addEvent( event );
|
||||
|
||||
getSceneData()->accept(*_eventVisitor);
|
||||
|
||||
// call any camera update callbacks, but only traverse that callback, don't traverse its subgraph
|
||||
// leave that to the scene update traversal.
|
||||
osg::NodeVisitor::TraversalMode tm = _eventVisitor->getTraversalMode();
|
||||
_eventVisitor->setTraversalMode(osg::NodeVisitor::TRAVERSE_NONE);
|
||||
|
||||
if (_camera.valid() && _camera->getEventCallback()) _camera->accept(*_eventVisitor);
|
||||
|
||||
for(unsigned int i=0; i<getNumSlaves(); ++i)
|
||||
{
|
||||
osg::Camera* camera = getSlave(i)._camera.get();
|
||||
if (camera && camera->getEventCallback()) camera->accept(*_eventVisitor);
|
||||
}
|
||||
|
||||
_eventVisitor->setTraversalMode(tm);
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
if (getStats() && getStats()->collectStats("event"))
|
||||
{
|
||||
double endEventTraversal = osg::Timer::instance()->delta_s(_startTick, osg::Timer::instance()->tick());
|
||||
@@ -2056,18 +2071,27 @@ void Viewer::updateTraversal()
|
||||
|
||||
double beginUpdateTraversal = osg::Timer::instance()->delta_s(_startTick, osg::Timer::instance()->tick());
|
||||
|
||||
osgUtil::UpdateVisitor* uv = _scene.valid() ? _scene->getUpdateVisitor() : 0;
|
||||
// do the update traversal of the scene.
|
||||
if (_scene.valid()) _scene->updateTraversal();
|
||||
|
||||
if (_camera.valid() && _camera->getUpdateCallback() && uv)
|
||||
osgUtil::UpdateVisitor* uv = _scene.valid() ? _scene->getUpdateVisitor() : 0;
|
||||
if (uv)
|
||||
{
|
||||
// call any camera update callbacks, but only traverse that callback, don't traverse its subgraph
|
||||
// leave that to the scene update traversal.
|
||||
osg::NodeVisitor::TraversalMode tm = uv->getTraversalMode();
|
||||
uv->setTraversalMode(osg::NodeVisitor::TRAVERSE_NONE);
|
||||
_camera->accept(*uv);
|
||||
uv->setTraversalMode(tm);
|
||||
|
||||
}
|
||||
|
||||
if (_scene.valid()) _scene->frameUpdateTraversal();
|
||||
if (_camera.valid() && _camera->getUpdateCallback()) _camera->accept(*uv);
|
||||
|
||||
for(unsigned int i=0; i<getNumSlaves(); ++i)
|
||||
{
|
||||
osg::Camera* camera = getSlave(i)._camera.get();
|
||||
if (camera && camera->getUpdateCallback()) camera->accept(*uv);
|
||||
}
|
||||
|
||||
uv->setTraversalMode(tm);
|
||||
}
|
||||
|
||||
if (_cameraManipulator.valid())
|
||||
{
|
||||
|
||||
Reference in New Issue
Block a user