root/OpenSceneGraph/trunk/src/osgWrappers/deprecated-dotosg/osgTerrain/TerrainTile.cpp @ 13041

Revision 13041, 10.7 kB (checked in by robert, 3 years ago)

Ran script to remove trailing spaces and tabs

  • Property svn:eol-style set to native
Line 
1#include <osgTerrain/TerrainTile>
2
3#include <iostream>
4#include <string>
5
6#include <osg/Vec3>
7#include <osg/Vec4>
8#include <osg/io_utils>
9
10#include <osgDB/ReadFile>
11#include <osgDB/Registry>
12#include <osgDB/Input>
13#include <osgDB/Output>
14#include <osgDB/ParameterOutput>
15
16bool TerrainTile_readLocalData(osg::Object &obj, osgDB::Input &fr);
17bool TerrainTile_writeLocalData(const osg::Object &obj, osgDB::Output &fw);
18
19REGISTER_DOTOSGWRAPPER(TerrainTile_Proxy)
20(
21    new osgTerrain::TerrainTile,
22    "TerrainTile",
23    "Object Node TerrainTile Group",
24    TerrainTile_readLocalData,
25    TerrainTile_writeLocalData
26);
27
28bool TerrainTile_readLocalData(osg::Object& obj, osgDB::Input &fr)
29{
30    osgTerrain::TerrainTile& terrainTile = static_cast<osgTerrain::TerrainTile&>(obj);
31
32    bool itrAdvanced = false;
33
34    osg::ref_ptr<osg::Object> readObject = fr.readObjectOfType(osgDB::type_wrapper<osgTerrain::Locator>());
35    if (readObject.valid()) itrAdvanced = true;
36
37    std::string blendingPolicy;
38    if (fr.read("BlendingPolicy",blendingPolicy))
39    {
40        if (blendingPolicy == "INHERIT") terrainTile.setBlendingPolicy(osgTerrain::TerrainTile::INHERIT);
41        else if (blendingPolicy == "DO_NOT_SET_BLENDING") terrainTile.setBlendingPolicy(osgTerrain::TerrainTile::DO_NOT_SET_BLENDING);
42        else if (blendingPolicy == "ENABLE_BLENDING") terrainTile.setBlendingPolicy(osgTerrain::TerrainTile::ENABLE_BLENDING);
43        else if (blendingPolicy == "ENABLE_BLENDING_WHEN_ALPHA_PRESENT") terrainTile.setBlendingPolicy(osgTerrain::TerrainTile::ENABLE_BLENDING_WHEN_ALPHA_PRESENT);
44    }
45
46    osgTerrain::Locator* locator = dynamic_cast<osgTerrain::Locator*>(readObject.get());
47    if (locator) terrainTile.setLocator(locator);
48
49    if (fr.matchSequence("ElevationLayer {"))
50    {
51        int entry = fr[0].getNoNestedBrackets();
52        fr += 2;
53
54        while (!fr.eof() && fr[0].getNoNestedBrackets()>entry)
55        {
56            bool localAdvanced = false;
57
58            osg::ref_ptr<osg::Object> readObject = fr.readObjectOfType(osgDB::type_wrapper<osgTerrain::Locator>());
59            osgTerrain::Locator* locator = dynamic_cast<osgTerrain::Locator*>(readObject.get());
60            if (readObject.valid()) localAdvanced = true;
61
62            unsigned int minLevel=0;
63            if (fr.read("MinLevel",minLevel))
64            {
65                itrAdvanced = true;
66            }
67
68            unsigned int maxLevel = MAXIMUM_NUMBER_OF_LEVELS;
69            if (fr.read("MaxLevel",maxLevel))
70            {
71                itrAdvanced = true;
72            }
73
74            if (fr.matchSequence("ProxyLayer %s") || fr.matchSequence("ProxyLayer %w") )
75            {
76                osgTerrain::ProxyLayer* proxyLayer = new osgTerrain::ProxyLayer;
77                proxyLayer->setFileName(fr[1].getStr());
78
79                if (locator) proxyLayer->setLocator(locator);
80                if (minLevel!=0) proxyLayer->setMinLevel(minLevel);
81                if (maxLevel!=MAXIMUM_NUMBER_OF_LEVELS) proxyLayer->setMaxLevel(maxLevel);
82
83                terrainTile.setElevationLayer(proxyLayer);
84
85                fr += 2;
86
87                localAdvanced = true;
88            }
89            else
90            {
91                osg::ref_ptr<osg::Object> readObject = fr.readObjectOfType(osgDB::type_wrapper<osgTerrain::Layer>());
92                osgTerrain::Layer* readLayer = dynamic_cast<osgTerrain::Layer*>(readObject.get());
93                if (readLayer)
94                {
95                    if (locator) readLayer->setLocator(locator);
96                    if (minLevel!=0) readLayer->setMinLevel(minLevel);
97                    if (maxLevel!=MAXIMUM_NUMBER_OF_LEVELS) readLayer->setMaxLevel(maxLevel);
98
99                    terrainTile.setElevationLayer(readLayer);
100                }
101
102                if (readObject.valid()) localAdvanced = true;
103            }
104
105            if (!localAdvanced) ++fr;
106        }
107
108        itrAdvanced = true;
109    }
110
111    bool firstMatched = false;
112    if ((firstMatched = fr.matchSequence("ColorLayer %i {")) || fr.matchSequence("ColorLayer {") )
113    {
114        unsigned int layerNum = 0;
115        if (firstMatched)
116        {
117            fr[1].getUInt(layerNum);
118            ++fr;
119        }
120
121        int entry = fr[0].getNoNestedBrackets();
122        fr += 2;
123
124        while (!fr.eof() && fr[0].getNoNestedBrackets()>entry)
125        {
126            bool localAdvanced = false;
127
128            osg::ref_ptr<osg::Object> readObject = fr.readObjectOfType(osgDB::type_wrapper<osgTerrain::Locator>());
129            osgTerrain::Locator* locator = dynamic_cast<osgTerrain::Locator*>(readObject.get());
130            if (readObject.valid()) localAdvanced = true;
131
132            unsigned int minLevel=0;
133            if (fr.read("MinLevel",minLevel))
134            {
135                itrAdvanced = true;
136            }
137
138            unsigned int maxLevel = MAXIMUM_NUMBER_OF_LEVELS;
139            if (fr.read("MaxLevel",maxLevel))
140            {
141                itrAdvanced = true;
142            }
143
144            if (fr.matchSequence("ProxyFile %s") || fr.matchSequence("ProxyFile %w") )
145            {
146                osg::ref_ptr<osg::Object> image = osgDB::readObjectFile(std::string(fr[1].getStr())+".gdal");
147                osgTerrain::ProxyLayer* proxyLayer = dynamic_cast<osgTerrain::ProxyLayer*>(image.get());
148                if (proxyLayer)
149                {
150                    if (locator) proxyLayer->setLocator(locator);
151                    if (minLevel!=0) proxyLayer->setMinLevel(minLevel);
152                    if (maxLevel!=MAXIMUM_NUMBER_OF_LEVELS) proxyLayer->setMaxLevel(maxLevel);
153
154                    terrainTile.setColorLayer(layerNum, proxyLayer);
155                }
156
157                fr += 2;
158
159                localAdvanced = true;
160            }
161            else
162            {
163                osg::ref_ptr<osg::Object> readObject = fr.readObjectOfType(osgDB::type_wrapper<osgTerrain::Layer>());
164                osgTerrain::Layer* readLayer = dynamic_cast<osgTerrain::Layer*>(readObject.get());
165                if (readLayer)
166                {
167                    if (locator) readLayer->setLocator(locator);
168                    if (minLevel!=0) readLayer->setMinLevel(minLevel);
169                    if (maxLevel!=MAXIMUM_NUMBER_OF_LEVELS) readLayer->setMaxLevel(maxLevel);
170
171                    terrainTile.setColorLayer(layerNum, readLayer);
172                }
173
174                if (readObject.valid()) localAdvanced = true;
175            }
176
177            if (!localAdvanced) ++fr;
178        }
179
180        itrAdvanced = true;
181    }
182
183
184    readObject = fr.readObjectOfType(osgDB::type_wrapper<osgTerrain::TerrainTechnique>());
185    if (readObject.valid())
186    {
187        terrainTile.setTerrainTechnique(dynamic_cast<osgTerrain::TerrainTechnique*>(readObject.get()));
188        itrAdvanced = true;
189    }
190
191    if (fr.getOptions())
192    {
193        osg::ref_ptr<osg::Node> node;
194        if (fr.getOptions()->getTerrain().lock(node))
195        {
196            terrainTile.setTerrain(node->asTerrain());
197        }
198    }
199
200    if (osgTerrain::TerrainTile::getTileLoadedCallback().valid())
201        osgTerrain::TerrainTile::getTileLoadedCallback()->loaded(&terrainTile, fr.getOptions());
202
203    return itrAdvanced;
204}
205
206bool TerrainTile_writeLocalData(const osg::Object& obj, osgDB::Output& fw)
207{
208    const osgTerrain::TerrainTile& terrainTile = static_cast<const osgTerrain::TerrainTile&>(obj);
209
210    int prec = fw.precision();
211    fw.precision(15);
212
213    switch(terrainTile.getBlendingPolicy())
214    {
215        case(osgTerrain::TerrainTile::INHERIT): fw.indent()<<"BlendingPolicy INHERIT"<<std::endl; break;
216        case(osgTerrain::TerrainTile::DO_NOT_SET_BLENDING): fw.indent()<<"BlendingPolicy DO_NOT_SET_BLENDING"<<std::endl; break;
217        case(osgTerrain::TerrainTile::ENABLE_BLENDING): fw.indent()<<"BlendingPolicy ENABLE_BLENDING"<<std::endl; break;
218        case(osgTerrain::TerrainTile::ENABLE_BLENDING_WHEN_ALPHA_PRESENT): fw.indent()<<"BlendingPolicy ENABLE_BLENDING_WHEN_ALPHA_PRESENT"<<std::endl; break;
219    }
220
221    if (terrainTile.getLocator())
222    {
223        fw.writeObject(*terrainTile.getLocator());
224    }
225
226    if (terrainTile.getElevationLayer())
227    {
228        fw.indent()<<"ElevationLayer {"<<std::endl;
229
230        fw.moveIn();
231
232        const osgTerrain::ProxyLayer* proxyLayer = dynamic_cast<const osgTerrain::ProxyLayer*>(terrainTile.getElevationLayer());
233        if (proxyLayer)
234        {
235            if (!proxyLayer->getFileName().empty())
236            {
237                const osgTerrain::Locator* locator = proxyLayer->getLocator();
238                if (locator && !locator->getDefinedInFile())
239                {
240                    fw.writeObject(*locator);
241                }
242
243                if (proxyLayer->getMinLevel()!=0)
244                {
245                    fw.indent()<<"MinLevel "<<proxyLayer->getMinLevel()<<std::endl;
246                }
247
248                if (proxyLayer->getMaxLevel()!=MAXIMUM_NUMBER_OF_LEVELS)
249                {
250                    fw.indent()<<"MaxLevel "<<proxyLayer->getMaxLevel()<<std::endl;
251                }
252
253                fw.indent()<<"ProxyLayer "<<proxyLayer->getFileName()<<std::endl;
254            }
255        }
256        else if (terrainTile.getElevationLayer())
257        {
258            fw.writeObject(*terrainTile.getElevationLayer());
259        }
260
261        fw.moveOut();
262
263        fw.indent()<<"}"<<std::endl;
264    }
265
266    for(unsigned int i=0; i<terrainTile.getNumColorLayers(); ++i)
267    {
268        const osgTerrain::Layer* layer = terrainTile.getColorLayer(i);
269        if (layer)
270        {
271            if (i>0)
272            {
273                fw.indent()<<"ColorLayer "<<i<<" {"<<std::endl;
274            }
275            else
276            {
277                fw.indent()<<"ColorLayer {"<<std::endl;
278            }
279
280            fw.moveIn();
281
282            const osgTerrain::ProxyLayer* proxyLayer = dynamic_cast<const osgTerrain::ProxyLayer*>(layer);
283            if (proxyLayer)
284            {
285                const osgTerrain::Locator* locator = proxyLayer->getLocator();
286                if (locator && !locator->getDefinedInFile())
287                {
288                    fw.writeObject(*locator);
289                }
290
291                if (proxyLayer->getMinLevel()!=0)
292                {
293                    fw.indent()<<"MinLevel "<<proxyLayer->getMinLevel()<<std::endl;
294                }
295
296                if (proxyLayer->getMaxLevel()!=MAXIMUM_NUMBER_OF_LEVELS)
297                {
298                    fw.indent()<<"MaxLevel "<<proxyLayer->getMaxLevel()<<std::endl;
299                }
300
301                if (!proxyLayer->getFileName().empty()) fw.indent()<<"ProxyLayer "<<proxyLayer->getFileName()<<std::endl;
302            }
303            else if (layer)
304            {
305                fw.writeObject(*terrainTile.getColorLayer(i));
306            }
307
308            fw.moveOut();
309
310            fw.indent()<<"}"<<std::endl;
311        }
312    }
313
314    if (terrainTile.getTerrainTechnique())
315    {
316        fw.writeObject(*terrainTile.getTerrainTechnique());
317    }
318
319    fw.precision(prec);
320
321    return true;
322}
Note: See TracBrowser for help on using the browser.