Introduce new osgGA::Event and osgGA::EventHandler base classes that the old GUIEventAdapter and GUIEventHandler now subclass from.
The new osgGA::Event is written to support more generic events than the original GUIEventAdapter which are written for keyboard and mouse events.
This commit is contained in:
@@ -372,7 +372,6 @@ bool PropertyInterface::copyPropertyObjectFromObject(const osg::Object* object,
|
||||
{
|
||||
if (areTypesCompatible(valueType, sourceType))
|
||||
{
|
||||
OSG_NOTICE<<"Calling get"<<std::endl;
|
||||
return serializer->get(*object, valuePtr);
|
||||
}
|
||||
else
|
||||
@@ -396,7 +395,6 @@ bool PropertyInterface::copyPropertyObjectToObject(osg::Object* object, const st
|
||||
{
|
||||
if (areTypesCompatible(valueType, destinationType))
|
||||
{
|
||||
OSG_NOTICE<<"Calling set"<<std::endl;
|
||||
return serializer->set(*object, const_cast<void*>(valuePtr));
|
||||
}
|
||||
else
|
||||
|
||||
@@ -11,6 +11,8 @@ SET(TARGET_H
|
||||
${HEADER_PATH}/AnimationPathManipulator
|
||||
${HEADER_PATH}/DriveManipulator
|
||||
${HEADER_PATH}/Device
|
||||
${HEADER_PATH}/Event
|
||||
${HEADER_PATH}/EventHandler
|
||||
${HEADER_PATH}/EventQueue
|
||||
${HEADER_PATH}/EventVisitor
|
||||
${HEADER_PATH}/Export
|
||||
@@ -38,6 +40,8 @@ SET(TARGET_SRC
|
||||
AnimationPathManipulator.cpp
|
||||
DriveManipulator.cpp
|
||||
Device.cpp
|
||||
Event.cpp
|
||||
EventHandler.cpp
|
||||
EventQueue.cpp
|
||||
EventVisitor.cpp
|
||||
FirstPersonManipulator.cpp
|
||||
|
||||
@@ -28,7 +28,7 @@ Device::Device(const Device& es, const osg::CopyOp& copyop):
|
||||
setEventQueue(new EventQueue);
|
||||
}
|
||||
|
||||
void Device::sendEvent(const GUIEventAdapter& /*event*/)
|
||||
void Device::sendEvent(const Event& /*event*/)
|
||||
{
|
||||
OSG_WARN << "Device::sendEvent not implemented!" << std::endl;
|
||||
}
|
||||
|
||||
25
src/osgGA/Event.cpp
Normal file
25
src/osgGA/Event.cpp
Normal file
@@ -0,0 +1,25 @@
|
||||
/* -*-c++-*- OpenSceneGraph - Copyright (C) 1998-2013 Robert Osfield
|
||||
*
|
||||
* This library is open source and may be redistributed and/or modified under
|
||||
* the terms of the OpenSceneGraph Public License (OSGPL) version 0.0 or
|
||||
* (at your option) any later version. The full license is in LICENSE file
|
||||
* included with this distribution, and on the openscenegraph.org website.
|
||||
*
|
||||
* This library is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* OpenSceneGraph Public License for more details.
|
||||
*/
|
||||
|
||||
#include <osgGA/Event>
|
||||
|
||||
using namespace osgGA;
|
||||
|
||||
Event::Event():
|
||||
_time(0.0)
|
||||
{}
|
||||
|
||||
Event::Event(const Event& rhs, const osg::CopyOp& copyop):
|
||||
osg::Object(rhs, copyop),
|
||||
_time(rhs._time)
|
||||
{}
|
||||
52
src/osgGA/EventHandler.cpp
Normal file
52
src/osgGA/EventHandler.cpp
Normal file
@@ -0,0 +1,52 @@
|
||||
/* -*-c++-*- OpenSceneGraph - Copyright (C) 1998-2013 Robert Osfield
|
||||
*
|
||||
* This library is open source and may be redistributed and/or modified under
|
||||
* the terms of the OpenSceneGraph Public License (OSGPL) version 0.0 or
|
||||
* (at your option) any later version. The full license is in LICENSE file
|
||||
* included with this distribution, and on the openscenegraph.org website.
|
||||
*
|
||||
* This library is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* OpenSceneGraph Public License for more details.
|
||||
*/
|
||||
|
||||
#include <osgGA/GUIEventHandler>
|
||||
#include <osgGA/EventVisitor>
|
||||
|
||||
using namespace osgGA;
|
||||
|
||||
void EventHandler::operator()(osg::Node* node, osg::NodeVisitor* nv)
|
||||
{
|
||||
osgGA::EventVisitor* ev = dynamic_cast<osgGA::EventVisitor*>(nv);
|
||||
if (ev && ev->getActionAdapter() && !ev->getEvents().empty())
|
||||
{
|
||||
for(osgGA::EventQueue::Events::iterator itr = ev->getEvents().begin();
|
||||
itr != ev->getEvents().end();
|
||||
++itr)
|
||||
{
|
||||
handle(itr->get(), node, nv);
|
||||
}
|
||||
}
|
||||
if (node->getNumChildrenRequiringEventTraversal()>0 || _nestedCallback.valid()) traverse(node,nv);
|
||||
}
|
||||
|
||||
void EventHandler::event(osg::NodeVisitor* nv, osg::Drawable* drawable)
|
||||
{
|
||||
osgGA::EventVisitor* ev = dynamic_cast<osgGA::EventVisitor*>(nv);
|
||||
if (ev && ev->getActionAdapter() && !ev->getEvents().empty())
|
||||
{
|
||||
for(osgGA::EventQueue::Events::iterator itr = ev->getEvents().begin();
|
||||
itr != ev->getEvents().end();
|
||||
++itr)
|
||||
{
|
||||
handle(itr->get(), drawable, nv);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
bool EventHandler::handle(osgGA::Event* event, osg::Object* object, osg::NodeVisitor* nv)
|
||||
{
|
||||
OSG_NOTICE<<"Handle event "<<event<<std::endl;
|
||||
return false;
|
||||
}
|
||||
@@ -51,7 +51,7 @@ void EventQueue::appendEvents(Events& events)
|
||||
_eventQueue.insert(_eventQueue.end(), events.begin(), events.end());
|
||||
}
|
||||
|
||||
void EventQueue::addEvent(GUIEventAdapter* event)
|
||||
void EventQueue::addEvent(Event* event)
|
||||
{
|
||||
OpenThreads::ScopedLock<OpenThreads::Mutex> lock(_eventQueueMutex);
|
||||
_eventQueue.push_back(event);
|
||||
@@ -425,7 +425,7 @@ GUIEventAdapter* EventQueue::touchBegan(unsigned int id, GUIEventAdapter::Touch
|
||||
event->addTouchPoint(id, phase, x, y, 0);
|
||||
if(_firstTouchEmulatesMouse)
|
||||
event->setButton(GUIEventAdapter::LEFT_MOUSE_BUTTON);
|
||||
|
||||
|
||||
addEvent(event);
|
||||
|
||||
return event;
|
||||
@@ -464,7 +464,7 @@ GUIEventAdapter* EventQueue::touchEnded(unsigned int id, GUIEventAdapter::Touch
|
||||
event->addTouchPoint(id, phase, x, y, tap_count);
|
||||
if(_firstTouchEmulatesMouse)
|
||||
event->setButton(GUIEventAdapter::LEFT_MOUSE_BUTTON);
|
||||
|
||||
|
||||
addEvent(event);
|
||||
|
||||
return event;
|
||||
@@ -495,7 +495,7 @@ void EventQueue::frame(double time)
|
||||
GUIEventAdapter* event = new GUIEventAdapter(*_accumulateEventState);
|
||||
event->setEventType(GUIEventAdapter::FRAME);
|
||||
event->setTime(time);
|
||||
|
||||
|
||||
// OSG_NOTICE<<"frame("<<time<<"), event->getX()="<<event->getX()<<", event->getY()="<<event->getY()<<", event->getXmin()="<<event->getXmin()<<", event->getYmin()="<<event->getYmin()<<", event->getXmax()="<<event->getXmax()<<", event->getYmax()="<<event->getYmax()<<std::endl;
|
||||
|
||||
addEvent(event);
|
||||
|
||||
@@ -28,14 +28,14 @@ EventVisitor::~EventVisitor()
|
||||
{
|
||||
}
|
||||
|
||||
void EventVisitor::addEvent(GUIEventAdapter* event)
|
||||
void EventVisitor::addEvent(Event* event)
|
||||
{
|
||||
_events.push_back(event);
|
||||
}
|
||||
|
||||
void EventVisitor::removeEvent(GUIEventAdapter* event)
|
||||
void EventVisitor::removeEvent(Event* event)
|
||||
{
|
||||
EventList::iterator itr = std::find(_events.begin(),_events.end(),event);
|
||||
EventQueue::Events::iterator itr = std::find(_events.begin(), _events.end(), event);
|
||||
if (itr!=_events.end()) _events.erase(itr);
|
||||
}
|
||||
|
||||
|
||||
@@ -25,7 +25,6 @@ osg::ref_ptr<GUIEventAdapter>& GUIEventAdapter::getAccumulatedEventState()
|
||||
GUIEventAdapter::GUIEventAdapter():
|
||||
_handled(false),
|
||||
_eventType(NONE),
|
||||
_time(0.0),
|
||||
_windowX(0),
|
||||
_windowY(0),
|
||||
_windowWidth(1280),
|
||||
@@ -48,10 +47,9 @@ GUIEventAdapter::GUIEventAdapter():
|
||||
{}
|
||||
|
||||
GUIEventAdapter::GUIEventAdapter(const GUIEventAdapter& rhs,const osg::CopyOp& copyop):
|
||||
osg::Object(rhs,copyop),
|
||||
osgGA::Event(rhs,copyop),
|
||||
_handled(rhs._handled),
|
||||
_eventType(rhs._eventType),
|
||||
_time(rhs._time),
|
||||
_context(rhs._context),
|
||||
_windowX(rhs._windowX),
|
||||
_windowY(rhs._windowY),
|
||||
|
||||
@@ -16,33 +16,21 @@
|
||||
|
||||
using namespace osgGA;
|
||||
|
||||
|
||||
void GUIEventHandler::operator()(osg::Node* node, osg::NodeVisitor* nv)
|
||||
// adapt EventHandler usage to old style GUIEventHandler usage
|
||||
bool GUIEventHandler::handle(osgGA::Event* event, osg::Object* object, osg::NodeVisitor* nv)
|
||||
{
|
||||
osgGA::EventVisitor* ev = dynamic_cast<osgGA::EventVisitor*>(nv);
|
||||
if (ev && ev->getActionAdapter() && !ev->getEvents().empty())
|
||||
osgGA::GUIEventAdapter* ea = event->asGUIEventAdapter();
|
||||
if (ea && ev && ev->getActionAdapter())
|
||||
{
|
||||
for(osgGA::EventQueue::Events::iterator itr = ev->getEvents().begin();
|
||||
itr != ev->getEvents().end();
|
||||
++itr)
|
||||
{
|
||||
handleWithCheckAgainstIgnoreHandledEventsMask(*(*itr), *(ev->getActionAdapter()), node, nv);
|
||||
}
|
||||
}
|
||||
if (node->getNumChildrenRequiringEventTraversal()>0 || _nestedCallback.valid()) traverse(node,nv);
|
||||
}
|
||||
|
||||
void GUIEventHandler::event(osg::NodeVisitor* nv, osg::Drawable* drawable)
|
||||
{
|
||||
osgGA::EventVisitor* ev = dynamic_cast<osgGA::EventVisitor*>(nv);
|
||||
if (ev && ev->getActionAdapter() && !ev->getEvents().empty())
|
||||
{
|
||||
for(osgGA::EventQueue::Events::iterator itr = ev->getEvents().begin();
|
||||
itr != ev->getEvents().end();
|
||||
++itr)
|
||||
{
|
||||
handleWithCheckAgainstIgnoreHandledEventsMask(*(*itr), *(ev->getActionAdapter()), drawable, nv);
|
||||
}
|
||||
#if 1
|
||||
bool handled = handle(*ea, *(ev->getActionAdapter()), object, nv);
|
||||
if (handled) ea->setHandled(true);
|
||||
return handled;
|
||||
#else
|
||||
return handleWithCheckAgainstIgnoreHandledEventsMask(*ea, *(ev->getActionAdapter()), object, nv);
|
||||
#endif
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
|
||||
@@ -305,8 +305,8 @@ void Dragger::traverse(osg::NodeVisitor& nv)
|
||||
itr != ev->getEvents().end();
|
||||
++itr)
|
||||
{
|
||||
osgGA::GUIEventAdapter* ea = itr->get();
|
||||
if (handle(*ea, *(ev->getActionAdapter()))) ea->setHandled(true);
|
||||
osgGA::GUIEventAdapter* ea = (*itr)->asGUIEventAdapter();
|
||||
if (ea && handle(*ea, *(ev->getActionAdapter()))) ea->setHandled(true);
|
||||
}
|
||||
}
|
||||
return;
|
||||
|
||||
@@ -187,7 +187,9 @@ void Cursor::traverse(osg::NodeVisitor& nv)
|
||||
itr != events.end();
|
||||
++itr)
|
||||
{
|
||||
osgGA::GUIEventAdapter* event = itr->get();
|
||||
osgGA::GUIEventAdapter* event = (*itr)->asGUIEventAdapter();
|
||||
if (!event) continue;
|
||||
|
||||
switch(event->getEventType())
|
||||
{
|
||||
case(osgGA::GUIEventAdapter::PUSH):
|
||||
|
||||
@@ -65,12 +65,6 @@ bool KeyEventHandler::handle(const osgGA::GUIEventAdapter& ea,osgGA::GUIActionAd
|
||||
return false;
|
||||
}
|
||||
|
||||
|
||||
void KeyEventHandler::accept(osgGA::GUIEventHandlerVisitor& v)
|
||||
{
|
||||
v.visit(*this);
|
||||
}
|
||||
|
||||
void KeyEventHandler::getUsage(osg::ApplicationUsage& /*usage*/) const
|
||||
{
|
||||
}
|
||||
|
||||
@@ -131,12 +131,6 @@ bool PickEventHandler::handle(const osgGA::GUIEventAdapter& ea,osgGA::GUIActionA
|
||||
return false;
|
||||
}
|
||||
|
||||
|
||||
void PickEventHandler::accept(osgGA::GUIEventHandlerVisitor& v)
|
||||
{
|
||||
v.visit(*this);
|
||||
}
|
||||
|
||||
void PickEventHandler::getUsage(osg::ApplicationUsage& /*usage*/) const
|
||||
{
|
||||
}
|
||||
|
||||
@@ -967,25 +967,6 @@ double SlideEventHandler::getCurrentTimeDelayBetweenSlides() const
|
||||
return _timePerSlide;
|
||||
}
|
||||
|
||||
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)
|
||||
{
|
||||
|
||||
|
||||
@@ -257,7 +257,8 @@ void Timeout::traverse(osg::NodeVisitor& nv)
|
||||
itr != events.end();
|
||||
++itr)
|
||||
{
|
||||
osgGA::GUIEventAdapter* event = itr->get();
|
||||
osgGA::GUIEventAdapter* event = (*itr)->asGUIEventAdapter();
|
||||
if (!event) continue;
|
||||
|
||||
bool keyEvent = event->getEventType()==osgGA::GUIEventAdapter::KEYDOWN || event->getEventType()==osgGA::GUIEventAdapter::KEYUP;
|
||||
|
||||
|
||||
@@ -916,7 +916,7 @@ void CompositeViewer::reprojectPointerData(osgGA::GUIEventAdapter& source_event,
|
||||
|
||||
struct SortEvents
|
||||
{
|
||||
bool operator() (const osg::ref_ptr<osgGA::GUIEventAdapter>& lhs,const osg::ref_ptr<osgGA::GUIEventAdapter>& rhs) const
|
||||
bool operator() (const osg::ref_ptr<osgGA::Event>& lhs,const osg::ref_ptr<osgGA::Event>& rhs) const
|
||||
{
|
||||
return lhs->getTime() < rhs->getTime();
|
||||
}
|
||||
@@ -961,7 +961,8 @@ void CompositeViewer::eventTraversal()
|
||||
itr != gw_events.end();
|
||||
++itr)
|
||||
{
|
||||
(*itr)->setGraphicsContext(gw);
|
||||
osgGA::GUIEventAdapter* ea = (*itr)->asGUIEventAdapter();
|
||||
if (ea) ea->setGraphicsContext(gw);
|
||||
}
|
||||
|
||||
all_events.insert(all_events.end(), gw_events.begin(), gw_events.end());
|
||||
@@ -976,7 +977,8 @@ void CompositeViewer::eventTraversal()
|
||||
itr != all_events.end();
|
||||
++itr)
|
||||
{
|
||||
osgGA::GUIEventAdapter* event = itr->get();
|
||||
osgGA::GUIEventAdapter* event = (*itr)->asGUIEventAdapter();
|
||||
if (!event) continue;
|
||||
|
||||
switch(event->getEventType())
|
||||
{
|
||||
@@ -1059,7 +1061,9 @@ void CompositeViewer::eventTraversal()
|
||||
itr != all_events.end();
|
||||
++itr)
|
||||
{
|
||||
osgGA::GUIEventAdapter* event = itr->get();
|
||||
osgGA::GUIEventAdapter* event = (*itr)->asGUIEventAdapter();
|
||||
if (!event) continue;
|
||||
|
||||
switch(event->getEventType())
|
||||
{
|
||||
case(osgGA::GUIEventAdapter::CLOSE_WINDOW):
|
||||
@@ -1118,7 +1122,8 @@ void CompositeViewer::eventTraversal()
|
||||
itr != veitr->second.end();
|
||||
++itr)
|
||||
{
|
||||
osgGA::GUIEventAdapter* event = itr->get();
|
||||
osgGA::GUIEventAdapter* event = (*itr)->asGUIEventAdapter();
|
||||
if (!event) continue;
|
||||
switch(event->getEventType())
|
||||
{
|
||||
case(osgGA::GUIEventAdapter::KEYUP):
|
||||
@@ -1148,16 +1153,15 @@ void CompositeViewer::eventTraversal()
|
||||
++veitr)
|
||||
{
|
||||
View* view = veitr->first;
|
||||
_eventVisitor->setActionAdapter(view);
|
||||
|
||||
if (view && view->getSceneData())
|
||||
{
|
||||
_eventVisitor->setActionAdapter(view);
|
||||
|
||||
for(osgGA::EventQueue::Events::iterator itr = veitr->second.begin();
|
||||
itr != veitr->second.end();
|
||||
++itr)
|
||||
{
|
||||
osgGA::GUIEventAdapter* event = itr->get();
|
||||
osgGA::Event* event = itr->get();
|
||||
|
||||
_eventVisitor->reset();
|
||||
_eventVisitor->addEvent( event );
|
||||
@@ -1205,18 +1209,18 @@ void CompositeViewer::eventTraversal()
|
||||
++veitr)
|
||||
{
|
||||
View* view = veitr->first;
|
||||
_eventVisitor->setActionAdapter(view);
|
||||
|
||||
for(osgGA::EventQueue::Events::iterator itr = veitr->second.begin();
|
||||
itr != veitr->second.end();
|
||||
++itr)
|
||||
{
|
||||
osgGA::GUIEventAdapter* event = itr->get();
|
||||
|
||||
osgGA::Event* event = itr->get();
|
||||
for(View::EventHandlers::iterator hitr = view->getEventHandlers().begin();
|
||||
hitr != view->getEventHandlers().end();
|
||||
++hitr)
|
||||
{
|
||||
(*hitr)->handleWithCheckAgainstIgnoreHandledEventsMask( *event, *view, 0, _eventVisitor.get());
|
||||
(*hitr)->handle( event, view, _eventVisitor.get());
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1226,16 +1230,16 @@ void CompositeViewer::eventTraversal()
|
||||
++veitr)
|
||||
{
|
||||
View* view = veitr->first;
|
||||
_eventVisitor->setActionAdapter(view);
|
||||
|
||||
for(osgGA::EventQueue::Events::iterator itr = veitr->second.begin();
|
||||
itr != veitr->second.end();
|
||||
++itr)
|
||||
{
|
||||
osgGA::GUIEventAdapter* event = itr->get();
|
||||
|
||||
osgGA::Event* event = itr->get();
|
||||
if (view->getCameraManipulator())
|
||||
{
|
||||
view->getCameraManipulator()->handleWithCheckAgainstIgnoreHandledEventsMask( *event, *view);
|
||||
view->getCameraManipulator()->handle( event, view, _eventVisitor.get());
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -270,7 +270,7 @@ void View::init()
|
||||
void View::setStartTick(osg::Timer_t tick)
|
||||
{
|
||||
_startTick = tick;
|
||||
|
||||
|
||||
for(Devices::iterator eitr = _eventSources.begin();
|
||||
eitr != _eventSources.end();
|
||||
++eitr)
|
||||
@@ -395,7 +395,7 @@ void View::home()
|
||||
}
|
||||
|
||||
|
||||
void View::addEventHandler(osgGA::GUIEventHandler* eventHandler)
|
||||
void View::addEventHandler(osgGA::EventHandler* eventHandler)
|
||||
{
|
||||
EventHandlers::iterator itr = std::find(_eventHandlers.begin(), _eventHandlers.end(), eventHandler);
|
||||
if (itr == _eventHandlers.end())
|
||||
@@ -404,7 +404,7 @@ void View::addEventHandler(osgGA::GUIEventHandler* eventHandler)
|
||||
}
|
||||
}
|
||||
|
||||
void View::removeEventHandler(osgGA::GUIEventHandler* eventHandler)
|
||||
void View::removeEventHandler(osgGA::EventHandler* eventHandler)
|
||||
{
|
||||
EventHandlers::iterator itr = std::find(_eventHandlers.begin(), _eventHandlers.end(), eventHandler);
|
||||
if (itr != _eventHandlers.end())
|
||||
@@ -846,7 +846,7 @@ void View::requestContinuousUpdate(bool flag)
|
||||
void View::requestWarpPointer(float x,float y)
|
||||
{
|
||||
OSG_INFO<<"View::requestWarpPointer("<<x<<","<<y<<")"<<std::endl;
|
||||
|
||||
|
||||
float local_x, local_y;
|
||||
const osg::Camera* camera = getCameraContainingPosition(x, y, local_x, local_y);
|
||||
if (camera)
|
||||
@@ -887,33 +887,33 @@ const osg::Camera* View::getCameraContainingPosition(float x, float y, float& lo
|
||||
const osgGA::GUIEventAdapter* eventState = getEventQueue()->getCurrentEventState();
|
||||
const osgViewer::GraphicsWindow* gw = dynamic_cast<const osgViewer::GraphicsWindow*>(eventState->getGraphicsContext());
|
||||
bool view_invert_y = eventState->getMouseYOrientation()==osgGA::GUIEventAdapter::Y_INCREASING_DOWNWARDS;
|
||||
|
||||
|
||||
// OSG_NOTICE<<"getCameraContainingPosition("<<x<<", "<<y<<") view_invert_y = "<<view_invert_y<<", Xmin() = "<<eventState->getXmin()<<", Xmax() = "<<eventState->getXmax()<<", Ymin() = "<<eventState->getYmin()<<", Ymax() = "<<eventState->getYmax()<<std::endl;
|
||||
|
||||
double epsilon = 0.5;
|
||||
|
||||
|
||||
|
||||
|
||||
// if master camera has graphics context and eventState context matches then assume coordinates refer
|
||||
// to master camera
|
||||
bool masterActive = (_camera->getGraphicsContext()!=0 && _camera->getViewport());
|
||||
bool eventStateMatchesMaster = (gw!=0) ? _camera->getGraphicsContext()==gw : false;
|
||||
|
||||
bool eventStateMatchesMaster = (gw!=0) ? _camera->getGraphicsContext()==gw : false;
|
||||
|
||||
if (masterActive && eventStateMatchesMaster)
|
||||
{
|
||||
// OSG_NOTICE<<"Event state matches master"<<std::endl;
|
||||
const osg::Viewport* viewport = _camera->getViewport();
|
||||
|
||||
|
||||
// rescale mouse x,y first to 0 to 1 range
|
||||
double new_x = (x-eventState->getXmin())/(eventState->getXmax()-eventState->getXmin());
|
||||
double new_y = (y-eventState->getYmin())/(eventState->getYmax()-eventState->getYmin());
|
||||
|
||||
|
||||
// flip y if required
|
||||
if (view_invert_y) new_y = 1.0f-new_y;
|
||||
|
||||
|
||||
// rescale mouse x, y to window dimensions so we can check against master Camera's viewport
|
||||
new_x *= static_cast<double>(_camera->getGraphicsContext()->getTraits()->width);
|
||||
new_y *= static_cast<double>(_camera->getGraphicsContext()->getTraits()->height);
|
||||
|
||||
|
||||
if (new_x >= (viewport->x()-epsilon) && new_y >= (viewport->y()-epsilon) &&
|
||||
new_x < (viewport->x()+viewport->width()-1.0+epsilon) && new_y <= (viewport->y()+viewport->height()-1.0+epsilon) )
|
||||
{
|
||||
@@ -929,7 +929,7 @@ const osg::Camera* View::getCameraContainingPosition(float x, float y, float& lo
|
||||
// OSG_NOTICE<<"master camera viewport not matched."<<std::endl;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
osg::Matrix masterCameraVPW = getCamera()->getViewMatrix() * getCamera()->getProjectionMatrix();
|
||||
|
||||
// convert to non dimensional
|
||||
@@ -990,9 +990,9 @@ bool View::computeIntersections(float x,float y, osgUtil::LineSegmentIntersector
|
||||
{
|
||||
float local_x, local_y;
|
||||
const osg::Camera* camera = getCameraContainingPosition(x, y, local_x, local_y);
|
||||
|
||||
|
||||
OSG_INFO<<"computeIntersections("<<x<<", "<<y<<") local_x="<<local_x<<", local_y="<<local_y<<std::endl;
|
||||
|
||||
|
||||
if (camera) return computeIntersections(camera, (camera->getViewport()==0)?osgUtil::Intersector::PROJECTION : osgUtil::Intersector::WINDOW, local_x, local_y, intersections, traversalMask);
|
||||
else return false;
|
||||
}
|
||||
@@ -1001,7 +1001,7 @@ bool View::computeIntersections(float x,float y, const osg::NodePath& nodePath,
|
||||
{
|
||||
float local_x, local_y;
|
||||
const osg::Camera* camera = getCameraContainingPosition(x, y, local_x, local_y);
|
||||
|
||||
|
||||
OSG_INFO<<"computeIntersections("<<x<<", "<<y<<") local_x="<<local_x<<", local_y="<<local_y<<std::endl;
|
||||
|
||||
if (camera) return computeIntersections(camera, (camera->getViewport()==0)?osgUtil::Intersector::PROJECTION : osgUtil::Intersector::WINDOW, local_x, local_y, nodePath, intersections, traversalMask);
|
||||
@@ -1015,7 +1015,7 @@ bool View::computeIntersections(const osgGA::GUIEventAdapter& ea, osgUtil::LineS
|
||||
{
|
||||
const osgGA::PointerData* pd = ea.getPointerData(ea.getNumPointerData()-1);
|
||||
const osg::Camera* camera = dynamic_cast<const osg::Camera*>(pd->object.get());
|
||||
if (camera)
|
||||
if (camera)
|
||||
{
|
||||
return computeIntersections(camera, osgUtil::Intersector::PROJECTION, pd->getXnormalized(), pd->getYnormalized(), intersections, traversalMask);
|
||||
}
|
||||
@@ -1031,7 +1031,7 @@ bool View::computeIntersections(const osgGA::GUIEventAdapter& ea, const osg::Nod
|
||||
{
|
||||
const osgGA::PointerData* pd = ea.getPointerData(ea.getNumPointerData()-1);
|
||||
const osg::Camera* camera = dynamic_cast<const osg::Camera*>(pd->object.get());
|
||||
if (camera)
|
||||
if (camera)
|
||||
{
|
||||
return computeIntersections(camera, osgUtil::Intersector::PROJECTION, pd->getXnormalized(), pd->getYnormalized(), nodePath, intersections, traversalMask);
|
||||
}
|
||||
@@ -1116,7 +1116,7 @@ void View::addDevice(osgGA::Device* eventSource)
|
||||
{
|
||||
_eventSources.push_back(eventSource);
|
||||
}
|
||||
|
||||
|
||||
if (eventSource)
|
||||
eventSource->getEventQueue()->setStartTick(getStartTick());
|
||||
}
|
||||
@@ -1226,7 +1226,7 @@ void View::StereoSlaveCallback::updateSlave(osg::View& view, osg::View::Slave& s
|
||||
{
|
||||
// inherit any settings applied to the master Camera.
|
||||
camera->inheritCullSettings(*(view.getCamera()), camera->getInheritanceMask());
|
||||
|
||||
|
||||
if (_eyeScale<0.0)
|
||||
{
|
||||
camera->setCullMask(camera->getCullMaskLeft());
|
||||
@@ -1235,7 +1235,7 @@ void View::StereoSlaveCallback::updateSlave(osg::View& view, osg::View::Slave& s
|
||||
{
|
||||
camera->setCullMask(camera->getCullMaskRight());
|
||||
}
|
||||
|
||||
|
||||
// set projection matrix
|
||||
if (_eyeScale<0.0)
|
||||
{
|
||||
@@ -1389,7 +1389,7 @@ void View::assignStereoOrKeystoneToCamera(osg::Camera* camera, osg::DisplaySetti
|
||||
{
|
||||
if (!camera || camera->getGraphicsContext()==0) return;
|
||||
if (!ds->getStereo() && !ds->getKeystoneHint()) return;
|
||||
|
||||
|
||||
ds->setUseSceneViewForStereoHint(false);
|
||||
|
||||
typedef std::vector< osg::ref_ptr<Keystone> > Keystones;
|
||||
@@ -1404,13 +1404,13 @@ void View::assignStereoOrKeystoneToCamera(osg::Camera* camera, osg::DisplaySetti
|
||||
if (keystone) keystones.push_back(keystone);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
if (ds->getKeystoneHint())
|
||||
{
|
||||
while(keystones.size()<2) keystones.push_back(new Keystone);
|
||||
}
|
||||
|
||||
|
||||
|
||||
// set up view's main camera
|
||||
{
|
||||
double height = ds->getScreenHeight();
|
||||
@@ -1420,10 +1420,10 @@ void View::assignStereoOrKeystoneToCamera(osg::Camera* camera, osg::DisplaySetti
|
||||
|
||||
camera->setProjectionMatrixAsPerspective( vfov, width/height, 1.0f,10000.0f);
|
||||
}
|
||||
|
||||
|
||||
|
||||
osg::ref_ptr<osg::GraphicsContext> gc = camera->getGraphicsContext();
|
||||
|
||||
|
||||
osg::ref_ptr<osg::GraphicsContext::Traits> traits = const_cast<osg::GraphicsContext::Traits*>(camera->getGraphicsContext()->getTraits());
|
||||
|
||||
if (!ds->getStereo())
|
||||
@@ -1432,7 +1432,7 @@ void View::assignStereoOrKeystoneToCamera(osg::Camera* camera, osg::DisplaySetti
|
||||
osg::ref_ptr<osgViewer::Keystone> keystone = 0;
|
||||
if (!(ds->getKeystones().empty())) keystone = dynamic_cast<osgViewer::Keystone*>(ds->getKeystones().front().get());
|
||||
if (!keystone) keystone = new osgViewer::Keystone;
|
||||
|
||||
|
||||
// create distortion texture
|
||||
osg::ref_ptr<osg::Texture> texture = createDistortionTexture(traits->width, traits->height);
|
||||
|
||||
@@ -1446,12 +1446,12 @@ void View::assignStereoOrKeystoneToCamera(osg::Camera* camera, osg::DisplaySetti
|
||||
texture.get(), keystone.get());
|
||||
// attach Keystone editing event handler.
|
||||
distortion_camera->addEventCallback(new KeystoneHandler(keystone.get()));
|
||||
|
||||
|
||||
camera->setGraphicsContext(0);
|
||||
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
switch(ds->getStereoMode())
|
||||
{
|
||||
case(osg::DisplaySettings::QUAD_BUFFER):
|
||||
@@ -1475,7 +1475,7 @@ void View::assignStereoOrKeystoneToCamera(osg::Camera* camera, osg::DisplaySetti
|
||||
// left keystone camera to render to left buffer
|
||||
// left keystone camera to render to right buffer
|
||||
// one keystone and editing for the one window
|
||||
|
||||
|
||||
if (!keystones.empty())
|
||||
{
|
||||
// for keystone:
|
||||
@@ -1484,7 +1484,7 @@ void View::assignStereoOrKeystoneToCamera(osg::Camera* camera, osg::DisplaySetti
|
||||
// left keystone camera to render to left viewport/window
|
||||
// right keystone camera to render to right viewport/window
|
||||
// two keystone, one for each of the left and right viewports/windows
|
||||
|
||||
|
||||
osg::ref_ptr<Keystone> keystone = keystones.front();
|
||||
|
||||
// create distortion texture
|
||||
@@ -1513,7 +1513,7 @@ void View::assignStereoOrKeystoneToCamera(osg::Camera* camera, osg::DisplaySetti
|
||||
|
||||
// attach the texture and use it as the color buffer.
|
||||
right_camera->attach(osg::Camera::COLOR_BUFFER, right_texture.get());
|
||||
|
||||
|
||||
|
||||
// create Keystone left distortion camera
|
||||
keystone->setGridColor(osg::Vec4(1.0f,0.0f,0.0,1.0));
|
||||
@@ -1527,7 +1527,7 @@ void View::assignStereoOrKeystoneToCamera(osg::Camera* camera, osg::DisplaySetti
|
||||
// attach Keystone editing event handler.
|
||||
left_keystone_camera->addEventCallback(new KeystoneHandler(keystone.get()));
|
||||
|
||||
|
||||
|
||||
// create Keystone right distortion camera
|
||||
osg::ref_ptr<osg::Camera> right_keystone_camera = assignKeystoneDistortionCamera(ds, gc.get(),
|
||||
0, 0, traits->width, traits->height,
|
||||
@@ -1536,7 +1536,7 @@ void View::assignStereoOrKeystoneToCamera(osg::Camera* camera, osg::DisplaySetti
|
||||
|
||||
right_keystone_camera->setRenderOrder(osg::Camera::NESTED_RENDER, 3);
|
||||
right_keystone_camera->setAllowEventFocus(false);
|
||||
|
||||
|
||||
}
|
||||
|
||||
break;
|
||||
@@ -1567,12 +1567,12 @@ void View::assignStereoOrKeystoneToCamera(osg::Camera* camera, osg::DisplaySetti
|
||||
// one keystone and editing for the one window
|
||||
|
||||
osg::ref_ptr<Keystone> keystone = keystones.front();
|
||||
|
||||
|
||||
bool useTwoTexture = true;
|
||||
|
||||
|
||||
if (useTwoTexture)
|
||||
{
|
||||
|
||||
|
||||
// create left distortion texture
|
||||
osg::ref_ptr<osg::Texture> left_texture = createDistortionTexture(traits->width, traits->height);
|
||||
|
||||
@@ -1628,10 +1628,10 @@ void View::assignStereoOrKeystoneToCamera(osg::Camera* camera, osg::DisplaySetti
|
||||
left_keystone_camera->addEventCallback(new KeystoneHandler(keystone.get()));
|
||||
|
||||
camera->setAllowEventFocus(false);
|
||||
|
||||
|
||||
}
|
||||
else
|
||||
{
|
||||
{
|
||||
// create distortion texture
|
||||
osg::ref_ptr<osg::Texture> texture = createDistortionTexture(traits->width, traits->height);
|
||||
|
||||
@@ -1664,7 +1664,7 @@ void View::assignStereoOrKeystoneToCamera(osg::Camera* camera, osg::DisplaySetti
|
||||
texture.get(), keystone.get());
|
||||
|
||||
distortion_camera->setRenderOrder(osg::Camera::NESTED_RENDER, 2);
|
||||
|
||||
|
||||
// attach Keystone editing event handler.
|
||||
distortion_camera->addEventCallback(new KeystoneHandler(keystone.get()));
|
||||
|
||||
@@ -1701,7 +1701,7 @@ void View::assignStereoOrKeystoneToCamera(osg::Camera* camera, osg::DisplaySetti
|
||||
// left keystone camera to render to left viewport/window
|
||||
// right keystone camera to render to right viewport/window
|
||||
// two keystone, one for each of the left and right viewports/windows
|
||||
|
||||
|
||||
osg::ref_ptr<Keystone> left_keystone = keystones[0];
|
||||
osg::ref_ptr<Keystone> right_keystone = keystones[1];
|
||||
|
||||
@@ -1733,7 +1733,7 @@ void View::assignStereoOrKeystoneToCamera(osg::Camera* camera, osg::DisplaySetti
|
||||
|
||||
// attach the texture and use it as the color buffer.
|
||||
right_camera->attach(osg::Camera::COLOR_BUFFER, right_texture.get());
|
||||
|
||||
|
||||
|
||||
// create Keystone left distortion camera
|
||||
left_keystone->setGridColor(osg::Vec4(1.0f,0.0f,0.0,1.0));
|
||||
@@ -1761,9 +1761,9 @@ void View::assignStereoOrKeystoneToCamera(osg::Camera* camera, osg::DisplaySetti
|
||||
right_keystone_camera->addEventCallback(new KeystoneHandler(right_keystone.get()));
|
||||
|
||||
camera->setAllowEventFocus(false);
|
||||
|
||||
|
||||
}
|
||||
|
||||
|
||||
break;
|
||||
}
|
||||
case(osg::DisplaySettings::VERTICAL_SPLIT):
|
||||
@@ -1774,7 +1774,7 @@ void View::assignStereoOrKeystoneToCamera(osg::Camera* camera, osg::DisplaySetti
|
||||
bool left_eye_bottom_viewport = ds->getSplitStereoVerticalEyeMapping()==osg::DisplaySettings::LEFT_EYE_BOTTOM_VIEWPORT;
|
||||
int left_start = (left_eye_bottom_viewport) ? 0 : traits->height/2;
|
||||
int right_start = (left_eye_bottom_viewport) ? traits->height/2 : 0;
|
||||
|
||||
|
||||
// bottom viewport Camera
|
||||
osg::ref_ptr<osg::Camera> left_camera = assignStereoCamera(ds, gc.get(),
|
||||
0, left_start, traits->width, traits->height/2, traits->doubleBuffer ? GL_BACK : GL_FRONT,
|
||||
@@ -1832,7 +1832,7 @@ void View::assignStereoOrKeystoneToCamera(osg::Camera* camera, osg::DisplaySetti
|
||||
|
||||
// attach the texture and use it as the color buffer.
|
||||
right_camera->attach(osg::Camera::COLOR_BUFFER, right_texture.get());
|
||||
|
||||
|
||||
|
||||
// create Keystone left distortion camera
|
||||
left_keystone->setGridColor(osg::Vec4(1.0f,0.0f,0.0,1.0));
|
||||
@@ -1860,7 +1860,7 @@ void View::assignStereoOrKeystoneToCamera(osg::Camera* camera, osg::DisplaySetti
|
||||
right_keystone_camera->addEventCallback(new KeystoneHandler(right_keystone.get()));
|
||||
|
||||
camera->setAllowEventFocus(false);
|
||||
|
||||
|
||||
}
|
||||
|
||||
break;
|
||||
@@ -1910,7 +1910,7 @@ void View::assignStereoOrKeystoneToCamera(osg::Camera* camera, osg::DisplaySetti
|
||||
texture.get(), keystone.get());
|
||||
|
||||
distortion_camera->setRenderOrder(osg::Camera::NESTED_RENDER, 2);
|
||||
|
||||
|
||||
// attach Keystone editing event handler.
|
||||
distortion_camera->addEventCallback(new KeystoneHandler(keystone.get()));
|
||||
}
|
||||
@@ -1960,7 +1960,7 @@ void View::assignStereoOrKeystoneToCamera(osg::Camera* camera, osg::DisplaySetti
|
||||
texture.get(), keystone.get());
|
||||
|
||||
distortion_camera->setRenderOrder(osg::Camera::NESTED_RENDER, 1);
|
||||
|
||||
|
||||
// attach Keystone editing event handler.
|
||||
distortion_camera->addEventCallback(new KeystoneHandler(keystone.get()));
|
||||
}
|
||||
@@ -1992,7 +1992,7 @@ void View::assignStereoOrKeystoneToCamera(osg::Camera* camera, osg::DisplaySetti
|
||||
camera->addChild(geode.get());
|
||||
|
||||
geode->setCullingActive(false);
|
||||
|
||||
|
||||
osg::ref_ptr<osg::StateSet> stateset = geode->getOrCreateStateSet();
|
||||
|
||||
// set up stencil
|
||||
|
||||
@@ -889,7 +889,8 @@ void Viewer::eventTraversal()
|
||||
itr != gw_events.end();
|
||||
++itr)
|
||||
{
|
||||
osgGA::GUIEventAdapter* event = itr->get();
|
||||
osgGA::GUIEventAdapter* event = (*itr)->asGUIEventAdapter();
|
||||
if (!event) continue;
|
||||
|
||||
event->setGraphicsContext(gw);
|
||||
|
||||
@@ -943,7 +944,8 @@ void Viewer::eventTraversal()
|
||||
itr != gw_events.end();
|
||||
++itr)
|
||||
{
|
||||
osgGA::GUIEventAdapter* event = itr->get();
|
||||
osgGA::GUIEventAdapter* event = (*itr)->asGUIEventAdapter();
|
||||
if (!event) continue;
|
||||
switch(event->getEventType())
|
||||
{
|
||||
case(osgGA::GUIEventAdapter::CLOSE_WINDOW):
|
||||
@@ -981,7 +983,8 @@ void Viewer::eventTraversal()
|
||||
itr != events.end();
|
||||
++itr)
|
||||
{
|
||||
osgGA::GUIEventAdapter* event = itr->get();
|
||||
osgGA::GUIEventAdapter* event = (*itr)->asGUIEventAdapter();
|
||||
if (!event) continue;
|
||||
switch(event->getEventType())
|
||||
{
|
||||
case(osgGA::GUIEventAdapter::KEYUP):
|
||||
@@ -1009,7 +1012,8 @@ void Viewer::eventTraversal()
|
||||
itr != events.end();
|
||||
++itr)
|
||||
{
|
||||
osgGA::GUIEventAdapter* event = itr->get();
|
||||
osgGA::GUIEventAdapter* event = (*itr)->asGUIEventAdapter();
|
||||
if (!event) continue;
|
||||
|
||||
_eventVisitor->reset();
|
||||
_eventVisitor->addEvent( event );
|
||||
@@ -1055,13 +1059,12 @@ void Viewer::eventTraversal()
|
||||
itr != events.end();
|
||||
++itr)
|
||||
{
|
||||
osgGA::GUIEventAdapter* event = itr->get();
|
||||
|
||||
osgGA::Event* event = itr->get();
|
||||
for(EventHandlers::iterator hitr = _eventHandlers.begin();
|
||||
hitr != _eventHandlers.end();
|
||||
++hitr)
|
||||
{
|
||||
(*hitr)->handleWithCheckAgainstIgnoreHandledEventsMask( *event, *this, 0, _eventVisitor.get());
|
||||
(*hitr)->handle( event, 0, _eventVisitor.get());
|
||||
}
|
||||
|
||||
}
|
||||
@@ -1070,10 +1073,10 @@ void Viewer::eventTraversal()
|
||||
itr != events.end();
|
||||
++itr)
|
||||
{
|
||||
osgGA::GUIEventAdapter* event = itr->get();
|
||||
if (_cameraManipulator.valid())
|
||||
osgGA::Event* event = itr->get();
|
||||
if (event && _cameraManipulator.valid())
|
||||
{
|
||||
_cameraManipulator->handleWithCheckAgainstIgnoreHandledEventsMask( *event, *this);
|
||||
_cameraManipulator->handle( event, 0, _eventVisitor.get());
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user