Show
Ignore:
Timestamp:
03/19/03 13:06:29 (11 years ago)
Author:
robert
Message:

Added a realize callback to the OsgCameraGroup?.

Move osgtexture3D across to using the new realize callback for creating its textures.

Files:
1 modified

Legend:

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

    r1697 r1717  
    2525 
    2626 
    27 class ConstructStateCallback : public osg::NodeCallback 
     27class ConstructStateCallback : public osgProducer::OsgCameraGroup::RealizeCallback 
    2828{ 
    2929    public: 
    30         ConstructStateCallback() {} 
     30        ConstructStateCallback(osg::Node* node):_node(node),_initialized(false) {} 
    3131         
    3232        osg::StateSet* constructState() 
     
    8383            texture3D->setFilter(osg::Texture3D::MIN_FILTER,osg::Texture3D::LINEAR); 
    8484            texture3D->setFilter(osg::Texture3D::MAG_FILTER,osg::Texture3D::LINEAR); 
     85            texture3D->setWrap(osg::Texture3D::WRAP_R,osg::Texture3D::REPEAT); 
    8586            texture3D->setImage(image_3d); 
    8687 
     
    104105        } 
    105106 
     107        virtual void operator()(const Producer::RenderSurface&, osgProducer::OsgCameraGroup* , osgProducer::OsgSceneHandler* sh) 
     108        {  
     109            if (!_initialized) 
     110            { 
     111                // only initialize state once, only need for cases where multiple graphics contexts are 
     112                // if which case this callback can get called multiple times. 
     113                _initialized = true; 
     114 
     115                if (_node) _node->setStateSet(constructState()); 
     116            }             
     117            // now safe to con 
     118            sh->init(); 
     119             
     120        } 
     121         
     122         
     123        osg::Node*  _node; 
     124        bool        _initialized; 
     125         
     126}; 
     127 
     128class UpdateStateCallback : public osg::NodeCallback 
     129{ 
     130    public: 
     131        UpdateStateCallback() {} 
     132         
    106133        void animateState(osg::StateSet* stateset) 
    107134        { 
     
    114141                texgen->getPlane(osg::TexGen::R)[3] += 0.001f; 
    115142            } 
    116              
     143 
    117144        } 
    118145 
     
    125152                // we have an exisitng stateset, so lets animate it. 
    126153                animateState(stateset); 
    127             } 
    128             else 
    129             { 
    130                 // no state exist yet, so we must be in the first 
    131                 // pass, so lets create our stateset with all the  
    132                 // textures in it. 
    133                 stateset = constructState(); 
    134                 if (stateset) node->setStateSet(stateset); 
    135154            } 
    136155 
     
    190209    // osg::Image::copySubImage() without using GLU which will get round 
    191210    // this current limitation. 
    192     geode->setUpdateCallback(new ConstructStateCallback()); 
     211    geode->setUpdateCallback(new UpdateStateCallback()); 
    193212     
    194213    return geode; 
     
    242261        // set the scene to render 
    243262        viewer.setSceneData(rootNode); 
     263         
     264        // the construct state uses gl commands to resize images so we are forced 
     265        // to only call it once a valid graphics context has been established, 
     266        // for that we use a realize callback. 
     267        viewer.setRealizeCallback(new ConstructStateCallback(rootNode)); 
    244268 
    245269        // create the windows and run the threads.