From e21865ee3332a8ffd657be03e75c1b68bded62ce Mon Sep 17 00:00:00 2001 From: Robert Osfield Date: Mon, 10 Feb 2014 18:07:26 +0000 Subject: [PATCH] Implemented Widget::handle, handleImplementation, traverse and travseImplementation() wrappers to enable them to be extended via scripting --- src/osgGA/Widget.cpp | 28 ++++++---- src/osgWrappers/serializers/osgGA/Widget.cpp | 57 ++++++++++++++++++++ 2 files changed, 75 insertions(+), 10 deletions(-) diff --git a/src/osgGA/Widget.cpp b/src/osgGA/Widget.cpp index f285f96cb..e8f22769f 100644 --- a/src/osgGA/Widget.cpp +++ b/src/osgGA/Widget.cpp @@ -190,6 +190,14 @@ void Widget::traverse(osg::NodeVisitor& nv) osg::CallbackObject* co = osg::getCallbackObject(this, "traverse"); if (co) { + // currently lua scripting takes a ref count so messes up handling of NodeVisitor's created on stack, + // so don't attempt to call the sctipt. + if (nv.referenceCount()==0) + { + traverseImplementation(nv); + return; + } + osg::Parameters inputParameters, outputParameters; inputParameters.push_back(&nv); co->run(this, inputParameters, outputParameters); @@ -204,6 +212,7 @@ void Widget::traverseImplementation(osg::NodeVisitor& nv) { if (!_graphicsInitialized && nv.getVisitorType()!=osg::NodeVisitor::CULL_VISITOR) createGraphics(); + osgGA::EventVisitor* ev = dynamic_cast(&nv); if (ev) { @@ -236,18 +245,17 @@ bool Widget::handle(osgGA::EventVisitor* ev, osgGA::Event* event) osg::CallbackObject* co = osg::getCallbackObject(this, "handle"); if (co) { + // currently lua scripting takes a ref count so messes up handling of NodeVisitor's created on stack, + // so don't attempt to call the sctipt. + if (ev->referenceCount()==0) + { + return handleImplementation(ev, event); + } + osg::Parameters inputParameters, outputParameters; inputParameters.push_back(ev); inputParameters.push_back(event); - if (co->run(this, inputParameters, outputParameters)) - { - if (outputParameters.size()>=1) - { - return true; - } - } - return false; - + return co->run(this, inputParameters, outputParameters) && outputParameters.size()>=1; } else { @@ -255,7 +263,7 @@ bool Widget::handle(osgGA::EventVisitor* ev, osgGA::Event* event) } } -bool Widget::handleImplementation(osgGA::EventVisitor* /*ev*/, osgGA::Event* /*event*/) +bool Widget::handleImplementation(osgGA::EventVisitor* ev, osgGA::Event* event) { return false; } diff --git a/src/osgWrappers/serializers/osgGA/Widget.cpp b/src/osgWrappers/serializers/osgGA/Widget.cpp index dc79a642f..c557e03a4 100644 --- a/src/osgWrappers/serializers/osgGA/Widget.cpp +++ b/src/osgWrappers/serializers/osgGA/Widget.cpp @@ -65,6 +65,58 @@ struct LeaveImplementation : public osgDB::MethodObject } }; + +struct Traverse : public osgDB::MethodObject +{ + virtual bool run(void* objectPtr, osg::Parameters& inputParameters, osg::Parameters&) const + { + osgGA::Widget* widget = reinterpret_cast(objectPtr); + osg::NodeVisitor* nv = (inputParameters.size()>=1) ? dynamic_cast(inputParameters[0].get()) : 0; + if (!nv) return false; + widget->traverse(*nv); + return true; + } +}; + +struct TraverseImplementation : public osgDB::MethodObject +{ + virtual bool run(void* objectPtr, osg::Parameters& inputParameters, osg::Parameters&) const + { + osgGA::Widget* widget = reinterpret_cast(objectPtr); + osg::NodeVisitor* nv = (inputParameters.size()>=1) ? dynamic_cast(inputParameters[0].get()) : 0; + if (!nv) return false; + widget->traverseImplementation(*nv); + return true; + } +}; + +struct Handle : public osgDB::MethodObject +{ + virtual bool run(void* objectPtr, osg::Parameters& inputParameters, osg::Parameters&) const + { + osgGA::Widget* widget = reinterpret_cast(objectPtr); + osgGA::EventVisitor* ev = (inputParameters.size()>=1) ? dynamic_cast(inputParameters[0].get()) : 0; + osgGA::Event* event = (inputParameters.size()>=2) ? dynamic_cast(inputParameters[1].get()) : 0; + if (!widget || !ev || !event) return false; + widget->handle(ev, event); + return true; + } +}; + +struct HandleImplementation : public osgDB::MethodObject +{ + virtual bool run(void* objectPtr, osg::Parameters& inputParameters, osg::Parameters&) const + { + osgGA::Widget* widget = reinterpret_cast(objectPtr); + osgGA::EventVisitor* ev = (inputParameters.size()>=1) ? dynamic_cast(inputParameters[0].get()) : 0; + osgGA::Event* event = (inputParameters.size()>=2) ? dynamic_cast(inputParameters[1].get()) : 0; + if (!widget || !ev || !event) return false; + widget->handleImplementation(ev, event); + return true; + } +}; + + REGISTER_OBJECT_WRAPPER( Widget, new osgGA::Widget, osgGA::Widget, @@ -89,5 +141,10 @@ REGISTER_OBJECT_WRAPPER( Widget, ADD_METHOD_OBJECT( "leave", Leave ); ADD_METHOD_OBJECT( "leaveImplementation", LeaveImplementation ); + ADD_METHOD_OBJECT( "traverse", Traverse ); + ADD_METHOD_OBJECT( "traverseImplementation", TraverseImplementation ); + + ADD_METHOD_OBJECT( "handle", Handle ); + ADD_METHOD_OBJECT( "handleImplementation", HandleImplementation ); }