root/OpenSceneGraph/trunk/src/osgPlugins/ive/ProxyNode.cpp @ 13041

Revision 13041, 6.8 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/**********************************************************************
2 *
3 *    FILE:            ProxyNode.cpp
4 *
5 *    DESCRIPTION:    Read/Write osg::ProxyNode in binary format to disk.
6 *
7 *    CREATED BY:        Auto generated by iveGenerate
8 *                    and later modified by Rune Schmidt Jensen.
9 *
10 *    HISTORY:        Created 24.3.2003
11 *
12 *    Copyright 2003 VR-C
13 **********************************************************************/
14
15#include <osgDB/WriteFile>
16#include <osgDB/ReadFile>
17#include <osgDB/FileUtils>
18#include <osgDB/FileNameUtils>
19#include <osg/Notify>
20
21#include "Exception.h"
22#include "ProxyNode.h"
23#include "Node.h"
24
25using namespace ive;
26/*
27for(osgDB::FilePathList::iterator itr=osgDB::getDataFilePathList().begin(); itr!=osgDB::getDataFilePathList().end(); ++itr)
28printf("#1######%s\n", itr->c_str());
29for(osgDB::FilePathList::const_iterator itrO=in->getOptions()->getDatabasePathList().begin(); itrO!=in->getOptions()->getDatabasePathList().end(); ++itrO)
30printf("#2######%s\n", itrO->c_str());
31namespace osgDB {
32class PushAndPopDataPath
33{
34    public:
35        PushAndPopDataPath(const std::string& path)
36        {
37            getDataFilePathList().push_front(path);
38        }
39
40        ~PushAndPopDataPath()
41        {
42            getDataFilePathList().pop_front();
43        }
44};
45}
46*/
47
48void ProxyNode::write(DataOutputStream* out)
49{
50    // Write ProxyNode's identification.
51    out->writeInt(IVEPROXYNODE);
52
53    // If the osg class is inherited by any other class we should also write this to file.
54    osg::Node* node = dynamic_cast<osg::Node*>(this);
55    if(node)
56    {
57        static_cast<ive::Node*>(node)->write(out);
58    }
59    else
60        out_THROW_EXCEPTION("ProxyNode::write(): Could not cast this osg::ProxyNode to an osg::Node.");
61
62    out->writeFloat(getRadius());
63    out->writeInt(getCenterMode());
64    out->writeVec3(getCenter());
65
66    out->writeUInt(getNumFileNames());
67    unsigned int numChildrenToWriteOut = 0;
68    unsigned int i;
69
70    std::string writeDirectory;
71    if (!(out->getOptions()->getDatabasePathList().empty())) writeDirectory = out->getOptions()->getDatabasePathList().front();
72
73    if (!writeDirectory.empty()) writeDirectory = writeDirectory + "/";
74
75    bool writeOutExternalIVEFIles = !out->getIncludeExternalReferences() && out->getWriteExternalReferenceFiles() && !out->getUseOriginalExternalReferences();
76
77    for(i=0; i<getNumFileNames(); i++)
78    {
79        if (getFileName(i).empty())
80        {
81            out->writeString("");
82
83            if (i<getNumChildren()) ++numChildrenToWriteOut;
84        }
85        else
86        {
87            if(!writeOutExternalIVEFIles)
88            {
89                out->writeString(getFileName(i));
90            }
91            else
92            {
93                std::string ivename = writeDirectory + osgDB::getStrippedName(getFileName(i)) +".ive";
94                out->writeString(ivename);
95            }
96        }
97    }
98
99    if(out->getIncludeExternalReferences()) //--------- inlined mode
100    {
101        out->writeUInt(getNumChildren());
102        for(i=0; i<getNumChildren(); i++)
103        {
104            out->writeNode(getChild(i));
105        }
106    }
107    else //----------------------------------------- no inlined mode
108    {
109        out->writeUInt(numChildrenToWriteOut);
110
111        for(i=0; i<getNumFileNames(); i++)
112        {
113            if (i<getNumChildren())
114            {
115                if (getFileName(i).empty())
116                {
117                    out->writeNode(getChild(i));
118                }
119                else if(out->getWriteExternalReferenceFiles())
120                {
121                    if(!writeOutExternalIVEFIles)
122                    {
123                        if (!out->getExternalFileWritten(getFileName(i)))
124                        {
125                            osgDB::writeNodeFile(*getChild(i), getFileName(i));
126                            out->setExternalFileWritten(getFileName(i), true);
127                        }
128                    }
129                    else
130                    {
131                        std::string ivename = writeDirectory + osgDB::getStrippedName(getFileName(i)) +".ive";
132                        if (!out->getExternalFileWritten(ivename))
133                        {
134                            osgDB::writeNodeFile(*getChild(i), ivename);
135                            out->setExternalFileWritten(ivename, true);
136                        }
137                    }
138                }
139            }
140        }
141    }
142}
143
144void ProxyNode::read(DataInputStream* in)
145{
146    // Peek on ProxyNode's identification.
147    int id = in->peekInt();
148    if(id == IVEPROXYNODE)
149    {
150        // Read ProxyNode's identification.
151        id = in->readInt();
152        // If the osg class is inherited by any other class we should also read this from file.
153        osg::Node* node = dynamic_cast<osg::Node*>(this);
154        if(node)
155        {
156            ((ive::Node*)(node))->read(in);
157        }
158        else
159            in_THROW_EXCEPTION("ProxyNode::read(): Could not cast this osg::ProxyNode to an osg::Node.");
160
161        if (in->getOptions() && !in->getOptions()->getDatabasePathList().empty())
162        {
163            const std::string& path = in->getOptions()->getDatabasePathList().front();
164            if (!path.empty())
165            {
166                setDatabasePath(path);
167            }
168        }
169
170        setRadius(in->readFloat());
171        setCenterMode((osg::ProxyNode::CenterMode)in->readInt());
172        setCenter(in->readVec3());
173
174        unsigned int numFileNames = in->readUInt();
175        unsigned int i;
176        for(i=0; i<numFileNames; i++)
177        {
178            setFileName(i, in->readString());
179        }
180
181        unsigned int numChildren = in->readUInt();
182        for(i=0; i<numChildren; i++)
183        {
184            osgDB::FilePathList& fpl = ((osgDB::ReaderWriter::Options*)in->getOptions())->getDatabasePathList();
185            fpl.push_front( fpl.empty() ? osgDB::getFilePath(getFileName(i)) : fpl.front()+'/'+ osgDB::getFilePath(getFileName(i)));
186            addChild(in->readNode());
187            fpl.pop_front();
188        }
189
190        if( in->getLoadExternalReferenceFiles() )
191        {
192            for(i=0; i<numFileNames; i++)
193            {
194                if(i>=numChildren && !getFileName(i).empty())
195                {
196                    osgDB::FilePathList& fpl = ((osgDB::ReaderWriter::Options*)in->getOptions())->getDatabasePathList();
197                    fpl.push_front( fpl.empty() ? osgDB::getFilePath(getFileName(i)) : fpl.front()+'/'+ osgDB::getFilePath(getFileName(i)));
198                    osg::Node *node = osgDB::readNodeFile(getFileName(i), in->getOptions());
199                    fpl.pop_front();
200
201                    if(node)
202                    {
203                        insertChild(i, node);
204                    }
205                }
206            }
207        }
208    }
209    else
210    {
211        in_THROW_EXCEPTION("ProxyNode::read(): Expected ProxyNode identification.");
212    }
213}
Note: See TracBrowser for help on using the browser.