[osg-users] Update node color on demand

Eran Cohen ceranco at gmail.com
Sat Nov 24 22:51:03 PST 2018


Hi Diego,

You can pass user events to the viewer (and thus to its Event Handlers):

Code:

// This struct will be passed to the event handler with the relevant parameters (for example, the node you want to affect and the color to change it to)
struct ChangeColorEvent : public osg::Referenced
{
  ChangeColorEvent(float r, float g, float b, osg::Node* node)
  {
    this->r = r;
    this->g = g;
    this->b = b;
    this->node = node;
  }

  float r;
  float g;
  float b;
  osg::Node* node;
}

// When you want to call the event (on a button click in QT for example)
viewer->getEventQueue()->userEvent(new ChangeColorEvent{ 1.0, 0.3, 0.4, node }, 0);




To handle said event in your EventHandler:

Code:

class ColorHandler : public osgGA::GUIEventHandler 
{ 
   virtual bool handle(const osgGA::GUIEventAdapter& ea, osgGA::GUIActionAdapter& aa) override 
   { 
      if (ea.getEventType() == ea.USER) 
      { 
         auto changeColorEvent = dynamic_cast<const ChangeColorEvent*>(ea.getUserData());
         if (changeColorEvent != nullptr)
         {
           // do whatever you want here, for example run the visitor on the node
           return true;
         }
      } 
      return false;
   } 
}; 





Cheers,
Eran

------------------
Read this topic online here:
http://forum.openscenegraph.org/viewtopic.php?p=75241#75241







More information about the osg-users mailing list