diff --git a/src/osgPlugins/osg/CMakeLists.txt b/src/osgPlugins/osg/CMakeLists.txt index 3ff51b4e6..f37487783 100644 --- a/src/osgPlugins/osg/CMakeLists.txt +++ b/src/osgPlugins/osg/CMakeLists.txt @@ -61,6 +61,7 @@ ShadeModel.cpp Shader.cpp Shape.cpp ShapeDrawable.cpp +StateAttribute.cpp StateSet.cpp Stencil.cpp Switch.cpp diff --git a/src/osgPlugins/osg/StateAttribute.cpp b/src/osgPlugins/osg/StateAttribute.cpp new file mode 100644 index 000000000..b6c9d988f --- /dev/null +++ b/src/osgPlugins/osg/StateAttribute.cpp @@ -0,0 +1,81 @@ +#include "osg/StateAttribute" + +#include "osgDB/Registry" +#include "osgDB/Input" +#include "osgDB/Output" + +using namespace osg; +using namespace osgDB; +using namespace std; + +// forward declare functions to use later. +bool StateAttribute_readLocalData(Object& obj, Input& fr); +bool StateAttribute_writeLocalData(const Object& obj, Output& fw); + +// register the read and write functions with the osgDB::Registry. +osg::StateAttribute* g_stateAttribute = 0; +RegisterDotOsgWrapperProxy g_StateAttributeProxy +( + g_stateAttribute, // no instance, osg::StateAttribute is an abstract class. + "StateAttribute", + "Object StateAttribute", + &StateAttribute_readLocalData, + &StateAttribute_writeLocalData +); + + +bool StateAttribute_readLocalData(Object& obj, Input& fr) +{ + bool iteratorAdvanced = false; + StateAttribute& stateAttribute = static_cast(obj); + + static ref_ptr s_callback = new osg::StateAttribute::Callback; + while (fr.matchSequence("UpdateCallback {")) + { + int entry = fr[0].getNoNestedBrackets(); + fr += 2; + StateAttribute::Callback* callback = dynamic_cast(fr.readObjectOfType(*s_callback)); + if (callback) { + stateAttribute.setUpdateCallback(callback); + } + iteratorAdvanced = true; + } + + while (fr.matchSequence("EventCallback {")) + { + int entry = fr[0].getNoNestedBrackets(); + fr += 2; + StateAttribute::Callback* callback = dynamic_cast(fr.readObjectOfType(*s_callback)); + if (callback) { + stateAttribute.setEventCallback(callback); + } + iteratorAdvanced = true; + } + + return iteratorAdvanced; +} + +bool StateAttribute_writeLocalData(const Object& obj,Output& fw) +{ + const StateAttribute& stateAttribute = static_cast(obj); + + if (stateAttribute.getUpdateCallback()) + { + fw.indent() << "UpdateCallback {" << std::endl; + fw.moveIn(); + fw.writeObject(*stateAttribute.getUpdateCallback()); + fw.moveOut(); + fw.indent() << "}" << std::endl; + } + + if (stateAttribute.getEventCallback()) + { + fw.indent() << "EventCallback {" << std::endl; + fw.moveIn(); + fw.writeObject(*stateAttribute.getEventCallback()); + fw.moveOut(); + fw.indent() << "}" << std::endl; + } + + return true; +}