Show
Ignore:
Timestamp:
09/16/14 19:40:13 (109 minutes ago)
Author:
robert
Message:

Changed osgvolume example to use the new tf plugin rather than having local code for reading transfer function

Files:
1 modified

Legend:

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

    r13277 r13376  
    1717#include <osg/DeleteHandler> 
    1818#include <osg/io_utils> 
     19#include <osg/TextureRectangle> 
     20#include <osg/TextureCubeMap> 
    1921 
    2022#include <osgDB/Registry> 
     
    267269        _endRenderingDispatchBarrier = rhs_viewer->_endRenderingDispatchBarrier; 
    268270        _endDynamicDrawBlock = rhs_viewer->_endDynamicDrawBlock; 
    269         _cameraWithFocus = rhs_viewer->_cameraWithFocus; 
    270271        _eventVisitor = rhs_viewer->_eventVisitor; 
    271272        _updateOperations = rhs_viewer->_updateOperations; 
     
    280281        rhs_viewer->_endRenderingDispatchBarrier = 0; 
    281282        rhs_viewer->_endDynamicDrawBlock = 0; 
    282         rhs_viewer->_cameraWithFocus = 0; 
    283283        rhs_viewer->_eventVisitor = 0; 
    284284        rhs_viewer->_updateOperations = 0; 
     
    430430    //OSG_INFO<<"Viewer::realize()"<<std::endl; 
    431431 
    432     setCameraWithFocus(0); 
    433  
    434432    Contexts contexts; 
    435433    getContexts(contexts); 
     
    562560        } 
    563561    } 
    564  
     562#if 0 
    565563    osgGA::GUIEventAdapter* eventState = getEventQueue()->getCurrentEventState(); 
    566564    if (getCamera()->getViewport()) 
     
    573571        eventState->setInputRange(-1.0, -1.0, 1.0, 1.0); 
    574572    } 
     573#endif 
    575574} 
    576575 
     
    617616} 
    618617 
     618void Viewer::generateSlavePointerData(osg::Camera* camera, osgGA::GUIEventAdapter& event) 
     619{ 
     620    osgViewer::GraphicsWindow* gw = dynamic_cast<osgViewer::GraphicsWindow*>(event.getGraphicsContext()); 
     621    if (!gw) return; 
     622 
     623    // What type of Camera is it? 
     624    // 1) Master Camera : do nothin extra 
     625    // 2) Slave Camera, Relative RF, Same scene graph as master : transform coords into Master Camera and add to PointerData list 
     626    // 3) Slave Camera, Relative RF, Different scene graph from master : do nothing extra? 
     627    // 4) Slave Camera, Absolute RF, Same scene graph as master : do nothing extra? 
     628    // 5) Slave Camera, Absolute RF, Different scene graph : do nothing extra? 
     629    // 6) Slave Camera, Absolute RF, Different scene graph but a distortion correction subgraph depending upon RTT Camera (slave or master) 
     630    //                              : 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. 
     631 
     632    // if camera isn't the master it must be a slave and could need reprojecting. 
     633    if (camera!=getCamera()) 
     634    { 
     635        float x = event.getX(); 
     636        float y = event.getY(); 
     637 
     638        bool invert_y = event.getMouseYOrientation()==osgGA::GUIEventAdapter::Y_INCREASING_DOWNWARDS; 
     639        if (invert_y && gw->getTraits()) y = gw->getTraits()->height - y; 
     640 
     641        osg::Matrix masterCameraVPW = getCamera()->getViewMatrix() * getCamera()->getProjectionMatrix(); 
     642        if (getCamera()->getViewport()) 
     643        { 
     644            osg::Viewport* viewport = getCamera()->getViewport(); 
     645            masterCameraVPW *= viewport->computeWindowMatrix(); 
     646        } 
     647 
     648        // slave Camera tahnks to sharing the same View 
     649        osg::View::Slave* slave = findSlaveForCamera(camera); 
     650        if (slave) 
     651        { 
     652            if (camera->getReferenceFrame()==osg::Camera::RELATIVE_RF && slave->_useMastersSceneData) 
     653            { 
     654                osg::Viewport* viewport = camera->getViewport(); 
     655                osg::Matrix localCameraVPW = camera->getViewMatrix() * camera->getProjectionMatrix(); 
     656                if (viewport) localCameraVPW *= viewport->computeWindowMatrix(); 
     657 
     658                osg::Matrix matrix( osg::Matrix::inverse(localCameraVPW) * masterCameraVPW ); 
     659                osg::Vec3d new_coord = osg::Vec3d(x,y,0.0) * matrix; 
     660                //OSG_NOTICE<<"    pointer event new_coord.x()="<<new_coord.x()<<" new_coord.y()="<<new_coord.y()<<std::endl; 
     661                event.addPointerData(new osgGA::PointerData(getCamera(), new_coord.x(), -1.0, 1.0, 
     662                                                                         new_coord.y(), -1.0, 1.0)); 
     663            } 
     664            else if (!slave->_useMastersSceneData) 
     665            { 
     666                // Are their any RTT Camera's that this Camera depends upon for textures? 
     667 
     668                osg::ref_ptr<osgUtil::LineSegmentIntersector> ray = new osgUtil::LineSegmentIntersector(osgUtil::Intersector::WINDOW, x,y); 
     669                osgUtil::IntersectionVisitor iv(ray.get()); 
     670                camera->accept(iv); 
     671                if (ray->containsIntersections()) 
     672                { 
     673                    osg::Vec3 tc; 
     674                    osg::Texture* texture = ray->getFirstIntersection().getTextureLookUp(tc); 
     675                    if (texture) 
     676                    { 
     677                        // look up Texture in RTT Camera's. 
     678                        for(unsigned int i=0; i<getNumSlaves();++i) 
     679                        { 
     680                            osg::Camera* slave_camera = getSlave(i)._camera; 
     681                            if (slave_camera) 
     682                            { 
     683                                osg::Camera::BufferAttachmentMap::const_iterator ba_itr = slave_camera->getBufferAttachmentMap().find(osg::Camera::COLOR_BUFFER); 
     684                                if (ba_itr != slave_camera->getBufferAttachmentMap().end()) 
     685                                { 
     686                                    if (ba_itr->second._texture == texture) 
     687                                    { 
     688                                        osg::TextureRectangle* tr = dynamic_cast<osg::TextureRectangle*>(ba_itr->second._texture.get()); 
     689                                        osg::TextureCubeMap* tcm = dynamic_cast<osg::TextureCubeMap*>(ba_itr->second._texture.get()); 
     690                                        if (tr) 
     691                                        { 
     692                                            event.addPointerData(new osgGA::PointerData(slave_camera, tc.x(), 0.0f, static_cast<float>(tr->getTextureWidth()), 
     693                                                                                                      tc.y(), 0.0f, static_cast<float>(tr->getTextureHeight()))); 
     694                                        } 
     695                                        else if (tcm) 
     696                                        { 
     697                                            OSG_NOTICE<<"  Slave has matched texture cubemap"<<ba_itr->second._texture.get()<<", "<<ba_itr->second._face<<std::endl; 
     698                                        } 
     699                                        else 
     700                                        { 
     701                                            event.addPointerData(new osgGA::PointerData(slave_camera, tc.x(), 0.0f, 1.0f, 
     702                                                                                                      tc.y(), 0.0f, 1.0f)); 
     703                                        } 
     704                                    } 
     705                                } 
     706                            } 
     707                        } 
     708                    } 
     709                } 
     710            } 
     711        } 
     712    } 
     713} 
     714     
     715     
     716void Viewer::generatePointerData(osgGA::GUIEventAdapter& event) 
     717{ 
     718    osgViewer::GraphicsWindow* gw = dynamic_cast<osgViewer::GraphicsWindow*>(event.getGraphicsContext()); 
     719    if (!gw) return; 
     720 
     721    float x = event.getX(); 
     722    float y = event.getY(); 
     723 
     724    bool invert_y = event.getMouseYOrientation()==osgGA::GUIEventAdapter::Y_INCREASING_DOWNWARDS; 
     725    if (invert_y && gw->getTraits()) y = gw->getTraits()->height - y; 
     726     
     727    event.addPointerData(new osgGA::PointerData(gw, x, 0, gw->getTraits()->width, 
     728                                                    y, 0, gw->getTraits()->height)); 
     729 
     730    // new code for populating the PointerData 
     731    osgViewer::View* this_view = dynamic_cast<osgViewer::View*>(this); 
     732    osg::GraphicsContext::Cameras& cameras = gw->getCameras(); 
     733    for(osg::GraphicsContext::Cameras::iterator citr = cameras.begin(); 
     734        citr != cameras.end(); 
     735        ++citr) 
     736    { 
     737        osg::Camera* camera = *citr; 
     738        if (camera->getView()==this_view && 
     739            camera->getAllowEventFocus() && 
     740            camera->getRenderTargetImplementation()==osg::Camera::FRAME_BUFFER) 
     741        { 
     742            osg::Viewport* viewport = camera ? camera->getViewport() : 0; 
     743            if (viewport && 
     744                x >= viewport->x() && y >= viewport->y() && 
     745                x <= (viewport->x()+viewport->width()) && y <= (viewport->y()+viewport->height()) ) 
     746            { 
     747                event.addPointerData(new osgGA::PointerData(camera, (x-viewport->x())/viewport->width()*2.0f-1.0f, -1.0, 1.0, 
     748                                                                    (y-viewport->y())/viewport->height()*2.0f-1.0f, -1.0, 1.0)); 
     749 
     750                // if camera isn't the master it must be a slave and could need reprojecting. 
     751                if (camera!=getCamera()) 
     752                { 
     753                    generateSlavePointerData(camera, event); 
     754                } 
     755            } 
     756        } 
     757    } 
     758} 
     759 
     760void Viewer::reprojectPointerData(osgGA::GUIEventAdapter& source_event, osgGA::GUIEventAdapter& dest_event) 
     761{ 
     762    osgViewer::GraphicsWindow* gw = dynamic_cast<osgViewer::GraphicsWindow*>(dest_event.getGraphicsContext()); 
     763    if (!gw) return; 
     764 
     765    float x = dest_event.getX(); 
     766    float y = dest_event.getY(); 
     767 
     768    bool invert_y = dest_event.getMouseYOrientation()==osgGA::GUIEventAdapter::Y_INCREASING_DOWNWARDS; 
     769    if (invert_y && gw->getTraits()) y = gw->getTraits()->height - y; 
     770 
     771    dest_event.addPointerData(new osgGA::PointerData(gw, x, 0, gw->getTraits()->width, 
     772                                                         y, 0, gw->getTraits()->height)); 
     773 
     774    osg::Camera* camera = (source_event.getNumPointerData()>=2) ? dynamic_cast<osg::Camera*>(source_event.getPointerData(1)->object.get()) : 0; 
     775    osg::Viewport* viewport = camera ? camera->getViewport() : 0; 
     776 
     777    if (!viewport) return; 
     778     
     779    dest_event.addPointerData(new osgGA::PointerData(camera, (x-viewport->x())/viewport->width()*2.0f-1.0f, -1.0, 1.0, 
     780                                                             (y-viewport->y())/viewport->height()*2.0f-1.0f, -1.0, 1.0)); 
     781 
     782    // if camera isn't the master it must be a slave and could need reprojecting. 
     783    if (camera!=getCamera()) 
     784    { 
     785        generateSlavePointerData(camera, dest_event); 
     786    } 
     787} 
     788 
    619789void Viewer::eventTraversal() 
    620790{ 
     
    638808 
    639809    osgGA::GUIEventAdapter* eventState = getEventQueue()->getCurrentEventState(); 
    640     osg::Matrix masterCameraVPW = getCamera()->getViewMatrix() * getCamera()->getProjectionMatrix(); 
    641     if (getCamera()->getViewport()) 
    642     { 
    643         osg::Viewport* viewport = getCamera()->getViewport(); 
    644         masterCameraVPW *= viewport->computeWindowMatrix(); 
    645     } 
    646  
    647810 
    648811    // get events from user Devices attached to Viewer. 
     
    680843                osgGA::GUIEventAdapter* event = itr->get(); 
    681844 
    682                 bool pointerEvent = false; 
    683  
    684                 float x = event->getX(); 
    685                 float y = event->getY(); 
    686  
    687                 bool invert_y = event->getMouseYOrientation()==osgGA::GUIEventAdapter::Y_INCREASING_DOWNWARDS; 
    688                 if (invert_y && gw->getTraits()) y = gw->getTraits()->height - y; 
     845                event->setGraphicsContext(gw); 
    689846 
    690847                switch(event->getEventType()) 
     
    693850                    case(osgGA::GUIEventAdapter::RELEASE): 
    694851                    case(osgGA::GUIEventAdapter::DOUBLECLICK): 
     852                    case(osgGA::GUIEventAdapter::MOVE): 
    695853                    case(osgGA::GUIEventAdapter::DRAG): 
    696                     case(osgGA::GUIEventAdapter::MOVE): 
    697854                    { 
    698                         pointerEvent = true; 
    699  
    700                         if (event->getEventType()!=osgGA::GUIEventAdapter::DRAG || !getCameraWithFocus()) 
     855                        if (event->getEventType()!=osgGA::GUIEventAdapter::DRAG || 
     856                            eventState->getGraphicsContext()!=event->getGraphicsContext() || 
     857                            eventState->getNumPointerData()<2) 
    701858                        { 
    702                             osg::GraphicsContext::Cameras& cameras = gw->getCameras(); 
    703                             for(osg::GraphicsContext::Cameras::iterator citr = cameras.begin(); 
    704                                 citr != cameras.end(); 
    705                                 ++citr) 
    706                             { 
    707                                 osg::Camera* camera = *citr; 
    708                                 if (camera->getView()==this && 
    709                                     camera->getAllowEventFocus() && 
    710                                     camera->getRenderTargetImplementation()==osg::Camera::FRAME_BUFFER) 
    711                                 { 
    712                                     osg::Viewport* viewport = camera ? camera->getViewport() : 0; 
    713                                     if (viewport && 
    714                                         x >= viewport->x() && y >= viewport->y() && 
    715                                         x <= (viewport->x()+viewport->width()) && y <= (viewport->y()+viewport->height()) ) 
    716                                     { 
    717                                         // OSG_NOTICE<<"setCamera with focus "<<camera->getName()<<" x="<<x<<" y="<<y<<std::endl; 
    718                                         setCameraWithFocus(camera); 
    719                                     } 
    720                                 } 
    721                             } 
     859                            generatePointerData(*event); 
    722860                        } 
    723  
     861                        else 
     862                        { 
     863                            reprojectPointerData(*eventState, *event); 
     864                        } 
     865 
     866#if 0 
     867                        // assign topmost PointeData settings as the events X,Y and InputRange 
     868                        osgGA::PointerData* pd = event->getPointerData(event->getNumPointerData()-1); 
     869                        event->setX(pd->x); 
     870                        event->setY(pd->y); 
     871                        event->setInputRange(pd->xMin, pd->yMin, pd->xMax, pd->yMax); 
     872                        event->setMouseYOrientation(osgGA::GUIEventAdapter::Y_INCREASING_UPWARDS); 
     873#else 
     874                        if (event->getMouseYOrientation()!=osgGA::GUIEventAdapter::Y_INCREASING_UPWARDS) 
     875                        { 
     876                            event->setY((event->getYmax()-event->getY())+event->getYmin()); 
     877                            event->setMouseYOrientation(osgGA::GUIEventAdapter::Y_INCREASING_UPWARDS); 
     878                        } 
     879#endif 
     880 
     881                        eventState->copyPointerDataFrom(*event); 
     882                         
    724883                        break; 
    725884                    } 
    726885                    default: 
     886                        event->copyPointerDataFrom(*eventState); 
    727887                        break; 
    728888                } 
    729  
    730                 if (pointerEvent) 
    731                 { 
    732                     if (getCameraWithFocus()) 
    733                     { 
    734                         if (getCameraWithFocus()!=getCamera()) 
    735                         { 
    736                             osg::Viewport* viewport = getCameraWithFocus()->getViewport(); 
    737                             osg::Matrix localCameraVPW = getCameraWithFocus()->getViewMatrix() * getCameraWithFocus()->getProjectionMatrix(); 
    738                             if (viewport) localCameraVPW *= viewport->computeWindowMatrix(); 
    739  
    740                             osg::Matrix matrix( osg::Matrix::inverse(localCameraVPW) * masterCameraVPW ); 
    741  
    742                             osg::Vec3d new_coord = osg::Vec3d(x,y,0.0) * matrix; 
    743  
    744                             x = new_coord.x(); 
    745                             y = new_coord.y(); 
    746                         } 
    747  
    748                         // OSG_NOTICE<<"pointer event new_coord.x()="<<new_coord.x()<<" new_coord.y()="<<new_coord.y()<<std::endl; 
    749  
    750                         event->setInputRange(eventState->getXmin(), eventState->getYmin(), eventState->getXmax(), eventState->getYmax()); 
    751                         event->setX(x); 
    752                         event->setY(y); 
    753                         event->setMouseYOrientation(osgGA::GUIEventAdapter::Y_INCREASING_UPWARDS); 
    754  
    755                     } 
    756                     else 
    757                     { 
    758                         x = eventState->getXmin() + (x/double(gw->getTraits()->width))*(eventState->getXmax() - eventState->getXmin()); 
    759                         y = eventState->getYmin() + (y/double(gw->getTraits()->height))*(eventState->getYmax() - eventState->getYmin()); 
    760                         // OSG_NOTICE<<"new x = "<<x<<" new y = "<<y<<std::endl; 
    761  
    762                         event->setInputRange(eventState->getXmin(), eventState->getYmin(), eventState->getXmax(), eventState->getYmax()); 
    763                         event->setX(x); 
    764                         event->setY(y); 
    765                         event->setMouseYOrientation(osgGA::GUIEventAdapter::Y_INCREASING_UPWARDS); 
    766                     } 
    767  
    768                     // pass along the new pointer events details to the eventState of the viewer 
    769                     eventState->setX(x); 
    770                     eventState->setY(y); 
    771                     eventState->setButtonMask(event->getButtonMask()); 
    772                     eventState->setMouseYOrientation(osgGA::GUIEventAdapter::Y_INCREASING_UPWARDS); 
    773  
    774                 } 
    775                 else 
    776                 { 
    777                     event->setInputRange(eventState->getXmin(), eventState->getYmin(), eventState->getXmax(), eventState->getYmax()); 
    778                     event->setX(eventState->getX()); 
    779                     event->setY(eventState->getY()); 
    780                     event->setButtonMask(eventState->getButtonMask()); 
    781                     event->setMouseYOrientation(eventState->getMouseYOrientation()); 
    782                 } 
    783                 //OSG_NOTICE<<"   mouse x = "<<event->getX()<<" y="<<event->getY()<<std::endl; 
    784                 // OSG_NOTICE<<"   mouse Xmin = "<<event->getXmin()<<" Ymin="<<event->getYmin()<<" xMax="<<event->getXmax()<<" Ymax="<<event->getYmax()<<std::endl; 
    785             } 
    786  
     889                 
     890                events.push_back(event); 
     891            } 
     892             
    787893            for(itr = gw_events.begin(); 
    788894                itr != gw_events.end(); 
     
    809915            } 
    810916 
    811             events.insert(events.end(), gw_events.begin(), gw_events.end()); 
    812  
    813         } 
    814     } 
    815  
    816     // pass on the coorindates of the main camera to make sure the frame event is scaled appropriately. 
    817     if (getCamera()->getViewport()) 
    818     { 
    819         osg::Viewport* viewport = getCamera()->getViewport(); 
    820         eventState->setInputRange( viewport->x(), viewport->y(), viewport->x() + viewport->width(), viewport->y() + viewport->height()); 
    821     } 
    822     else 
    823     { 
    824         eventState->setInputRange(-1.0, -1.0, 1.0, 1.0); 
     917        } 
    825918    } 
    826919 
     
    831924 
    832925    _eventQueue->takeEvents(events, cutOffTime); 
    833  
    834  
    835 #if 0 
    836     // OSG_NOTICE<<"Events "<<events.size()<<std::endl; 
    837     for(osgGA::EventQueue::Events::iterator itr = events.begin(); 
    838         itr != events.end(); 
    839         ++itr) 
    840     { 
    841         osgGA::GUIEventAdapter* event = itr->get(); 
    842         switch(event->getEventType()) 
    843         { 
    844             case(osgGA::GUIEventAdapter::PUSH): 
    845                 OSG_NOTICE<<"  PUSH "<<event->getButton()<<" x="<<event->getX()<<" y="<<event->getY()<<std::endl; 
    846                 break; 
    847             case(osgGA::GUIEventAdapter::RELEASE): 
    848                 OSG_NOTICE<<"  RELEASE "<<event->getButton()<<" x="<<event->getX()<<" y="<<event->getY()<<std::endl; 
    849                 break; 
    850             case(osgGA::GUIEventAdapter::DRAG): 
    851                 OSG_NOTICE<<"  DRAG "<<event->getButtonMask()<<" x="<<event->getX()<<" y="<<event->getY()<<std::endl; 
    852                 break; 
    853             case(osgGA::GUIEventAdapter::MOVE): 
    854                 OSG_NOTICE<<"  MOVE "<<event->getButtonMask()<<" x="<<event->getX()<<" y="<<event->getY()<<std::endl; 
    855                 break; 
    856             case(osgGA::GUIEventAdapter::SCROLL): 
    857                 OSG_NOTICE<<"  SCROLL "<<event->getScrollingMotion()<<std::endl; 
    858                 break; 
    859             case(osgGA::GUIEventAdapter::KEYDOWN): 
    860                 OSG_NOTICE<<"  KEYDOWN '"<<(char)event->getKey()<<"'"<<std::endl; 
    861                 break; 
    862             case(osgGA::GUIEventAdapter::KEYUP): 
    863                 OSG_NOTICE<<"  KEYUP '"<<(char)event->getKey()<<"'"<<std::endl; 
    864                 break; 
    865             case(osgGA::GUIEventAdapter::RESIZE): 
    866                 OSG_NOTICE<<"  RESIZE "<<event->getWindowX()<<"/"<<event->getWindowY()<<" x "<<event->getWindowWidth()<<"/"<<event->getWindowHeight() << std::endl; 
    867                 break; 
    868             case(osgGA::GUIEventAdapter::QUIT_APPLICATION): 
    869                 OSG_NOTICE<<"  QUIT_APPLICATION " << std::endl; 
    870                 break; 
    871             case(osgGA::GUIEventAdapter::FRAME): 
    872                 // OSG_NOTICE<<"  FRAME "<<std::endl; 
    873                 break; 
    874             default: 
    875                 // OSG_NOTICE<<"  Event not handled"<<std::endl; 
    876                 break; 
    877         } 
    878     } 
    879 #endif 
    880926 
    881927    // OSG_NOTICE<<"Events "<<events.size()<<std::endl;