diff --git a/src/osgPlugins/osg/StateSet.cpp b/src/osgPlugins/osg/StateSet.cpp index 30e21456e..a63a14a40 100644 --- a/src/osgPlugins/osg/StateSet.cpp +++ b/src/osgPlugins/osg/StateSet.cpp @@ -333,6 +333,28 @@ bool StateSet_readLocalData(Object& obj, Input& fr) stateset.setRenderBinDetails(binNumber,binName,rbmode); } + static ref_ptr s_callback = new osg::StateSet::Callback; + while (fr.matchSequence("UpdateCallback {")) + { + int entry = fr[0].getNoNestedBrackets(); + fr += 2; + StateSet::Callback* callback = dynamic_cast(fr.readObjectOfType(*s_callback)); + if (callback) { + stateset.setUpdateCallback(callback); + } + iteratorAdvanced = true; + } + + while (fr.matchSequence("EventCallback {")) + { + int entry = fr[0].getNoNestedBrackets(); + fr += 2; + StateSet::Callback* callback = dynamic_cast(fr.readObjectOfType(*s_callback)); + if (callback) { + stateset.setEventCallback(callback); + } + iteratorAdvanced = true; + } bool readingMode = true; StateAttribute::GLModeValue value; @@ -599,6 +621,24 @@ bool StateSet_writeLocalData(const Object& obj, Output& fw) fw.moveOut(); fw.indent()<<"}"<< std::endl; } + + if (stateset.getUpdateCallback()) + { + fw.indent() << "UpdateCallback {" << std::endl; + fw.moveIn(); + fw.writeObject(*stateset.getUpdateCallback()); + fw.moveOut(); + fw.indent() << "}" << std::endl; + } + + if (stateset.getEventCallback()) + { + fw.indent() << "EventCallback {" << std::endl; + fw.moveIn(); + fw.writeObject(*stateset.getEventCallback()); + fw.moveOut(); + fw.indent() << "}" << std::endl; + } return true; } diff --git a/src/osgPlugins/osg/Uniform.cpp b/src/osgPlugins/osg/Uniform.cpp index 4c156be7a..15a6019b3 100644 --- a/src/osgPlugins/osg/Uniform.cpp +++ b/src/osgPlugins/osg/Uniform.cpp @@ -196,6 +196,29 @@ bool Uniform_readLocalData(Object& obj, Input& fr) } #endif //] + static ref_ptr s_callback = new osg::Uniform::Callback; + while (fr.matchSequence("UpdateCallback {")) + { + int entry = fr[0].getNoNestedBrackets(); + fr += 2; + Uniform::Callback* callback = dynamic_cast(fr.readObjectOfType(*s_callback)); + if (callback) { + uniform.setUpdateCallback(callback); + } + iteratorAdvanced = true; + } + + while (fr.matchSequence("EventCallback {")) + { + int entry = fr[0].getNoNestedBrackets(); + fr += 2; + Uniform::Callback* callback = dynamic_cast(fr.readObjectOfType(*s_callback)); + if (callback) { + uniform.setEventCallback(callback); + } + iteratorAdvanced = true; + } + return iteratorAdvanced; } @@ -210,5 +233,24 @@ bool Uniform_writeLocalData(const Object& obj,Output& fw) if( uniform.getFloatArray() ) Array_writeLocalData( *uniform.getFloatArray(), fw ); if( uniform.getIntArray() ) Array_writeLocalData( *uniform.getIntArray(), fw ); + + if (uniform.getUpdateCallback()) + { + fw.indent() << "UpdateCallback {" << std::endl; + fw.moveIn(); + fw.writeObject(*uniform.getUpdateCallback()); + fw.moveOut(); + fw.indent() << "}" << std::endl; + } + + if (uniform.getEventCallback()) + { + fw.indent() << "EventCallback {" << std::endl; + fw.moveIn(); + fw.writeObject(*uniform.getEventCallback()); + fw.moveOut(); + fw.indent() << "}" << std::endl; + } + return true; }