1 #include "osg/Program"
2 #include "osg/Shader"
3 
4 #include "osgDB/Registry"
5 #include "osgDB/Input"
6 #include "osgDB/Output"
7 
8 using namespace osg;
9 using namespace osgDB;
10 using namespace std;
11 
12 extern bool Geometry_matchPrimitiveModeStr(const char* str, GLenum& mode);
13 extern const char* Geometry_getPrimitiveModeStr(GLenum mode);
14 
15 // forward declare functions to use later.
16 bool Program_readLocalData(Object& obj, Input& fr);
17 bool Program_writeLocalData(const Object& obj, Output& fw);
18 
19 // register the read and write functions with the osgDB::Registry.
20 REGISTER_DOTOSGWRAPPER(Program)
21 (
22     new osg::Program,
23     "Program",
24     "Object StateAttribute Program",
25     &Program_readLocalData,
PositionAttitudeTransform_readLocalData(Object & obj,Input & fr)26     &Program_writeLocalData
27 );
28 
29 
30 bool Program_readLocalData(Object& obj, Input& fr)
31 {
32     bool iteratorAdvanced = false;
33 
34     Program& program = static_cast<Program&>(obj);
35 
36     if(fr.matchSequence("GeometryVerticesOut %i"))
37     {
38         unsigned int verticesOut;
39         fr[1].getUInt(verticesOut);
40         program.setParameter(GL_GEOMETRY_VERTICES_OUT_EXT, verticesOut);
41         fr += 2;
42         iteratorAdvanced = true;
43     }
44 
45     if(fr.matchSequence("GeometryInputType %w"))
46     {
47         std::string primitiveMode = fr[1].getStr();
48         GLenum mode;
49         if(Geometry_matchPrimitiveModeStr(primitiveMode.c_str(), mode))
50             program.setParameter(GL_GEOMETRY_INPUT_TYPE_EXT, mode);
51         fr += 2;
52         iteratorAdvanced = true;
53     }
54 
55     if(fr.matchSequence("GeometryOutputType %w"))
56     {
57         std::string primitiveMode = fr[1].getStr();
58         GLenum mode;
59         if(Geometry_matchPrimitiveModeStr(primitiveMode.c_str(), mode))
60             program.setParameter(GL_GEOMETRY_OUTPUT_TYPE_EXT, mode);
61         fr += 2;
62         iteratorAdvanced = true;
63     }
64 
65     while(fr.matchSequence("AttribBindingLocation %i %w"))
66     {
67         unsigned int index;
68         fr[1].getUInt(index);
69         program.addBindAttribLocation(fr[2].getStr(), index);
70         fr += 3;
71         iteratorAdvanced = true;
72     }
73 
74 
75     while(fr.matchSequence("AttribBindingLocation %w %i"))
76     {
77         unsigned int index;
78         fr[2].getUInt(index);
79         program.addBindAttribLocation(fr[1].getStr(), index);
80         fr += 3;
81         iteratorAdvanced = true;
82     }
83 
84     int num_shaders;
85     if (fr[0].matchWord("num_shaders") &&
86         fr[1].getInt(num_shaders))
87     {
88         // could allocate space for shaders here...
PositionAttitudeTransform_writeLocalData(const Object & obj,Output & fw)89         fr+=2;
90         iteratorAdvanced = true;
91     }
92 
93     Object* object = NULL;
94     while((object=fr.readObject())!=NULL)
95     {
96         program.addShader(dynamic_cast<Shader*>(object));
97         iteratorAdvanced = true;
98     }
99 
100     return iteratorAdvanced;
101 }
102 
103 
104 bool Program_writeLocalData(const Object& obj,Output& fw)
105 {
106     const Program& program = static_cast<const Program&>(obj);
107 
108     fw.indent() << "GeometryVerticesOut " << program.getParameter(GL_GEOMETRY_VERTICES_OUT_EXT) << std::endl;
109     fw.indent() << "GeometryInputType " << Geometry_getPrimitiveModeStr(program.getParameter(GL_GEOMETRY_INPUT_TYPE_EXT)) << std::endl;
110     fw.indent() << "GeometryOutputType " << Geometry_getPrimitiveModeStr(program.getParameter(GL_GEOMETRY_OUTPUT_TYPE_EXT)) << std::endl;
111 
112     const Program::AttribBindingList& abl = program.getAttribBindingList();
113     Program::AttribBindingList::const_iterator i;
114     for(i=abl.begin(); i!=abl.end(); i++)
115     {
116         fw.indent() << "AttribBindingLocation " << (*i).first << " " << (*i).second << std::endl;
117     }
118 
119     fw.indent() << "num_shaders " << program.getNumShaders() << std::endl;
120     for(unsigned int ic=0;ic<program.getNumShaders();++ic)
121     {
122         fw.writeObject(*program.getShader(ic));
123     }
124 
125     return true;
126 }
127