When I call sceneViewer->cull() first it works like a charm.. But should I have 
to?

From: [EMAIL PROTECTED] [mailto:[EMAIL PROTECTED] On Behalf Of [EMAIL PROTECTED]
Sent: 8. april 2008 13:51
To: [email protected]
Subject: [osg-users] SceneView error

I try to use OpenSceneGraph and SceneView as shown in example when using an 
existing renderer, but get an error when calling "SceneView->draw()" or more 
spesific in

"_localStateSet->setAttribute(getViewport());"

The example code I use is as following:

int CMapRenderThread::InitOpenSceneGraph()
{
      root              = new osg::Group;
      pyramidGeode      = new osg::Geode;
      pyramidGeometry = new osg::Geometry;

      // Associate the pyramid geometry with the pyramid geode
      // Add the pyramid geode to the root node of the scene graph.
      pyramidGeode->addDrawable(pyramidGeometry);
      root->addChild(pyramidGeode);

      // Declare an array of vertices.
      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 );

      // Create a primitive set and add it to the pyramid geometry.
      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);

      // Repeat the same for each of the four sides. Again, vertices are
      // specified in counter-clockwise order.
      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);

      // Declare and load an array of Vec4 elements to store colors.
      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

      // Declare the variable that will match vertex array elements to color
      // array elements.
      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

      // The next step is to associate the array of colors with the geometry,
      // assign the color indices created above to the geometry and set the
      // binding mode to BIND_PER_VERTEX.
      pyramidGeometry->setColorArray(colors);
      pyramidGeometry->setColorIndices(colorIndexArray);
      pyramidGeometry->setColorBinding(osg::Geometry::BIND_PER_VERTEX);

      // Declare and initialize a transform node.
      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 model in the scene

      //m_pRenderer->

      //double x,y,z;
      //LatLonAltToXYZ(61.0, 10.0, 500.0, &x, &y, &z, this);
      //osg::Vec3 pyramidTwoPosition(x,y,z);
      //pyramidTwoXForm->setPosition( pyramidTwoPosition );

      pyramidTwoXForm->setScale(osg::Vec3d(100,100,100));

      // The final step is to set up and enter a simulation loop.
      /*
      osgViewer::Viewer viewer;
      viewer.setSceneData( root );
      viewer.setCameraManipulator(new osgGA::TrackballManipulator);
      viewer.realize();

      while( !viewer.done() )
      {
            viewer.frame();
      }
      */

      //visitor = new 
osg::NodeVisitor(osg::NodeVisitor::TRAVERSE_ACTIVE_CHILDREN);
      //visitor = new osg::NodeVisitor;

      sceneViewer = new osgUtil::SceneView();

      sceneViewer->setDefaults();
      sceneViewer->setComputeNearFarMode( 
osgUtil::CullVisitor::DO_NOT_COMPUTE_NEAR_FAR );
      sceneViewer->setSceneData(root);

      return 0;
}

int CMapRenderThread::DrawOpenSceneGraph()
{
      // init
      GLint viewParams[4];
      glGetIntegerv( GL_VIEWPORT, viewParams );
      sceneViewer->setViewport(viewParams[0], viewParams[1], viewParams[2], 
viewParams[3]);

      GLfloat glMat[16];
      osg::Matrix osgMat;

      glGetFloatv( GL_PROJECTION_MATRIX, glMat );
      osgMat.set( glMat );
      sceneViewer->setProjectionMatrix(osgMat);

      glGetFloatv( GL_MODELVIEW_MATRIX, glMat );
      osgMat.set( glMat );
      sceneViewer->setViewMatrix(osgMat);


      // reset all
      glPushAttrib(GL_ALL_ATTRIB_BITS );
      glMatrixMode(GL_PROJECTION);
      glPushMatrix();
      glMatrixMode(GL_TEXTURE);
      glPushMatrix();
      glMatrixMode(GL_MODELVIEW);
      glPushMatrix();


      // draw objects in scenegraph
      sceneViewer->draw();


      // set back
      glMatrixMode(GL_TEXTURE);
      glPopMatrix();
      glMatrixMode(GL_PROJECTION);
      glPopMatrix();
      glMatrixMode(GL_MODELVIEW);
      glPopMatrix();
      glPopAttrib();

      return 0;
}

_______________________________________________
osg-users mailing list
[email protected]
http://lists.openscenegraph.org/listinfo.cgi/osg-users-openscenegraph.org

Reply via email to