From 958a7d0ab0884bfeea894ef88bf21db60449bf49 Mon Sep 17 00:00:00 2001 From: Robert Osfield Date: Thu, 6 Feb 2014 17:04:40 +0000 Subject: [PATCH] Added osg::CallbackObject suport to the experiment Widget base class to enable script language extension of widgets --- .../TransferFunctionWidget.cpp | 10 +-- .../TransferFunctionWidget.h | 6 +- examples/osgtransferfunction/Widget.cpp | 82 ++++++++++++++++++- examples/osgtransferfunction/Widget.h | 12 ++- .../osgtransferfunction.cpp | 5 +- 5 files changed, 101 insertions(+), 14 deletions(-) diff --git a/examples/osgtransferfunction/TransferFunctionWidget.cpp b/examples/osgtransferfunction/TransferFunctionWidget.cpp index d1b74869b..8f5590e4c 100644 --- a/examples/osgtransferfunction/TransferFunctionWidget.cpp +++ b/examples/osgtransferfunction/TransferFunctionWidget.cpp @@ -120,12 +120,12 @@ void TransferFunctionWidget::scaleVisibleRange(float center, float delta) } -void TransferFunctionWidget::traverse(osg::NodeVisitor& nv) +void TransferFunctionWidget::traverseImplementation(osg::NodeVisitor& nv) { - Widget::traverse(nv); + Widget::traverseImplementation(nv); } -bool TransferFunctionWidget::handle(osgGA::EventVisitor* ev, osgGA::Event* event) +bool TransferFunctionWidget::handleImplementation(osgGA::EventVisitor* ev, osgGA::Event* event) { osgGA::GUIEventAdapter* ea = event->asGUIEventAdapter(); if (!ea) return false; @@ -222,7 +222,7 @@ bool TransferFunctionWidget::handle(osgGA::EventVisitor* ev, osgGA::Event* event return false; } -void TransferFunctionWidget::createGraphics() +void TransferFunctionWidget::createGraphicsImplementation() { // OSG_NOTICE<<"Create graphics"<dirtyBound(); // make sure the general widget geometry/state is created and _graphicsInitialized reset to false - Widget::createGraphics(); + Widget::createGraphicsImplementation(); } diff --git a/examples/osgtransferfunction/TransferFunctionWidget.h b/examples/osgtransferfunction/TransferFunctionWidget.h index ee0f93844..78e173709 100644 --- a/examples/osgtransferfunction/TransferFunctionWidget.h +++ b/examples/osgtransferfunction/TransferFunctionWidget.h @@ -31,9 +31,9 @@ public: TransferFunctionWidget(const TransferFunctionWidget& tfw, const osg::CopyOp& copyop=osg::CopyOp::SHALLOW_COPY); META_Node(osgUI, TransferFunctionWidget); - void traverse(osg::NodeVisitor& nv); + virtual void traverseImplementation(osg::NodeVisitor& nv); - virtual bool handle(osgGA::EventVisitor* ev, osgGA::Event* event); + virtual bool handleImplementation(osgGA::EventVisitor* ev, osgGA::Event* event); void setTransferFunction(const osg::TransferFunction1D* tf); osg::TransferFunction1D* getTransferFunction() { return _transferFunction.get(); } @@ -44,7 +44,7 @@ public: void translateVisibleRange(float delta); void scaleVisibleRange(float center, float delta); - virtual void createGraphics(); + virtual void createGraphicsImplementation(); protected: virtual ~TransferFunctionWidget() {} diff --git a/examples/osgtransferfunction/Widget.cpp b/examples/osgtransferfunction/Widget.cpp index b100468af..0ff94c79d 100644 --- a/examples/osgtransferfunction/Widget.cpp +++ b/examples/osgtransferfunction/Widget.cpp @@ -14,6 +14,7 @@ #include "Widget.h" #include +#include #include #include #include @@ -149,16 +150,57 @@ bool Widget::getHasEventFocus() const } void Widget::enter() +{ + osg::CallbackObject* co = osg::getCallbackObject(this, "enter"); + if (co) + { + co->run(this); + } + else + { + enterImplementation(); + } +} + +void Widget::enterImplementation() { OSG_NOTICE<<"enter()"<run(this); + } + else + { + leaveImplementation(); + } +} + +void Widget::leaveImplementation() { OSG_NOTICE<<"leave()"<run(this, inputParameters, outputParameters); + } + else + { + traverseImplementation(nv); + } +} + +void Widget::traverseImplementation(osg::NodeVisitor& nv) { if (!_graphicsInitialized && nv.getVisitorType()!=osg::NodeVisitor::CULL_VISITOR) createGraphics(); @@ -190,7 +232,31 @@ void Widget::traverse(osg::NodeVisitor& nv) } } -bool Widget::handle(osgGA::EventVisitor* /*ev*/, osgGA::Event* /*event*/) +bool Widget::handle(osgGA::EventVisitor* ev, osgGA::Event* event) +{ + osg::CallbackObject* co = osg::getCallbackObject(this, "handle"); + if (co) + { + 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; + + } + else + { + return handleImplementation(ev, event); + } +} + +bool Widget::handleImplementation(osgGA::EventVisitor* /*ev*/, osgGA::Event* /*event*/) { return false; } @@ -213,6 +279,20 @@ bool Widget::computePositionInLocalCoordinates(osgGA::EventVisitor* ev, osgGA::G void Widget::createGraphics() +{ + osg::CallbackObject* co = osg::getCallbackObject(this, "createGraphics"); + if (co) + { + co->run(this); + } + else + { + createGraphicsImplementation(); + } + +} + +void Widget::createGraphicsImplementation() { _graphicsInitialized = true; } diff --git a/examples/osgtransferfunction/Widget.h b/examples/osgtransferfunction/Widget.h index 5c4024014..f78d3354a 100644 --- a/examples/osgtransferfunction/Widget.h +++ b/examples/osgtransferfunction/Widget.h @@ -32,12 +32,15 @@ public: META_Node(osgUI, Widget); virtual void traverse(osg::NodeVisitor& nv); + virtual void traverseImplementation(osg::NodeVisitor& nv); virtual bool handle(osgGA::EventVisitor* ev, osgGA::Event* event); + virtual bool handleImplementation(osgGA::EventVisitor* ev, osgGA::Event* event); virtual bool computePositionInLocalCoordinates(osgGA::EventVisitor* ev, osgGA::GUIEventAdapter* event, osg::Vec3& localPosition) const; virtual void createGraphics(); + virtual void createGraphicsImplementation(); virtual void setExtents(const osg::BoundingBox& bb); const osg::BoundingBox& getExtents() const { return _extents; } @@ -63,14 +66,17 @@ public: virtual osg::BoundingSphere computeBound() const; -protected: - virtual ~Widget() {} - /** update any focus related graphics+state to the focused state.*/ virtual void enter(); + virtual void enterImplementation(); /** update any focus related graphics+state to the unfocused state.*/ virtual void leave(); + virtual void leaveImplementation(); + + +protected: + virtual ~Widget() {} FocusBehaviour _focusBehaviour; bool _hasEventFocus; diff --git a/examples/osgtransferfunction/osgtransferfunction.cpp b/examples/osgtransferfunction/osgtransferfunction.cpp index fcf90d40e..897f216b5 100644 --- a/examples/osgtransferfunction/osgtransferfunction.cpp +++ b/examples/osgtransferfunction/osgtransferfunction.cpp @@ -420,6 +420,7 @@ int main(int argc, char ** argv) copyobject->myMethod(); #endif +#if 0 osg::ref_ptr object = osgDB::readNodeFile("load.lua"); if (object.valid()) { @@ -441,10 +442,10 @@ int main(int argc, char ** argv) } } return 0; +#endif - - #if 0 + #if 1 osgViewer::Viewer viewer(arguments); viewer.addEventHandler(new osgViewer::StatsHandler());