Added View::computeIntersection implementation for a node withing a scene graph.

This commit is contained in:
Robert Osfield
2007-01-10 10:09:05 +00:00
parent 4d4b342e97
commit 4954262eb0
8 changed files with 69 additions and 106 deletions

View File

@@ -220,7 +220,7 @@ LineSegmentIntersector::LineSegmentIntersector(CoordinateFrame cf, double x, dou
switch(cf)
{
case WINDOW : _start.set(x,y,0.0); _end.set(x,y,1.0); break;
case PROJECTION : _start.set(x,y,1.0); _end.set(x,y,-1.0); break;
case PROJECTION : _start.set(x,y,-1.0); _end.set(x,y,1.0); break;
case VIEW : _start.set(x,y,0.0); _end.set(x,y,1.0); break;
case MODEL : _start.set(x,y,0.0); _end.set(x,y,1.0); break;
}

View File

@@ -12,6 +12,7 @@
*/
#include <osgViewer/Scene>
#include <osgGA/EventVisitor>
using namespace osgViewer;
@@ -64,11 +65,6 @@ void Scene::setDatabasePager(osgDB::DatabasePager* dp)
_databasePager = dp;
}
void Scene::addEventHandler(osgGA::GUIEventHandler*)
{
osg::notify(osg::NOTICE)<<"Scene::addEventHandler() not implementated yet."<<std::endl;
}
void Scene::frameAdvance()
{
// double previousTime = _frameStamp->getReferenceTime();
@@ -79,45 +75,6 @@ void Scene::frameAdvance()
// osg::notify(osg::NOTICE)<<"Frame rate = "<<1.0/(_frameStamp->getReferenceTime()-previousTime)<<std::endl;
}
void Scene::frameEventTraversal()
{
_eventQueue->frame( _frameStamp->getReferenceTime() );
osgGA::EventQueue::Events events;
_eventQueue->takeEvents(events);
if (_eventVisitor.valid())
{
_eventVisitor->setTraversalNumber(_frameStamp->getFrameNumber());
}
for(osgGA::EventQueue::Events::iterator itr = events.begin();
itr != events.end();
++itr)
{
osgGA::GUIEventAdapter* event = itr->get();
bool handled = false;
if (_eventVisitor.valid() && getSceneData())
{
_eventVisitor->reset();
_eventVisitor->addEvent( event );
getSceneData()->accept(*_eventVisitor);
if (_eventVisitor->getEventHandled()) handled = true;
}
for(EventHandlers::iterator hitr = _eventHandlers.begin();
hitr != _eventHandlers.end() && !handled;
++hitr)
{
// handled = (*hitr)->handle( *event, *this, 0, 0);
}
}
}
void Scene::frameUpdateTraversal()
{
if (!getSceneData()) return;

View File

@@ -409,11 +409,43 @@ bool View::computeIntersections(float x,float y, osgUtil::LineSegmentIntersector
}
}
bool View::computeIntersections(float x,float y, osg::Node* node, osgUtil::LineSegmentIntersector::Intersections& intersections,osg::Node::NodeMask traversalMask)
bool View::computeIntersections(float x,float y, osg::NodePath& nodePath, osgUtil::LineSegmentIntersector::Intersections& intersections,osg::Node::NodeMask traversalMask)
{
if (!_camera.valid()) return false;
osg::notify(osg::NOTICE)<<"View::computeIntersections(x,y,node,intersections) not implemented"<<std::endl;
return false;
osg::Matrix matrix = osg::computeWorldToLocal(nodePath) * _camera->getViewMatrix() * _camera->getProjectionMatrix();
double zNear = -1.0;
double zFar = 1.0;
if (_camera->getViewport())
{
matrix.postMult(_camera->getViewport()->computeWindowMatrix());
zNear = 0.0;
zFar = 1.0;
}
osg::Matrix inverse;
inverse.invert(matrix);
osg::Vec3d startVertex = osg::Vec3d(x,y,zNear) * inverse;
osg::Vec3d endVertex = osg::Vec3d(x,y,zFar) * inverse;
osgUtil::LineSegmentIntersector* picker = new osgUtil::LineSegmentIntersector(osgUtil::Intersector::MODEL, startVertex, endVertex);
osgUtil::IntersectionVisitor iv(picker);
iv.setTraversalMask(traversalMask);
nodePath.back()->accept(iv);
if (picker->containsIntersections())
{
intersections = picker->getIntersections();
return true;
}
else
{
intersections.clear();
return false;
}
}

View File

@@ -31,6 +31,8 @@ Viewer::Viewer():
_threadingModel(ThreadPerContext),
_numThreadsOnBarrier(0)
{
_eventVisitor = new osgGA::EventVisitor;
_eventVisitor->setActionAdapter(this);
}
Viewer::~Viewer()
@@ -723,37 +725,6 @@ void Viewer::eventTraversal()
}
}
#if 0
// pointer coordinate transform
for(osgGA::EventQueue::Events::iterator itr = events.begin();
itr != events.end();
++itr)
{
osgGA::GUIEventAdapter* event = itr->get();
if (getEventQueue()->getUseFixedMouseInputRange())
{
event->setInputRange(eventState->getXmin(), eventState->getYmin(), eventState->getXmax(), eventState->getYmax());
}
switch(event->getEventType())
{
case(osgGA::GUIEventAdapter::PUSH):
case(osgGA::GUIEventAdapter::RELEASE):
case(osgGA::GUIEventAdapter::DRAG):
case(osgGA::GUIEventAdapter::MOVE):
eventState->setX(event->getX());
eventState->setY(event->getY());
eventState->setButtonMask(event->getButtonMask());
// osg::notify(osg::NOTICE)<<" mouse x = "<<event->getX()<<" y="<<event->getY()<<std::endl;
// osg::notify(osg::NOTICE)<<" mouse Xmin = "<<event->getXmin()<<" Ymin="<<event->getYmin()<<" xMax="<<event->getXmax()<<" Ymax="<<event->getYmax()<<std::endl;
break;
default:
break;
}
}
#else
#endif
// osg::notify(osg::NOTICE)<<"mouseEventState Xmin = "<<eventState->getXmin()<<" Ymin="<<eventState->getYmin()<<" xMax="<<eventState->getXmax()<<" Ymax="<<eventState->getYmax()<<std::endl;
@@ -792,7 +763,7 @@ void Viewer::eventTraversal()
case(osgGA::GUIEventAdapter::KEYUP):
osg::notify(osg::NOTICE)<<" KEYUP '"<<(char)event->getKey()<<"'"<<std::endl;
break;
*/ case(osgGA::GUIEventAdapter::RESIZE):
case(osgGA::GUIEventAdapter::RESIZE):
osg::notify(osg::NOTICE)<<" RESIZE "<<event->getWindowX()<<"/"<<event->getWindowY()<<" x "<<event->getWindowWidth()<<"/"<<event->getWindowHeight() << std::endl;
break;
case(osgGA::GUIEventAdapter::QUIT_APPLICATION):
@@ -861,6 +832,28 @@ void Viewer::eventTraversal()
}
}
if (_eventVisitor.valid())
{
_eventVisitor->setFrameStamp(_scene->getFrameStamp());
_eventVisitor->setTraversalNumber(_scene->getFrameStamp()->getFrameNumber());
for(osgGA::EventQueue::Events::iterator itr = events.begin();
itr != events.end();
++itr)
{
osgGA::GUIEventAdapter* event = itr->get();
bool handled = false;
_eventVisitor->reset();
_eventVisitor->addEvent( event );
getSceneData()->accept(*_eventVisitor);
if (_eventVisitor->getEventHandled()) handled = true;
}
}
}
void Viewer::updateTraversal()