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

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