root/OpenSceneGraph/trunk/src/osgPlugins/glsl/ReaderWriterGLSL.cpp @ 10627

Revision 10627, 4.0 kB (checked in by robert, 5 years ago)

From Stephane Lamoliatte, "Here is a patch wich improves the support for geometry shaders in OpenSceneGraph.
It adds new PrimitiveSet? constants for the specific geometry shader primitive types :

  • LINES_ADJACENCY
  • LINE_STRIP_ADJACENCY
  • TRIANGLES_ADJACENCY
  • TRIANGLE_STRIP_ADJACENCY

It also adds some missing features to the glsl reader plug'in.
"

Line 
1#include <osg/Shader>
2#include <osg/Notify>
3#include <osg/GL>
4
5#include <osgDB/Registry>
6#include <osgDB/FileNameUtils>
7#include <osgDB/FileUtils>
8#include <osgDB/fstream>
9
10
11class ReaderWriterGLSL : public osgDB::ReaderWriter
12{
13    public:
14   
15        ReaderWriterGLSL()
16        {
17            supportsExtension("gl","OpenGL Shader Language format");
18            supportsExtension("frag","OpenGL Shader Language format");
19            supportsExtension("vert","OpenGL Shader Language format");
20            supportsExtension("geom","OpenGL Shader Language format");
21            supportsExtension("glsl","OpenGL Shader Language format");
22        }
23   
24        virtual const char* className() const { return "GLSL Shader Reader"; }
25
26        virtual ReadResult readShader(std::istream& fin,const Options* options) const
27        {
28            // read source
29            fin.seekg(0, std::ios::end);
30            int length = fin.tellg();
31            char *text = new char[length + 1];
32            fin.seekg(0, std::ios::beg);
33            fin.read(text, length);
34            text[length] = '\0';
35       
36            // create shader
37            osg::Shader* shader = new osg::Shader();
38            shader->setShaderSource( text );
39
40            // check options which can define the type of the shader program
41            if (options)
42            {
43                if (options->getOptionString().find("fragment")!=std::string::npos) shader->setType(osg::Shader::FRAGMENT);
44                if (options->getOptionString().find("vertex")!=std::string::npos) shader->setType(osg::Shader::VERTEX);
45                if (options->getOptionString().find("geometry")!=std::string::npos) shader->setType(osg::Shader::GEOMETRY);
46            }
47
48            // cleanup
49            delete [] text;
50
51            // return valid shader
52            return shader;
53        }
54
55        virtual ReadResult readShader(const std::string& file, const osgDB::ReaderWriter::Options* options) const
56        {
57            std::string ext = osgDB::getLowerCaseFileExtension(file);
58            if (!acceptsExtension(ext)) return ReadResult::FILE_NOT_HANDLED;
59
60            std::string fileName = osgDB::findDataFile( file, options );
61            if (fileName.empty()) return ReadResult::FILE_NOT_FOUND;
62
63            osgDB::ifstream istream(fileName.c_str(), std::ios::in | std::ios::binary);
64            if(!istream) return ReadResult::FILE_NOT_HANDLED;
65            ReadResult rr = readShader(istream, options);
66            if(rr.validShader())
67            {
68                osg::Shader* shader = rr.getShader();
69                shader->setFileName(file);
70                if (shader->getType() == osg::Shader::UNDEFINED)
71                {
72                    // set type based on filename extension, where possible
73                    if (ext == "frag") shader->setType(osg::Shader::FRAGMENT);
74                    if (ext == "vert") shader->setType(osg::Shader::VERTEX);
75                    if (ext == "geom") shader->setType(osg::Shader::GEOMETRY);
76                }
77            }
78            return rr;
79        }
80
81        virtual WriteResult writeShader(const osg::Shader& shader,std::ostream& fout,const Options* = NULL) const
82        {
83            // get shader source
84            std::string source = shader.getShaderSource();
85           
86            // write source to file
87            fout << source;
88
89            // return all things went fine
90            return WriteResult::FILE_SAVED;
91        }
92
93        virtual WriteResult writeShader(const osg::Shader &shader,const std::string& fileName, const osgDB::ReaderWriter::Options*) const
94        {
95            std::string ext = osgDB::getFileExtension(fileName);
96            if (!acceptsExtension(ext)) return WriteResult::FILE_NOT_HANDLED;
97
98            osgDB::ofstream fout(fileName.c_str(), std::ios::out | std::ios::binary);
99            if(!fout) return WriteResult::ERROR_IN_WRITING_FILE;
100
101            return writeShader(shader, fout);
102        }
103};
104
105// now register with Registry to instantiate the above
106// reader/writer.
107REGISTER_OSGPLUGIN(glsl, ReaderWriterGLSL)
Note: See TracBrowser for help on using the browser.