Show
Ignore:
Timestamp:
01/27/07 15:27:29 (7 years ago)
Author:
robert
Message:

Added light source.

Files:
1 modified

Legend:

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

    r6058 r6059  
    318318public: 
    319319 
    320     osg::Vec4 _lightpos; 
     320    osg::ref_ptr<osg::Light>    _ambientLight; 
     321    osg::ref_ptr<osg::Light>    _diffuseLight; 
     322     
    321323    osg::ref_ptr<osg::StateSet> _ss1; 
    322324    osg::ref_ptr<osg::StateSet> _mainShadowStateSet; 
     
    326328    ShadowCallback(osgShadow::ShadowVolumeGeometry::DrawMode drawMode) 
    327329    { 
    328         osg::Vec4 ambient(0.2,0.2,0.2,1.0); 
    329         osg::Vec4 diffuse(0.8,0.8,0.8,1.0); 
    330         osg::Vec4 zero_colour(0.0,0.0,0.0,1.0); 
    331         _lightpos.set(0.0,1.0,0.0,0.0); 
    332      
    333330        // first group, render the depth buffer + ambient light contribution 
    334331        { 
    335332            _ss1 = new osg::StateSet; 
    336333 
     334#if 0 
    337335            osg::LightModel* lm1 = new osg::LightModel; 
    338336            lm1->setAmbientIntensity(ambient); 
     
    344342            light1->setPosition(_lightpos); 
    345343            _ss1->setAttributeAndModes(light1, osg::StateAttribute::ON | osg::StateAttribute::OVERRIDE); 
     344#endif             
     345             
    346346            _ss1->setMode(GL_LIGHTING, osg::StateAttribute::ON | osg::StateAttribute::OVERRIDE); 
    347347        } 
     
    409409            // _shadowedSceneStateSet->setMode(GL_LIGHTING, osg::StateAttribute::ON | osg::StateAttribute::OVERRIDE); 
    410410 
    411  
     411#if 0 
    412412            osg::LightModel* lm1 = new osg::LightModel; 
    413413            lm1->setAmbientIntensity(zero_colour); 
    414414            _shadowedSceneStateSet->setAttribute(lm1); 
    415  
    416             osg::LightSource* lightsource = new osg::LightSource; 
    417 //            lightsource->setLight(light.get()); 
    418415 
    419416            osg::Light* light = new osg::Light; 
     
    424421            _shadowedSceneStateSet->setMode(GL_LIGHT0, osg::StateAttribute::ON | osg::StateAttribute::OVERRIDE); 
    425422            _shadowedSceneStateSet->setAttribute(light); 
     423#endif 
    426424 
    427425            // set up the stencil ops so that only operator on this mirrors stencil value. 
     
    458456        osg::ref_ptr<osgUtil::RenderBin> original_bin = cv->getCurrentRenderBin(); 
    459457         
    460         osg::ref_ptr<osgUtil::RenderBin> new_bin = original_bin->find_or_insert(999,"RenderBin"); 
     458        osg::ref_ptr<osgUtil::RenderBin> new_bin = original_bin->find_or_insert(0,"RenderBin"); 
    461459 
    462460        cv->setCurrentRenderBin(new_bin.get()); 
     
    466464        cv->setCurrentRenderBin(original_bin.get()); 
    467465 
    468 #if 0 
    469         osg::notify(osg::NOTICE)<<"new_bin->getStateGraphList().size()= "<<new_bin->getStateGraphList().size()<<std::endl; 
    470         osg::notify(osg::NOTICE)<<"new_bin->getRenderBinList().size()= "<<new_bin->getRenderBinList().size()<<std::endl; 
    471         osg::notify(osg::NOTICE)<<"new_bin->getRenderLeafList().size()= "<<new_bin->getRenderLeafList().size()<<std::endl; 
    472          
    473          
    474         for(osgUtil::RenderBin::RenderBinList::iterator itr = new_bin->getRenderBinList().begin(); 
    475             itr != new_bin->getRenderBinList().end(); 
    476             ++itr) 
    477         { 
    478             osg::notify(osg::NOTICE)<<"    bin num = "<<itr->first<<std::endl; 
    479             osg::notify(osg::NOTICE)<<"    new_bin->getStateGraphList().size()= "<<itr->second->getStateGraphList().size()<<std::endl; 
    480             osg::notify(osg::NOTICE)<<"    new_bin->getRenderBinList().size()= "<<itr->second->getRenderBinList().size()<<std::endl; 
    481             osg::notify(osg::NOTICE)<<"    new_bin->getRenderLeafList().size()= "<<itr->second->getRenderLeafList().size()<<std::endl; 
    482              
    483         } 
    484 #endif         
    485          
    486466        osgUtil::RenderBin::RenderBinList::iterator itr =  new_bin->getRenderBinList().find(1000); 
    487467        osg::ref_ptr<osgUtil::RenderBin> shadowVolumeBin; 
     
    497477        } 
    498478         
    499 #if 0 
    500         for(osgUtil::RenderBin::RenderBinList::iterator itr = new_bin->getRenderBinList().begin(); 
    501             itr != new_bin->getRenderBinList().end(); 
    502             ++itr) 
    503         { 
    504             osg::notify(osg::NOTICE)<<"bin num = "<<itr->first<<std::endl; 
    505         } 
    506  
    507         osg::notify(osg::NOTICE)<<"after new_bin->getStateGraphList().size()= "<<new_bin->getStateGraphList().size()<<std::endl; 
    508         osg::notify(osg::NOTICE)<<"after new_bin->getRenderBinList().size()= "<<new_bin->getRenderBinList().size()<<std::endl; 
    509         osg::notify(osg::NOTICE)<<"after new_bin->getRenderLeafList().size()= "<<new_bin->getRenderLeafList().size()<<std::endl; 
    510 #endif 
    511  
    512  
    513         original_bin->setStateSet(_ss1.get()); 
    514  
    515         osgUtil::RenderStage* orig_rs = cv->getRenderStage(); 
    516         osgUtil::RenderStage* new_rs = new osgUtil::RenderStage; 
    517         orig_rs->addPostRenderStage(new_rs); 
    518          
    519         new_rs->setViewport(orig_rs->getViewport()); 
    520         new_rs->setClearColor(orig_rs->getClearColor()); 
    521         new_rs->setClearMask(GL_STENCIL_BUFFER_BIT); 
    522         new_rs->setDrawBuffer(orig_rs->getDrawBuffer()); 
    523         new_rs->setReadBuffer(orig_rs->getReadBuffer()); 
    524         new_rs->setColorMask(orig_rs->getColorMask()); 
    525         new_rs->setPositionalStateContainer(orig_rs->getPositionalStateContainer()); 
    526  
    527479        if (shadowVolumeBin.valid()) 
    528         { 
    529             // new_rs->setStateSet(_mainShadowStateSet.get()); 
    530             new_rs->getRenderBinList()[0] = shadowVolumeBin; 
    531             shadowVolumeBin->setStateSet(_shadowVolumeStateSet.get()); 
    532              
    533             osg::ref_ptr<osgUtil::RenderBin> nested_bin = new_rs->find_or_insert(1,"RenderBin"); 
    534             nested_bin->getRenderBinList()[0] = new_bin;             
    535             nested_bin->setStateSet(_shadowedSceneStateSet.get()); 
    536         } 
    537  
    538 #if 0         
    539         osg::notify(osg::NOTICE)<<"After setup"<<std::endl; 
    540         osg::notify(osg::NOTICE)<<"new_bin->getStateGraphList().size()= "<<new_bin->getStateGraphList().size()<<std::endl; 
    541         osg::notify(osg::NOTICE)<<"new_bin->getRenderBinList().size()= "<<new_bin->getRenderBinList().size()<<std::endl; 
    542         osg::notify(osg::NOTICE)<<"new_bin->getRenderLeafList().size()= "<<new_bin->getRenderLeafList().size()<<std::endl; 
    543          
    544          
    545         for(osgUtil::RenderBin::RenderBinList::iterator itr = new_bin->getRenderBinList().begin(); 
    546             itr != new_bin->getRenderBinList().end(); 
    547             ++itr) 
    548         { 
    549             osg::notify(osg::NOTICE)<<"    bin num = "<<itr->first<<std::endl; 
    550             osg::notify(osg::NOTICE)<<"    new_bin->getStateGraphList().size()= "<<itr->second->getStateGraphList().size()<<std::endl; 
    551             osg::notify(osg::NOTICE)<<"    new_bin->getRenderBinList().size()= "<<itr->second->getRenderBinList().size()<<std::endl; 
    552             osg::notify(osg::NOTICE)<<"    new_bin->getRenderLeafList().size()= "<<itr->second->getRenderLeafList().size()<<std::endl; 
    553              
    554         } 
    555         osg::notify(osg::NOTICE)<<std::endl; 
    556 #endif 
    557  
     480        {         
     481            original_bin->setStateSet(_ss1.get()); 
     482 
     483            osgUtil::RenderStage* orig_rs = cv->getRenderStage(); 
     484            osgUtil::RenderStage* new_rs = new osgUtil::RenderStage; 
     485            orig_rs->addPostRenderStage(new_rs); 
     486 
     487            new_rs->setViewport(orig_rs->getViewport()); 
     488            new_rs->setClearColor(orig_rs->getClearColor()); 
     489            new_rs->setClearMask(GL_STENCIL_BUFFER_BIT); 
     490            new_rs->setDrawBuffer(orig_rs->getDrawBuffer()); 
     491            new_rs->setReadBuffer(orig_rs->getReadBuffer()); 
     492            new_rs->setColorMask(orig_rs->getColorMask()); 
     493            new_rs->setPositionalStateContainer(orig_rs->getPositionalStateContainer()); 
     494 
     495            if (shadowVolumeBin.valid()) 
     496            { 
     497                // new_rs->setStateSet(_mainShadowStateSet.get()); 
     498                new_rs->getRenderBinList()[0] = shadowVolumeBin; 
     499                shadowVolumeBin->setStateSet(_shadowVolumeStateSet.get()); 
     500 
     501                osg::ref_ptr<osgUtil::RenderBin> nested_bin = new_rs->find_or_insert(1,"RenderBin"); 
     502                nested_bin->getRenderBinList()[0] = new_bin;             
     503                nested_bin->setStateSet(_shadowedSceneStateSet.get()); 
     504            } 
     505        } 
    558506    } 
    559507}; 
     
    731679 
    732680    osg::ref_ptr<osg::Light> light = new osg::Light; 
     681    light->setPosition(lightpos); 
    733682 
    734683    if (!doShadow) 
     
    754703        group->addChild(model.get()); 
    755704 
     705        osg::ref_ptr<osg::LightSource> ls = new osg::LightSource; 
     706        ls->setLight(light.get()); 
     707        group->addChild(ls.get()); 
     708 
    756709        { 
    757710            osg::ref_ptr<osg::Geode> geode = new osg::Geode; 
     
    760713            occluder->computeShadowVolumeGeometry(lightpos, *shadowVolume); 
    761714            shadowVolume->setDrawMode(drawMode); 
    762  
    763715 
    764716            if (drawMode == osgShadow::ShadowVolumeGeometry::STENCIL_TWO_SIDED)