From 6a74240d22d250a459adc7c7e3def3dae170b631 Mon Sep 17 00:00:00 2001 From: Robert Osfield Date: Tue, 26 Dec 2006 17:38:47 +0000 Subject: [PATCH] Various tweaks to keep in sync with new changes to osg::Timer and osgGA::EventQueue --- include/osgViewer/Scene | 1 - include/osgViewer/SimpleViewer | 1 - src/osgViewer/GraphicsWindowX11.cpp | 9 ++++++-- src/osgViewer/Scene.cpp | 5 +---- src/osgViewer/SimpleViewer.cpp | 6 +----- src/osgViewer/View.cpp | 5 +++++ src/osgViewer/Viewer.cpp | 32 ++++++++++++++++++++++------- 7 files changed, 39 insertions(+), 20 deletions(-) diff --git a/include/osgViewer/Scene b/include/osgViewer/Scene index c7147b8ce..dbbc43256 100644 --- a/include/osgViewer/Scene +++ b/include/osgViewer/Scene @@ -66,7 +66,6 @@ class OSGVIEWER_EXPORT Scene : public virtual osg::Referenced protected: bool _firstFrame; - osg::Timer_t _startTick; osg::ref_ptr _frameStamp; osg::ref_ptr _sceneData; diff --git a/include/osgViewer/SimpleViewer b/include/osgViewer/SimpleViewer index ba3b5796a..f5ed4bc4c 100644 --- a/include/osgViewer/SimpleViewer +++ b/include/osgViewer/SimpleViewer @@ -86,7 +86,6 @@ class OSGVIEWER_EXPORT SimpleViewer : public virtual osgViewer::GraphicsWindow bool _firstFrame; - osg::Timer_t _startTick; osg::ref_ptr _frameStamp; osg::ref_ptr _sceneView; diff --git a/src/osgViewer/GraphicsWindowX11.cpp b/src/osgViewer/GraphicsWindowX11.cpp index 568c16dbc..4f8a481c5 100644 --- a/src/osgViewer/GraphicsWindowX11.cpp +++ b/src/osgViewer/GraphicsWindowX11.cpp @@ -25,7 +25,9 @@ #include #include #include +#include +#include /* For CARD16 */ using namespace osgViewer; @@ -367,8 +369,9 @@ bool GraphicsWindowX11::realizeImplementation() if (!_initialized) return false; XMapWindow( _display, _window ); - Window temp = _window; - XSetWMColormapWindows( _display, _window, &temp, 1); + +// Window temp = _window; +// XSetWMColormapWindows( _display, _window, &temp, 1); _realized = true; @@ -492,6 +495,8 @@ void GraphicsWindowX11::checkEvents() case MotionNotify : { + osg::notify(osg::INFO)<<"MotionNotify time="<tick(); _frameStamp = new osg::FrameStamp; _frameStamp->setFrameNumber(0); _frameStamp->setReferenceTime(0); @@ -27,7 +26,6 @@ Scene::Scene(): _updateVisitor->setFrameStamp(_frameStamp.get()); _eventQueue = new osgGA::EventQueue; - _eventQueue->setStartTick(_startTick); _eventVisitor = new osgGA::EventVisitor; @@ -68,8 +66,7 @@ void Scene::frameAdvance() { // double previousTime = _frameStamp->getReferenceTime(); - osg::Timer_t currentTick = osg::Timer::instance()->tick(); - _frameStamp->setReferenceTime(osg::Timer::instance()->delta_s(_startTick,currentTick)); + _frameStamp->setReferenceTime(osg::Timer::instance()->time_s()); _frameStamp->setFrameNumber(_frameStamp->getFrameNumber()+1); // osg::notify(osg::NOTICE)<<"Frame rate = "<<1.0/(_frameStamp->getReferenceTime()-previousTime)<setDefaults(); _sceneView->getState()->setContextID(osg::GraphicsContext::createNewContextID()); - _startTick = osg::Timer::instance()->tick(); _frameStamp = new osg::FrameStamp; _frameStamp->setFrameNumber(0); _frameStamp->setReferenceTime(0); - _eventQueue->setStartTick(_startTick); - _eventVisitor = new osgGA::EventVisitor; setDatabasePager(new osgDB::DatabasePager); @@ -138,8 +135,7 @@ void SimpleViewer::frame() void SimpleViewer::frameAdvance() { - osg::Timer_t currentTick = osg::Timer::instance()->tick(); - _frameStamp->setReferenceTime(osg::Timer::instance()->delta_s(_startTick,currentTick)); + _frameStamp->setReferenceTime(osg::Timer::instance()->time_s()); _frameStamp->setFrameNumber(_frameStamp->getFrameNumber()+1); _sceneView->setFrameStamp(_frameStamp.get()); diff --git a/src/osgViewer/View.cpp b/src/osgViewer/View.cpp index 19a9ee30e..195229ae0 100644 --- a/src/osgViewer/View.cpp +++ b/src/osgViewer/View.cpp @@ -62,6 +62,11 @@ void View::setCameraManipulator(osgGA::MatrixManipulator* manipulator) } } +void View::addEventHandler(osgGA::GUIEventHandler* eventHandler) +{ + _eventHandlers.push_back(eventHandler); +} + void View::setUpViewAcrossAllScreens() { osg::GraphicsContext::WindowingSystemInterface* wsi = osg::GraphicsContext::getWindowingSystemInterface(); diff --git a/src/osgViewer/Viewer.cpp b/src/osgViewer/Viewer.cpp index ac3688dfc..c6d25877a 100644 --- a/src/osgViewer/Viewer.cpp +++ b/src/osgViewer/Viewer.cpp @@ -163,7 +163,7 @@ void Viewer::realize() getContexts(contexts); bool multiThreaded = getNumSlaves() > 1; - + if (multiThreaded) { _startRenderingBarrier = new osg::BarrierOperation(contexts.size()+1, osg::BarrierOperation::NO_OPERATION); @@ -202,10 +202,9 @@ void Viewer::realize() ++citr) { (*citr)->realize(); + OpenThreads::Thread::YieldCurrentThread(); } - OpenThreads::Thread::YieldCurrentThread(); - bool grabFocus = true; if (grabFocus) { @@ -221,6 +220,9 @@ void Viewer::realize() } } + // initialize the global timer to be relative to the current time. + osg::Timer::instance()->setStartTick(); + if (multiThreaded) { @@ -232,6 +234,7 @@ void Viewer::realize() if (!gc->getGraphicsThread()->isRunning()) { gc->getGraphicsThread()->startThread(); + OpenThreads::Thread::YieldCurrentThread(); } } } @@ -288,10 +291,6 @@ void Viewer::frameEventTraversal() } } - _eventQueue->frame( _scene->getFrameStamp()->getReferenceTime() ); - - _eventQueue->takeEvents(events); - osgGA::GUIEventAdapter* eventState = getEventQueue()->getCurrentEventState(); for(osgGA::EventQueue::Events::iterator itr = events.begin(); itr != events.end(); @@ -299,8 +298,27 @@ void Viewer::frameEventTraversal() { osgGA::GUIEventAdapter* event = itr->get(); 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()); + break; + default: + break; + } } + _eventQueue->frame( _scene->getFrameStamp()->getReferenceTime() ); + + _eventQueue->takeEvents(events); + + #if 0 // osg::notify(osg::NOTICE)<<"Events "<