Fixed crash and double call bug in handle event callbacks attached to Drawable
This commit is contained in:
@@ -49,10 +49,13 @@ public:
|
||||
virtual DrawableEventCallback* asDrawableEventCallback() { return osg::DrawableEventCallback::asDrawableEventCallback(); }
|
||||
virtual const DrawableEventCallback* asDrawableEventCallback() const { return osg::DrawableEventCallback::asDrawableEventCallback(); }
|
||||
|
||||
virtual EventHandler* asEventHandler() { return this; }
|
||||
virtual const EventHandler* asEventHandler() const { return this; }
|
||||
|
||||
virtual bool run(osg::Object* object, osg::Object* data)
|
||||
{
|
||||
osg::Node* node = dynamic_cast<osg::Node*>(object);
|
||||
osg::NodeVisitor* nv = dynamic_cast<osg::NodeVisitor*>(data);
|
||||
osg::Node* node = object->asNode();
|
||||
osg::NodeVisitor* nv = data->asNodeVisitor();
|
||||
operator()(node, nv);
|
||||
return true;
|
||||
}
|
||||
|
||||
@@ -27,6 +27,7 @@
|
||||
#include <osg/ScriptEngine>
|
||||
|
||||
#include <osgGA/GUIEventAdapter>
|
||||
#include <osgGA/GUIEventHandler>
|
||||
#include <osgGA/GUIActionAdapter>
|
||||
#include <osgGA/EventQueue>
|
||||
|
||||
@@ -83,14 +84,23 @@ class OSGGA_EXPORT EventVisitor : public osg::NodeVisitor
|
||||
osg::Callback* callback = drawable.getEventCallback();
|
||||
if (callback)
|
||||
{
|
||||
osg::DrawableEventCallback* drawable_callback = callback->asDrawableEventCallback();
|
||||
osg::NodeCallback* node_callback = callback->asNodeCallback();
|
||||
osg::CallbackObject* callback_object = callback->asCallbackObject();
|
||||
osgGA::EventHandler* eh = callback->asEventHandler();
|
||||
if (eh)
|
||||
{
|
||||
callback->run(&drawable,this);
|
||||
}
|
||||
else
|
||||
{
|
||||
osg::DrawableEventCallback* drawable_callback = callback->asDrawableEventCallback();
|
||||
osg::NodeCallback* node_callback = callback->asNodeCallback();
|
||||
osg::CallbackObject* callback_object = callback->asCallbackObject();
|
||||
|
||||
if (drawable_callback) drawable_callback->event(this,&drawable);
|
||||
if (node_callback) (*node_callback)(&drawable, this);
|
||||
if (drawable_callback) drawable_callback->event(this,&drawable);
|
||||
if (node_callback) (*node_callback)(&drawable, this);
|
||||
if (callback_object) callback_object->run(&drawable, this);
|
||||
|
||||
if ((!drawable_callback && !node_callback) || callback_object) callback_object->run(&drawable, this);
|
||||
if (!drawable_callback && !node_callback && !callback_object) callback->run(&drawable, this);
|
||||
}
|
||||
}
|
||||
|
||||
handle_callbacks(drawable.getStateSet());
|
||||
|
||||
Reference in New Issue
Block a user