root/OpenSceneGraph/trunk/src/osgWrappers/deprecated-dotosg/osg/Material.cpp @ 13041

Revision 13041, 6.9 kB (checked in by robert, 2 years ago)

Ran script to remove trailing spaces and tabs

  • Property svn:eol-style set to native
  • Property svn:keywords set to Author Date Id Revision
Line 
1#if defined(_MSC_VER)
2    #pragma warning( disable : 4786 )
3#endif
4
5#include "osg/Material"
6#include <osg/io_utils>
7
8#include "osgDB/Registry"
9#include "osgDB/Input"
10#include "osgDB/Output"
11
12using namespace osg;
13using namespace osgDB;
14
15// forward declare functions to use later.
16bool Material_readLocalData(Object& obj, Input& fr);
17bool Material_writeLocalData(const Object& obj, Output& fw);
18bool Material_matchFaceAndColor(Input& fr,const char* name,Material::Face& mf,Vec4& color);
19
20// register the read and write functions with the osgDB::Registry.
21REGISTER_DOTOSGWRAPPER(Material)
22(
23    new osg::Material,
24    "Material",
25    "Object StateAttribute Material",
26    &Material_readLocalData,
27    &Material_writeLocalData
28);
29
30
31bool Material_readLocalData(Object& obj, Input& fr)
32{
33    bool iteratorAdvanced = false;
34
35    Material& material = static_cast<Material&>(obj);
36
37    Vec4 data(0.0f,  0.0f, 0.0f, 1.0f);
38    Material::Face mf = Material::FRONT_AND_BACK;
39
40    if (fr[0].matchWord("ColorMode"))
41    {
42        if (fr[1].matchWord("AMBIENT"))
43        {
44            material.setColorMode(Material::AMBIENT);
45            fr+=2;
46            iteratorAdvanced = true;
47        }
48        else if (fr[1].matchWord("DIFFUSE"))
49        {
50            material.setColorMode(Material::DIFFUSE);
51            fr+=2;
52            iteratorAdvanced = true;
53        }
54        else if (fr[1].matchWord("SPECULAR"))
55        {
56            material.setColorMode(Material::SPECULAR);
57            fr+=2;
58            iteratorAdvanced = true;
59        }
60        else if (fr[1].matchWord("EMISSION"))
61        {
62            material.setColorMode(Material::EMISSION);
63            fr+=2;
64            iteratorAdvanced = true;
65        }
66        else if (fr[1].matchWord("AMBIENT_AND_DIFFUSE"))
67        {
68            material.setColorMode(Material::AMBIENT_AND_DIFFUSE);
69            fr+=2;
70            iteratorAdvanced = true;
71        }
72        else if (fr[1].matchWord("OFF"))
73        {
74            material.setColorMode(Material::OFF);
75            fr+=2;
76            iteratorAdvanced = true;
77        }
78
79    }
80
81    if (Material_matchFaceAndColor(fr,"ambientColor",mf,data))
82    {
83        material.setAmbient(mf,data);
84        iteratorAdvanced = true;
85    }
86
87    if (Material_matchFaceAndColor(fr,"diffuseColor",mf,data))
88    {
89        material.setDiffuse(mf,data);
90        iteratorAdvanced = true;
91    }
92
93    if (Material_matchFaceAndColor(fr,"specularColor",mf,data))
94    {
95        material.setSpecular(mf,data);
96        iteratorAdvanced = true;
97    }
98
99    if (Material_matchFaceAndColor(fr,"emissionColor",mf,data) ||
100        Material_matchFaceAndColor(fr,"emissiveColor",mf,data))
101    {
102        material.setEmission(mf,data);
103        iteratorAdvanced = true;
104    }
105
106    if (Material_matchFaceAndColor(fr,"ambientColor",mf,data))
107    {
108        material.setAmbient(mf,data);
109        iteratorAdvanced = true;
110    }
111
112    float shininess = 0.0f;
113    if (fr[0].matchWord("shininess"))
114    {
115
116        mf = Material::FRONT_AND_BACK;
117        int fr_inc = 1;
118
119        if (fr[1].matchWord("FRONT"))
120        {
121            mf = Material::FRONT;
122            ++fr_inc;
123        }
124        else if (fr[1].matchWord("BACK"))
125        {
126            mf = Material::BACK;
127            ++fr_inc;
128        }
129
130        if (fr[fr_inc].getFloat(shininess))
131        {
132            fr+=(fr_inc+1);
133            material.setShininess(mf,shininess);
134            iteratorAdvanced = true;
135        }
136
137    }
138
139    float transparency = 0.0f;
140    if (fr[0].matchWord("transparency") && fr[1].getFloat(transparency))
141    {
142
143        material.setTransparency(Material::FRONT_AND_BACK,transparency);
144
145        fr+=2;
146        iteratorAdvanced = true;
147    }
148
149    return iteratorAdvanced;
150
151}
152
153bool Material_matchFaceAndColor(Input& fr,const char* name,Material::Face& mf,Vec4& color)
154{
155    bool iteratorAdvanced = false;
156
157    if (fr[0].matchWord(name))
158    {
159        int fr_inc = 1;
160        if (fr[1].matchWord("FRONT"))
161        {
162            mf = Material::FRONT;
163            ++fr_inc;
164        }
165        else if (fr[1].matchWord("BACK"))
166        {
167            mf = Material::BACK;
168            ++fr_inc;
169        }
170
171        if (fr[fr_inc].getFloat(color[0]) && fr[fr_inc+1].getFloat(color[1]) && fr[fr_inc+2].getFloat(color[2]))
172        {
173            fr_inc += 3;
174
175            if (fr[fr_inc].getFloat(color[3])) ++fr_inc;
176            else color[3] = 1.0f;
177
178            fr+=fr_inc;
179
180            iteratorAdvanced = true;
181        }
182    }
183
184    return iteratorAdvanced;
185}
186
187
188bool Material_writeLocalData(const Object& obj, Output& fw)
189{
190
191    const Material& material = static_cast<const Material&>(obj);
192
193    switch(material.getColorMode())
194    {
195        case(Material::AMBIENT): fw.indent() << "ColorMode AMBIENT" << std::endl; break;
196        case(Material::DIFFUSE): fw.indent() << "ColorMode DIFFUSE" << std::endl; break;
197        case(Material::SPECULAR): fw.indent() << "ColorMode SPECULAR" << std::endl; break;
198        case(Material::EMISSION): fw.indent() << "ColorMode EMISSION" << std::endl; break;
199        case(Material::AMBIENT_AND_DIFFUSE): fw.indent() << "ColorMode AMBIENT_AND_DIFFUSE" << std::endl; break;
200        case(Material::OFF): fw.indent() << "ColorMode OFF" << std::endl; break;
201    }
202
203    if (material.getAmbientFrontAndBack())
204    {
205        fw.indent() << "ambientColor " << material.getAmbient(Material::FRONT) << std::endl;
206    }
207    else
208    {
209        fw.indent() << "ambientColor FRONT " << material.getAmbient(Material::FRONT) << std::endl;
210        fw.indent() << "ambientColor BACK  " << material.getAmbient(Material::BACK)  << std::endl;
211    }
212
213    if (material.getDiffuseFrontAndBack())
214    {
215        fw.indent() << "diffuseColor " << material.getDiffuse(Material::FRONT) << std::endl;
216    }
217    else
218    {
219        fw.indent() << "diffuseColor FRONT " << material.getDiffuse(Material::FRONT) << std::endl;
220        fw.indent() << "diffuseColor BACK  " << material.getDiffuse(Material::BACK) << std::endl;
221    }
222
223    if (material.getSpecularFrontAndBack())
224    {
225        fw.indent() << "specularColor " << material.getSpecular(Material::FRONT) << std::endl;
226    }
227    else
228    {
229        fw.indent() << "specularColor FRONT " << material.getSpecular(Material::FRONT) << std::endl;
230        fw.indent() << "specularColor BACK  " << material.getSpecular(Material::BACK) << std::endl;
231    }
232
233    if (material.getEmissionFrontAndBack())
234    {
235        fw.indent() << "emissionColor " << material.getEmission(Material::FRONT) << std::endl;
236    }
237    else
238    {
239        fw.indent() << "emissionColor FRONT " << material.getEmission(Material::FRONT) << std::endl;
240        fw.indent() << "emissionColor BACK  " << material.getEmission(Material::BACK)  << std::endl;
241    }
242
243    if (material.getShininessFrontAndBack())
244    {
245        fw.indent() << "shininess " << material.getShininess(Material::FRONT) << std::endl;
246    }
247    else
248    {
249        fw.indent() << "shininess FRONT " << material.getShininess(Material::FRONT) << std::endl;
250        fw.indent() << "shininess BACK  " << material.getShininess(Material::BACK) << std::endl;
251    }
252
253    return true;
254}
Note: See TracBrowser for help on using the browser.