Show
Ignore:
Timestamp:
01/24/07 12:18:27 (7 years ago)
Author:
robert
Message:

Added ability to generate various cube faces for testing and switch handler to toggle between different models.

Files:
1 modified

Legend:

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

    r6043 r6045  
    99#include <osg/CullFace> 
    1010#include <osg/Geometry> 
     11#include <osg/Switch> 
    1112 
    1213#include <osgGA/TrackballManipulator> 
     
    130131}; 
    131132 
    132 osg::Node* createTestModel() 
     133enum Faces 
     134{ 
     135    FRONT_FACE = 1, 
     136    BACK_FACE = 2, 
     137    LEFT_FACE = 4, 
     138    RIGHT_FACE = 8, 
     139    TOP_FACE = 16, 
     140    BOTTOM_FACE = 32         
     141}; 
     142 
     143osg::Node* createCube(unsigned int mask) 
    133144{ 
    134145    osg::Geode* geode = new osg::Geode; 
     
    162173    osg::Vec3 nz(0.0f,0.0f,-1.0f); 
    163174 
    164     // front face     
    165     vertices->push_back(origin); 
    166     vertices->push_back(origin+dx); 
    167     vertices->push_back(origin+dx+dz); 
    168     vertices->push_back(origin+dz); 
    169     normals->push_back(ny); 
    170     normals->push_back(ny); 
    171     normals->push_back(ny); 
    172     normals->push_back(ny); 
    173      
    174     // front face     
    175     vertices->push_back(origin+dy); 
    176     vertices->push_back(origin+dy+dz); 
    177     vertices->push_back(origin+dy+dx+dz); 
    178     vertices->push_back(origin+dy+dx); 
    179     normals->push_back(py); 
    180     normals->push_back(py); 
    181     normals->push_back(py); 
    182     normals->push_back(py); 
    183      
    184     // left face     
    185     vertices->push_back(origin+dy); 
    186     vertices->push_back(origin); 
    187     vertices->push_back(origin+dz); 
    188     vertices->push_back(origin+dy+dz); 
    189     normals->push_back(nx); 
    190     normals->push_back(nx); 
    191     normals->push_back(nx); 
    192     normals->push_back(nx); 
    193  
    194     // right face     
    195     vertices->push_back(origin+dx+dy); 
    196     vertices->push_back(origin+dx+dy+dz); 
    197     vertices->push_back(origin+dx+dz); 
    198     vertices->push_back(origin+dx); 
    199     normals->push_back(px); 
    200     normals->push_back(px); 
    201     normals->push_back(px); 
    202     normals->push_back(px); 
    203  
    204     // top face     
    205     vertices->push_back(origin+dz); 
    206     vertices->push_back(origin+dz+dx); 
    207     vertices->push_back(origin+dz+dx+dy); 
    208     vertices->push_back(origin+dz+dy); 
    209     normals->push_back(pz); 
    210     normals->push_back(pz); 
    211     normals->push_back(pz); 
    212     normals->push_back(pz); 
    213  
    214     // bottom face     
    215     vertices->push_back(origin); 
    216     vertices->push_back(origin+dy); 
    217     vertices->push_back(origin+dx+dy); 
    218     vertices->push_back(origin+dx); 
    219     normals->push_back(nz); 
    220     normals->push_back(nz); 
    221     normals->push_back(nz); 
    222     normals->push_back(nz); 
    223  
     175    if (mask & FRONT_FACE) 
     176    { 
     177        // front face     
     178        vertices->push_back(origin); 
     179        vertices->push_back(origin+dx); 
     180        vertices->push_back(origin+dx+dz); 
     181        vertices->push_back(origin+dz); 
     182        normals->push_back(ny); 
     183        normals->push_back(ny); 
     184        normals->push_back(ny); 
     185        normals->push_back(ny); 
     186    } 
     187 
     188    if (mask & BACK_FACE) 
     189    { 
     190        // back face     
     191        vertices->push_back(origin+dy); 
     192        vertices->push_back(origin+dy+dz); 
     193        vertices->push_back(origin+dy+dx+dz); 
     194        vertices->push_back(origin+dy+dx); 
     195        normals->push_back(py); 
     196        normals->push_back(py); 
     197        normals->push_back(py); 
     198        normals->push_back(py); 
     199    } 
     200 
     201    if (mask & LEFT_FACE) 
     202    { 
     203        // left face     
     204        vertices->push_back(origin+dy); 
     205        vertices->push_back(origin); 
     206        vertices->push_back(origin+dz); 
     207        vertices->push_back(origin+dy+dz); 
     208        normals->push_back(nx); 
     209        normals->push_back(nx); 
     210        normals->push_back(nx); 
     211        normals->push_back(nx); 
     212    } 
     213 
     214    if (mask & RIGHT_FACE) 
     215    { 
     216        // right face     
     217        vertices->push_back(origin+dx+dy); 
     218        vertices->push_back(origin+dx+dy+dz); 
     219        vertices->push_back(origin+dx+dz); 
     220        vertices->push_back(origin+dx); 
     221        normals->push_back(px); 
     222        normals->push_back(px); 
     223        normals->push_back(px); 
     224        normals->push_back(px); 
     225    } 
     226 
     227    if (mask & TOP_FACE) 
     228    { 
     229        // top face     
     230        vertices->push_back(origin+dz); 
     231        vertices->push_back(origin+dz+dx); 
     232        vertices->push_back(origin+dz+dx+dy); 
     233        vertices->push_back(origin+dz+dy); 
     234        normals->push_back(pz); 
     235        normals->push_back(pz); 
     236        normals->push_back(pz); 
     237        normals->push_back(pz); 
     238    } 
     239 
     240    if (mask & BOTTOM_FACE) 
     241    { 
     242        // bottom face     
     243        vertices->push_back(origin); 
     244        vertices->push_back(origin+dy); 
     245        vertices->push_back(origin+dx+dy); 
     246        vertices->push_back(origin+dx); 
     247        normals->push_back(nz); 
     248        normals->push_back(nz); 
     249        normals->push_back(nz); 
     250        normals->push_back(nz); 
     251    } 
     252     
    224253    geometry->addPrimitiveSet(new osg::DrawArrays(GL_QUADS, 0, vertices->size())); 
    225254 
    226255    return geode; 
     256} 
     257 
     258class SwitchHandler : public osgGA::GUIEventHandler 
     259{ 
     260public: 
     261 
     262    SwitchHandler(): 
     263        _childNum(0), 
     264        _frameNum(0) {} 
     265     
     266    virtual bool handle(const osgGA::GUIEventAdapter& ea,osgGA::GUIActionAdapter& aa, osg::Object* object, osg::NodeVisitor* nv) 
     267    { 
     268        osg::Switch* sw = dynamic_cast<osg::Switch*>(object); 
     269        if (!sw) return false; 
     270         
     271        if (nv->getFrameStamp()) 
     272        { 
     273            if (nv->getFrameStamp()->getFrameNumber()==_frameNum) return false; 
     274            _frameNum = nv->getFrameStamp()->getFrameNumber(); 
     275        } 
     276         
     277        switch(ea.getEventType()) 
     278        { 
     279            case(osgGA::GUIEventAdapter::KEYDOWN): 
     280            { 
     281                if (ea.getKey()=='n') 
     282                { 
     283                 
     284                    ++_childNum; 
     285                    if (_childNum >= sw->getNumChildren()) _childNum = 0; 
     286 
     287                    osg::notify(osg::NOTICE)<<"selecting "<<_childNum<<std::endl; 
     288 
     289                    sw->setSingleChildOn(_childNum); 
     290                    return true; 
     291                }                 
     292                break; 
     293            } 
     294            default: 
     295                break; 
     296        } 
     297        return false; 
     298    } 
     299 
     300protected: 
     301 
     302    virtual ~SwitchHandler() {} 
     303    unsigned int    _childNum; 
     304    int             _frameNum; 
     305 
     306}; 
     307 
     308osg::Node* createTestModel() 
     309{ 
     310    osg::Switch* sw = new osg::Switch; 
     311    sw->setEventCallback(new SwitchHandler); 
     312     
     313    sw->addChild(createCube(FRONT_FACE), true); 
     314    sw->addChild(createCube(FRONT_FACE | BACK_FACE), false); 
     315    sw->addChild(createCube(FRONT_FACE | BACK_FACE | LEFT_FACE), false); 
     316    sw->addChild(createCube(FRONT_FACE | BACK_FACE | LEFT_FACE | RIGHT_FACE), false); 
     317    sw->addChild(createCube(FRONT_FACE | BACK_FACE | LEFT_FACE | RIGHT_FACE | TOP_FACE), false); 
     318    sw->addChild(createCube(FRONT_FACE | BACK_FACE | LEFT_FACE | RIGHT_FACE | TOP_FACE | BOTTOM_FACE), false); 
     319     
     320    return sw; 
    227321} 
    228322