Show
Ignore:
Timestamp:
10/28/04 11:38:03 (9 years ago)
Author:
robert
Message:

Updates for Rainer, and with a few changes by Robert.

Files:
1 modified

Legend:

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

    r3532 r3551  
    88#include <osg/ShapeDrawable> 
    99#include <osg/Texture2D> 
     10#include <osg/Material> 
     11#include <osg/Light> 
     12#include <osg/LightSource> 
     13#include <osg/LightModel> 
    1014 
    1115 
     
    2024 
    2125#include <osgProducer/Viewer> 
     26 
     27 
     28static osg::Vec3 defaultPos( 0.0f, 0.0f, 0.0f ); 
     29static osg::Vec3 centerScope(0.0f, 0.0f, 0.0f); 
     30 
     31 
     32osg::Group* createSunLight() 
     33{ 
     34    osg::Group* lightNode = new osg::Group; 
     35 
     36    osg::Light* sunLight = new osg::Light; 
     37    sunLight->setPosition( osg::Vec4( 0.0f, 0.0f, 0.0f, 1.0f ) ); 
     38    sunLight->setAmbient( osg::Vec4( 0.0f, 0.0f, 0.0f, 1.0f ) ); 
     39 
     40    osg::LightSource* sunLightSource = new osg::LightSource; 
     41    sunLightSource->setLight( sunLight ); 
     42     
     43    lightNode->addChild( sunLightSource ); 
     44     
     45    osg::LightModel* lightModel = new osg::LightModel; 
     46    lightModel->setAmbientIntensity(osg::Vec4(0.0f,0.0f,0.0f,1.0f)); 
     47    lightNode->getOrCreateStateSet()->setAttribute(lightModel); 
     48 
     49 
     50    return lightNode;         
     51}// end createSunLight 
    2252 
    2353 
     
    89119 
    90120 
     121osg::Geode* createSpace( double radius, const std::string& name, const std::string& textureName ) 
     122{ 
     123    osg::Sphere *spaceSphere = new osg::Sphere( osg::Vec3( 0.0, 0.0, 0.0 ), radius ); 
     124     
     125    osg::ShapeDrawable *sSpaceSphere = new osg::ShapeDrawable( spaceSphere ); 
     126     
     127    if( !textureName.empty() ) 
     128    { 
     129        osg::Image* image = osgDB::readImageFile( textureName ); 
     130        if ( image ) 
     131        { 
     132            sSpaceSphere->getOrCreateStateSet()->setTextureAttributeAndModes( 0, new osg::Texture2D( image ), osg::StateAttribute::ON ); 
     133 
     134            // reset the object color to white to allow the texture to set the colour. 
     135            sSpaceSphere->setColor( osg::Vec4(1.0f,1.0f,1.0f,1.0f) ); 
     136        } 
     137    } 
     138     
     139    osg::Geode* geodeSpace = new osg::Geode(); 
     140    geodeSpace->setName( name ); 
     141     
     142    geodeSpace->addDrawable( sSpaceSphere ); 
     143 
     144    return( geodeSpace ); 
     145     
     146}// end createSpace 
     147 
     148 
    91149osg::Geode* createPlanet( double radius, const std::string& name, const osg::Vec4& color , const std::string& textureName ) 
    92150{ 
     
    121179 
    122180    return( geodePlanet ); 
     181     
    123182}// end createPlanet 
    124 //--radiusSun 5.0 --radiusEarth 2.0 --RorbitEarth 10.0 --RorbitMoon 2.0 --radiusMoon 0.5 --tiltEarth 18.0 --rotateSpeedEarth 1.0  
    125 //--rotateSpeedMoon 1.0 --rotateSpeedEarthAndMoon 1.0 
     183 
    126184 
    127185class SolarSystem 
     
    138196    double _RorbitMoon; 
    139197    double _rotateSpeedMoon; 
     198    double _radiusSpace; 
    140199     
    141200    SolarSystem() 
     
    150209        _RorbitMoon = 2.0; 
    151210        _rotateSpeedMoon = 1.0; 
     211        _radiusSpace = 300.0; 
    152212    } 
    153213     
     
    156216        osg::Group* thisSystem = new osg::Group; 
    157217         
     218        osg::StateSet* sunStateSet = new osg::StateSet; 
     219        osg::Material* material = new osg::Material; 
     220        material->setEmission( osg::Material::FRONT_AND_BACK, osg::Vec4( 1.0f, 1.0f, 0.0f, 0.0f ) ); 
     221        sunStateSet->setAttributeAndModes( material, osg::StateAttribute::ON ); 
     222         
     223         
    158224         
    159225        // create the sun 
    160         osg::Node* sun = createPlanet( _radiusSun, "Sun", osg::Vec4( 1.0f, 1.0f, 0.5f, 1.0f), "" ); 
     226        osg::Node* sun = createPlanet( _radiusSun, "Sun", osg::Vec4( 0, 0, 0, 1.0f), "" ); 
     227        sun->setStateSet( sunStateSet ); 
    161228         
    162229        // stick sun right under root, no transformations for the sun 
     
    164231         
    165232         
     233        // create light source in the sun 
     234        osg::Group* sunLight = createSunLight(); 
    166235         
    167236        //creating right side of the graph with earth and moon and the rotations above it 
     
    197266        aroundSunRotation->addChild( earthPosition ); 
    198267         
    199          
    200         thisSystem->addChild( aroundSunRotation ); 
     268        sunLight->addChild( aroundSunRotation ); 
     269         
     270        thisSystem->addChild( sunLight ); 
     271 
     272#if 0 
     273        // add space, but don't light it, as its not illuminated by our sun 
     274        osg::Node* space = createSpace( _radiusSpace, "Space", "Images/spacemap1.jpg" ); 
     275        space->getOrCreateStateSet()->setMode(GL_LIGHTING, osg::StateAttribute::OFF); 
     276        thisSystem->addChild( space ); 
     277#endif         
    201278                 
    202279        return( thisSystem ); 
     
    214291        std::cout << "RorbitMoon\t= " << _RorbitMoon << std::endl; 
    215292        std::cout << "rotateSpeedMoon\t= " << _rotateSpeedMoon << std::endl; 
     293        std::cout << "radiusSpace\t= " << _radiusSpace << std::endl; 
     294         
    216295    } 
    217296     
     
    249328    while (arguments.read("--RorbitMoon",solarSystem._RorbitMoon)) { } 
    250329    while (arguments.read("--rotateSpeedMoon",solarSystem._rotateSpeedMoon)) { } 
     330    while (arguments.read("--radiusSpace",solarSystem._radiusSpace)) { } 
     331     
    251332 
    252333    solarSystem.printParameters(); 
     
    265346        std::cout << "--RorbitMoon: double" << std::endl; 
    266347        std::cout << "--rotateSpeedMoon: double" << std::endl; 
     348        std::cout << "--radiusSpace: double" << std::endl; 
     349         
    267350                 
    268351        return 1; 
     
    298381    // create the windows and run the threads. 
    299382    viewer.realize(); 
     383     
     384    osg::Matrix lookAt; 
     385    lookAt.makeLookAt( osg::Vec3(0.0f, -80.0f, 0.0f), centerScope, osg::Vec3(0.0f, 0.0f, 1.0f ) ); 
     386 
     387    viewer.setView( lookAt ); 
     388     
     389    viewer.setClearColor(osg::Vec4(0.0f,0.0f,0.0f,1.0f)); 
    300390 
    301391    while( !viewer.done() )