diff --git a/include/osg/FragmentProgram b/include/osg/FragmentProgram index fc68bc37f..602bbf133 100644 --- a/include/osg/FragmentProgram +++ b/include/osg/FragmentProgram @@ -166,12 +166,20 @@ class SG_EXPORT FragmentProgram : public StateAttribute /** Get the fragment program.*/ inline const std::string& getFragmentProgram() const { return _fragmentProgram; } - /** Program Parameters */ + /** Set Program Parameters */ inline void setProgramLocalParameter(const GLuint index, const Vec4& p) { _programLocalParameters[index] = p; } + typedef std::map LocalParamList; + + /** Get list of Program Parameters */ + inline LocalParamList& getLocalParamList() { return _programLocalParameters; } + + /** Get const list of Program Parameters */ + inline const LocalParamList& getLocalParamList() const { return _programLocalParameters; } + /** Matrix */ inline void setMatrix(const GLenum mode, const Matrix& matrix) { @@ -255,7 +263,6 @@ class SG_EXPORT FragmentProgram : public StateAttribute std::string _fragmentProgram; - typedef std::map LocalParamList; LocalParamList _programLocalParameters; typedef std::map MatrixList; diff --git a/src/osgPlugins/ive/FragmentProgram.cpp b/src/osgPlugins/ive/FragmentProgram.cpp index 0cfbe0d26..156ae9979 100644 --- a/src/osgPlugins/ive/FragmentProgram.cpp +++ b/src/osgPlugins/ive/FragmentProgram.cpp @@ -34,6 +34,14 @@ void FragmentProgram::write( DataOutputStream* out ) } // Write FragmentProgram properties. + FragmentProgram::LocalParamList lpl = getLocalParamList(); + out->writeInt(lpl.size()); + for(FragmentProgram::LocalParamList::iterator i=lpl.begin(); i!=lpl.end(); ++i) + { + out->writeInt(i->first); + out->writeVec4(i->second); + } + // Write program. out->writeString( this->getFragmentProgram() ); } @@ -58,6 +66,11 @@ void FragmentProgram::read(DataInputStream* in){ } // Read data + int i, size; + size = in->readInt(); + for(i=0; isetProgramLocalParameter( in->readInt(), in->readVec4() ); + std::string fp = in->readString(); this->setFragmentProgram( fp ); } diff --git a/src/osgPlugins/osg/FragmentProgram.cpp b/src/osgPlugins/osg/FragmentProgram.cpp index 67585fd4f..b65cdef31 100644 --- a/src/osgPlugins/osg/FragmentProgram.cpp +++ b/src/osgPlugins/osg/FragmentProgram.cpp @@ -31,37 +31,53 @@ bool FragmentProgram_readLocalData(Object& obj, Input& fr) FragmentProgram& fragmentProgram = static_cast(obj); - if (fr.matchSequence("code {")) { - std::string code; - fr += 2; - iteratorAdvanced = true; - int entry = fr[0].getNoNestedBrackets(); - while (!fr.eof() && fr[0].getNoNestedBrackets() >= entry) { - if (fr[0].getStr()) { - code.append(std::string(fr[0].getStr())); - code += '\n'; - } - ++fr; - } + if (fr[0].matchWord("ProgramLocalParameter")) + { + int index; + Vec4 vec; + fr[1].getInt(index); + fr[2].getFloat(vec[0]); + fr[3].getFloat(vec[1]); + fr[4].getFloat(vec[2]); + fr[5].getFloat(vec[3]); + fr += 6; + iteratorAdvanced = true; + fragmentProgram.setProgramLocalParameter(index, vec); + } + + if (fr.matchSequence("code {")) + { + std::string code; + fr += 2; + iteratorAdvanced = true; + int entry = fr[0].getNoNestedBrackets(); + while (!fr.eof() && fr[0].getNoNestedBrackets() >= entry) { + if (fr[0].getStr()) { + code.append(std::string(fr[0].getStr())); + code += '\n'; + } + ++fr; + } fragmentProgram.setFragmentProgram(code); } - if( fr.matchSequence("file %s")) { - std::string filename = fr[1].getStr(); - fr += 2; - iteratorAdvanced = true; + if( fr.matchSequence("file %s")) + { + std::string filename = fr[1].getStr(); + fr += 2; + iteratorAdvanced = true; - ifstream vfstream( filename.c_str() ); + ifstream vfstream( filename.c_str() ); - if( vfstream ) { - ostringstream vstream; - char ch; + if( vfstream ) { + ostringstream vstream; + char ch; - /* xxx better way to transfer a ifstream to a string?? */ - while( vfstream.get(ch)) vstream.put(ch); + /* xxx better way to transfer a ifstream to a string?? */ + while( vfstream.get(ch)) vstream.put(ch); - fragmentProgram.setFragmentProgram( vstream.str() ); - } + fragmentProgram.setFragmentProgram( vstream.str() ); + } } return iteratorAdvanced; @@ -72,19 +88,27 @@ bool FragmentProgram_writeLocalData(const Object& obj,Output& fw) { const FragmentProgram& fragmentProgram = static_cast(obj); + const FragmentProgram::LocalParamList& lpl = fragmentProgram.getLocalParamList(); + FragmentProgram::LocalParamList::const_iterator i; + for(i=lpl.begin(); i!=lpl.end(); i++) + { + fw.indent() << "ProgramLocalParameter " << (*i).first << " " << (*i).second << std::endl; + } std::vector lines; std::istringstream iss(fragmentProgram.getFragmentProgram()); std::string line; - while (std::getline(iss, line)) { - lines.push_back(line); + while (std::getline(iss, line)) + { + lines.push_back(line); } fw.indent() << "code {\n"; fw.moveIn(); std::vector::const_iterator j; - for (j=lines.begin(); j!=lines.end(); ++j) { - fw.indent() << "\"" << *j << "\"\n"; + for (j=lines.begin(); j!=lines.end(); ++j) + { + fw.indent() << "\"" << *j << "\"\n"; } fw.moveOut();