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

Revision 2615, 5.5 KB checked in by mattausch, 16 years ago (diff)

did some stuff for the visualization

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