Thanks JS, changes now merged and submitted to svn/trunk.
On Tue, Nov 24, 2009 at 5:04 PM, Jean-Sébastien Guay <[email protected]> wrote: > Hi Robert, > > Explanation: > > Currently osg2cpp removes "\n" line endings to replace them with a textual > equivalent ("\\n") in order for the string representing the shader to > contain line endings in the string. But if the file that was read contained > Windows line endings ("\r\n"), the resulting file looked really weird (the > \r were left there and editors interpreted that as an additional newline). > Also, I can imagine that if the shader file that was read had Mac line > endings ("\r") then the output shader would all end up in one long line > since there are no "\n"... > > What I've done: > > I've added a search and replace of "\r\n" to "\n", and then "\r" to "\n" > (note that the order is important). > > I've also changed the filename handling so that the output file will be put > in the same directory as the input file in case it was specified with a > path. Previous functionality is retained for files specified with the > filename only. > > Thanks, > > J-S > -- > ______________________________________________________ > Jean-Sebastien Guay [email protected] > http://www.cm-labs.com/ > http://whitestar02.webhop.org/ > > #include <osg/ArgumentParser> > #include <osg/ApplicationUsage> > > #include <osgDB/ReadFile> > #include <osgDB/FileNameUtils> > #include <osgDB/fstream> > > #include <iostream> > > // Search in str for all occurences of spat and replace them with rpat. > void searchAndReplace(std::string& str, const std::string& spat, const > std::string& rpat) > { > std::string::size_type pos = 0; > while ((pos = str.find(spat, pos)) != std::string::npos) > { > str.replace(pos, spat.length(), rpat); > } > } > > void writeShader(osg::Shader* shader, const std::string& cppFileName, const > std::string& variableName) > { > osgDB::ofstream fout(cppFileName.c_str()); > if (!fout) > { > std::cout<<"Error: could not open file `"<<cppFileName<<"` for > writing."<<std::endl; > } > > std::string shaderSource = shader->getShaderSource(); > searchAndReplace(shaderSource, "\r\n", "\n"); > searchAndReplace(shaderSource, "\r", "\n"); > > std::string variableString = std::string("char > ")+variableName+std::string("[] = "); > > std::string::size_type startOfLine = 0; > std::string::size_type endOfLine = shaderSource.find_first_of('\n', > startOfLine); > > if (endOfLine==std::string::npos) > { > fout<<variableString<<shaderSource<<"\\n\";"<<std::endl; > } > else > { > std::string padding(variableString.size(),' '); > > > fout<<variableString<<"\""<<shaderSource.substr(startOfLine,endOfLine-startOfLine)<<"\\n\""<<std::endl; > startOfLine = endOfLine+1; > endOfLine = shaderSource.find_first_of('\n', startOfLine); > > while (endOfLine != std::string::npos) > { > > fout<<padding<<"\""<<shaderSource.substr(startOfLine,endOfLine-startOfLine)<<"\\n\""<<std::endl; > startOfLine = endOfLine + 1; > endOfLine = shaderSource.find_first_of('\n', startOfLine); > } > > fout<<padding<<"\""<<shaderSource.substr(startOfLine,endOfLine-startOfLine)<<"\\n\";"<<std::endl; > } > std::cout<<"Written shader to `"<<cppFileName<<"`"<<std::endl; > } > > int main( int argc, char **argv ) > { > // use an ArgumentParser object to manage the program arguments. > osg::ArgumentParser arguments(&argc,argv); > > // set up the usage document, in case we need to print out how to use > this program. > > arguments.getApplicationUsage()->setApplicationName(arguments.getApplicationName()); > > arguments.getApplicationUsage()->setDescription(arguments.getApplicationName()+" > is a utility for converting between various input and output databases > formats."); > > arguments.getApplicationUsage()->setCommandLineUsage(arguments.getApplicationName()+" > [options] filename ..."); > arguments.getApplicationUsage()->addCommandLineOption("--shader > <filename>","Shader file to create a .cpp file for."); > arguments.getApplicationUsage()->addCommandLineOption("-h or > --help","Display command line parameters"); > > // if user request help write it out to cout. > if (arguments.read("-h") || arguments.read("--help")) > { > arguments.getApplicationUsage()->write(std::cout); > return 1; > } > > std::string filename; > if (arguments.read("--shader",filename)) > { > osg::ref_ptr<osg::Shader> shader = osgDB::readShaderFile(filename); > if (shader.valid()) > { > std::string name = osgDB::getStrippedName(filename); > std::string path = osgDB::getFilePath(filename); > std::string invalidCharacters = "-+/\\*=(){}[]:;<>,.?@'~#`!\""; > std::string numbericCharacters = "0123456789"; > std::string::size_type pos = > name.find_first_of(invalidCharacters); > while (pos != std::string::npos) > { > name[pos] = '_'; > pos = name.find_first_of(invalidCharacters); > } > > std::string ext = osgDB::getFileExtension(filename); > std::string cppFileName = osgDB::concatPaths(path, name + "_" + > ext + ".cpp"); > std::string variableName = name + "_" + ext; > writeShader(shader.get(), cppFileName, variableName); > > return 0; > } > else > { > std::cout<<"Error: could not find file > '"<<filename<<"'"<<std::endl; > return 1; > } > > } > > std::cout<<"No appropriate command line options used."<<std::endl; > > arguments.getApplicationUsage()->write(std::cout); > return 1; > } > > _______________________________________________ > osg-submissions mailing list > [email protected] > http://lists.openscenegraph.org/listinfo.cgi/osg-submissions-openscenegraph.org > > _______________________________________________ osg-submissions mailing list [email protected] http://lists.openscenegraph.org/listinfo.cgi/osg-submissions-openscenegraph.org
