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

Revision 13041, 8.7 kB (checked in by robert, 3 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#include "osg/ProxyNode"
2#include "osg/Notify"
3#include <osg/io_utils>
4
5#include "osgDB/Registry"
6#include "osgDB/Input"
7#include "osgDB/Output"
8#include <osgDB/ReadFile>
9#include <osgDB/WriteFile>
10#include <osgDB/FileUtils>
11#include <osgDB/FileNameUtils>
12
13using namespace osg;
14using namespace osgDB;
15
16// forward declare functions to use later.
17bool ProxyNode_readLocalData(Object& obj, Input& fr);
18bool ProxyNode_writeLocalData(const Object& obj, Output& fw);
19
20// register the read and write functions with the osgDB::Registry.
21REGISTER_DOTOSGWRAPPER(ProxyNode)
22(
23    new osg::ProxyNode,
24    "ProxyNode",
25    "Object Node ProxyNode",
26    &ProxyNode_readLocalData,
27    &ProxyNode_writeLocalData
28);
29
30bool ProxyNode_readLocalData(Object& obj, Input& fr)
31{
32    bool iteratorAdvanced = false;
33
34    ProxyNode& proxyNode = static_cast<ProxyNode&>(obj);
35
36    if (fr.matchSequence("Center %f %f %f"))
37    {
38        Vec3 center;
39        fr[1].getFloat(center[0]);
40        fr[2].getFloat(center[1]);
41        fr[3].getFloat(center[2]);
42        proxyNode.setCenter(center);
43
44        iteratorAdvanced = true;
45        fr+=4;
46    }
47    else
48        proxyNode.setCenterMode(osg::ProxyNode::USE_BOUNDING_SPHERE_CENTER);
49
50    if (fr.matchSequence("ExtRefMode %s") || fr.matchSequence("ExtRefMode %w"))
51    {
52        if      (fr[1].matchWord("LOAD_IMMEDIATELY"))
53            proxyNode.setLoadingExternalReferenceMode(ProxyNode::LOAD_IMMEDIATELY);
54        else if (fr[1].matchWord("DEFER_LOADING_TO_DATABASE_PAGER"))
55            proxyNode.setLoadingExternalReferenceMode(ProxyNode::DEFER_LOADING_TO_DATABASE_PAGER);
56        else if (fr[1].matchWord("NO_AUTOMATIC_LOADING"))
57            proxyNode.setLoadingExternalReferenceMode(ProxyNode::NO_AUTOMATIC_LOADING);
58
59        fr+=2;
60        iteratorAdvanced = true;
61    }
62
63    float radius;
64    if (fr[0].matchWord("Radius") && fr[1].getFloat(radius))
65    {
66        proxyNode.setRadius(radius);
67        fr+=2;
68        iteratorAdvanced = true;
69    }
70
71    if (fr.getOptions() && !fr.getOptions()->getDatabasePathList().empty())
72    {
73        const std::string& path = fr.getOptions()->getDatabasePathList().front();
74        if (!path.empty())
75        {
76            proxyNode.setDatabasePath(path);
77        }
78    }
79
80    bool matchFirst;
81    if ((matchFirst=fr.matchSequence("FileNameList {")) || fr.matchSequence("FileNameList %i {"))
82    {
83
84        // set up coordinates.
85        int entry = fr[0].getNoNestedBrackets();
86        if (matchFirst)
87        {
88            fr += 2;
89        }
90        else
91        {
92            fr += 3;
93        }
94
95        unsigned int i=0;
96        while (!fr.eof() && fr[0].getNoNestedBrackets()>entry)
97        {
98            if (fr[0].isString() || fr[0].isQuotedString())
99            {
100                if (fr[0].getStr()) proxyNode.setFileName(i,fr[0].getStr());
101                else proxyNode.setFileName(i,"");
102
103                ++fr;
104                ++i;
105            }
106            else
107            {
108                ++fr;
109            }
110        }
111
112        iteratorAdvanced = true;
113        ++fr;
114
115    }
116
117    unsigned int num_children = 0;
118    if (fr[0].matchWord("num_children") &&
119        fr[1].getUInt(num_children))
120    {
121        // could allocate space for children here...
122        fr+=2;
123        iteratorAdvanced = true;
124    }
125
126    unsigned int i;
127    for(i=0; i<num_children; i++)
128    {
129        osgDB::FilePathList& fpl = ((osgDB::ReaderWriter::Options*)fr.getOptions())->getDatabasePathList();
130        fpl.push_front( fpl.empty() ? osgDB::getFilePath(proxyNode.getFileName(i)) : fpl.front()+'/'+ osgDB::getFilePath(proxyNode.getFileName(i)));
131        Node* node = NULL;
132        if((node=fr.readNode())!=NULL)
133        {
134            proxyNode.addChild(node);
135            iteratorAdvanced = true;
136        }
137        fpl.pop_front();
138    }
139
140    if(proxyNode.getLoadingExternalReferenceMode() == ProxyNode::LOAD_IMMEDIATELY)
141    {
142        for(i=0; i<proxyNode.getNumFileNames(); i++)
143        {
144            if(i>=proxyNode.getNumChildren() && !proxyNode.getFileName(i).empty())
145            {
146                osgDB::FilePathList& fpl = ((osgDB::ReaderWriter::Options*)fr.getOptions())->getDatabasePathList();
147                fpl.push_front( fpl.empty() ? osgDB::getFilePath(proxyNode.getFileName(i)) : fpl.front()+'/'+ osgDB::getFilePath(proxyNode.getFileName(i)));
148                osg::Node *node = osgDB::readNodeFile(proxyNode.getFileName(i), fr.getOptions());
149                fpl.pop_front();
150                if(node)
151                {
152                    proxyNode.insertChild(i, node);
153                }
154            }
155        }
156    }
157
158    return iteratorAdvanced;
159}
160
161
162bool ProxyNode_writeLocalData(const Object& obj, Output& fw)
163{
164    bool includeExternalReferences = false;
165    bool useOriginalExternalReferences = true;
166    bool writeExternalReferenceFiles = false;
167    if (fw.getOptions())
168    {
169        std::string optionsString = fw.getOptions()->getOptionString();
170        includeExternalReferences = optionsString.find("includeExternalReferences")!=std::string::npos;
171        bool newExternals = optionsString.find("writeExternalReferenceFiles")!=std::string::npos;
172        if (newExternals)
173        {
174            useOriginalExternalReferences = false;
175            writeExternalReferenceFiles = true;
176        }
177    }
178    const ProxyNode& proxyNode = static_cast<const ProxyNode&>(obj);
179
180    if (proxyNode.getCenterMode()==osg::ProxyNode::USER_DEFINED_CENTER) fw.indent() << "Center "<< proxyNode.getCenter() << std::endl;
181
182    fw.indent() << "ExtRefMode ";
183
184    switch(proxyNode.getLoadingExternalReferenceMode())
185    {
186    case ProxyNode::LOAD_IMMEDIATELY:
187        fw.indent() << "LOAD_IMMEDIATELY" <<std::endl;
188        break;
189    case ProxyNode::DEFER_LOADING_TO_DATABASE_PAGER:
190        fw.indent() << "DEFER_LOADING_TO_DATABASE_PAGER" <<std::endl;
191        break;
192    case ProxyNode::NO_AUTOMATIC_LOADING:
193        fw.indent() << "NO_AUTOMATIC_LOADING" <<std::endl;
194        break;
195    }
196
197    fw.indent() << "Radius "<<proxyNode.getRadius()<<std::endl;
198
199    fw.indent() << "FileNameList "<<proxyNode.getNumFileNames()<<" {"<< std::endl;
200    fw.moveIn();
201
202    unsigned int numChildrenToWriteOut = 0;
203
204    for(unsigned int i=0; i<proxyNode.getNumFileNames();++i)
205    {
206        if (proxyNode.getFileName(i).empty())
207        {
208            fw.indent() << "\"\"" << std::endl;
209            ++numChildrenToWriteOut;
210        }
211        else
212        {
213            if(useOriginalExternalReferences)
214            {
215                fw.indent() << proxyNode.getFileName(i) << std::endl;
216            }
217            else
218            {
219                std::string path = osgDB::getFilePath(fw.getFileName());
220                std::string new_filename = osgDB::getStrippedName(proxyNode.getFileName(i)) +".osg";
221                std::string osgname = path.empty() ? new_filename :  (path +"/"+ new_filename) ;
222                fw.indent() << osgname << std::endl;
223            }
224        }
225    }
226    fw.moveOut();
227    fw.indent() << "}"<< std::endl;
228
229
230    if(includeExternalReferences) //out->getIncludeExternalReferences()) // inlined mode
231    {
232        fw.indent() << "num_children " << proxyNode.getNumChildren() << std::endl;
233        for(unsigned int i=0; i<proxyNode.getNumChildren(); i++)
234        {
235            fw.writeObject(*proxyNode.getChild(i));
236        }
237    }
238    else //----------------------------------------- no inlined mode
239    {
240        fw.indent() << "num_children " << numChildrenToWriteOut << std::endl;
241        for(unsigned int i=0; i<proxyNode.getNumChildren(); ++i)
242        {
243            if (proxyNode.getFileName(i).empty())
244            {
245                fw.writeObject(*proxyNode.getChild(i));
246            }
247            else if(writeExternalReferenceFiles) //out->getWriteExternalReferenceFiles())
248            {
249                if(useOriginalExternalReferences) //out->getUseOriginalExternalReferences())
250                {
251                    std::string origname = proxyNode.getFileName(i);
252                    if (!fw.getExternalFileWritten(origname))
253                    {
254                        osgDB::writeNodeFile(*proxyNode.getChild(i), origname);
255                        fw.setExternalFileWritten(origname, true);
256                    }
257                }
258                else
259                {
260                    std::string path = osgDB::getFilePath(fw.getFileName());
261                    std::string new_filename = osgDB::getStrippedName(proxyNode.getFileName(i)) +".osg";
262                    std::string osgname = path.empty() ? new_filename :  (path +"/"+ new_filename) ;
263                    if (!fw.getExternalFileWritten(osgname))
264                    {
265                        osgDB::writeNodeFile(*proxyNode.getChild(i), osgname);
266                        fw.setExternalFileWritten(osgname, true);
267                    }
268                }
269            }
270        }
271    }
272
273    return true;
274}
Note: See TracBrowser for help on using the browser.