Show
Ignore:
Timestamp:
09/18/14 11:51:24 (10 hours ago)
Author:
robert
Message:

Created ui lua scripts in a way that makes them compatible with being used with lua require()

Files:
1 modified

Legend:

Unmodified
Added
Removed
  • OpenSceneGraph/trunk/src/osgViewer/CompositeViewer.cpp

    r13277 r13376  
    1313 
    1414#include <osg/GLExtensions> 
     15#include <osg/TextureRectangle> 
     16#include <osg/TextureCubeMap> 
     17 
    1518#include <osgGA/TrackballManipulator> 
    1619#include <osgViewer/CompositeViewer> 
     
    641644    } 
    642645 
    643     for(RefViews::iterator vitr = _views.begin(); 
    644         vitr != _views.end(); 
    645         ++vitr) 
    646     { 
    647         View* view = vitr->get(); 
    648  
    649         osgGA::GUIEventAdapter* eventState = view->getEventQueue()->getCurrentEventState(); 
    650         if (view->getCamera()->getViewport()) 
    651         { 
    652             osg::Viewport* viewport = view->getCamera()->getViewport(); 
    653             eventState->setInputRange( viewport->x(), viewport->y(), viewport->x() + viewport->width(), viewport->y() + viewport->height()); 
    654         } 
    655         else 
    656         { 
    657             eventState->setInputRange(-1.0, -1.0, 1.0, 1.0); 
    658         } 
    659  
    660  
    661         view->getEventQueue()->frame( getFrameStamp()->getReferenceTime() ); 
    662     } 
    663  
    664646 
    665647    if (getViewerStats() && getViewerStats()->collectStats("frame_rate")) 
     
    698680} 
    699681 
    700 void CompositeViewer::eventTraversal() 
    701 { 
    702     if (_done) return; 
    703  
    704     if (_views.empty()) return; 
    705  
    706     double cutOffTime = (_runFrameScheme==ON_DEMAND) ? DBL_MAX : _frameStamp->getReferenceTime(); 
    707  
    708     double beginEventTraversal = osg::Timer::instance()->delta_s(_startTick, osg::Timer::instance()->tick()); 
    709  
    710     // OSG_NOTICE<<"CompositeViewer::frameEventTraversal()."<<std::endl; 
    711  
    712     // need to copy events from the GraphicsWindow's into local EventQueue; 
    713  
    714     typedef std::map<osgViewer::View*, osgGA::EventQueue::Events> ViewEventsMap; 
    715     ViewEventsMap viewEventsMap; 
    716  
    717     Contexts contexts; 
    718     getContexts(contexts); 
    719  
    720     // set done if there are no windows 
    721     checkWindowStatus(contexts); 
    722     if (_done) return; 
    723  
    724     Scenes scenes; 
    725     getScenes(scenes); 
    726  
    727     osgViewer::View* masterView = getViewWithFocus() ? getViewWithFocus() : _views[0].get(); 
    728  
    729     osg::Camera* masterCamera = masterView->getCamera(); 
    730     osgGA::GUIEventAdapter* eventState = masterView->getEventQueue()->getCurrentEventState(); 
    731     osg::Matrix masterCameraVPW = masterCamera->getViewMatrix() * masterCamera->getProjectionMatrix(); 
    732     if (masterCamera->getViewport()) 
    733     { 
    734         osg::Viewport* viewport = masterCamera->getViewport(); 
    735         masterCameraVPW *= viewport->computeWindowMatrix(); 
    736     } 
    737  
    738     // get events from all windows attached to Viewer. 
    739     for(Contexts::iterator citr = contexts.begin(); 
    740         citr != contexts.end(); 
    741         ++citr) 
    742     { 
    743         osgViewer::GraphicsWindow* gw = dynamic_cast<osgViewer::GraphicsWindow*>(*citr); 
    744         if (gw) 
    745         { 
    746             gw->checkEvents(); 
    747  
    748             osgGA::EventQueue::Events gw_events; 
    749             gw->getEventQueue()->takeEvents(gw_events, cutOffTime); 
    750  
    751             osgGA::EventQueue::Events::iterator itr; 
    752             for(itr = gw_events.begin(); 
    753                 itr != gw_events.end(); 
    754                 ++itr) 
    755             { 
    756                 osgGA::GUIEventAdapter* event = itr->get(); 
    757  
    758                 //OSG_NOTICE<<"event->getGraphicsContext()="<<event->getGraphicsContext()<<std::endl; 
    759  
    760                 bool pointerEvent = false; 
    761  
    762                 float x = event->getX(); 
    763                 float y = event->getY(); 
    764  
    765                 bool invert_y = event->getMouseYOrientation()==osgGA::GUIEventAdapter::Y_INCREASING_DOWNWARDS; 
    766                 if (invert_y && gw->getTraits()) y = gw->getTraits()->height - y; 
    767  
    768                 switch(event->getEventType()) 
     682 
     683void CompositeViewer::generateSlavePointerData(osg::Camera* camera, osgGA::GUIEventAdapter& event) 
     684{ 
     685    osgViewer::GraphicsWindow* gw = dynamic_cast<osgViewer::GraphicsWindow*>(event.getGraphicsContext()); 
     686    if (!gw) return; 
     687 
     688    // What type of Camera is it? 
     689    // 1) Master Camera : do nothin extra 
     690    // 2) Slave Camera, Relative RF, Same scene graph as master : transform coords into Master Camera and add to PointerData list 
     691    // 3) Slave Camera, Relative RF, Different scene graph from master : do nothing extra? 
     692    // 4) Slave Camera, Absolute RF, Same scene graph as master : do nothing extra? 
     693    // 5) Slave Camera, Absolute RF, Different scene graph : do nothing extra? 
     694    // 6) Slave Camera, Absolute RF, Different scene graph but a distortion correction subgraph depending upon RTT Camera (slave or master) 
     695    //                              : project ray into RTT Camera's clip space, and RTT Camera's is Relative RF and sharing same scene graph as master then transform coords. 
     696 
     697    // if camera isn't the master it must be a slave and could need reprojecting. 
     698     
     699     
     700    osgViewer::View* view = dynamic_cast<osgViewer::View*>(camera->getView()); 
     701    if (!view) return; 
     702     
     703    osg::Camera* view_masterCamera = view->getCamera(); 
     704    if (camera!=view_masterCamera) 
     705    { 
     706        float x = event.getX(); 
     707        float y = event.getY(); 
     708 
     709        bool invert_y = event.getMouseYOrientation()==osgGA::GUIEventAdapter::Y_INCREASING_DOWNWARDS; 
     710        if (invert_y && gw->getTraits()) y = gw->getTraits()->height - y; 
     711 
     712        osg::Matrix masterCameraVPW = view_masterCamera->getViewMatrix() * view_masterCamera->getProjectionMatrix(); 
     713        if (view_masterCamera->getViewport()) 
     714        { 
     715            osg::Viewport* viewport = view_masterCamera->getViewport(); 
     716            masterCameraVPW *= viewport->computeWindowMatrix(); 
     717        } 
     718 
     719        // slave Camera tahnks to sharing the same View 
     720        osg::View::Slave* slave = view ? view->findSlaveForCamera(camera) : 0; 
     721        if (slave) 
     722        { 
     723            if (camera->getReferenceFrame()==osg::Camera::RELATIVE_RF && slave->_useMastersSceneData) 
     724            { 
     725                osg::Viewport* viewport = camera->getViewport(); 
     726                osg::Matrix localCameraVPW = camera->getViewMatrix() * camera->getProjectionMatrix(); 
     727                if (viewport) localCameraVPW *= viewport->computeWindowMatrix(); 
     728 
     729                osg::Matrix matrix( osg::Matrix::inverse(localCameraVPW) * masterCameraVPW ); 
     730                osg::Vec3d new_coord = osg::Vec3d(x,y,0.0) * matrix; 
     731                //OSG_NOTICE<<"    pointer event new_coord.x()="<<new_coord.x()<<" new_coord.y()="<<new_coord.y()<<std::endl; 
     732                event.addPointerData(new osgGA::PointerData(view_masterCamera, new_coord.x(), -1.0, 1.0, 
     733                                                                               new_coord.y(), -1.0, 1.0)); 
     734            } 
     735            else if (!slave->_useMastersSceneData) 
     736            { 
     737                // Are their any RTT Camera's that this Camera depends upon for textures? 
     738 
     739                osg::ref_ptr<osgUtil::LineSegmentIntersector> ray = new osgUtil::LineSegmentIntersector(osgUtil::Intersector::WINDOW, x,y); 
     740                osgUtil::IntersectionVisitor iv(ray.get()); 
     741                camera->accept(iv); 
     742                if (ray->containsIntersections()) 
    769743                { 
    770                     case(osgGA::GUIEventAdapter::RESIZE): 
    771                         setCameraWithFocus(0); 
    772                         break; 
    773                     case(osgGA::GUIEventAdapter::PUSH): 
    774                     case(osgGA::GUIEventAdapter::RELEASE): 
    775                     case(osgGA::GUIEventAdapter::DOUBLECLICK): 
    776                     case(osgGA::GUIEventAdapter::DRAG): 
    777                     case(osgGA::GUIEventAdapter::MOVE): 
     744                    osg::Vec3 tc; 
     745                    osg::Texture* texture = ray->getFirstIntersection().getTextureLookUp(tc); 
     746                    if (texture) 
    778747                    { 
    779                         pointerEvent = true; 
    780  
    781                         if (event->getEventType()!=osgGA::GUIEventAdapter::DRAG || !getCameraWithFocus()) 
     748                        // look up Texture in RTT Camera's. 
     749                        for(unsigned int i=0; i<view->getNumSlaves();++i) 
    782750                        { 
    783                             osg::GraphicsContext::Cameras& cameras = gw->getCameras(); 
    784                             for(osg::GraphicsContext::Cameras::iterator citr = cameras.begin(); 
    785                                 citr != cameras.end(); 
    786                                 ++citr) 
     751                            osg::Camera* slave_camera = view->getSlave(i)._camera; 
     752                            if (slave_camera) 
    787753                            { 
    788                                 osg::Camera* camera = *citr; 
    789                                 if ((camera->getNodeMask()!=0) && 
    790                                     camera->getView() && 
    791                                     camera->getAllowEventFocus() && 
    792                                     camera->getRenderTargetImplementation()==osg::Camera::FRAME_BUFFER) 
     754                                osg::Camera::BufferAttachmentMap::const_iterator ba_itr = slave_camera->getBufferAttachmentMap().find(osg::Camera::COLOR_BUFFER); 
     755                                if (ba_itr != slave_camera->getBufferAttachmentMap().end()) 
    793756                                { 
    794                                     osg::Viewport* viewport = camera ? camera->getViewport() : 0; 
    795                                     if (viewport && 
    796                                         x >= viewport->x() && y >= viewport->y() && 
    797                                         x <= (viewport->x()+viewport->width()) && y <= (viewport->y()+viewport->height()) ) 
     757                                    if (ba_itr->second._texture == texture) 
    798758                                    { 
    799                                         setCameraWithFocus(camera); 
    800  
    801                                         // If this camera is not a slave camera 
    802                                         if (camera->getView()->getCamera() == camera) 
     759                                        osg::TextureRectangle* tr = dynamic_cast<osg::TextureRectangle*>(ba_itr->second._texture.get()); 
     760                                        osg::TextureCubeMap* tcm = dynamic_cast<osg::TextureCubeMap*>(ba_itr->second._texture.get()); 
     761                                        if (tr) 
    803762                                        { 
    804                                             eventState->setGraphicsContext(gw); 
    805                                             eventState->setInputRange( viewport->x(), viewport->y(), 
    806                                                                     viewport->x()+viewport->width(), 
    807                                                                     viewport->y()+viewport->height()); 
    808  
     763                                            event.addPointerData(new osgGA::PointerData(slave_camera, tc.x(), 0.0f, static_cast<float>(tr->getTextureWidth()), 
     764                                                                                                           tc.y(), 0.0f, static_cast<float>(tr->getTextureHeight()))); 
     765                                        } 
     766                                        else if (tcm) 
     767                                        { 
     768                                            OSG_NOTICE<<"  Slave has matched texture cubemap"<<ba_itr->second._texture.get()<<", "<<ba_itr->second._face<<std::endl; 
    809769                                        } 
    810770                                        else 
    811771                                        { 
    812                                             eventState->setInputRange(-1.0, -1.0, 1.0, 1.0); 
    813                                         } 
    814  
    815                                         if (getViewWithFocus()!=masterView) 
    816                                         { 
    817                                             // need to reset the masterView 
    818                                             masterView = getViewWithFocus(); 
    819                                             masterCamera = masterView->getCamera(); 
    820                                             eventState = masterView->getEventQueue()->getCurrentEventState(); 
    821                                             masterCameraVPW = masterCamera->getViewMatrix() * masterCamera->getProjectionMatrix(); 
    822  
    823                                             if (masterCamera->getViewport()) 
    824                                             { 
    825                                                 osg::Viewport* viewport = masterCamera->getViewport(); 
    826                                                 masterCameraVPW *= viewport->computeWindowMatrix(); 
    827                                             } 
    828                                         } 
    829  
    830                                         // If this camera is not a slave camera 
    831                                         if (camera->getView()->getCamera() == camera) 
    832                                         { 
    833                                             eventState->setGraphicsContext(gw); 
    834                                             eventState->setInputRange( viewport->x(), viewport->y(), 
    835                                                                     viewport->x()+viewport->width(), 
    836                                                                     viewport->y()+viewport->height()); 
    837  
    838                                         } 
    839                                         else 
    840                                         { 
    841                                             eventState->setInputRange(-1.0, -1.0, 1.0, 1.0); 
     772                                            event.addPointerData(new osgGA::PointerData(slave_camera, tc.x(), 0.0f, 1.0f, 
     773                                                                                                           tc.y(), 0.0f, 1.0f)); 
    842774                                        } 
    843775                                    } 
     
    845777                            } 
    846778                        } 
    847  
    848                         break; 
    849779                    } 
    850                     default: 
    851                         break; 
    852780                } 
    853  
    854                 if (pointerEvent) 
     781            } 
     782        } 
     783    } 
     784} 
     785     
     786     
     787void CompositeViewer::generatePointerData(osgGA::GUIEventAdapter& event) 
     788{ 
     789    osgViewer::GraphicsWindow* gw = dynamic_cast<osgViewer::GraphicsWindow*>(event.getGraphicsContext()); 
     790    if (!gw) return; 
     791 
     792    float x = event.getX(); 
     793    float y = event.getY(); 
     794 
     795    bool invert_y = event.getMouseYOrientation()==osgGA::GUIEventAdapter::Y_INCREASING_DOWNWARDS; 
     796    if (invert_y && gw->getTraits()) y = gw->getTraits()->height - y; 
     797     
     798    event.addPointerData(new osgGA::PointerData(gw, x, 0, gw->getTraits()->width, 
     799                                                    y, 0, gw->getTraits()->height)); 
     800 
     801    osg::GraphicsContext::Cameras& cameras = gw->getCameras(); 
     802    for(osg::GraphicsContext::Cameras::iterator citr = cameras.begin(); 
     803        citr != cameras.end(); 
     804        ++citr) 
     805    { 
     806        osg::Camera* camera = *citr; 
     807        if (camera->getAllowEventFocus() && 
     808            camera->getRenderTargetImplementation()==osg::Camera::FRAME_BUFFER) 
     809        { 
     810            osg::Viewport* viewport = camera ? camera->getViewport() : 0; 
     811            if (viewport && 
     812                x >= viewport->x() && y >= viewport->y() && 
     813                x <= (viewport->x()+viewport->width()) && y <= (viewport->y()+viewport->height()) ) 
     814            { 
     815                event.addPointerData(new osgGA::PointerData(camera, (x-viewport->x())/viewport->width()*2.0f-1.0f, -1.0, 1.0, 
     816                                                                    (y-viewport->y())/viewport->height()*2.0f-1.0f, -1.0, 1.0)); 
     817 
     818                osgViewer::View* view = dynamic_cast<osgViewer::View*>(camera->getView()); 
     819                osg::Camera* view_masterCamera = view ? view->getCamera() : 0; 
     820 
     821                // if camera isn't the master it must be a slave and could need reprojecting. 
     822                if (view && camera!=view_masterCamera) 
    855823                { 
    856                     if (getCameraWithFocus()) 
    857                     { 
    858                         osg::Viewport* viewport = getCameraWithFocus()->getViewport(); 
    859                         osg::Matrix localCameraVPW = getCameraWithFocus()->getViewMatrix() * getCameraWithFocus()->getProjectionMatrix(); 
    860                         if (viewport) localCameraVPW *= viewport->computeWindowMatrix(); 
    861  
    862                         osg::Matrix matrix( osg::Matrix::inverse(localCameraVPW) * masterCameraVPW ); 
    863  
    864                         osg::Vec3d new_coord = osg::Vec3d(x,y,0.0) * matrix; 
    865  
    866                         x = new_coord.x(); 
    867                         y = new_coord.y(); 
    868  
    869                         event->setInputRange(eventState->getXmin(), eventState->getYmin(), eventState->getXmax(), eventState->getYmax()); 
    870                         event->setX(x); 
    871                         event->setY(y); 
    872                         event->setMouseYOrientation(osgGA::GUIEventAdapter::Y_INCREASING_UPWARDS); 
    873  
    874                     } 
    875                     // pass along the new pointer events details to the eventState of the viewer 
    876                     eventState->setX(x); 
    877                     eventState->setY(y); 
    878                     eventState->setButtonMask(event->getButtonMask()); 
    879                     eventState->setMouseYOrientation(osgGA::GUIEventAdapter::Y_INCREASING_UPWARDS); 
    880  
     824                    generateSlavePointerData(camera, event); 
     825                } 
     826            } 
     827        } 
     828    } 
     829} 
     830 
     831void CompositeViewer::reprojectPointerData(osgGA::GUIEventAdapter& source_event, osgGA::GUIEventAdapter& dest_event) 
     832{ 
     833    osgViewer::GraphicsWindow* gw = dynamic_cast<osgViewer::GraphicsWindow*>(dest_event.getGraphicsContext()); 
     834    if (!gw) return; 
     835 
     836    float x = dest_event.getX(); 
     837    float y = dest_event.getY(); 
     838 
     839    bool invert_y = dest_event.getMouseYOrientation()==osgGA::GUIEventAdapter::Y_INCREASING_DOWNWARDS; 
     840    if (invert_y && gw->getTraits()) y = gw->getTraits()->height - y; 
     841 
     842    dest_event.addPointerData(new osgGA::PointerData(gw, x, 0, gw->getTraits()->width, 
     843                                                         y, 0, gw->getTraits()->height)); 
     844 
     845    osg::Camera* camera = (source_event.getNumPointerData()>=2) ? dynamic_cast<osg::Camera*>(source_event.getPointerData(1)->object.get()) : 0; 
     846    osg::Viewport* viewport = camera ? camera->getViewport() : 0; 
     847 
     848    if (!viewport) return; 
     849     
     850    dest_event.addPointerData(new osgGA::PointerData(camera, (x-viewport->x())/viewport->width()*2.0f-1.0f, -1.0, 1.0, 
     851                                                             (y-viewport->y())/viewport->height()*2.0f-1.0f, -1.0, 1.0)); 
     852 
     853    osgViewer::View* view = dynamic_cast<osgViewer::View*>(camera->getView()); 
     854    osg::Camera* view_masterCamera = view ? view->getCamera() : 0; 
     855 
     856    // if camera isn't the master it must be a slave and could need reprojecting. 
     857    if (view && camera!=view_masterCamera) 
     858    { 
     859        generateSlavePointerData(camera, dest_event); 
     860    } 
     861} 
     862 
     863struct SortEvents 
     864{ 
     865    bool operator() (const osg::ref_ptr<osgGA::GUIEventAdapter>& lhs,const osg::ref_ptr<osgGA::GUIEventAdapter>& rhs) const 
     866    { 
     867        return lhs->getTime() < rhs->getTime(); 
     868    } 
     869}; 
     870 
     871void CompositeViewer::eventTraversal() 
     872{ 
     873    if (_done) return; 
     874 
     875    if (_views.empty()) return; 
     876 
     877    double cutOffTime = (_runFrameScheme==ON_DEMAND) ? DBL_MAX : _frameStamp->getReferenceTime(); 
     878 
     879    double beginEventTraversal = osg::Timer::instance()->delta_s(_startTick, osg::Timer::instance()->tick()); 
     880 
     881    // need to copy events from the GraphicsWindow's into local EventQueue for each view; 
     882    typedef std::map<osgViewer::View*, osgGA::EventQueue::Events> ViewEventsMap; 
     883    ViewEventsMap viewEventsMap; 
     884 
     885    Contexts contexts; 
     886    getContexts(contexts); 
     887 
     888    // set done if there are no windows 
     889    checkWindowStatus(contexts); 
     890    if (_done) return; 
     891     
     892    osgGA::EventQueue::Events all_events; 
     893     
     894    for(Contexts::iterator citr = contexts.begin(); 
     895        citr != contexts.end(); 
     896        ++citr) 
     897    { 
     898        osgViewer::GraphicsWindow* gw = dynamic_cast<osgViewer::GraphicsWindow*>(*citr); 
     899        if (gw) 
     900        { 
     901            gw->checkEvents(); 
     902 
     903            osgGA::EventQueue::Events gw_events; 
     904            gw->getEventQueue()->takeEvents(gw_events, cutOffTime); 
     905 
     906            for(osgGA::EventQueue::Events::iterator itr = gw_events.begin(); 
     907                itr != gw_events.end(); 
     908                ++itr) 
     909            { 
     910                (*itr)->setGraphicsContext(gw); 
     911            } 
     912 
     913            all_events.insert(all_events.end(), gw_events.begin(), gw_events.end()); 
     914        } 
     915    } 
     916 
     917    // sort all the events in time order so we can make sure we pass them all on in the correct order. 
     918    all_events.sort(SortEvents()); 
     919     
     920    // pass on pointer data onto non mouse events to keep the position data usable by all recipients of all events. 
     921    for(osgGA::EventQueue::Events::iterator itr = all_events.begin(); 
     922        itr != all_events.end(); 
     923        ++itr) 
     924    { 
     925        osgGA::GUIEventAdapter* event = itr->get(); 
     926 
     927        switch(event->getEventType()) 
     928        { 
     929            case(osgGA::GUIEventAdapter::PUSH): 
     930            case(osgGA::GUIEventAdapter::RELEASE): 
     931            case(osgGA::GUIEventAdapter::DOUBLECLICK): 
     932            case(osgGA::GUIEventAdapter::MOVE): 
     933            case(osgGA::GUIEventAdapter::DRAG): 
     934            { 
     935                if ((event->getEventType()!=osgGA::GUIEventAdapter::DRAG && event->getEventType()!=osgGA::GUIEventAdapter::RELEASE) || 
     936                    !_previousEvent || 
     937                    _previousEvent->getGraphicsContext()!=event->getGraphicsContext() || 
     938                    _previousEvent->getNumPointerData()<2) 
     939                { 
     940                    generatePointerData(*event); 
    881941                } 
    882942                else 
    883943                { 
    884                     event->setInputRange(eventState->getXmin(), eventState->getYmin(), eventState->getXmax(), eventState->getYmax()); 
    885                     event->setX(eventState->getX()); 
    886                     event->setY(eventState->getY()); 
    887                     event->setButtonMask(eventState->getButtonMask()); 
    888                     event->setMouseYOrientation(eventState->getMouseYOrientation()); 
     944                    reprojectPointerData(*_previousEvent, *event); 
    889945                } 
    890             } 
    891  
    892             for(itr = gw_events.begin(); 
    893                 itr != gw_events.end(); 
    894                 ++itr) 
    895             { 
    896                 osgGA::GUIEventAdapter* event = itr->get(); 
    897                 switch(event->getEventType()) 
     946 
     947#if 0                 
     948                // assign topmost PointeData settings as the events X,Y and InputRange 
     949                osgGA::PointerData* pd = event->getPointerData(event->getNumPointerData()-1); 
     950                event->setX(pd->x); 
     951                event->setY(pd->y); 
     952                event->setInputRange(pd->xMin, pd->yMin, pd->xMax, pd->yMax); 
     953                event->setMouseYOrientation(osgGA::GUIEventAdapter::Y_INCREASING_UPWARDS); 
     954#else                 
     955                if (event->getMouseYOrientation()!=osgGA::GUIEventAdapter::Y_INCREASING_UPWARDS) 
    898956                { 
    899                     case(osgGA::GUIEventAdapter::CLOSE_WINDOW): 
    900                     { 
    901                         bool wasThreading = areThreadsRunning(); 
    902                         if (wasThreading) stopThreading(); 
    903  
    904                         gw->close(); 
    905  
    906                         if (wasThreading) startThreading(); 
    907  
    908                         break; 
    909                     } 
    910                     default: 
    911                         break; 
     957                    event->setY((event->getYmax()-event->getY())+event->getYmin()); 
     958                    event->setMouseYOrientation(osgGA::GUIEventAdapter::Y_INCREASING_UPWARDS); 
    912959                } 
    913             } 
    914  
    915             viewEventsMap[masterView].insert( viewEventsMap[masterView].end(), gw_events.begin(), gw_events.end() ); 
    916  
    917         } 
    918     } 
    919  
    920  
    921     // OSG_NOTICE<<"mouseEventState Xmin = "<<eventState->getXmin()<<" Ymin="<<eventState->getYmin()<<" xMax="<<eventState->getXmax()<<" Ymax="<<eventState->getYmax()<<std::endl; 
    922  
     960#endif                 
     961 
     962                _previousEvent = event; 
     963                 
     964                break; 
     965            } 
     966            default: 
     967                if (_previousEvent.valid()) event->copyPointerDataFrom(*_previousEvent); 
     968                break; 
     969        } 
     970 
     971        osgGA::PointerData* pd = event->getNumPointerData()>0 ? event->getPointerData(event->getNumPointerData()-1) : 0; 
     972        osg::Camera* camera = pd ? dynamic_cast<osg::Camera*>(pd->object.get()) : 0; 
     973        osgViewer::View* view = camera ? dynamic_cast<osgViewer::View*>(camera->getView()) : 0; 
     974         
     975        if (!view)  
     976        { 
     977            if (_viewWithFocus.valid())  
     978            { 
     979                // OSG_NOTICE<<"Falling back to using _viewWithFocus"<<std::endl; 
     980                view = _viewWithFocus.get(); 
     981            } 
     982            else if (!_views.empty())  
     983            { 
     984                // OSG_NOTICE<<"Falling back to using first view as one with focus"<<std::endl; 
     985                view = _views[0].get(); 
     986            } 
     987        } 
     988         
     989        // reassign view with focus 
     990        if (_viewWithFocus != view)  _viewWithFocus = view; 
     991 
     992        if (view)  
     993        { 
     994            viewEventsMap[view].push_back( event ); 
     995             
     996            osgGA::GUIEventAdapter* eventState = view->getEventQueue()->getCurrentEventState(); 
     997            eventState->copyPointerDataFrom(*event); 
     998        } 
     999 
     1000        _previousEvent = event; 
     1001    } 
     1002 
     1003    // handle any close windows 
     1004    for(osgGA::EventQueue::Events::iterator itr = all_events.begin(); 
     1005        itr != all_events.end(); 
     1006        ++itr) 
     1007    { 
     1008        osgGA::GUIEventAdapter* event = itr->get(); 
     1009        switch(event->getEventType()) 
     1010        { 
     1011            case(osgGA::GUIEventAdapter::CLOSE_WINDOW): 
     1012            { 
     1013                bool wasThreading = areThreadsRunning(); 
     1014                if (wasThreading) stopThreading(); 
     1015 
     1016                if (event->getGraphicsContext()) 
     1017                { 
     1018                    event->getGraphicsContext()->close(); 
     1019                } 
     1020 
     1021                if (wasThreading) startThreading(); 
     1022 
     1023                break; 
     1024            } 
     1025            default: 
     1026                break; 
     1027        } 
     1028    } 
     1029         
    9231030 
    9241031    for(RefViews::iterator vitr = _views.begin(); 
     
    9421049        } 
    9431050 
     1051        // generate frame event 
     1052        view->getEventQueue()->frame( getFrameStamp()->getReferenceTime() ); 
     1053 
    9441054        view->getEventQueue()->takeEvents(viewEventsMap[view], cutOffTime); 
    9451055    } 
    946  
    947  
    948     // OSG_NOTICE<<"Events "<<events.size()<<std::endl; 
    9491056 
    9501057    if ((_keyEventSetsDone!=0) || _quitEventSetsDone) 
     
    9881095        { 
    9891096            View* view = veitr->first; 
    990             _eventVisitor->setActionAdapter(view); 
    991  
    992             if (view->getSceneData()) 
    993             { 
     1097 
     1098            if (view && view->getSceneData()) 
     1099            { 
     1100                _eventVisitor->setActionAdapter(view); 
     1101 
    9941102                for(osgGA::EventQueue::Events::iterator itr = veitr->second.begin(); 
    9951103                    itr != veitr->second.end(); 
     
    10791187    } 
    10801188 
    1081  
    1082  
    10831189    if (getViewerStats() && getViewerStats()->collectStats("event")) 
    10841190    { 
     
    10911197    } 
    10921198} 
    1093  
    10941199 
    10951200void CompositeViewer::updateTraversal()