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