Show
Ignore:
Timestamp:
09/26/03 13:20:43 (11 years ago)
Author:
robert
Message:

Improves to CullStack?.

From M.Grngr. options support for f=switching off internal imagery in .ive files

Files:
1 modified

Legend:

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

    r2315 r2316  
    2222#include "../osghangglide/terrain_coords.h" 
    2323 
    24 class Tree : public osg::Referenced 
     24// class to create the forest and manage the movement between various techniques. 
     25class ForestTechniqueManager : public osg::Referenced 
    2526{ 
    2627public: 
    2728 
    28     Tree(): 
    29         _color(255,255,255,255), 
    30         _width(1.0f), 
    31         _height(1.0f), 
    32         _type(0) {} 
    33  
    34     Tree(const osg::Vec3& position, const osg::UByte4& color, float width, float height, unsigned int type): 
    35         _position(position), 
    36         _color(color), 
    37         _width(width), 
    38         _height(height), 
    39         _type(type) {} 
    40  
    41     osg::Vec3       _position; 
    42     osg::UByte4     _color; 
    43     float           _width; 
    44     float           _height; 
    45     unsigned int    _type; 
     29    ForestTechniqueManager() {} 
     30 
     31    class Tree : public osg::Referenced 
     32    { 
     33    public: 
     34 
     35        Tree(): 
     36            _color(255,255,255,255), 
     37            _width(1.0f), 
     38            _height(1.0f), 
     39            _type(0) {} 
     40 
     41        Tree(const osg::Vec3& position, const osg::UByte4& color, float width, float height, unsigned int type): 
     42            _position(position), 
     43            _color(color), 
     44            _width(width), 
     45            _height(height), 
     46            _type(type) {} 
     47 
     48        osg::Vec3       _position; 
     49        osg::UByte4     _color; 
     50        float           _width; 
     51        float           _height; 
     52        unsigned int    _type; 
     53    }; 
     54 
     55    typedef std::vector< osg::ref_ptr<Tree> > TreeList; 
     56 
     57    float random(float min,float max) { return min + (max-min)*(float)rand()/(float)RAND_MAX; } 
     58    int random(int min,int max) { return min + (int)((float)(max-min)*(float)rand()/(float)RAND_MAX); } 
     59 
     60    osg::Geode* createTerrain(const osg::Vec3& origin, const osg::Vec3& size); 
     61 
     62    void createTreeList(osg::Node* terrain,const osg::Vec3& origin, const osg::Vec3& size,unsigned int numTreesToCreate,TreeList& trees); 
     63 
     64    osg::Geometry* createSprite( float w, float h, osg::UByte4 color ); 
     65 
     66    osg::Geometry* createOrthogonalQuads( const osg::Vec3& pos, float w, float h, osg::UByte4 color ); 
     67 
     68    osg::Node* createScene(); 
     69     
     70    void advanceToNextTechnique(int delta=1) 
     71    { 
     72        if (_techniqueSwitch.valid()) 
     73        { 
     74            _currentTechnique = (_currentTechnique + delta)%_techniqueSwitch->getNumChildren(); 
     75            _techniqueSwitch->setSingleChildOn(_currentTechnique); 
     76        } 
     77    } 
     78     
     79    osg::ref_ptr<osg::Switch>   _techniqueSwitch; 
     80    int                         _currentTechnique; 
     81     
     82 
    4683}; 
    4784 
    48  
    49 osg::Geode* createTerrain(const osg::Vec3& origin, const osg::Vec3& size) 
     85// event handler to capture keyboard events and use them to advance the technique used for rendering 
     86class TechniqueEventHandler : public osgGA::GUIEventHandler, public osg::NodeCallback 
     87{ 
     88public: 
     89 
     90    TechniqueEventHandler(ForestTechniqueManager* ttm=0) { _ForestTechniqueManager = ttm; } 
     91     
     92    META_Object(osgforestApp,TechniqueEventHandler); 
     93 
     94    virtual void accept(osgGA::GUIEventHandlerVisitor& v) { v.visit(*this); } 
     95 
     96    virtual bool handle(const osgGA::GUIEventAdapter& ea,osgGA::GUIActionAdapter&); 
     97     
     98    virtual void getUsage(osg::ApplicationUsage& usage) const; 
     99 
     100protected: 
     101 
     102    ~TechniqueEventHandler() {} 
     103     
     104    TechniqueEventHandler(const TechniqueEventHandler&,const osg::CopyOp&) {} 
     105     
     106    osg::ref_ptr<ForestTechniqueManager> _ForestTechniqueManager; 
     107 
     108         
     109}; 
     110 
     111bool TechniqueEventHandler::handle(const osgGA::GUIEventAdapter& ea,osgGA::GUIActionAdapter&) 
     112{ 
     113    switch(ea.getEventType()) 
     114    { 
     115        case(osgGA::GUIEventAdapter::KEYDOWN): 
     116        { 
     117            if (ea.getKey()=='n' || 
     118                ea.getKey()==osgGA::GUIEventAdapter::KEY_Right ||  
     119                ea.getKey()==osgGA::GUIEventAdapter::KEY_KP_Right) 
     120            { 
     121                _ForestTechniqueManager->advanceToNextTechnique(1); 
     122                return true; 
     123            } 
     124            else if (ea.getKey()=='p' || 
     125                     ea.getKey()==osgGA::GUIEventAdapter::KEY_Left ||  
     126                     ea.getKey()==osgGA::GUIEventAdapter::KEY_KP_Left) 
     127            { 
     128                _ForestTechniqueManager->advanceToNextTechnique(-1); 
     129                return true; 
     130            } 
     131            return false; 
     132        } 
     133 
     134        default: 
     135            return false; 
     136    } 
     137} 
     138 
     139void TechniqueEventHandler::getUsage(osg::ApplicationUsage& usage) const 
     140{ 
     141    usage.addKeyboardMouseBinding("n or Left Arrow","Advance to next technique"); 
     142    usage.addKeyboardMouseBinding("p or Right Array","Move to previous technique"); 
     143} 
     144 
     145 
     146osg::Geode* ForestTechniqueManager::createTerrain(const osg::Vec3& origin, const osg::Vec3& size) 
    50147{ 
    51148    osg::Geode* geode = new osg::Geode(); 
     
    167264} 
    168265 
    169 typedef std::vector< osg::ref_ptr<Tree> > TreeList; 
    170  
    171 float random(float min,float max) { return min + (max-min)*(float)rand()/(float)RAND_MAX; } 
    172 int random(int min,int max) { return min + (int)((float)(max-min)*(float)rand()/(float)RAND_MAX); } 
    173  
    174 void createTreeList(osg::Node* terrain,const osg::Vec3& origin, const osg::Vec3& size,unsigned int numTreesToCreate,TreeList& trees) 
     266void ForestTechniqueManager::createTreeList(osg::Node* terrain,const osg::Vec3& origin, const osg::Vec3& size,unsigned int numTreesToCreate,TreeList& trees) 
    175267{ 
    176268 
     
    219311} 
    220312 
    221 osg::Geometry* createSprite( float w, float h, osg::UByte4 color ) 
     313osg::Geometry* ForestTechniqueManager::createSprite( float w, float h, osg::UByte4 color ) 
    222314{ 
    223315    // set up the coords 
     
    252344} 
    253345 
    254 osg::Geometry* createOrthogonalQuads( const osg::Vec3& pos, float w, float h, osg::UByte4 color ) 
     346osg::Geometry* ForestTechniqueManager::createOrthogonalQuads( const osg::Vec3& pos, float w, float h, osg::UByte4 color ) 
    255347{ 
    256348    // set up the coords 
     
    299391} 
    300392 
    301 osg::Node* createScene() 
     393osg::Node* ForestTechniqueManager::createScene() 
    302394{ 
    303395    osg::Vec3 origin(0.0f,0.0f,0.0f); 
     
    330422     
    331423 
    332     osg::Switch* switchNode = new osg::Switch; 
     424    _techniqueSwitch = new osg::Switch; 
    333425     
    334426    { 
     
    344436        } 
    345437     
    346         switchNode->addChild(billboard); 
     438        _techniqueSwitch->addChild(billboard); 
    347439    } 
    348440 
     
    359451        } 
    360452         
    361         switchNode->addChild(geode); 
     453        _techniqueSwitch->addChild(geode); 
    362454    } 
    363455 
     
    384476        } 
    385477         
    386         switchNode->addChild(transform_group); 
    387     } 
    388      
    389     switchNode->setSingleChildOn(1); 
     478        _techniqueSwitch->addChild(transform_group); 
     479    } 
     480     
     481    _currentTechnique = 0; 
     482    _techniqueSwitch->setSingleChildOn(_currentTechnique); 
     483     
    390484 
    391485    osg::Group* scene = new osg::Group; 
    392486     
    393487    scene->addChild(terrain.get()); 
    394     scene->addChild(switchNode); 
     488    scene->addChild(_techniqueSwitch.get()); 
    395489 
    396490    return scene; 
     
    413507    // set up the value with sensible default event handlers. 
    414508    viewer.setUpViewer(osgProducer::Viewer::STANDARD_SETTINGS); 
     509     
     510    osg::ref_ptr<ForestTechniqueManager> ttm = new ForestTechniqueManager; 
     511     
     512    viewer.getEventHandlerList().push_front(new TechniqueEventHandler(ttm.get())); 
    415513 
    416514    // get details on keyboard and mouse bindings used by the viewer. 
     
    434532    } 
    435533     
    436     osg::Node* node = createScene(); 
     534    osg::Node* node = ttm->createScene(); 
    437535 
    438536    // add model to viewer.