#include #include #include #include #include #include #include #include #include #include #include osg::Geode *makeGalaxy(unsigned nvertices) { osg::Geode *geode = new osg::Geode(); osg::Geometry *galaxy = new osg::Geometry(); osg::Vec3Array *vertices = new osg::Vec3Array(); osg::Vec4Array *colors = new osg::Vec4Array(); osg::Vec4 ini(1,1,0,1); osg::Vec4 fin(0,0,1,1); /** Formula for the two spirals */ for (unsigned i=0;ipush_back(osg::Vec3(cos(val)*val+modx1, sin(val)*val+mody1, modz1)); vertices->push_back(osg::Vec3(-cos(val)*val+modx2, -sin(val)*val+mody2, modz2)); colors->push_back(ini+(fin-ini)*(i*2/(float)nvertices)); colors->push_back(ini+(fin-ini)*(i*2/(float)nvertices)); } galaxy->setVertexArray(vertices); galaxy->setColorArray(colors); galaxy->setColorBinding(osg::Geometry::BIND_PER_VERTEX); galaxy->addPrimitiveSet(new osg::DrawArrays(osg::PrimitiveSet::POINTS, 0, nvertices)); geode->addDrawable(galaxy); return geode; } osg::StateSet* makeStateSet(float size) { osg::StateSet *set = new osg::StateSet(); /// Setup cool blending set->setMode(GL_BLEND, osg::StateAttribute::ON); osg::BlendFunc *fn = new osg::BlendFunc(); fn->setFunction(osg::BlendFunc::SRC_ALPHA, osg::BlendFunc::DST_ALPHA); set->setAttributeAndModes(fn, osg::StateAttribute::ON); /// Setup the point sprites osg::PointSprite *sprite = new osg::PointSprite(); set->setTextureAttributeAndModes(0, sprite, osg::StateAttribute::ON); /// Give some size to the points to be able to see the sprite osg::Point *point = new osg::Point(); point->setSize(size); set->setAttribute(point); /// Disable depth test to avoid sort problems and Lighting set->setMode(GL_DEPTH_TEST, osg::StateAttribute::OFF); set->setMode(GL_LIGHTING, osg::StateAttribute::OFF); /// The texture for the sprites osg::Texture2D *tex = new osg::Texture2D(); tex->setImage(osgDB::readImageFile("Images/particle.rgb")); set->setTextureAttributeAndModes(0, tex, osg::StateAttribute::ON); return set; } int main(int, char *[]) { osgViewer::Viewer viewer; /// Make the galaxy of points osg::Node *node = makeGalaxy(5000); node->setStateSet(makeStateSet(10.0f)); viewer.setSceneData(node); return viewer.run(); }