Hello!!

Its my first email to the community!

I have been to the website and I foudn the codes examples.
I am trying to adda simple light or spot light to my scene graf!!

However I am not very skilled in coding, and I have an unclean code... 
I dont know where its my mistake or how to adapt the lamp to my code!
Basically I copied:


I attached my code in join file so you can have a look if required!/
I believe the problem is there:


// create the light    

        osg::StateSet* statelightON_OVRD = new osg::StateSet();
    osg::LightSource* lightSource = new osg::LightSource;
   

    osg::Light* light = lightSource->getLight();
  
        light->setLightNum(0);
    light->setPosition(osg::Vec4(0.0f,0.0f,0.0f,1.0f)); // directional light 
from above
    light->setAmbient(osg::Vec4(0.8f,0.8f,0.8f,1.0f));
    light->setDiffuse(osg::Vec4(0.2f,0.2f,0.2f,1.0f));
    light->setSpecular(osg::Vec4(0.2f,0.2f,0.2f,1.0f));
        light->setSpotExponent(50.0);
        light->setDirection(osg::Vec3(1,1,-1));
        
        

statelightON_OVRD->setAttribute(light, osg::StateAttribute::ON);
 group->addChild(lightSource);

    





// mtTwo->addChild(loadedModel);
 mtTwo->setStateSet(stateTwoFogON_OVRD);
 loadedModel->setStateSet(stateTwoFogON_OVRD);
// mtTwo->setStateSet(statelightON_OVRD);
 

but Maybve its somewhere else!!!


Cheers!

Jean

/******************************************************************************\
* SimpleViewer                                                                 *
* An OSG-based 3D viewer. Almost as simple as possible.                        *
* Leandro Motta Barros (based on Tutorials from TerseSolutions)                *
* modified slightly by Michael Kriegel                                          
                                   *
\******************************************************************************/

#include <iostream>
#include <osgDB/ReadFile>
#include <osgUtil/Optimizer>
#include <osgProducer/Viewer>
#include <osg/PositionAttitudeTransform>
#include <osg/Geode>
#include <osg/ShapeDrawable>
#include <osg/TexEnv>
#include <osg/Fog>
#include <osg/StateSet>
#include <osg/MatrixTransform>
#include <osgGA/GUIEventHandler>
#include <osg/LightSource>





class myKeyboardEventHandler : public osgGA::GUIEventHandler
{
public:
   virtual bool handle(const osgGA::GUIEventAdapter& 
ea,osgGA::GUIActionAdapter&);
   virtual void accept(osgGA::GUIEventHandlerVisitor& v)   { v.visit(*this); };
//   
};
//declare my global variable 
int testswitch=1;

bool myKeyboardEventHandler::handle(const osgGA::GUIEventAdapter& 
ea,osgGA::GUIActionAdapter& aa)
 {
         
   switch(ea.getEventType())
   {
   case(osgGA::GUIEventAdapter::KEYDOWN):
      {
         switch(ea.getKey())
         {
         case 'c':
            std::cout << " c key pressed" << std::endl;
            return false;
            
                 case 'g':
                         std::cout << " g key pressed" << std::endl;
                         testswitch=1;
                         return testswitch;
                    
                 case 'h':
                         std::cout << " h key pressed" << std::endl;
                         testswitch=0;
                         return testswitch;

                 case 'j':
                         std::cout << " h key pressed" << std::endl;
                         testswitch=2;
                         return testswitch;
                
                /* case 'l':
                         std::cout << " l key pressed" << std::endl;
                         testswitch=3;
                         return testswitch;*/
                          

         default:
            return false;
         } 
      }
   default:
      return false;
   }
}



int main (int argc, char* argv[])
{                
        


         // Create a Producer-based viewer
   osgProducer::Viewer viewer;
   viewer.setUpViewer(osgProducer::Viewer::STANDARD_SETTINGS);

 myKeyboardEventHandler* myFirstEventHandler = new myKeyboardEventHandler();

   viewer.getEventHandlerList().push_front(myFirstEventHandler); 



        
         // Create a new StateSet with default settings: 
   osg::StateSet* stateTwoFogON_OVRD = new osg::StateSet();
   osg::Fog* fog = new osg::Fog(); 
   fog->setMode(osg::Fog::LINEAR);
   fog->setDensity(0.1f); 
   fog->setColor(osg::Vec4d(.95,0.95,.95,0.95)); 
   fog->setStart(0.30f);
   fog->setEnd(200.0f);
  




// For stateTwo, turn FOG OFF and set to OVERRIDE.
   //    Descendants in this sub-tree will not be able to change FOG unless
   //    they set the FOG attribute value to PROTECTED
   
// apply the StateSets above to appropriates nodes in the scene graph.
   //mtTwo->setStateSet(stateTwoFogON_OVRD);
   

  

/*
   //fuck
   osg::ref_ptr<osg::MatrixTransform> mtTwo = new osg::MatrixTransform();
   mtTwo->addChild(labelGeode[2]);
   osg::Geode* boxGeode = new osg::Geode();
   mtTwo->setMatrix(osg::Matrixd::translate(-2.5,0.0,-3.0));
   mtTwo->addChild(boxGeode);
   mtTwo->addChild(mtThree.get());
   mtTwo->addChild(mtFour.get());
   mtTwo->setStateSet(stateTwoFogON_OVRD); */

   //refuck
 osg::ref_ptr<osg::MatrixTransform> mtTwo = new osg::MatrixTransform();

osg::ref_ptr<osg::Node> loadedModel = osgDB::readNodeFile("mystadium.3ds");



osg::ref_ptr<osg::Group> group = new osg::Group;
    
    group->addChild(loadedModel.get());
    
//loadedModel->getOrCreateStateSet()->setAttributeAndModes(precipitationEffect->getFog());
    

// create the light    

        osg::StateSet* statelightON_OVRD = new osg::StateSet();
    osg::LightSource* lightSource = new osg::LightSource;
   

    osg::Light* light = lightSource->getLight();
  
        light->setLightNum(0);
    light->setPosition(osg::Vec4(0.0f,0.0f,0.0f,1.0f)); // directional light 
from above
    light->setAmbient(osg::Vec4(0.8f,0.8f,0.8f,1.0f));
    light->setDiffuse(osg::Vec4(0.2f,0.2f,0.2f,1.0f));
    light->setSpecular(osg::Vec4(0.2f,0.2f,0.2f,1.0f));
        light->setSpotExponent(50.0);
        light->setDirection(osg::Vec3(1,1,-1));
        
        

statelightON_OVRD->setAttribute(light, osg::StateAttribute::ON);
 group->addChild(lightSource);

    





// mtTwo->addChild(loadedModel);
 mtTwo->setStateSet(stateTwoFogON_OVRD);
 loadedModel->setStateSet(stateTwoFogON_OVRD);
// mtTwo->setStateSet(statelightON_OVRD);
 




   // Load a model
 //  osg::ref_ptr<osg::Node> loadedModel = osgDB::readNodeFile("mystadium.3ds");

   if (!loadedModel)
   {
      std::cerr << "Problem opening model. \n";
      exit (1);
   }

   viewer.setSceneData (loadedModel.get());

   // Optimize the scene graph (a simple as possible viewer doesn't really
   // need this.
   osgUtil::Optimizer optOSGFile;
   optOSGFile.optimize (loadedModel.get());

   // Enter rendering loop
   viewer.realize();
                 
   while (!viewer.done())
   {
           if (testswitch==1)
   {
   stateTwoFogON_OVRD->setAttribute(fog, osg::StateAttribute::ON); 
   stateTwoFogON_OVRD->setMode(GL_FOG, osg::StateAttribute::ON | 
osg::StateAttribute::PROTECTED);
   }
   else if (testswitch==0)
   {
   stateTwoFogON_OVRD->setAttribute(fog, osg::StateAttribute::OFF); 
   stateTwoFogON_OVRD->setMode(GL_FOG, osg::StateAttribute::OFF | 
osg::StateAttribute::PROTECTED);
   }
   else if (testswitch==2)
   {
       
   }
   /*else if (testswitch==3)
   {
           statelightON_OVRD->setAttribute(light, osg::StateAttribute::ON);
   }
   */
          // wait for all cull and draw threads to complete.
      viewer.sync();
      
      viewer.update();

      // fire off the cull and draw traversals of the scene.
      viewer.frame();
   }

   // Wait for all cull and draw threads to complete before exit.
   viewer.sync();
}


//tutorial deux: make two pyramids
/*
int main()
{
   osgProducer::Viewer viewer;
   osg::Group* root = new osg::Group();
   osg::Geode* pyramidGeode = new osg::Geode();
   osg::Geometry* pyramidGeometry = new osg::Geometry();

   pyramidGeode->addDrawable(pyramidGeometry); 
   root->addChild(pyramidGeode);

    osg::Vec3Array* pyramidVertices = new osg::Vec3Array;
   pyramidVertices->push_back( osg::Vec3( 0, 0, 0) ); // front left
   pyramidVertices->push_back( osg::Vec3(10, 0, 0) ); // front right
   pyramidVertices->push_back( osg::Vec3(10,10, 0) ); // back right 
   pyramidVertices->push_back( osg::Vec3( 0,10, 0) ); // back left 
   pyramidVertices->push_back( osg::Vec3( 5, 5,10) ); // peak

   pyramidGeometry->setVertexArray( pyramidVertices ); 

     osg::DrawElementsUInt* pyramidBase = 
      new osg::DrawElementsUInt(osg::PrimitiveSet::QUADS, 0);
   pyramidBase->push_back(3);
   pyramidBase->push_back(2);
   pyramidBase->push_back(1);
   pyramidBase->push_back(0);
   pyramidGeometry->addPrimitiveSet(pyramidBase); 

   osg::DrawElementsUInt* pyramidFaceOne = 
      new osg::DrawElementsUInt(osg::PrimitiveSet::TRIANGLES, 0);
   pyramidFaceOne->push_back(0);
   pyramidFaceOne->push_back(1);
   pyramidFaceOne->push_back(4);
   pyramidGeometry->addPrimitiveSet(pyramidFaceOne);

   osg::DrawElementsUInt* pyramidFaceTwo = 
      new osg::DrawElementsUInt(osg::PrimitiveSet::TRIANGLES, 0);
   pyramidFaceTwo->push_back(1);
   pyramidFaceTwo->push_back(2);
   pyramidFaceTwo->push_back(4);
   pyramidGeometry->addPrimitiveSet(pyramidFaceTwo);

   osg::DrawElementsUInt* pyramidFaceThree = 
      new osg::DrawElementsUInt(osg::PrimitiveSet::TRIANGLES, 0);
   pyramidFaceThree->push_back(2);
   pyramidFaceThree->push_back(3);
   pyramidFaceThree->push_back(4);
   pyramidGeometry->addPrimitiveSet(pyramidFaceThree);

   osg::DrawElementsUInt* pyramidFaceFour = 
      new osg::DrawElementsUInt(osg::PrimitiveSet::TRIANGLES, 0);
   pyramidFaceFour->push_back(3);
   pyramidFaceFour->push_back(0);
   pyramidFaceFour->push_back(4);
   pyramidGeometry->addPrimitiveSet(pyramidFaceFour);

           osg::Vec4Array* colors = new osg::Vec4Array;
   colors->push_back(osg::Vec4(1.0f, 0.0f, 0.0f, 1.0f) ); //index 0 red
   colors->push_back(osg::Vec4(0.0f, 1.0f, 0.0f, 1.0f) ); //index 1 green
   colors->push_back(osg::Vec4(0.0f, 0.0f, 1.0f, 1.0f) ); //index 2 blue
   colors->push_back(osg::Vec4(1.0f, 1.0f, 1.0f, 1.0f) ); //index 3 white

    osg::TemplateIndexArray
      <unsigned int, osg::Array::UIntArrayType,4,4> *colorIndexArray;
   colorIndexArray = 
      new osg::TemplateIndexArray<unsigned int, osg::Array::UIntArrayType,4,4>;
   colorIndexArray->push_back(0); // vertex 0 assigned color array element 0
   colorIndexArray->push_back(1); // vertex 1 assigned color array element 1
   colorIndexArray->push_back(2); // vertex 2 assigned color array element 2
   colorIndexArray->push_back(3); // vertex 3 assigned color array element 3
   colorIndexArray->push_back(0); // vertex 4 assigned color array element 0

     pyramidGeometry->setColorArray(colors);
   pyramidGeometry->setColorIndices(colorIndexArray);
   pyramidGeometry->setColorBinding(osg::Geometry::BIND_PER_VERTEX);

   osg::Vec2Array* texcoords = new osg::Vec2Array(5);
   (*texcoords)[0].set(0.00f,0.0f);
   (*texcoords)[1].set(0.25f,0.0f);
   (*texcoords)[2].set(0.50f,0.0f);
   (*texcoords)[3].set(0.75f,0.0f);
   (*texcoords)[4].set(0.50f,1.0f);
    pyramidGeometry->setTexCoordArray(0,texcoords);

        // Declare and initialize a transform node.
   osg::PositionAttitudeTransform* pyramidTwoXForm =
      new osg::PositionAttitudeTransform();

// Use the 'addChild' method of the osg::Group class to
// add the transform as a child of the root node and the
// pyramid node as a child of the transform.
   root->addChild(pyramidTwoXForm);
   pyramidTwoXForm->addChild(pyramidGeode);

// Declare and initialize a Vec3 instance to change the
// position of the tank model in the scene
   osg::Vec3 pyramidTwoPosition(15,0,0);
   pyramidTwoXForm->setPosition( pyramidTwoPosition ); 

    viewer.setUpViewer(osgProducer::Viewer::STANDARD_SETTINGS);
   viewer.setSceneData( root );

   viewer.realize();

   while( !viewer.done() )
   {
      viewer.sync();
      viewer.update();
      viewer.frame();
   } 

} */

//tutorial 3 the pyramid and the texturing
/*
osg::Geode* createPyramid()
{
   osg::Geode* pyramidGeode = new osg::Geode();
   osg::Geometry* pyramidGeometry = new osg::Geometry();
   pyramidGeode->addDrawable(pyramidGeometry); 

   // Specify the vertices:
   osg::Vec3Array* pyramidVertices = new osg::Vec3Array;
   pyramidVertices->push_back( osg::Vec3(0, 0, 0) ); // front left 
   pyramidVertices->push_back( osg::Vec3(2, 0, 0) ); // front right 
   pyramidVertices->push_back( osg::Vec3(2, 2, 0) ); // back right 
   pyramidVertices->push_back( osg::Vec3( 0,2, 0) ); // back left 
   pyramidVertices->push_back( osg::Vec3( 1, 1,2) ); // peak

   // Associate this set of vertices with the geometry associated with the 
   // geode we added to the scene.
   pyramidGeometry->setVertexArray( pyramidVertices );

   // Create a QUAD primitive for the base by specifying the 
   // vertices from our vertex list that make up this QUAD:
   osg::DrawElementsUInt* pyramidBase = 
      new osg::DrawElementsUInt(osg::PrimitiveSet::QUADS, 0);
   pyramidBase->push_back(3);
   pyramidBase->push_back(2);
   pyramidBase->push_back(1);
   pyramidBase->push_back(0);

   // Add this primitive to the geometry: 
pyramidGeometry->addPrimitiveSet(pyramidBase);
   // code to create other faces goes here!
  osg::DrawElementsUInt* pyramidFaceOne = 
      new osg::DrawElementsUInt(osg::PrimitiveSet::TRIANGLES, 0);
   pyramidFaceOne->push_back(0);
   pyramidFaceOne->push_back(1);
   pyramidFaceOne->push_back(4);
   pyramidGeometry->addPrimitiveSet(pyramidFaceOne);

   osg::DrawElementsUInt* pyramidFaceTwo = 
      new osg::DrawElementsUInt(osg::PrimitiveSet::TRIANGLES, 0);
   pyramidFaceTwo->push_back(1);
   pyramidFaceTwo->push_back(2);
   pyramidFaceTwo->push_back(4);
   pyramidGeometry->addPrimitiveSet(pyramidFaceTwo);

   osg::DrawElementsUInt* pyramidFaceThree = 
      new osg::DrawElementsUInt(osg::PrimitiveSet::TRIANGLES, 0);
   pyramidFaceThree->push_back(2);
   pyramidFaceThree->push_back(3);
   pyramidFaceThree->push_back(4);
   pyramidGeometry->addPrimitiveSet(pyramidFaceThree);

   osg::DrawElementsUInt* pyramidFaceFour = 
      new osg::DrawElementsUInt(osg::PrimitiveSet::TRIANGLES, 0);
   pyramidFaceFour->push_back(3);
   pyramidFaceFour->push_back(0);
   pyramidFaceFour->push_back(4);
   pyramidGeometry->addPrimitiveSet(pyramidFaceFour);

   // (removed to save space, see tutorial two)
   osg::Vec4Array* colors = new osg::Vec4Array;
   colors->push_back(osg::Vec4(1.0f, 0.0f, 0.0f, 1.0f) ); //index 0 red
   colors->push_back(osg::Vec4(0.0f, 1.0f, 0.0f, 1.0f) ); //index 1 green
   colors->push_back(osg::Vec4(0.0f, 0.0f, 1.0f, 1.0f) ); //index 2 blue
   colors->push_back(osg::Vec4(1.0f, 1.0f, 1.0f, 1.0f) ); //index 3 white

   osg::TemplateIndexArray
      <unsigned int, osg::Array::UIntArrayType,4,4> *colorIndexArray;
   colorIndexArray = 
      new osg::TemplateIndexArray<unsigned int, osg::Array::UIntArrayType,4,4>;
   colorIndexArray->push_back(0); // vertex 0 assigned color array element 0
   colorIndexArray->push_back(1); // vertex 1 assigned color array element 1
   colorIndexArray->push_back(2); // vertex 2 assigned color array element 2
   colorIndexArray->push_back(3); // vertex 3 assigned color array element 3
   colorIndexArray->push_back(0); // vertex 4 assigned color array element 0

   pyramidGeometry->setColorArray(colors);
   pyramidGeometry->setColorIndices(colorIndexArray);
   pyramidGeometry->setColorBinding(osg::Geometry::BIND_PER_VERTEX);

   // Since the mapping from vertices to texture coordinates is 1:1, 
   // we don't need to use an index array to map vertices to texture
   // coordinates. We can do it directly with the 'setTexCoordArray' 
   // method of the Geometry class. 
   // This method takes a variable that is an array of two dimensional
   // vectors (osg::Vec2). This variable needs to have the same
   // number of elements as our Geometry has vertices. Each array element
   // defines the texture coordinate for the cooresponding vertex in the
   // vertex array.
   osg::Vec2Array* texcoords = new osg::Vec2Array(5);
   (*texcoords)[0].set(0.00f,0.0f); // tex coord for vertex 0 
   (*texcoords)[1].set(0.25f,0.0f); // tex coord for vertex 1 
   (*texcoords)[2].set(0.50f,0.0f); // ""
   (*texcoords)[3].set(0.75f,0.0f); // "" 
   (*texcoords)[4].set(0.50f,1.0f); // ""
   pyramidGeometry->setTexCoordArray(0,texcoords);

   return pyramidGeode;
}
int main()
{
   osgProducer::Viewer viewer;

   // Declare a group to act as root node of a scene:
   osg::Group* root = new osg::Group();
   osg::Geode* pyramidGeode = createPyramid();
   root->addChild(pyramidGeode);
   osg::Texture2D* KLN89FaceTexture = new osg::Texture2D;

   // protect from being optimized away as static state:
   KLN89FaceTexture->setDataVariance(osg::Object::DYNAMIC); 

   // load an image by reading a file: 
   osg::Image* klnFace = osgDB::readImageFile("KLN89FaceB.tga");
   if (!klnFace)
   {
      std::cout << " couldn't find texture, quiting." << std::endl;
      return -1;
   }

   // Assign the texture to the image we read from file: 
   KLN89FaceTexture->setImage(klnFace);

    // Create a new StateSet with default settings: 
   osg::StateSet* stateOne = new osg::StateSet();

   // Assign texture unit 0 of our new StateSet to the texture 
   // we just created and enable the texture.
   stateOne->setTextureAttributeAndModes
      (0,KLN89FaceTexture,osg::StateAttribute::ON);
   // Associate this state set with the Geode that contains
   // the pyramid: 
   pyramidGeode->setStateSet(stateOne);

     //The final step is to set up and enter a simulation loop.
   viewer.setUpViewer(osgProducer::Viewer::STANDARD_SETTINGS);
   viewer.setSceneData( root );
   viewer.realize();

   while( !viewer.done() )
   {
      viewer.sync();
      viewer.update();
      viewer.frame();
   } 
   return 0;
}
*/

/*
int main()
{
// Declare a group to act as root node of a scene:
osg::Group* root = new osg::Group();
osgProducer::Viewer viewer;
//moncopiercoler
  osg::Texture2D* KLN89FaceTexture = new osg::Texture2D;

   // protect from being optimized away as static state:
   KLN89FaceTexture->setDataVariance(osg::Object::DYNAMIC); 

   // load an image by reading a file: 
   osg::Image* klnFace = osgDB::readImageFile("KLN89FaceB.tga");
   if (!klnFace)
   {
      std::cout << " couldn't find texture, quiting." << std::endl;
      return -1;
   }

   // Assign the texture to the image we read from file: 
   KLN89FaceTexture->setImage(klnFace);

    // Create a new StateSet with default settings: 
   osg::StateSet* stateOne = new osg::StateSet();

   // Assign texture unit 0 of our new StateSet to the texture 
   // we just created and enable the texture.
   stateOne->setTextureAttributeAndModes
      (0,KLN89FaceTexture,osg::StateAttribute::ON);





//fin demoncopiercoller


// Declare a box class (derived from shape class) instance
// This constructor takes an osg::Vec3 to define the center
// and a float to define the height, width and depth.
// (an overloaded constructor allows you to specify unique
// height, width and height values.)
osg::Box* unitCube = new osg::Box( osg::Vec3(0,0,0), 1.0f);

// Declare an instance of the shape drawable class and initialize 
// it with the unitCube shape we created above.
// This class is derived from 'drawable' so instances of this
// class can be added to Geode instances.
osg::ShapeDrawable* unitCubeDrawable = new osg::ShapeDrawable(unitCube);

// Declare a instance of the geode class: 
osg::Geode* basicShapesGeode = new osg::Geode();

// Add the unit cube drawable to the geode:
basicShapesGeode->addDrawable(unitCubeDrawable);

// Add the goede to the scene:
root->addChild(basicShapesGeode);
// Create a sphere centered at the origin, unit radius: 
osg::Sphere* unitSphere = new osg::Sphere( osg::Vec3(0,0,0), 1.0);
osg::ShapeDrawable* unitSphereDrawable = new osg::ShapeDrawable(unitSphere);

osg::PositionAttitudeTransform* sphereXForm = 
   new osg::PositionAttitudeTransform();
sphereXForm->setPosition(osg::Vec3(2.5,0,0));

osg::Geode* unitSphereGeode = new osg::Geode();
root->addChild(sphereXForm);

sphereXForm->addChild(unitSphereGeode);
unitSphereGeode->addDrawable(unitSphereDrawable);

unitSphereGeode->setStateSet(stateOne);


// Declare a state set for 'BLEND' texture mode
osg::StateSet* blendStateSet = new osg::StateSet();

// Declare a TexEnv instance, set the mode to 'BLEND'
osg::TexEnv* blendTexEnv = new osg::TexEnv;
blendTexEnv->setMode(osg::TexEnv::BLEND);

// Turn the attribute of texture 0 - the texture we loaded above - 'ON'
blendStateSet->setTextureAttributeAndModes
   (0,KLN89FaceTexture,osg::StateAttribute::ON);

// Set the texture texture environment for texture 0 to the 
// texture envirnoment we declared above:
blendStateSet->setTextureAttribute(0,blendTexEnv);

osg::StateSet* decalStateSet = new osg::StateSet();

osg::TexEnv* decalTexEnv = new osg::TexEnv();
decalTexEnv->setMode(osg::TexEnv::DECAL);

decalStateSet->setTextureAttributeAndModes
   (0,KLN89FaceTexture,osg::StateAttribute::ON);
decalStateSet->setTextureAttribute(0,decalTexEnv);

root->setStateSet(blendStateSet);
unitSphereGeode->setStateSet(decalStateSet);

viewer.setUpViewer(osgProducer::Viewer::STANDARD_SETTINGS);
viewer.setSceneData( root );
viewer.realize();

while( !viewer.done() )
{
   viewer.sync();
   viewer.update();
   viewer.frame();

   /*float beginx=0.1,i;
              for (i=0;i<5;i++)
                          {
                    
                                beginx=beginx+.1;
                                
              }
                          sphereXForm->setPosition(osg::Vec3(beginx,0,0));
                          viewer.update();
   
   viewer.frame();
   //put the the close multicomment here 
  
}  

return 0;
}
 */


_______________________________________________
osg-users mailing list
[email protected]
http://openscenegraph.net/mailman/listinfo/osg-users
http://www.openscenegraph.org/

Reply via email to