I´m trying to make a very simple SceneGraph, with a model and 3 planes, but
when I run it I get ha next warning twice:
Warning: invalid line segment passed to IntersectVisitor::addLine
Segment<..>
0 0 0 0 0 0 segment ignored
and then get a blank console...
I saw many other mails about this kind of error but none of them seems to
apply, here's y code:
#include <osg/Node>
#include <osg/Geometry>
#include <osg/Geode>
#include <osg/Notify>
#include <osg/MatrixTransform>
#include <osg/BlendFunc>
#include <osg/ColorMask>
#include <osgDB/ReadFile>
#include <osgUtil/Optimizer>
#include <osgProducer/Viewer>
osg::Node* createMirrors(float xMin,float xMax,float zMin,float zMax,float
y)
{
// set up the Geometry.
osg::Geometry* geom = new osg::Geometry;
osg::Vec3Array* coords = new osg::Vec3Array(6);
coords->push_back( osg::Vec3( 0,0,zMax) ); // front top
coords->push_back( osg::Vec3(xMin,0,zMin) ); // front left
coords->push_back( osg::Vec3(xMax,0,zMin) ); // front right
coords->push_back( osg::Vec3( 0,y,zMax) ); // back top
coords->push_back( osg::Vec3(xMin,y,zMin) ); // back left
coords->push_back( osg::Vec3(xMax,y,zMin) ); // back right
geom->setVertexArray(coords);
osg::DrawElementsUInt* espejoBase =
new osg::DrawElementsUInt(osg::PrimitiveSet::QUADS, 0);
espejoBase->push_back(4);
espejoBase->push_back(5);
espejoBase->push_back(2);
espejoBase->push_back(1);
geom->addPrimitiveSet(espejoBase);
osg::DrawElementsUInt* espejoIzq =
new osg::DrawElementsUInt(osg::PrimitiveSet::QUADS, 0);
espejoIzq->push_back(1);
espejoIzq->push_back(0);
espejoIzq->push_back(3);
espejoIzq->push_back(4);
geom->addPrimitiveSet(espejoIzq);
osg::DrawElementsUInt* espejoDer =
new osg::DrawElementsUInt(osg::PrimitiveSet::QUADS, 0);
espejoDer->push_back(2);
espejoDer->push_back(5);
espejoDer->push_back(3);
espejoDer->push_back(0);
geom->addPrimitiveSet(espejoDer);
osg::Vec3Array* norms = new osg::Vec3Array(1);
(*norms)[0].set(0.0f,0.0f,1.0f);
geom->setNormalArray(norms);
geom->setNormalBinding(osg::Geometry::BIND_OVERALL);
osg::Vec4Array* colours = new osg::Vec4Array(1);
(*colours)[0].set(1.0f,1.0f,1.0,1.0f);
geom->setColorArray(colours);
geom->setColorBinding(osg::Geometry::BIND_OVERALL);
osg::Geode* geode = new osg::Geode;
geode->addDrawable(geom);
return geode;
}
osg::Node* createCaleidoscope(osg::Node* model)
{
// calculate where to place the mirror according to the
// loaded models bounding sphere.
const osg::BoundingSphere& bs = model->getBound();
float xMin = bs.center().x()-bs.radius()*.9129;
float xMax = bs.center().x()+bs.radius()*.9129;
float zMin = bs.center().z()-bs.radius();
float zMax = bs.center().z()+bs.radius()*1.5;
float y = bs.center().y()-bs.radius()*10.5;
osg::Group* rootNode = new osg::Group;
// create a textured, transparent node at the appropriate place.
osg::Node* mirrors = createMirrors(xMin,xMax,zMin,zMax,y);
rootNode->addChild(mirrors);
return rootNode;
}
int main( int argc, char **argv )
{
// use an ArgumentParser object to manage the program arguments.
osg::ArgumentParser arguments(&argc,argv);
// construct the viewer.
osgProducer::Viewer viewer(arguments);
// set up the value with sensible default event handlers.
viewer.setUpViewer(osgProducer::Viewer::STANDARD_SETTINGS);
// any option left unread are converted into errors to write out later.
arguments.reportRemainingOptionsAsUnrecognized();
// report any errors if they have occured when parsing the program
aguments.
if (arguments.errors())
{
arguments.writeErrorMessages(std::cout);
return 1;
}
if (arguments.argc()<=1)
{
arguments.getApplicationUsage()->write(std::cout,osg::ApplicationUsage::COMMAND_LINE_OPTION);
return 1;
}
// read the scene from the list of file specified commandline args.
osg::ref_ptr<osg::Node> loadedModel = osgDB::readNodeFiles(arguments);
// if no model has been successfully loaded report failure.
if (!loadedModel)
{
std::cout << arguments.getApplicationName() <<": No data loaded" <<
std::endl;
return 1;
}
// optimize the scene graph, remove rendundent nodes and state etc.
osgUtil::Optimizer optimizer;
optimizer.optimize(loadedModel.get());
// add a transform with a callback to animate the loaded model.
osg::ref_ptr<osg::MatrixTransform> loadedModelTransform = new
osg::MatrixTransform;
loadedModelTransform->addChild(loadedModel.get());
osg::ref_ptr<osg::Node> rootNode =
createCaleidoscope(loadedModelTransform.get());
// set the scene to render
viewer.setSceneData(rootNode.get());
// create the windows and run the threads.
viewer.realize();
while( !viewer.done() )
{
// wait for all cull and draw threads to complete.
viewer.sync();
// update the scene by traversing it with the the update visitor
which will
// call all node update callbacks and animations.
viewer.update();
// fire off the cull and draw traversals of the scene.
viewer.frame();
}
// wait for all cull and draw threads to complete.
viewer.sync();
// run a clean up frame to delete all OpenGL objects.
viewer.cleanup_frame();
// wait for all the clean up frame to complete.
viewer.sync();
return 0;
}
Thanks for any elp you can provide...
_________________________________________________________________
El mejor destino, con los mejores contenidos http://www.prodigy.msn.com
_______________________________________________
osg-users mailing list
osg-users@openscenegraph.net
http://openscenegraph.net/mailman/listinfo/osg-users
http://www.openscenegraph.org/