Hello Trajce, The visitor class implementation is on my previous post on this thread. I took that code from Gordon Tomlison's OSG Samples, and it works when is used previous to the rendering as you can see on my initial post (other thread: http://forum.openscenegraph.org/viewtopic.php?p=75209#75209).
As I said everything gets called when it should, but on runtime, the lines wont change color. I you look at the code snippet of my main: Code: _lines = osgDB::readNodeFile("lines.dxf"); _topo->setDataVariance(osg::Object::DYNAMIC); osg::Geode* geode = new osg::Geode; _mViewer->addEventHandler(new ColorHandler); ColorVisitor newColor; newColor.setColor( 1.0f, 0.0f, 0.0f ); _lines->accept(newColor); geode->addChild(_lines); _mViewer->realize(); The color of the lines turns red on start. But then, when I try to change it to another color on runetime, nothing happens. Anyway, here is the visitor implementation (.cpp): Code: ColorVisitor::ColorVisitor(): osg::NodeVisitor(osg::NodeVisitor::TRAVERSE_ALL_CHILDREN) { m_color.set(1.0, 1.0, 1.0, 1.0); m_colorArrays = new osg::Vec4Array; m_colorArrays->push_back(m_color); }; ColorVisitor::ColorVisitor(const osg::Vec4 &color): osg::NodeVisitor(osg::NodeVisitor::TRAVERSE_ALL_CHILDREN) { m_color = color; m_colorArrays = new osg::Vec4Array; m_colorArrays->push_back(m_color); }; ColorVisitor::~ColorVisitor() { }; void ColorVisitor::apply(osg::Node &node) { // -------------------------------------------- // // Handle traversal of osg::Node node types // // -------------------------------------------- traverse(node); }; void ColorVisitor::apply(osg::Geode &geode) { // ------------------------------------------------ // // Handle traversal of osg::Geode node types // // ------------------------------------------------ osg::StateSet *state = NULL; unsigned int vertNum = 0; // // We need to iterate through all the drawables check if // the contain any geometry that we will need to process // unsigned int numGeoms = geode.getNumDrawables(); for (unsigned int geodeIdx = 0; geodeIdx < numGeoms; geodeIdx++) { // // Use 'asGeometry' as its supposed to be faster than a dynamic_cast // every little saving counts // osg::Geometry *curGeom = geode.getDrawable(geodeIdx)->asGeometry(); // // Only process if the drawable is geometry // if (curGeom) { osg::Vec4Array *colorArrays = dynamic_cast<osg::Vec4Array *>(curGeom->getColorArray()); if (colorArrays) { for (unsigned int i = 0; i < colorArrays->size(); i++) { osg::Vec4 *color = &colorArrays->operator [](i); // // could also use *color = m_color // color->set(m_color._v[0], m_color._v[1], m_color._v[2], m_color._v[3]); } } else { curGeom->setColorArray(m_colorArrays.get()); curGeom->setColorBinding(osg::Geometry::BIND_OVERALL); } } } }; void ColorVisitor::setColor(const float r, const float g, const float b, const float a) { // ------------------------------------------------------------------- // // Set the color to change apply to the nodes geometry // // ------------------------------------------------------------------- osg::Vec4 *c = &m_colorArrays->operator [](0); m_color.set(r, g, b, a); *c = m_color; }; void ColorVisitor::setColor(const osg::Vec4 &color) { // ------------------------------------------------------------------- // // Set the color to change apply to the nodes geometry // // ------------------------------------------------------------------- osg::Vec4 *c = &m_colorArrays->operator [](0); m_color = color; *c = m_color; }; Cheers, ------------------ Read this topic online here: http://forum.openscenegraph.org/viewtopic.php?p=75248#75248 _______________________________________________ osg-users mailing list osg-users@lists.openscenegraph.org http://lists.openscenegraph.org/listinfo.cgi/osg-users-openscenegraph.org