Re-instated the code to allow event handler to run in standard viewers like osgviewer

This commit is contained in:
Robert Osfield
2009-04-29 20:55:48 +00:00
parent 590ac02859
commit 7cf721d1b5
3 changed files with 52 additions and 13 deletions

View File

@@ -1561,11 +1561,14 @@ osgDB::ReaderWriter::ReadResult ReaderWriterP3DXML::readNode(const std::string&
osgDB::getDataFilePathList() = previousPaths;
return constructor.takePresentation();
/*
std::cout<<"readSlide="<<readSlide<<std::endl;
std::cout<<"node="<<node<<std::endl;
return node;*/
osg::ref_ptr<osg::Node> presentation_node = constructor.takePresentation();
osgPresentation::SlideEventHandler* seh = new osgPresentation::SlideEventHandler;
seh->set(presentation_node.get());
presentation_node->setEventCallback(seh);
return presentation_node.release();
}

View File

@@ -656,7 +656,7 @@ SlideEventHandler::SlideEventHandler(osgViewer::Viewer* viewer):
_updateOpacityActive(false),
_previousX(0), _previousY(0),
_cursorOn(true),
_releaseAndCompileOnEachNewSlide(true),
_releaseAndCompileOnEachNewSlide(false),
_firstSlideOrLayerChange(true),
_tickAtFirstSlideOrLayerChange(0),
_tickAtLastSlideOrLayerChange(0),
@@ -701,7 +701,7 @@ void SlideEventHandler::set(osg::Node* model)
_timePerSlide = duration;
}
selectSlide(0);
//selectSlide(0);
}
else
{
@@ -718,7 +718,7 @@ void SlideEventHandler::set(osg::Node* model)
osg::notify(osg::INFO)<<"Found presentation slide"<<findSlide._switch->getName()<<std::endl;
_slideSwitch = findSlide._switch;
selectLayer(0);
//selectLayer(0);
}
else
{
@@ -753,8 +753,38 @@ double SlideEventHandler::getCurrentTimeDelayBetweenSlides() const
}
void SlideEventHandler::operator()(osg::Node* node, osg::NodeVisitor* nv)
{
osgGA::EventVisitor* ev = dynamic_cast<osgGA::EventVisitor*>(nv);
if (ev)
{
if (node->getNumChildrenRequiringEventTraversal()>0) traverse(node,nv);
if (ev->getActionAdapter() && !ev->getEvents().empty())
{
for(osgGA::EventQueue::Events::iterator itr = ev->getEvents().begin();
itr != ev->getEvents().end();
++itr)
{
handleWithCheckAgainstIgnoreHandledEventsMask(*(*itr), *(ev->getActionAdapter()), node, nv);
}
}
}
}
bool SlideEventHandler::handle(const osgGA::GUIEventAdapter& ea,osgGA::GUIActionAdapter& aa)
{
if (!_viewer)
{
_viewer = dynamic_cast<osgViewer::Viewer*>(&aa);
selectSlide(0);
home();
osg::notify(osg::NOTICE)<<"Assigned viewer. to SlideEventHandler"<<std::endl;
}
// else osg::notify(osg::NOTICE)<<"SlideEventHandler::handle()"<<std::endl;
if (ea.getHandled()) return false;
switch(ea.getEventType())
@@ -1201,8 +1231,11 @@ void SlideEventHandler::updateOperators()
_activeOperators.collect(_slideSwitch.get());
_activeOperators.process();
UpdateLightVisitor uav(_viewer->getCamera()->getViewMatrix(),0.0f,0.0f);
_viewer->getSceneData()->accept(uav);
if (_viewer.valid())
{
UpdateLightVisitor uav(_viewer->getCamera()->getViewMatrix(),0.0f,0.0f);
_viewer->getSceneData()->accept(uav);
}
}
bool SlideEventHandler::home(const osgGA::GUIEventAdapter& ea,osgGA::GUIActionAdapter& aa)

View File

@@ -205,6 +205,9 @@ public:
virtual void accept(osgGA::GUIEventHandlerVisitor& v) { v.visit(*this); }
/** Event traversal node callback method.*/
virtual void operator()(osg::Node* node, osg::NodeVisitor* nv);
virtual bool handle(const osgGA::GUIEventAdapter& ea,osgGA::GUIActionAdapter&);
virtual void getUsage(osg::ApplicationUsage& usage) const;
@@ -280,13 +283,13 @@ protected:
osg::observer_ptr<osgViewer::Viewer> _viewer;
osg::ref_ptr<osg::Switch> _showSwitch;
osg::observer_ptr<osg::Switch> _showSwitch;
unsigned int _activePresentation;
osg::ref_ptr<osg::Switch> _presentationSwitch;
osg::observer_ptr<osg::Switch> _presentationSwitch;
unsigned int _activeSlide;
osg::ref_ptr<osg::Switch> _slideSwitch;
osg::observer_ptr<osg::Switch> _slideSwitch;
unsigned int _activeLayer;
bool _firstTraversal;