Show
Ignore:
Timestamp:
12/23/05 11:59:31 (9 years ago)
Author:
robert
Message:

Ported picking across to using PickVisitor?.

Files:
1 modified

Legend:

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

    r4880 r4952  
    121121            std::cout<<"Picking "<<x<<"\t"<<y<<std::endl; 
    122122 
    123  
    124123            int origX, origY, width, height; 
    125124            _sceneView->getViewport(origX,origY,width,height); 
    126125 
    127             // convert Produce's non dimensional x,y coords back into pixel coords. 
    128             int winX = (int)((x+1.0f)*0.5f*(float)width); 
    129             int winY = (int)((y+1.0f)*0.5f*(float)height); 
    130  
    131             osg::Vec3 nearPoint, farPoint; 
    132             _sceneView->projectWindowXYIntoObject(winX,winY,nearPoint,farPoint); 
    133  
    134             std::cout<<"nearPoint "<<nearPoint<<"  farPoint "<<farPoint<<std::endl; 
    135  
    136             // make a line segment 
    137             osg::ref_ptr<osg::LineSegment> lineSegment = new osg::LineSegment(nearPoint,farPoint);  
    138  
    139             // create the IntersectVisitor to do the line intersection traversals. 
    140             osgUtil::IntersectVisitor intersector; 
    141             intersector.addLineSegment(lineSegment.get()); 
    142              
    143             scene->accept(intersector); 
    144              
    145             osgUtil::IntersectVisitor::HitList& hits=intersector.getHitList(lineSegment.get()); 
    146             if (!hits.empty()) 
     126            // convert Producer's non dimensional x,y coords back into pixel coords. 
     127            int pixel_x = (int)((x+1.0f)*0.5f*(float)width); 
     128            int pixel_y = (int)((y+1.0f)*0.5f*(float)height); 
     129             
     130             
     131            osgUtil::PickVisitor pick(_sceneView->getViewport(), 
     132                                      _sceneView->getProjectionMatrix(), 
     133                                      _sceneView->getViewMatrix(), 
     134                                      pixel_x, pixel_y); 
     135 
     136            scene->accept(pick); 
     137             
     138            osgUtil::PickVisitor::LineSegmentHitListMap& segHitList = pick.getSegHitList(); 
     139            if (!segHitList.empty() && !segHitList.begin()->second.empty()) 
    147140            { 
    148141                std::cout<<"Got hits"<<std::endl; 
     142                 
     143                // get the hits for the first segment 
     144                osgUtil::PickVisitor::HitList& hits = segHitList.begin()->second; 
    149145                 
    150146                // just take the first hit - nearest the eye point. 
     
    154150                osg::Node* node = (nodePath.size()>=1)?nodePath[nodePath.size()-1]:0; 
    155151                osg::Group* parent = (nodePath.size()>=2)?dynamic_cast<osg::Group*>(nodePath[nodePath.size()-2]):0; 
    156                  
     152 
     153                if (node) std::cout<<"  Hits "<<node->className()<<" nodePath size"<<nodePath.size()<<std::endl; 
     154 
     155                // now we try to decorate the hit node by the osgFX::Scribe to show that its been "picked" 
    157156                if (parent && node) 
    158157                { 
    159158                 
    160                     std::cout<<"Hits "<<node->className()<<std::endl; 
    161                     std::cout<<" parent "<<parent->className()<<std::endl; 
     159                    std::cout<<"  parent "<<parent->className()<<std::endl; 
    162160                     
    163161                    osgFX::Scribe* parentAsScribe = dynamic_cast<osgFX::Scribe*>(parent);