Fixed crash and double call bug in handle event callbacks attached to Drawable
This commit is contained in:
parent
96b180ddad
commit
8de4c76582
@ -17,6 +17,9 @@
|
||||
#include <osg/Object>
|
||||
#include <osg/UserDataContainer>
|
||||
|
||||
// forward declare
|
||||
namespace osgGA { class EventHandler; }
|
||||
|
||||
namespace osg {
|
||||
|
||||
// forward declare
|
||||
@ -64,6 +67,9 @@ class OSG_EXPORT Callback : public virtual Object {
|
||||
virtual DrawableCullCallback* asDrawableCullCallback() { return 0; }
|
||||
virtual const DrawableCullCallback* asDrawableCullCallback() const { return 0; }
|
||||
|
||||
virtual osgGA::EventHandler* asEventHandler() { return 0; }
|
||||
virtual const osgGA::EventHandler* asEventHandler() const { return 0; }
|
||||
|
||||
/** Invoke the callback, first parameter is the Object that the callback is attached to,
|
||||
* the second parameter, the data, is typically the NodeVisitor that is invoking the callback.
|
||||
* The run(..) method may be overriden by users directly, or if the user is using one of the old
|
||||
|
@ -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());
|
||||
|
Loading…
Reference in New Issue
Block a user