[osg-users] Update node color on demand

Trajce Nikolov NICK trajce.nikolov.nick at gmail.com
Mon Nov 26 23:47:00 PST 2018


Hi,

try in void ColorVisitor::apply(osg::Geode &geode) {
.....
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]);
                }
colorArrays->dirty() or ->dirtyBufferObject() I am not sure what was the
right call. Please look it up. It is not enough only to change the color,
you have to dirty the array to be updated
            }

On Tue, Nov 27, 2018 at 2:10 AM Diego Mancilla <dmancillac at gmail.com> wrote:

> 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 at lists.openscenegraph.org
> http://lists.openscenegraph.org/listinfo.cgi/osg-users-openscenegraph.org
>


-- 
trajce nikolov nick
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.openscenegraph.org/pipermail/osg-users-openscenegraph.org/attachments/20181127/ab581b0c/attachment.html>


More information about the osg-users mailing list