source: GTP/trunk/Lib/Vis/Preprocessing/src/SceneGraph.cpp @ 2601

Revision 2601, 4.9 KB checked in by mattausch, 16 years ago (diff)
RevLine 
[162]1//#include <boost/algorithm/string.hpp>
2
3#include <stack>
4#include "SceneGraph.h"
5#include "X3dExporter.h"
[339]6#include "Intersectable.h"
[162]7
8
[2176]9using namespace std;
10
[863]11namespace GtpVisibilityPreprocessor {
[860]12
13
[162]14bool
15SceneGraph::Export( const string filename )
16{
17  if (strstr(filename.c_str(), ".x3d")) {
18    X3dExporter exporter(filename);
19    exporter.ExportScene(mRoot);
20    return true;
21  } else {
22    cerr<<"Error: Currently unsuported export format, filename "<<filename<<endl;
23   
24  }
25 
26 
27    return false;
28 
29}
30
31
[1328]32SceneGraphNode::~SceneGraphNode()
33{
[2600]34}
35
36
37SceneGraphLeaf::~SceneGraphLeaf()
38{
39    CLEAR_CONTAINER(mGeometry);
40}
41
42
43SceneGraphInterior::~SceneGraphInterior()
44{
[1328]45        // recursivly delete all children
46        CLEAR_CONTAINER(mChildren);
47}
48
49
[2600]50
[1328]51/************************************************************/
52/*                 SceneGraph implementation                */
53/************************************************************/
54
55
56SceneGraph::SceneGraph():
57mRoot(NULL)
58{
59}
60
61
[1002]62SceneGraph::~SceneGraph()
63{
64        DEL_PTR(mRoot);
65}
66
67
[2601]68SceneGraphInterior *SceneGraph::GetRoot()
[1002]69{
[1328]70        return mRoot;
71}
[1002]72
[1328]73
[2601]74void SceneGraph::SetRoot(SceneGraphInterior *root)
[1328]75{
76        mRoot = root;
[1002]77}
78
79
[2600]80int SceneGraph::CollectObjects(ObjectContainer &instances)
[162]81{
[2601]82        instances.clear();
[1328]83        int number = 0;
[162]84
[1328]85        stack<SceneGraphNode *> nodeStack;
86        nodeStack.push(mRoot);
87
[2600]88        while (!nodeStack.empty())
89        {
[1328]90                SceneGraphNode *node = nodeStack.top();
91                nodeStack.pop();
[2600]92
93                if (node->IsLeaf())
[1328]94                {
[2601]95                        SceneGraphLeaf *leaf = static_cast<SceneGraphLeaf *>(node);
[2600]96
97                        ObjectContainer::const_iterator mi = leaf->mGeometry.begin();
98
99                        for (; mi != leaf->mGeometry.end(); mi++)
100                        {
[2601]101                                instances.push_back(*mi);
[2600]102                        }
[1328]103                }
[2600]104                else
105                {
[2601]106                        SceneGraphInterior *interior = static_cast<SceneGraphInterior *>(node);
[2600]107                        SceneGraphNodeContainer::iterator ni = interior->mChildren.begin();
108
109                        for (; ni != interior->mChildren.end(); ++ ni)
110                        {
111                                nodeStack.push(*ni);   
112                                number++;
113                        }
[1328]114                }
115        }
[1344]116
[1328]117        return number;
[162]118}
[339]119
120
121int
122SceneGraph::AssignObjectIds()
123{
[2544]124        // matt: rather start with id zero
125        int id = 0;
126        stack<SceneGraphNode *> nodeStack;
[1344]127
[2544]128        nodeStack.push(mRoot);
129
130        while (!nodeStack.empty())
131        {
132                SceneGraphNode *node = nodeStack.top();
133                nodeStack.pop();
134
[2601]135                if (node->IsLeaf())
[2600]136                {
137                        SceneGraphLeaf *leaf = static_cast<SceneGraphLeaf *>(node);
138                        ObjectContainer::iterator mi = leaf->mGeometry.begin();
[2544]139
[2600]140                        for (; mi != leaf->mGeometry.end(); mi ++)
141                        {
142                                (*mi)->SetId(id ++);
143                        }
[2544]144                }
[2600]145                else
[2544]146                {
[2600]147                        SceneGraphInterior *interior = static_cast<SceneGraphInterior *>(node);
[2601]148
[2600]149                        SceneGraphNodeContainer::iterator ni = interior->mChildren.begin();
[2601]150                       
151                        for (; ni != interior->mChildren.end(); ni ++)
[2600]152                        {
153                                nodeStack.push(*ni);
154                        }
[2544]155                }
[576]156        }
[2544]157
158        // return max id
159        return id;
[339]160}
[387]161
162void
163SceneGraph::GetStatistics(int &intersectables, int &faces) const
164{
[2600]165        stack<SceneGraphNode *> nodeStack;
166
167        nodeStack.push(mRoot);
168        faces = 0;
[387]169        intersectables = 0;
[2601]170
171        while (!nodeStack.empty())
172        {
[2600]173                SceneGraphNode *node = nodeStack.top();
174                nodeStack.pop();
175
[2601]176                if (node->IsLeaf())
177                {
178                        SceneGraphLeaf *leaf = static_cast<SceneGraphLeaf *>(node);
179
180                        ObjectContainer::const_iterator mi = leaf->mGeometry.begin();
181                        for (; mi != leaf->mGeometry.end(); mi++)
182                        {
183                                intersectables++;
184                                faces += (*mi)->NumberOfFaces();
185                        }
[387]186                }
[2601]187                else
188                {
189                        SceneGraphInterior *interior = static_cast<SceneGraphInterior *>(node);
[2600]190
[2601]191                        SceneGraphNodeContainer::iterator ni = interior->mChildren.begin();
192                        for (; ni != interior->mChildren.end(); ni++)
193                        {
194                                nodeStack.push(*ni);
195                        }
[2600]196                }
197        }
[387]198}
[492]199
200
[2601]201void SceneGraphLeaf::UpdateBox()
[492]202{
[2600]203        AxisAlignedBox3 box;
204        box.Initialize();
205
206        ObjectContainer::const_iterator mi = mGeometry.begin();
207        for (; mi != mGeometry.end(); mi++)
208                box.Include((*mi)->GetBox());
209
210        mBox = box;
[492]211}
[860]212
[1166]213
[2601]214void SceneGraphInterior::UpdateBox()
[2600]215{
216        AxisAlignedBox3 box;
217
218        box.Initialize();
219
220        SceneGraphNodeContainer::iterator ni = mChildren.begin();
221       
222        for (; ni != mChildren.end(); ++ ni)
223        {
224                (*ni)->UpdateBox();
225                box.Include((*ni)->mBox);
226        }
227
228        mBox = box;
229}
230
231
232
[1166]233void SceneGraph::ExportScene(const string filename)
234{
[1194]235       
[1166]236}
237
[1194]238
[1166]239void SceneGraph::LoadScene(const string filename)
240{
241        //  load binary version of mesh
242}
243
[1958]244
[2601]245int SceneGraph::GetSize() const
246{
247        stack<SceneGraphNode *> nodeStack;
248
249        nodeStack.push(mRoot);
250        int size = 0;
251
252        while (!nodeStack.empty())
253        {
254                SceneGraphNode *node = nodeStack.top();
255                nodeStack.pop();
256
257                if (node->IsLeaf())
258                {
259                        SceneGraphLeaf *leaf = static_cast<SceneGraphLeaf *>(node);
260
261                        size += leaf->mGeometry.size();
262                }
263                else
264                {
265                        SceneGraphInterior *interior = static_cast<SceneGraphInterior *>(node);
266
267                        SceneGraphNodeContainer::iterator ni = interior->mChildren.begin();
268                        for (; ni != interior->mChildren.end(); ni++)
269                        {
270                                nodeStack.push(*ni);
271                        }
272                }
273        }
274
275        return size;
276}
277
[860]278}
Note: See TracBrowser for help on using the repository browser.