Yes you have to call cull,
basically it's the cull the creates the list of things to draw __________________________________________________________ Gordon Tomlinson Email : <mailto:[EMAIL PROTECTED]> [EMAIL PROTECTED] YIM/AIM : gordon3dBrit MSN IM : <mailto:[EMAIL PROTECTED]> [EMAIL PROTECTED] Website : <http://www.vis-sim.com> www.vis-sim.com <http://www.gordontomlinson.com> www.gordontomlinson.com __________________________________________________________ From: [EMAIL PROTECTED] [mailto:[EMAIL PROTECTED] On Behalf Of [EMAIL PROTECTED] Sent: Thursday, April 10, 2008 5:41 AM To: osg-users@lists.openscenegraph.org Subject: Re: [osg-users] SceneView error 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: osg-users@lists.openscenegraph.org 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 osg-users@lists.openscenegraph.org http://lists.openscenegraph.org/listinfo.cgi/osg-users-openscenegraph.org