source: trunk/VUT/GtpVisibilityPreprocessor/src/X3dExporter.cpp @ 292

Revision 292, 14.2 KB checked in by mattausch, 19 years ago (diff)
Line 
1#include <stack>
2#include "common.h"
3#include "SceneGraph.h"
4#include "X3dExporter.h"
5#include "Mesh.h"
6#include "KdTree.h"
7#include "ViewCellBsp.h"
8#include "ViewCell.h"
9#include "Polygon3.h"
10ViewCellContainer X3dExporter::foundViewCells; // TODO: delete later
11
12X3dExporter::X3dExporter(const string filename):Exporter(filename)
13{
14  stream.open(mFilename.c_str());
15  stream<<"<?xml version=\"1.0\" encoding=\"UTF-8\"?>"<<endl;
16  stream<<"<X3D>"<<endl;
17  stream<<"<Scene>"<<endl;
18 
19}
20
21X3dExporter::~X3dExporter()
22{
23  stream<<"</Scene>"<<endl;
24  stream<<"</X3D>"<<endl;
25  stream.close();
26}
27
28
29bool
30X3dExporter::ExportRays(const vector<Ray> &rays,
31                        const float length,
32                        const RgbColor &color)
33{
34  vector<Ray>::const_iterator ri = rays.begin();
35  stream<<"<Shape>"<<endl;
36  stream<<"<Appearance>"<<endl;
37  stream<<"<Material ambientColor=\""<<color.r<<" "<<color.g<<" "<<color.b<<
38    "\" />"<<endl;
39  stream<<"</Appearance>"<<endl;
40 
41  stream<<"<IndexedLineSet coordIndex=\""<<endl;
42
43  int index = 0;
44  for (; ri != rays.end(); ri++) {
45    stream<<index<<" "<<index+1<<" -1\n";
46    index+=2;
47  }
48 
49  stream<<"\" >"<<endl;
50 
51  stream<<"<Coordinate  point=\""<<endl;
52 
53  ri = rays.begin();
54  for (; ri != rays.end(); ri++) {
55    Vector3 a = (*ri).GetLoc();
56   
57    Vector3 b;
58    if (length < 0)
59      b = (*ri).GetLoc() - length*(*ri).GetDir();
60    else
61      if ((*ri).intersections.size()==0)
62        b = (*ri).GetLoc() + length*(*ri).GetDir();
63      else
64        b = (*ri).Extrap((*ri).intersections[0].mT);
65   
66    stream<<a.x<<" "<<a.y<<" "<<a.z<<" ,";
67    stream<<b.x<<" "<<b.y<<" "<<b.z<<" ,\n";
68  }
69 
70  stream<<"\" >"<<endl;
71  stream<<"</Coordinate>"<<endl;
72  stream<<"</IndexedLineSet>"<<endl;
73  stream<<"</Shape>"<<endl;
74  return true;
75}
76
77void
78X3dExporter::ExportSceneNode(SceneGraphNode *node)
79{
80  stream<<"<Group>"<<endl;
81
82  SceneGraphNodeContainer::iterator ni = node->mChildren.begin();
83  for (; ni != node->mChildren.end(); ni++)
84    ExportSceneNode(*ni);
85 
86 
87  ObjectContainer::const_iterator mi = node->mGeometry.begin();
88  for (; mi != node->mGeometry.end(); mi++) {
89    // export the transform...
90    ExportIntersectable(*mi);
91  }
92 
93  stream<<"</Group>"<<endl;
94
95}
96void
97X3dExporter::ExportIntersectable(Intersectable *object)
98{
99  switch (object->Type()) {
100  case Intersectable::MESH_INSTANCE:
101  case Intersectable::TRANSFORMED_MESH_INSTANCE:
102    ExportMeshInstance((MeshInstance *)object);
103        break;
104  case Intersectable::VIEWCELL:
105        ExportViewCell((ViewCell *)object);
106    break;
107  default:
108    cerr<<"Sorry the export for object not yet defined"<<endl;
109    break;
110  }
111}
112
113void
114X3dExporter::ExportMeshInstance(MeshInstance *object)
115{
116  // $$JB$$
117  // in the future check whether the mesh was not already exportet
118  // and use a reference to the that mesh instead
119  ExportMesh(object->GetMesh());
120}
121
122void X3dExporter::ExportViewCells(ViewCellContainer *viewCells)
123{
124        ViewCellContainer::iterator it, it_end = viewCells->end();
125
126        for (it = viewCells->begin(); it != it_end; ++it)
127                ExportViewCell(*it);
128}
129void
130X3dExporter::ExportViewCell(ViewCell *viewCell)
131{
132        if (viewCell->GetMesh())
133                ExportMesh(viewCell->GetMesh());
134}
135
136void
137X3dExporter::ExportMesh(Mesh *mesh)
138{
139
140  stream<<"<Shape>"<<endl;
141  stream<<"<Appearance>"<<endl;
142 
143  // $$ tmp -> random material
144 
145  float r, g, b;
146
147  if (mUseForcedMaterial) {
148    r = mForcedMaterial.mDiffuseColor.r;
149    g = mForcedMaterial.mDiffuseColor.g;
150    b = mForcedMaterial.mDiffuseColor.b;
151   
152  } else
153    if (mesh->mMaterial) {
154      r = mesh->mMaterial->mDiffuseColor.r;
155      g = mesh->mMaterial->mDiffuseColor.g;
156      b = mesh->mMaterial->mDiffuseColor.b;
157    } else {
158      r = RandomValue(0.5, 1.0);
159      g = RandomValue(0.5, 1.0);
160      b = RandomValue(0.5, 1.0);
161    }
162  stream<<"<Material diffuseColor=\""<<r<<" "<<g<<" "<<b<<
163    "\" specularColor=\"0.0 0.0 0.0\"/>"<<endl;
164  stream<<"</Appearance>"<<endl;
165
166
167  if (mWireframe)
168    stream<<"<IndexedLineSet ccw=\"TRUE\" coordIndex=\""<<endl;
169  else
170    stream<<"<IndexedFaceSet ccw=\"TRUE\" coordIndex=\""<<endl;
171
172  FaceContainer::const_iterator fi = mesh->mFaces.begin();
173
174  int index = 0;
175 
176  for (; fi != mesh->mFaces.end(); fi++) {
177    Face *face = *fi;
178    VertexIndexContainer::const_iterator vi = face->mVertexIndices.begin();
179    for (; vi != face->mVertexIndices.end(); vi++)
180      stream<<*vi<<" ";
181    stream<<"-1"<<endl;
182  }
183  stream<<"\" >"<<endl;
184
185  stream<<"<Coordinate  point=\""<<endl;
186 
187  VertexContainer::const_iterator vi = mesh->mVertices.begin();
188  for (; vi != mesh->mVertices.end(); vi++) {
189    stream<<(*vi).x<<" "<<(*vi).y<<" "<<(*vi).z;
190    stream<<","<<endl;
191  }
192 
193  stream<<"\" >"<<endl;
194  stream<<"</Coordinate>"<<endl;
195
196  if (mWireframe)
197    stream<<"</IndexedLineSet>"<<endl;
198  else
199    stream<<"</IndexedFaceSet>"<<endl;
200 
201  stream<<"</Shape>"<<endl;
202
203}
204
205
206void X3dExporter::ExportPolygon(Polygon3 *poly)
207{
208        stream << "<Shape>" << endl;
209        stream << "<Appearance>" << endl;
210 
211        // $$ tmp -> random material
212 
213        float r, g, b;
214
215        if (mUseForcedMaterial)
216        {
217                r = mForcedMaterial.mDiffuseColor.r;
218                g = mForcedMaterial.mDiffuseColor.g;
219                b = mForcedMaterial.mDiffuseColor.b;
220        }
221        else if (poly->mMaterial)
222        {
223                r = poly->mMaterial->mDiffuseColor.r;
224                g = poly->mMaterial->mDiffuseColor.g;
225                b = poly->mMaterial->mDiffuseColor.b;
226        } else
227        {
228                r = RandomValue(0.5, 1.0);
229                g = RandomValue(0.5, 1.0);
230                b = RandomValue(0.5, 1.0);
231        }
232
233        stream << "<Material diffuseColor=\"" << r << " " << g << " " << b
234                   << "\" specularColor=\"0.0 0.0 0.0\"/>" << endl;
235
236    stream << "</Appearance>" << endl;
237
238
239        //-- create and write indices
240        if (mWireframe)
241                stream << "<IndexedLineSet ccw=\"TRUE\" coordIndex=\"" << endl;
242        else
243                stream << "<IndexedFaceSet ccw=\"TRUE\" coordIndex=\"" << endl;
244
245        int index = 0;
246       
247        VertexContainer::const_iterator vi; 
248       
249        for (vi = poly->mVertices.begin(); vi != poly->mVertices.end(); ++vi)
250        {
251                stream << index ++ << " ";
252        }
253        stream << "-1" << endl;
254
255        stream << "\" >" << endl;
256       
257        stream << "<Coordinate  point=\"" << endl;
258 
259        for (vi = poly->mVertices.begin(); vi != poly->mVertices.end(); ++vi)
260        {
261                stream << (*vi).x << " " << (*vi).y << " " << (*vi).z;
262                stream << "," << endl;
263        }
264 
265        stream << "\" >" << endl;
266        stream << "</Coordinate>" << endl;
267
268        if (mWireframe)
269                stream << "</IndexedLineSet>" << endl;
270        else
271                stream << "</IndexedFaceSet>" << endl;
272 
273        stream << "</Shape>" << endl;
274}
275
276void X3dExporter::ExportPolygons(PolygonContainer *polys)
277{
278        stream << "<Shape>" << endl;
279        stream << "<Appearance>" << endl;
280 
281        // $$ tmp -> random material
282 
283        float r, g, b;
284
285        if (mUseForcedMaterial)
286        {
287                r = mForcedMaterial.mDiffuseColor.r;
288                g = mForcedMaterial.mDiffuseColor.g;
289                b = mForcedMaterial.mDiffuseColor.b;
290        }
291        else
292        {
293                r = RandomValue(0.5, 1.0);
294                g = RandomValue(0.5, 1.0);
295                b = RandomValue(0.5, 1.0);
296        }
297
298        stream << "<Material diffuseColor=\"" << r << " " << g << " " << b
299                   << "\" specularColor=\"0.0 0.0 0.0\"/>" << endl;
300
301    stream << "</Appearance>" << endl;
302
303
304        //-- create and write indices
305        if (mWireframe)
306                stream << "<IndexedLineSet ccw=\"TRUE\" coordIndex=\"" << endl;
307        else
308                stream << "<IndexedFaceSet ccw=\"TRUE\" coordIndex=\"" << endl;
309
310        int index = 0;
311       
312        PolygonContainer::const_iterator pit;
313
314    VertexContainer::const_iterator vi; 
315       
316        for (pit = polys->begin(); pit != polys->end(); ++pit)
317        {
318                Polygon3 *poly = *pit;
319                for (vi = poly->mVertices.begin(); vi != poly->mVertices.end(); ++vi)
320                {
321                        stream << index ++ << " ";
322                }
323                stream << "-1" << endl;
324        }
325
326        stream << "\" >" << endl;
327       
328        stream << "<Coordinate  point=\"" << endl;
329        for (pit = polys->begin(); pit != polys->end(); ++pit)
330        {
331                Polygon3 *poly = *pit;
332        for (vi = poly->mVertices.begin(); vi != poly->mVertices.end(); ++vi)
333                {
334                        stream << (*vi).x << " " << (*vi).y << " " << (*vi).z;
335                        stream << "," << endl;
336                }
337        }
338        stream << "\" >" << endl;
339        stream << "</Coordinate>" << endl;
340
341        if (mWireframe)
342                stream << "</IndexedLineSet>" << endl;
343        else
344                stream << "</IndexedFaceSet>" << endl;
345 
346        stream << "</Shape>" << endl;
347}
348
349bool
350X3dExporter::ExportBox(const AxisAlignedBox3 &box)
351{
352  Mesh *mesh = new Mesh;
353  // add 6 vertices of the box
354  int index = (int)mesh->mVertices.size();
355  for (int i=0; i < 8; i++) {
356    Vector3 v;
357    box.GetVertex(i, v);
358    mesh->mVertices.push_back(v);
359  }
360 
361  mesh->AddFace(new Face(index + 0, index + 1, index + 3, index + 2) );
362  mesh->AddFace(new Face(index + 0, index + 2, index + 6, index + 4) );
363  mesh->AddFace(new Face(index + 4, index + 6, index + 7, index + 5) );
364 
365  mesh->AddFace(new Face(index + 3, index + 1, index + 5, index + 7) );
366  mesh->AddFace(new Face(index + 0, index + 4, index + 5, index + 1) );
367  mesh->AddFace(new Face(index + 2, index + 3, index + 7, index + 6) );
368 
369  ExportMesh(mesh);
370  delete mesh;
371  return true;
372}
373
374bool
375X3dExporter::ExportBspTree(const BspTree &tree)
376{
377        if (mExportRayDensity)
378        {
379                return ExportBspTreeRayDensity(tree);
380        }
381 
382        stack<BspNode *> tStack;
383
384        tStack.push(tree.GetRoot());
385
386        Mesh *mesh = new Mesh;
387
388        AxisAlignedBox3 box = tree.GetBoundingBox();
389        bool savedWireframe = mWireframe;
390
391        SetWireframe();
392        ExportBox(box);
393       
394        if (!savedWireframe)
395                SetFilled();
396
397        //ViewCellContainer foundViewCells;
398
399        if (tree.StorePolys())
400        {
401                while (!tStack.empty())
402                {
403            BspNode *node = tStack.top();
404   
405                        tStack.pop();
406       
407                        if (tree.StorePolys()) // extract the polygons
408                        {
409                                PolygonContainer::const_iterator it;
410                                PolygonContainer::const_iterator it_end = node->GetPolygons()->end();
411
412                                for (it = node->GetPolygons()->begin(); it != it_end; ++ it)
413                                        ExportPolygon(*it);
414                        }
415
416                        if (!node->IsLeaf())
417                        {
418                                BspInterior *interior = dynamic_cast<BspInterior *>(node);
419     
420                                tStack.push(interior->GetFront());
421                                tStack.push(interior->GetBack());
422
423                        }
424                }
425        }
426        else // export view cells
427        {
428                while (!tStack.empty())
429                {
430            BspNode *node = tStack.top();
431   
432                        tStack.pop();
433       
434                        if (node->IsLeaf())
435                        {
436                                ViewCell *viewCell = dynamic_cast<BspLeaf *>(node)->GetViewCell();
437                                if (viewCell)
438                                        foundViewCells.push_back(viewCell);
439                        }
440                        else
441                        {
442                                BspInterior *interior = dynamic_cast<BspInterior *>(node);
443     
444                                tStack.push(interior->GetFront());
445                                tStack.push(interior->GetBack());
446                        }
447                }
448
449                Debug << "Number of view cells with dublicates: " << (int)foundViewCells.size() << endl;
450
451        //-- erase dublicates
452                sort(foundViewCells.begin(), foundViewCells.end());
453                ViewCellContainer::iterator new_end = unique(foundViewCells.begin(), foundViewCells.end());
454                foundViewCells.erase(new_end, foundViewCells.end());
455                ExportViewCells(&foundViewCells);
456
457                Debug << "Number of view cells after erasing dublicates: " << (int)foundViewCells.size() << endl;
458        }
459
460        return true;
461}
462
463bool X3dExporter::ExportKdTree(const KdTree &tree)
464{
465         if (mExportRayDensity) {
466    return ExportKdTreeRayDensity(tree);
467  }
468 
469  stack<KdNode *> tStack;
470
471  tStack.push(tree.GetRoot());
472
473  Mesh *mesh = new Mesh;
474 
475  while (!tStack.empty()) {
476    KdNode *node = tStack.top();
477    tStack.pop();
478    AxisAlignedBox3 box = tree.GetBox(node);
479    // add 6 vertices of the box
480    int index = (int)mesh->mVertices.size();
481    for (int i=0; i < 8; i++) {
482      Vector3 v;
483      box.GetVertex(i, v);
484      mesh->mVertices.push_back(v);
485    }
486    mesh->AddFace(new Face(index + 0, index + 1, index + 3, index + 2) );
487    mesh->AddFace(new Face(index + 0, index + 2, index + 6, index + 4) );
488    mesh->AddFace(new Face(index + 4, index + 6, index + 7, index + 5) );
489
490    mesh->AddFace(new Face(index + 3, index + 1, index + 5, index + 7) );
491    mesh->AddFace(new Face(index + 0, index + 4, index + 5, index + 1) );
492    mesh->AddFace(new Face(index + 2, index + 3, index + 7, index + 6) );
493
494    if (!node->IsLeaf()) {
495      KdInterior *interior = (KdInterior *)node;
496      tStack.push(interior->mFront);
497      tStack.push(interior->mBack);
498    }
499  }
500 
501  ExportMesh(mesh);
502  delete mesh;
503  return true;
504        // TODO
505        return true;
506}
507
508
509bool
510X3dExporter::ExportBspTreeRayDensity(const BspTree &tree)
511{
512        // TODO
513        return true;
514}
515
516bool
517X3dExporter::ExportKdTreeRayDensity(const KdTree &tree)
518{
519  stack<KdNode *> tStack;
520
521  tStack.push(tree.GetRoot());
522
523  bool fm = mUseForcedMaterial;
524  mUseForcedMaterial = true;
525  mForcedMaterial.mDiffuseColor.g = 1.0f;
526  mForcedMaterial.mDiffuseColor.b = 1.0f;
527  while (!tStack.empty()) {
528    KdNode *node = tStack.top();
529    tStack.pop();
530    if (node->IsLeaf()) {
531      AxisAlignedBox3 box = tree.GetBox(node);
532      Mesh *mesh = new Mesh;
533     
534      // add 6 vertices of the box
535      int index = (int)mesh->mVertices.size();
536      for (int i=0; i < 8; i++) {
537        Vector3 v;
538        box.GetVertex(i, v);
539        mesh->mVertices.push_back(v);
540      }
541      mesh->AddFace(new Face(index + 0, index + 1, index + 3, index + 2) );
542      mesh->AddFace(new Face(index + 0, index + 2, index + 6, index + 4) );
543      mesh->AddFace(new Face(index + 4, index + 6, index + 7, index + 5) );
544     
545      mesh->AddFace(new Face(index + 3, index + 1, index + 5, index + 7) );
546      mesh->AddFace(new Face(index + 0, index + 4, index + 5, index + 1) );
547      mesh->AddFace(new Face(index + 2, index + 3, index + 7, index + 6) );
548
549
550      // set the mesh material according to the ray density
551      KdLeaf *leaf = (KdLeaf *) node;
552      if (leaf->mPassingRays.mRays) {
553        float importance = leaf->mPassingRays.mContributions/(float)leaf->mPassingRays.mRays;
554        //      float importance = leaf->mPassingRays.mContributions/1000.0f;
555        //      float importance = leaf->mPassingRays.mRays/1000.0f;
556        ///(float)leaf->mPassingRays.mRays;
557        // mForcedMaterial.mDiffuseColor.r = log10(leaf->mPassingRays.mRays)/3.0f;
558        mForcedMaterial.mDiffuseColor.r = importance;
559        mForcedMaterial.mDiffuseColor.g = 1.0f - mForcedMaterial.mDiffuseColor.r;
560        ExportMesh(mesh);
561      }
562      delete mesh;
563    } else {
564      KdInterior *interior = (KdInterior *)node;
565      tStack.push(interior->mFront);
566      tStack.push(interior->mBack);
567    }
568  }
569  // restore the state of forced material
570  mUseForcedMaterial = fm;
571  return true;
572}
Note: See TracBrowser for help on using the repository browser.