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

Reply via email to