Show
Ignore:
Timestamp:
04/14/06 13:04:11 (8 years ago)
Author:
robert
Message:

Added fog parameters settings.

Files:
1 modified

Legend:

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

    r5088 r5090  
    4040        nearTransition(25.0), 
    4141        farTransition(100.0), 
    42         fogDensity(0.1), 
    43         fogEnd(1000.0) 
     42        fogDensity(0.001), 
     43        fogExponent(1.0), 
     44        fogEnd(1000.0), 
     45        fogColour(0.5, 0.5, 0.5, 1.0) 
    4446    {} 
    4547 
     
    4951        particleSize = 0.01 + 0.02*intensity; 
    5052        numberOfParticles = intensity * 100000000; 
    51         particleColour = osg::Vec4(0.6, 0.6, 0.6, 1.0); 
    52         fogDensity = intensity; 
     53        particleColour = osg::Vec4(0.6, 0.6, 0.6, 1.0) -  osg::Vec4(0.1, 0.1, 0.1, 1.0)* intensity; 
     54        fogExponent = 1.0f; 
     55        fogDensity = 0.01f*intensity; 
    5356        fogEnd = 250/(0.01 + intensity); 
     57        farTransition = 150.0f - 100.0f*intensity; 
    5458    } 
    5559 
     
    5963        particleSize = 0.02 + 0.03*intensity; 
    6064        numberOfParticles = intensity * 100000000; 
    61         particleColour = osg::Vec4(0.8, 0.8, 0.8, 1.0); 
    62         fogDensity = intensity; 
    63         fogEnd = 150/(0.01 + intensity); 
     65        particleColour = osg::Vec4(0.85f, 0.85f, 0.85f, 1.0f) -  osg::Vec4(0.1f, 0.1f, 0.1f, 1.0f)* intensity; 
     66        fogExponent = 1.0f; 
     67        fogDensity = 0.02f*intensity; 
     68        fogEnd = 150.0f/(0.01f + intensity); 
     69        farTransition = 150.0f - 100.0f*intensity; 
    6470    } 
    6571 
     
    7480    float               nearTransition; 
    7581    float               farTransition; 
     82    float               fogExponent; 
    7683    float               fogDensity; 
    7784    float               fogEnd; 
     85    osg::Vec4           fogColour; 
    7886}; 
    7987 
     
    8997    virtual bool cull(osg::NodeVisitor* nodeVisitor, osg::Drawable* drawable, osg::State* state) const 
    9098    { 
    91         osgUtil::CullVisitor* cv = dynamic_cast<osgUtil::CullVisitor*>(nodeVisitor); 
    92         if (cv) 
    93         { 
    94             float distance = nodeVisitor->getDistanceFromEyePoint(drawable->getBound().center(),true); 
    95  
    96 //            if (distance<-4.0) return true; 
    97              
    98 #if 0 
    99              
    100             const osg::BoundingBox& bb = drawable->getBound(); 
    101             const osg::Polytope& frustum = cv->getCurrentCullingSet().getFrustum(); 
    102             int numPointsInside = 0; 
    103             for(unsigned int i=0; i<8; ++i) 
    104             { 
    105                 if (frustum.contains(bb.corner(i))) ++numPointsInside; 
    106             } 
    107          
    108             std::cout<<" "<<drawable->getName()<<" distance "<<distance<<"num Points inside = "<<numPointsInside<<std::endl; 
    109  
    110             if (cv->isCulled(drawable->getBound())) 
    111             { 
    112                 std::cout<<" isCulled "<<drawable->getName()<<std::endl; 
    113                 return true; 
    114             } 
    115 #endif 
    116  
    117         } 
    118      
    11999        return false; 
    120100    } 
     
    144124        void setPosition(const osg::Vec3& position) { _position = position; } 
    145125        const osg::Vec3& getPosition() const { return _position; } 
    146  
    147          
     126         
     127        void setStartTime(float time) { _startTime = time; } 
     128        float getStartTime() const { return _startTime; } 
     129 
     130 
    148131        virtual void compileGLObjects(osg::State& state) const 
    149132        { 
     
    162145            if (!_internalGeometry) return; 
    163146             
     147            const Extensions* extensions = getExtensions(state.getContextID(),true); 
     148 
    164149            glNormal3fv(_position.ptr()); 
     150            extensions->glMultiTexCoord1f(GL_TEXTURE1, _startTime); 
    165151 
    166152            _internalGeometry->draw(state); 
     
    215201 
    216202        osg::Vec3                   _position; 
     203        float                       _startTime; 
    217204        osg::ref_ptr<osg::Geometry> _internalGeometry; 
    218205 
     
    508495    osg::Vec3 dv_j( 0.0f, bb.yMax()-bb.yMin(), 0.0f ); 
    509496    osg::Vec3 dv_k( velocity * period ); 
     497 
     498    float startTime = random(0, period); 
    510499     
    511500    // high res LOD. 
     
    519508        geometry->setName("highres"); 
    520509        geometry->setPosition(position); 
     510        geometry->setStartTime(startTime); 
    521511        geometry->setInitialBound(bb); 
    522512        geometry->setInternalGeometry(quad_geometry.get()); 
     
    537527        geometry->setName("lowres"); 
    538528        geometry->setPosition(position); 
     529        geometry->setStartTime(startTime); 
    539530        geometry->setInitialBound(bb); 
    540531        geometry->setInternalGeometry(point_geometry.get()); 
     
    606597 
    607598    osg::Uniform* inversePeriodUniform = new osg::Uniform("inversePeriod",1.0f/period); 
    608     osg::Uniform* startTime = new osg::Uniform("startTime",0.0f); 
     599    //osg::Uniform* startTime = new osg::Uniform("startTime",0.0f); 
    609600 
    610601    //stateset->addUniform(position_Uniform); // vec3 
     
    613604    stateset->addUniform(dv_k_Uniform); // vec3 
    614605    stateset->addUniform(inversePeriodUniform); // float 
    615     stateset->addUniform(startTime); // float 
     606    //stateset->addUniform(startTime); // float 
    616607 
    617608    stateset->setMode(GL_LIGHTING, osg::StateAttribute::OFF); 
     
    657648         
    658649        osg::Fog* fog = new osg::Fog; 
    659         fog->setMode(osg::Fog::LINEAR); 
     650         
     651        if (parameters.fogExponent<1.0) 
     652        { 
     653            fog->setMode(osg::Fog::LINEAR); 
     654        } 
     655        else if (parameters.fogExponent<2.0) 
     656        { 
     657            fog->setMode(osg::Fog::EXP); 
     658        } 
     659        else 
     660        { 
     661            fog->setMode(osg::Fog::EXP2); 
     662        } 
     663         
    660664        fog->setDensity(parameters.fogDensity); 
    661665        fog->setStart(0.0f); 
    662666        fog->setEnd(parameters.fogEnd); 
    663         fog->setColor(osg::Vec4(0.5f,0.5f,0.5f,1.0f)); 
     667        fog->setColor(parameters.fogColour); 
    664668        stateset->setAttributeAndModes(fog, osg::StateAttribute::ON); 
    665669         
     
    693697    arguments.getApplicationUsage()->setCommandLineUsage(arguments.getApplicationName()+" [options] filename ..."); 
    694698    arguments.getApplicationUsage()->addCommandLineOption("-h or --help","Display this information"); 
    695     arguments.getApplicationUsage()->addCommandLineOption("--shader","Use GLSL shaders."); 
    696     arguments.getApplicationUsage()->addCommandLineOption("--fixed","Use fixed function pipeline."); 
     699    arguments.getApplicationUsage()->addCommandLineOption("",""); 
     700    arguments.getApplicationUsage()->addCommandLineOption("",""); 
     701    arguments.getApplicationUsage()->addCommandLineOption("",""); 
     702    arguments.getApplicationUsage()->addCommandLineOption("",""); 
     703    arguments.getApplicationUsage()->addCommandLineOption("",""); 
     704    arguments.getApplicationUsage()->addCommandLineOption("",""); 
     705    arguments.getApplicationUsage()->addCommandLineOption("",""); 
     706    arguments.getApplicationUsage()->addCommandLineOption("",""); 
     707    arguments.getApplicationUsage()->addCommandLineOption("",""); 
     708    arguments.getApplicationUsage()->addCommandLineOption("",""); 
    697709     
    698710 
     
    713725 
    714726    while (arguments.read("--particleSize", parameters.particleSize)) {} 
     727    while (arguments.read("--particleColor", parameters.particleColour.r(), parameters.particleColour.g(), parameters.particleColour.b(), parameters.particleColour.a())) {} 
     728    while (arguments.read("--particleColour", parameters.particleColour.r(), parameters.particleColour.g(), parameters.particleColour.b(), parameters.particleColour.a())) {} 
    715729 
    716730    osg::Vec3 particleVelocity; 
     
    734748 
    735749    while (arguments.read("--fogDensity", parameters.fogDensity )) {} 
     750    while (arguments.read("--fogExponent", parameters.fogExponent )) {} 
    736751    while (arguments.read("--fogEnd", parameters.fogEnd )) {} 
     752    while (arguments.read("--fogColor", parameters.fogColour.r(), parameters.fogColour.g(), parameters.fogColour.b(), parameters.fogColour.a())) {} 
     753    while (arguments.read("--fogColour", parameters.fogColour.r(), parameters.fogColour.g(), parameters.fogColour.b(), parameters.fogColour.a())) {} 
    737754  
    738755    // if user request help write it out to cout.