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

Revision 2610, 5.0 KB checked in by bittner, 16 years ago (diff)

pixel error computation revival

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}
35
36
37SceneGraphLeaf::~SceneGraphLeaf()
38{
39    CLEAR_CONTAINER(mGeometry);
40}
41
42
43SceneGraphInterior::~SceneGraphInterior()
44{
45        // recursivly delete all children
46        CLEAR_CONTAINER(mChildren);
47}
48
49
50
51/************************************************************/
52/*                 SceneGraph implementation                */
53/************************************************************/
54
55
56SceneGraph::SceneGraph():
57mRoot(NULL)
58{
59}
60
61
62SceneGraph::~SceneGraph()
63{
64        DEL_PTR(mRoot);
65}
66
67
68SceneGraphInterior *SceneGraph::GetRoot()
69{
70        return mRoot;
71}
72
73
74void SceneGraph::SetRoot(SceneGraphInterior *root)
75{
76        mRoot = root;
77}
78
79
80int SceneGraph::CollectObjects(ObjectContainer &instances)
81{
82        instances.clear();
83        int number = 0;
84
85        stack<SceneGraphNode *> nodeStack;
86        nodeStack.push(mRoot);
87
88        while (!nodeStack.empty())
89        {
90                SceneGraphNode *node = nodeStack.top();
91                nodeStack.pop();
92
93                if (node->IsLeaf())
94                {
95                        SceneGraphLeaf *leaf = static_cast<SceneGraphLeaf *>(node);
96
97                        ObjectContainer::const_iterator mi = leaf->mGeometry.begin();
98
99                        for (; mi != leaf->mGeometry.end(); mi++)
100                        {
101                                instances.push_back(*mi);
102                        }
103                }
104                else
105                {
106                        SceneGraphInterior *interior = static_cast<SceneGraphInterior *>(node);
107                        SceneGraphNodeContainer::iterator ni = interior->mChildren.begin();
108
109                        for (; ni != interior->mChildren.end(); ++ ni)
110                        {
111                                nodeStack.push(*ni);   
112                                number++;
113                        }
114                }
115        }
116
117        return number;
118}
119
120
121int
122SceneGraph::AssignObjectIds()
123{
124        // matt: rather start with id zero
125        int id = 0;
126        stack<SceneGraphNode *> nodeStack;
127
128        nodeStack.push(mRoot);
129
130        while (!nodeStack.empty())
131        {
132                SceneGraphNode *node = nodeStack.top();
133                nodeStack.pop();
134
135                if (node->IsLeaf())
136                {
137                        SceneGraphLeaf *leaf = static_cast<SceneGraphLeaf *>(node);
138                        ObjectContainer::iterator mi = leaf->mGeometry.begin();
139
140                        for (; mi != leaf->mGeometry.end(); mi ++)
141                        {
142                                (*mi)->SetId(id ++);
143                        }
144                }
145                else
146                {
147                        SceneGraphInterior *interior = static_cast<SceneGraphInterior *>(node);
148
149                        SceneGraphNodeContainer::iterator ni = interior->mChildren.begin();
150                       
151                        for (; ni != interior->mChildren.end(); ni ++)
152                        {
153                                nodeStack.push(*ni);
154                        }
155                }
156        }
157
158        // return max id
159        return id;
160}
161
162void
163SceneGraph::GetStatistics(int &intersectables, int &faces) const
164{
165        stack<SceneGraphNode *> nodeStack;
166
167        nodeStack.push(mRoot);
168        faces = 0;
169        intersectables = 0;
170
171        while (!nodeStack.empty())
172        {
173                SceneGraphNode *node = nodeStack.top();
174                nodeStack.pop();
175
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                        }
186                }
187                else
188                {
189                        SceneGraphInterior *interior = static_cast<SceneGraphInterior *>(node);
190
191                        SceneGraphNodeContainer::iterator ni = interior->mChildren.begin();
192                        for (; ni != interior->mChildren.end(); ni++)
193                        {
194                                nodeStack.push(*ni);
195                        }
196                }
197        }
198}
199
200
201void SceneGraphLeaf::UpdateBox()
202{
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;
211}
212
213
214void SceneGraphInterior::UpdateBox()
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
233void SceneGraph::ExportScene(const string filename)
234{
235       
236}
237
238
239void SceneGraph::LoadScene(const string filename)
240{
241        //  load binary version of mesh
242}
243
244
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
278
279void SceneGraphLeaf::Transform(const Matrix4x4 &trafo)
280{
281        mTrafo *= trafo;
282}
283
284}
Note: See TracBrowser for help on using the repository browser.