Show
Ignore:
Timestamp:
11/30/06 13:05:51 (8 years ago)
Author:
robert
Message:

Added dynamic updating of light position and multi-pass addition of ambient and diffuse lighting

Files:
1 modified

Legend:

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

    r5779 r5781  
    11#include <osg/ArgumentParser> 
     2 
     3#include <osg/LightModel> 
     4#include <osg/Depth> 
     5#include <osg/BlendFunc> 
    26 
    37#include <osgProducer/Viewer> 
     
    142146    bool updateLightPosition = true; 
    143147 
     148    bool doShadow = true; 
     149 
    144150    // any option left unread are converted into errors to write out later. 
    145151    arguments.reportRemainingOptionsAsUnrecognized(); 
     
    166172     
    167173    osg::ref_ptr<osg::Group> group = new osg::Group; 
    168     group->addChild(model.get()); 
    169174 
    170175    // set up the occluder 
     
    192197    else 
    193198    { 
    194         lightpos.set(0.5f,0.25f,-0.8f,0.0f); 
    195     } 
    196  
    197     { 
     199        lightpos.set(0.5f,0.25f,0.8f,0.0f); 
     200    } 
     201 
     202 
     203    osg::ref_ptr<osg::Light> light = new osg::Light; 
     204 
     205    if (!doShadow) 
     206    { 
     207        group->addChild(model.get()); 
     208 
    198209        osg::ref_ptr<osg::Geode> geode = new osg::Geode; 
    199210        occluder->comptueShadowVolumeGeometry(lightpos, *shadowVolume); 
     
    201212        group->addChild(geode.get()); 
    202213    } 
    203  
     214    else 
     215    { 
     216        osg::Vec4 ambient(0.5,0.5,0.5,1.0); 
     217        osg::Vec4 diffuse(1.0,1.0,1.0,1.0); 
     218        osg::Vec4 zero_colour(0.0,0.0,0.0,1.0); 
     219     
     220        // first group 
     221        { 
     222 
     223            osg::Group* first_model_group = new osg::Group; 
     224            first_model_group->addChild(model.get()); 
     225            group->addChild(first_model_group); 
     226 
     227            osg::StateSet* ss1 = first_model_group->getOrCreateStateSet(); 
     228 
     229            osg::LightModel* lm1 = new osg::LightModel; 
     230            lm1->setAmbientIntensity(ambient); 
     231            ss1->setAttribute(lm1); 
     232 
     233            osg::Light* light1 = new osg::Light; 
     234            light1->setAmbient(ambient); 
     235            light1->setDiffuse(zero_colour); 
     236            light1->setPosition(lightpos); 
     237            ss1->setAttributeAndModes(light1, osg::StateAttribute::ON); 
     238         
     239        }     
     240     
     241        // second group 
     242        { 
     243 
     244            osg::Group* second_model_group = new osg::Group; 
     245            second_model_group->addChild(model.get()); 
     246            group->addChild(second_model_group); 
     247 
     248            osg::StateSet* ss1 = second_model_group->getOrCreateStateSet(); 
     249            ss1->setRenderBinDetails(1, "RenderBin"); 
     250 
     251            osg::LightModel* lm1 = new osg::LightModel; 
     252            lm1->setAmbientIntensity(zero_colour); 
     253            ss1->setAttribute(lm1); 
     254 
     255 
     256            osg::LightSource* lightsource = new osg::LightSource; 
     257            lightsource->setLight(light.get()); 
     258            light->setAmbient(zero_colour); 
     259            light->setDiffuse(diffuse); 
     260            light->setPosition(lightpos); 
     261            second_model_group->addChild(lightsource); 
     262             
     263            ss1->setMode(GL_LIGHT0, osg::StateAttribute::ON); 
     264             
     265            osg::Depth* depth = new osg::Depth; 
     266            depth->setWriteMask(false); 
     267            depth->setFunction(osg::Depth::LEQUAL); 
     268            ss1->setAttribute(depth); 
     269             
     270            osg::BlendFunc* blend = new osg::BlendFunc; 
     271            blend->setFunction(osg::BlendFunc::ONE, osg::BlendFunc::ONE); 
     272            ss1->setAttributeAndModes(blend, osg::StateAttribute::ON | osg::StateAttribute::OVERRIDE); 
     273         
     274        }     
     275 
     276        { 
     277            osg::ref_ptr<osg::Geode> geode = new osg::Geode; 
     278            occluder->comptueShadowVolumeGeometry(lightpos, *shadowVolume); 
     279            geode->addDrawable(shadowVolume.get()); 
     280            group->addChild(geode.get()); 
     281        } 
     282 
     283    } 
    204284 
    205285 
     
    223303            else 
    224304            { 
    225                 lightpos.set(sinf(t),cosf(t),-0.8f,0.0f); 
     305                lightpos.set(sinf(t),cosf(t),0.8f,0.0f); 
    226306            } 
     307            light->setPosition(lightpos); 
    227308            occluder->comptueShadowVolumeGeometry(lightpos, *shadowVolume); 
    228309       }