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

Revision 2544, 3.4 KB checked in by mattausch, 17 years ago (diff)
Line 
1//#include <boost/algorithm/string.hpp>
2
3#include <stack>
4#include "SceneGraph.h"
5#include "X3dExporter.h"
6#include "Intersectable.h"
7
8
9using namespace std;
10
11namespace GtpVisibilityPreprocessor {
12
13
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
32SceneGraphNode::~SceneGraphNode()
33{
34        CLEAR_CONTAINER(mGeometry);
35        // recursivly delete all children
36        CLEAR_CONTAINER(mChildren);
37}
38
39
40/************************************************************/
41/*                 SceneGraph implementation                */
42/************************************************************/
43
44
45SceneGraph::SceneGraph():
46mRoot(NULL)
47{
48}
49
50
51SceneGraph::~SceneGraph()
52{
53        DEL_PTR(mRoot);
54}
55
56
57SceneGraphNode *SceneGraph::GetRoot()
58{
59        return mRoot;
60}
61
62
63void SceneGraph::SetRoot(SceneGraphNode *root)
64{
65        mRoot = root;
66}
67
68
69int
70SceneGraph::CollectObjects(ObjectContainer *instances)
71{
72        instances->clear();
73        int number = 0;
74
75        stack<SceneGraphNode *> nodeStack;
76        nodeStack.push(mRoot);
77
78        while (!nodeStack.empty()) {
79                SceneGraphNode *node = nodeStack.top();
80                nodeStack.pop();
81               
82                ObjectContainer::const_iterator mi = node->mGeometry.begin();
83                for (; mi != node->mGeometry.end(); mi++)
84                {
85                        instances->push_back(*mi);
86                }
87       
88                SceneGraphNodeContainer::iterator ni = node->mChildren.begin();
89                for (; ni != node->mChildren.end(); ni++) {
90                        nodeStack.push(*ni);   
91                        number++;
92                }
93        }
94
95        return number;
96}
97
98
99int
100SceneGraph::AssignObjectIds()
101{
102        // matt: rather start with id zero
103        int id = 0;
104        stack<SceneGraphNode *> nodeStack;
105
106        nodeStack.push(mRoot);
107
108        while (!nodeStack.empty())
109        {
110                SceneGraphNode *node = nodeStack.top();
111                nodeStack.pop();
112
113                ObjectContainer::iterator mi = node->mGeometry.begin();
114
115                for (; mi != node->mGeometry.end(); mi ++)
116                {
117                        (*mi)->SetId(id ++);
118                }
119
120                SceneGraphNodeContainer::iterator ni = node->mChildren.begin();
121                for (; ni != node->mChildren.end(); ni ++)
122                {
123                        nodeStack.push(*ni);
124                }
125        }
126
127        // return max id
128        return id;
129}
130
131void
132SceneGraph::GetStatistics(int &intersectables, int &faces) const
133{
134  stack<SceneGraphNode *> nodeStack;
135 
136  nodeStack.push(mRoot);
137  faces = 0;
138        intersectables = 0;
139  while (!nodeStack.empty()) {
140    SceneGraphNode *node = nodeStack.top();
141    nodeStack.pop();
142               
143    ObjectContainer::const_iterator mi = node->mGeometry.begin();
144    for (; mi != node->mGeometry.end(); mi++) {
145                        intersectables++;
146                        faces += (*mi)->NumberOfFaces();
147                }
148   
149    SceneGraphNodeContainer::iterator ni = node->mChildren.begin();
150    for (; ni != node->mChildren.end(); ni++) {
151      nodeStack.push(*ni);
152    }
153  }
154       
155}
156
157
158void
159SceneGraphNode::UpdateBox()
160{
161  AxisAlignedBox3 box;
162 
163  box.Initialize();
164 
165  ObjectContainer::const_iterator mi = mGeometry.begin();
166  for (; mi != mGeometry.end(); mi++)
167        box.Include((*mi)->GetBox());
168 
169  SceneGraphNodeContainer::iterator ni = mChildren.begin();
170  for (; ni != mChildren.end(); ni++) {
171        (*ni)->UpdateBox();
172        box.Include((*ni)->mBox);
173  }
174 
175  mBox = box;
176}
177
178
179void SceneGraph::ExportScene(const string filename)
180{
181       
182}
183
184
185void SceneGraph::LoadScene(const string filename)
186{
187        //  load binary version of mesh
188}
189
190
191}
Note: See TracBrowser for help on using the repository browser.