Show
Ignore:
Timestamp:
09/05/05 15:19:20 (9 years ago)
Author:
robert
Message:

Added event handler to shader code so that alphaCuttOff, transparency and
sampleDensity are controlled via 'a', 't' and 'd' respectively.

Files:
1 modified

Legend:

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

    r4501 r4502  
    2121#include <osgDB/FileUtils> 
    2222#include <osgDB/FileNameUtils> 
     23 
     24#include <osgGA/EventVisitor> 
    2325 
    2426#include <osgUtil/CullVisitor> 
     
    641643} 
    642644 
     645class FollowMouseCallback : public osgGA::GUIEventHandler, public osg::StateSet::Callback 
     646{ 
     647    public: 
     648     
     649        FollowMouseCallback() 
     650        { 
     651            _updateTransparency = false; 
     652            _updateAlphaCutOff = false; 
     653            _updateSampleDensity = false; 
     654        } 
     655 
     656        FollowMouseCallback(const FollowMouseCallback&,const osg::CopyOp&) {} 
     657 
     658        META_Object(osg,FollowMouseCallback); 
     659 
     660        virtual void operator() (osg::StateSet* stateset, osg::NodeVisitor* nv) 
     661        { 
     662            osgGA::EventVisitor* ev = dynamic_cast<osgGA::EventVisitor*>(nv); 
     663            if (nv->getVisitorType()==osg::NodeVisitor::EVENT_VISITOR || ev) 
     664            { 
     665                if (ev) 
     666                { 
     667                    osgGA::GUIActionAdapter* aa = ev->getActionAdapter(); 
     668                    osgGA::EventVisitor::EventList& events = ev->getEventList(); 
     669                    for(osgGA::EventVisitor::EventList::iterator itr=events.begin(); 
     670                        itr!=events.end(); 
     671                        ++itr) 
     672                    { 
     673                        handle(*(*itr), *aa, stateset, ev); 
     674                    } 
     675                } 
     676            } 
     677        } 
     678         
     679        virtual bool handle(const osgGA::GUIEventAdapter& ea,osgGA::GUIActionAdapter&, osg::Object* object, osg::NodeVisitor*) 
     680        { 
     681            osg::StateSet* stateset = dynamic_cast<osg::StateSet*>(object); 
     682            if (!stateset) return false; 
     683             
     684            switch(ea.getEventType()) 
     685            { 
     686                case(osgGA::GUIEventAdapter::MOVE): 
     687                case(osgGA::GUIEventAdapter::DRAG): 
     688                { 
     689                    float v = ea.getY()*0.5f+0.5f; 
     690                    osg::Uniform* uniform = 0; 
     691                    if (_updateTransparency && (uniform = stateset->getUniform("transparency"))) uniform->set(v); 
     692                    if (_updateAlphaCutOff && (uniform = stateset->getUniform("alphaCutOff"))) uniform->set(v); 
     693                    if (_updateSampleDensity && (uniform = stateset->getUniform("sampleDensity"))) uniform->set(powf(v,5)); 
     694                    break; 
     695                } 
     696                case(osgGA::GUIEventAdapter::KEYDOWN): 
     697                { 
     698                    if (ea.getKey()=='t') _updateTransparency = true; 
     699                    if (ea.getKey()=='a') _updateAlphaCutOff = true; 
     700                    if (ea.getKey()=='d') _updateSampleDensity = true; 
     701                    break; 
     702                } 
     703                case(osgGA::GUIEventAdapter::KEYUP): 
     704                { 
     705                    if (ea.getKey()=='t') _updateTransparency = false; 
     706                    if (ea.getKey()=='a') _updateAlphaCutOff = false; 
     707                    if (ea.getKey()=='d') _updateSampleDensity = false; 
     708                    break; 
     709                } 
     710                default: 
     711                    break; 
     712            } 
     713            return false; 
     714        } 
     715                 
     716        virtual void accept(osgGA::GUIEventHandlerVisitor& v) 
     717        { 
     718            v.visit(*this); 
     719        } 
     720         
     721        bool _updateTransparency; 
     722        bool _updateAlphaCutOff; 
     723        bool _updateSampleDensity; 
     724 
     725}; 
     726 
    643727osg::Node* createShaderModel(osg::ref_ptr<osg::Image>& image_3d, osg::ref_ptr<osg::Image>& normalmap_3d, 
    644728                       osg::Texture::InternalFormatMode internalFormatMode, 
     
    650734    osg::StateSet* stateset = geode->getOrCreateStateSet(); 
    651735     
     736    stateset->setEventCallback(new FollowMouseCallback); 
     737 
    652738    // set up the 3d texture itself, 
    653739    // note, well set the filtering up so that mip mapping is disabled, 
     
    749835    stateset->addUniform(baseTextureSampler); 
    750836 
    751     osg::Uniform* sampleDensity = new osg::Uniform("sampleDensity", 1.0f/(float)numSlices); 
     837    osg::Uniform* sampleDensity = new osg::Uniform("sampleDensity", 0.01f); 
    752838    stateset->addUniform(sampleDensity); 
    753839