#include <osg\Geometry>
#include <osg\Group>
#include <osgViewer\Viewer>
#include <osg\LineWidth>
#include <iostream>
#include <osgViewer/ViewerEventHandlers>
class DynamicLineCallback: public osg::Drawable::UpdateCallback
{
public:
DynamicLineCallback()
{
}
virtual void update(osg::NodeVisitor* nv, osg::Drawable* drawable)
{
osg::Geometry* geom = dynamic_cast<osg::Geometry*>(drawable);
if (!geom) return;
osg::Vec3Array* vertices = dynamic_cast<osg::Vec3Array*>(geom->getVertexArray() );
if (vertices)
{
if ( vertices->size() > 5 )
{
if (vertices->size() == 6)
{
for (unsigned int i=0; i<vertices->size(); i++)
{
(*vertices)[i].set( vertices->at(i).x() + 5, vertices->at(i).y(), vertices->at(i).z() );
}
}
vertices->pop_back();
for (unsigned int i=0; i<vertices->size(); i++)
{
std::cout<<vertices->at(i).x()<<" "<<vertices->at(i).y()<<" "<<vertices->at(i).z()<<std::endl;
}
std::cout<<std::endl<<std::endl;
}
}
osg::DrawArrays* da = (osg::DrawArrays*)geom->getPrimitiveSet(0);
da->setCount( vertices->size() );
da->dirty();
}
};
int main()
{
osg::ref_ptr<osg::Vec3Array> vertices = new osg::Vec3Array(10);
for (unsigned int i=0; i<10; i++)
{
(*vertices)[i].set(float(i), 0.0f,0.0f);
std::cout<<vertices->at(i).x()<<" "<<vertices->at(i).y()<<" "<<vertices->at(i).z()<<std::endl;
}
osg::ref_ptr<osg::Geometry> lineGeom = new osg::Geometry;
lineGeom->setUseVertexBufferObjects( true );
lineGeom->setUseDisplayList( false );
lineGeom->setDataVariance( osg::Object::DYNAMIC );
lineGeom->setVertexArray( vertices.get() );
lineGeom->addPrimitiveSet( new osg::DrawArrays(osg::DrawArrays::POINTS,0,vertices->size() ) );
lineGeom->setInitialBound( osg::BoundingBox( osg::Vec3(-20.0f,-20.0f,-20.0f), osg::Vec3(20.0f,20.0f,20.0f)) );
lineGeom->setUpdateCallback( new DynamicLineCallback());
osg::ref_ptr<osg::Geode> geode = new osg::Geode;
geode->getOrCreateStateSet()->setMode( GL_LIGHTING, osg::StateAttribute::OFF);
geode->getOrCreateStateSet()->setAttribute( new osg::LineWidth(4.0f));
geode->addDrawable( lineGeom.get() );
osgViewer::Viewer viewer;
viewer.setSceneData( geode.get() );
viewer.addEventHandler( new osgViewer::WindowSizeHandler);
return viewer.run();
}
#include <osg\Group>
#include <osgViewer\Viewer>
#include <osg\LineWidth>
#include <iostream>
#include <osgViewer/ViewerEventHandlers>
class DynamicLineCallback: public osg::Drawable::UpdateCallback
{
public:
DynamicLineCallback()
{
}
virtual void update(osg::NodeVisitor* nv, osg::Drawable* drawable)
{
osg::Geometry* geom = dynamic_cast<osg::Geometry*>(drawable);
if (!geom) return;
osg::Vec3Array* vertices = dynamic_cast<osg::Vec3Array*>(geom->getVertexArray() );
if (vertices)
{
if ( vertices->size() > 5 )
{
if (vertices->size() == 6)
{
for (unsigned int i=0; i<vertices->size(); i++)
{
(*vertices)[i].set( vertices->at(i).x() + 5, vertices->at(i).y(), vertices->at(i).z() );
}
}
vertices->pop_back();
for (unsigned int i=0; i<vertices->size(); i++)
{
std::cout<<vertices->at(i).x()<<" "<<vertices->at(i).y()<<" "<<vertices->at(i).z()<<std::endl;
}
std::cout<<std::endl<<std::endl;
}
}
osg::DrawArrays* da = (osg::DrawArrays*)geom->getPrimitiveSet(0);
da->setCount( vertices->size() );
da->dirty();
}
};
int main()
{
osg::ref_ptr<osg::Vec3Array> vertices = new osg::Vec3Array(10);
for (unsigned int i=0; i<10; i++)
{
(*vertices)[i].set(float(i), 0.0f,0.0f);
std::cout<<vertices->at(i).x()<<" "<<vertices->at(i).y()<<" "<<vertices->at(i).z()<<std::endl;
}
osg::ref_ptr<osg::Geometry> lineGeom = new osg::Geometry;
lineGeom->setUseVertexBufferObjects( true );
lineGeom->setUseDisplayList( false );
lineGeom->setDataVariance( osg::Object::DYNAMIC );
lineGeom->setVertexArray( vertices.get() );
lineGeom->addPrimitiveSet( new osg::DrawArrays(osg::DrawArrays::POINTS,0,vertices->size() ) );
lineGeom->setInitialBound( osg::BoundingBox( osg::Vec3(-20.0f,-20.0f,-20.0f), osg::Vec3(20.0f,20.0f,20.0f)) );
lineGeom->setUpdateCallback( new DynamicLineCallback());
osg::ref_ptr<osg::Geode> geode = new osg::Geode;
geode->getOrCreateStateSet()->setMode( GL_LIGHTING, osg::StateAttribute::OFF);
geode->getOrCreateStateSet()->setAttribute( new osg::LineWidth(4.0f));
geode->addDrawable( lineGeom.get() );
osgViewer::Viewer viewer;
viewer.setSceneData( geode.get() );
viewer.addEventHandler( new osgViewer::WindowSizeHandler);
return viewer.run();
}