Show
Ignore:
Timestamp:
02/26/07 14:01:17 (7 years ago)
Author:
robert
Message:

Completed changes to osgManipulator to make it more flexible w.r.t viewer usage, and
ported osgmanipulator example across of osgViewer

Files:
1 modified

Legend:

Unmodified
Added
Removed
  • OpenSceneGraph/trunk/examples/osgmanipulator/osgmanipulator.cpp

    r6148 r6277  
     1// --c++-- 
    12#include <osgDB/ReadFile> 
    23#include <osgUtil/Optimizer> 
    3 #include <osgProducer/Viewer> 
     4#include <osgViewer/Viewer> 
    45#include <osg/CoordinateSystemNode> 
    56#include <osgText/Text> 
     
    1415#include <osgManipulator/TranslateAxisDragger> 
    1516 
     17#include <iostream> 
     18 
    1619osgManipulator::Dragger* createDragger(const std::string& name) 
    1720{ 
     
    100103} 
    101104 
    102  
     105#if 0 
    103106bool computePixelCoords(osgProducer::Viewer* viewer,float x,float y,unsigned int cameraNum,float& pixel_x,float& pixel_y) 
    104107{ 
     
    151154    return true; 
    152155} 
     156#endif 
    153157 
    154158osg::Node* addDraggerToScene(osg::Node* scene, osgManipulator::CommandManager* cmdMgr, const std::string& name) 
     
    183187        }; 
    184188 
    185         PickModeHandler(osgProducer::Viewer *viewer) : osgGA::GUIEventHandler(), 
    186                                                        _viewer(viewer), _mode(VIEW), _activeDragger(0) 
     189        PickModeHandler(): 
     190            _mode(VIEW),  
     191            _activeDragger(0) 
    187192        { 
    188193        }         
     
    191196                    osg::Object*, osg::NodeVisitor*) 
    192197        { 
     198            osgViewer::View* view = dynamic_cast<osgViewer::View*>(&aa); 
     199            if (!view) return false; 
     200 
    193201            if (ea.getKey() == osgGA::GUIEventAdapter::KEY_Tab && 
    194202                ea.getEventType() == osgGA::GUIEventAdapter::KEYDOWN && 
     
    200208            if (VIEW == _mode) return false; 
    201209 
    202             for(unsigned int i=0;i<_viewer->getNumberOfCameras();++i) 
     210            switch (ea.getEventType()) 
    203211            { 
    204                  
    205                 if ((ea.getEventType() == osgGA::GUIEventAdapter::PUSH) && 
    206                     _viewer->computeIntersections(ea.getX(), ea.getY(), i, _pointer.hitList)) 
     212                case osgGA::GUIEventAdapter::PUSH: 
    207213                { 
    208                     float pixel_x,pixel_y; 
    209                     if (computePixelCoords(_viewer,ea.getX(),ea.getY(),i,pixel_x,pixel_y)) 
     214                    osgUtil::LineSegmentIntersector::Intersections intersections; 
     215 
     216                    _pointer.reset(); 
     217 
     218                    if (view->computeIntersections(ea.getX(),ea.getY(),intersections)) 
    210219                    { 
    211                         Producer::Camera* camera=_viewer->getCamera(i); 
    212  
    213                         osgProducer::OsgSceneHandler* sh = dynamic_cast<osgProducer::OsgSceneHandler*>(camera->getSceneHandler()); 
    214                         osgUtil::SceneView* sv = sh ? sh->getSceneView() : 0; 
    215                         if (! sv) continue; 
    216                          
    217                         _pointer.pixel_x = int(pixel_x+0.5); 
    218                         _pointer.pixel_y = int(pixel_y+0.5); 
    219                         _pointer.sv = sv; 
    220                         _pointer.hitIter = _pointer.hitList.begin(); 
    221  
    222                         for (osg::NodePath::iterator itr = _pointer.hitList.front().getNodePath().begin(); 
    223                              itr != _pointer.hitList.front().getNodePath().end(); 
     220                        _pointer.setCamera(view->getCamera()); 
     221                        _pointer.setMousePosition(ea.getX(), ea.getY()); 
     222 
     223                        for(osgUtil::LineSegmentIntersector::Intersections::iterator hitr = intersections.begin(); 
     224                            hitr != intersections.end(); 
     225                            ++hitr) 
     226                        { 
     227                            _pointer.addIntersection(hitr->nodePath, hitr->getLocalIntersectPoint()); 
     228                        } 
     229                        for (osg::NodePath::iterator itr = _pointer._hitList.front().first.begin(); 
     230                             itr != _pointer._hitList.front().first.end(); 
    224231                             ++itr) 
    225232                        { 
     
    235242                    } 
    236243                } 
    237                  
    238                 switch (ea.getEventType()) 
     244                case osgGA::GUIEventAdapter::DRAG: 
     245                case osgGA::GUIEventAdapter::RELEASE: 
    239246                { 
    240                     case osgGA::GUIEventAdapter::DRAG: 
    241                     case osgGA::GUIEventAdapter::RELEASE: 
    242                         if (_activeDragger) 
    243                         { 
    244                             float pixel_x,pixel_y; 
    245                             if (computePixelCoords(_viewer,ea.getX(),ea.getY(),i,pixel_x,pixel_y)) 
    246                             { 
    247                                 Producer::Camera* camera=_viewer->getCamera(i); 
    248  
    249                                 osgProducer::OsgSceneHandler* sh = dynamic_cast<osgProducer::OsgSceneHandler*>(camera->getSceneHandler()); 
    250                                 osgUtil::SceneView* sv = sh ? sh->getSceneView() : 0; 
    251                                 if (_activeDragger && sv) 
    252                                 { 
    253                                     _pointer.pixel_x = int(pixel_x+0.5); 
    254                                     _pointer.pixel_y = int(pixel_y+0.5); 
    255                                     _pointer.sv = sv; 
    256                                     _pointer.hitIter = _pointer.hitList.begin(); 
    257  
    258                                     _activeDragger->handle(_pointer, ea, aa); 
    259                                 } 
    260                             } 
    261                         } 
    262                         break; 
    263  
    264                     default: 
    265                         break; 
     247                    if (_activeDragger) 
     248                    { 
     249                        _pointer._hitIter = _pointer._hitList.begin(); 
     250                        _pointer.setCamera(view->getCamera()); 
     251                        _pointer.setMousePosition(ea.getX(), ea.getY()); 
     252 
     253                        _activeDragger->handle(_pointer, ea, aa); 
     254                    } 
     255                    break; 
    266256                } 
    267                 if (ea.getEventType() == osgGA::GUIEventAdapter::RELEASE) 
    268                 { 
    269                     _activeDragger = 0; 
    270                     _pointer.hitList.clear(); 
    271                 } 
     257                default: 
     258                    break; 
    272259            } 
     260 
     261            if (ea.getEventType() == osgGA::GUIEventAdapter::RELEASE) 
     262            { 
     263                _activeDragger = 0; 
     264                _pointer.reset(); 
     265            } 
     266 
    273267            return true; 
    274268        } 
    275269         
    276270    private: 
    277         osgProducer::Viewer* _viewer; 
    278271        unsigned int _mode; 
    279272        osgManipulator::Dragger* _activeDragger; 
    280         osgManipulator::Dragger::PointerInfo _pointer; 
     273        osgManipulator::PointerInfo _pointer; 
    281274}; 
    282275 
     
    302295 
    303296    // construct the viewer. 
    304     osgProducer::Viewer viewer(arguments); 
    305  
    306     // set up the value with sensible default event handlers. 
    307     viewer.setUpViewer(osgProducer::Viewer::STANDARD_SETTINGS); 
     297    osgViewer::Viewer viewer; 
    308298 
    309299    // get details on keyboard and mouse bindings used by the viewer. 
     
    372362    viewer.setSceneData(addDraggerToScene(loadedModel.get(), cmdMgr.get(), dragger_name)); 
    373363 
    374     viewer.getEventHandlerList().push_front(new PickModeHandler(&viewer)); 
    375  
    376     // create the windows and run the threads. 
    377     viewer.realize(); 
    378  
    379     while( !viewer.done() ) 
    380     { 
    381         // wait for all cull and draw threads to complete. 
    382         viewer.sync(); 
    383  
    384         // update the scene by traversing it with the the update visitor which will 
    385         // call all node update callbacks and animations. 
    386         viewer.update(); 
    387           
    388         // fire off the cull and draw traversals of the scene. 
    389         viewer.frame(); 
    390          
    391     } 
    392      
    393     // wait for all cull and draw threads to complete. 
    394     viewer.sync(); 
    395  
    396     // run a clean up frame to delete all OpenGL objects. 
    397     viewer.cleanup_frame(); 
    398  
    399     // wait for all the clean up frame to complete. 
    400     viewer.sync(); 
    401  
    402     return 0; 
    403 } 
    404  
     364    viewer.addEventHandler(new PickModeHandler()); 
     365 
     366    return viewer.run(); 
     367} 
     368