source: GTP/trunk/Lib/Vis/Preprocessing/src/Exporter.cpp @ 1415

Revision 1415, 6.4 KB checked in by mattausch, 18 years ago (diff)
Line 
1#include "X3dExporter.h"
2#include "VrmlExporter.h"
3#include "OspTree.h"
4#include "KdTree.h"
5#include "IntersectableWrapper.h"
6#include "BvHierarchy.h"
7#include "Triangle3.h"
8#include "Polygon3.h"
9
10
11namespace GtpVisibilityPreprocessor {
12
13Exporter *
14Exporter::GetExporter(const string filename)
15{
16  Exporter *exporter = NULL;
17
18  if (strstr(filename.c_str(), ".x3d"))
19  {
20          exporter = new X3dExporter(filename);
21  }
22  else if (strstr(filename.c_str(), ".wrl"))
23  {
24          exporter = new VrmlExporter(filename);
25  }
26  else
27  {
28          cerr<<"Error: Currently unsuported export format, filename " << filename << endl;
29  }
30
31  return exporter;
32}
33
34
35bool Exporter::ExportOspTree(const OspTree &ospTree,
36                                                         const int maxPvs
37                                                         )
38{
39        vector<KdLeaf *> leaves;
40        ospTree.CollectLeaves(leaves);
41        mUseForcedMaterial = true;
42
43        vector<KdLeaf *>::const_iterator it, it_end = leaves.end();
44
45        Material white;
46        white.mDiffuseColor.r = 1;
47        white.mDiffuseColor.g = 1;
48        white.mDiffuseColor.b = 1;
49       
50        for (it = leaves.begin(); it != it_end; ++ it)
51        {
52                KdLeaf *leaf = *it;
53
54                SetWireframe();
55                SetForcedMaterial(white);
56                ExportBox(ospTree.GetBoundingBox(leaf));
57
58                SetFilled();
59
60                if (maxPvs) // color code pvs
61                {
62                        mForcedMaterial.mDiffuseColor.b = 1.0f;
63                        const float importance = (float)leaf->mObjects.size() / (float)maxPvs;
64
65                        mForcedMaterial.mDiffuseColor.r = importance;
66                        mForcedMaterial.mDiffuseColor.g = 1.0f - mForcedMaterial.mDiffuseColor.r;
67                }
68                else
69                {
70                        SetForcedMaterial(RandomMaterial());
71                }
72                if (0) ExportGeometry(leaf->mObjects); 
73        }
74
75        return true;
76}
77
78
79void Exporter::ExportKdIntersectable(const KdIntersectable &kdObj)
80{
81        KdNode *node = kdObj.GetItem();
82        Intersectable::NewMail();
83
84        // todo: traverse to leaves
85        if (node->IsLeaf())
86        {
87                // eyport leaf pvs
88                KdLeaf *leaf = dynamic_cast<KdLeaf *>(node);
89
90                ObjectContainer::const_iterator oit, oit_end = leaf->mObjects.end();
91
92                for (oit = leaf->mObjects.begin(); oit != oit_end; ++ oit)
93                {       
94                        Intersectable *obj = *oit;
95       
96                        if (!obj->Mailed())
97                        {
98                                ExportIntersectable(obj);
99                                obj->Mail();                                   
100                        }                               
101                }
102        }
103}
104
105
106bool Exporter::ExportBvHierarchy(const BvHierarchy &bvHierarchy,
107                                                                 const int maxPvs,
108                                                                 AxisAlignedBox3 *box)
109{
110        vector<BvhLeaf *> leaves;
111        bvHierarchy.CollectLeaves(leaves);
112
113        mUseForcedMaterial = true;
114        vector<BvhLeaf *>::const_iterator it, it_end = leaves.end();
115
116        Material white;
117        white.mDiffuseColor.r = 1;
118        white.mDiffuseColor.g = 1;
119        white.mDiffuseColor.b = 1;
120       
121        for (it = leaves.begin(); it != it_end; ++ it)
122        {
123                BvhLeaf *leaf = *it;
124                if (leaf->mObjects.empty())
125                        continue;
126
127                if (box && !Overlap(*box, leaf->GetBoundingBox()))
128                        continue;
129
130                SetWireframe();
131                SetForcedMaterial(white);
132                ExportBox(leaf->GetBoundingBox());
133                SetFilled();
134
135                if (maxPvs) // color code pvs
136                {
137                        mForcedMaterial.mDiffuseColor.b = 1.0f;
138                        const float importance = (float)leaf->mObjects.size() / (float)maxPvs;
139
140                        mForcedMaterial.mDiffuseColor.r = importance;
141                        mForcedMaterial.mDiffuseColor.g = 1.0f - mForcedMaterial.mDiffuseColor.r;
142                }
143                else
144                {
145                        SetForcedMaterial(RandomMaterial());
146                }
147
148                if (1)
149                {
150                        SetFilled();
151                        ExportGeometry(leaf->mObjects, true);
152                }
153        }
154
155        return true;
156}
157
158
159void Exporter::ExportIntersectable(Intersectable *object)
160{
161        switch (object->Type())
162        {
163        case Intersectable::MESH_INSTANCE:
164                ExportMeshInstance((MeshInstance *)object);
165                break;
166        case Intersectable::TRANSFORMED_MESH_INSTANCE:
167                ExportTransformedMeshInstance(dynamic_cast<TransformedMeshInstance *>(object));
168                break;
169        case Intersectable::VIEW_CELL:
170                ExportViewCell(dynamic_cast<ViewCell *>(object));
171                break;
172        case Intersectable::KD_INTERSECTABLE:
173                ExportKdIntersectable(*(dynamic_cast<KdIntersectable *>(object)));
174                break;
175        case Intersectable::TRIANGLE_INTERSECTABLE:
176                {
177                        const Triangle3 triangle = dynamic_cast<TriangleIntersectable *>(object)->GetItem();
178
179                        VertexContainer vertices;
180                        vertices.push_back(triangle.mVertices[0]);
181                        vertices.push_back(triangle.mVertices[1]);
182                        vertices.push_back(triangle.mVertices[2]);
183
184                        Polygon3 poly(vertices);
185                        ExportPolygon(&poly);
186                        break;
187                }
188        default:
189                cerr << "Sorry the export for object type " << Intersectable::GetTypeName(object) << " is not available yet" << endl;
190                break;
191        }
192}
193
194void Exporter::ExportMeshInstance(MeshInstance *object)
195{
196        // $$JB$$
197        // in the future check whether the mesh was not already exported
198        // and use a reference to the that mesh instead
199        ExportMesh(object->GetMesh());
200}
201
202
203void Exporter::ExportTransformedMeshInstance(TransformedMeshInstance *mi)
204{
205        Mesh mesh(*mi->GetMesh());
206
207        Matrix4x4 m;
208        mi->GetWorldTransform(m);
209        mesh.ApplyTransformation(m);
210
211        ExportMesh(&mesh);
212}
213
214
215void Exporter::ExportViewCells(const ViewCellContainer &viewCells)
216{
217        ViewCellContainer::const_iterator it, it_end = viewCells.end();
218
219        for (it = viewCells.begin(); it != it_end; ++ it)
220        {
221                ExportViewCell(*it);
222        }
223}
224
225
226void Exporter::ExportGeometry(const ObjectContainer &objects,
227                                                          const bool exportSingleMesh,
228                                                          AxisAlignedBox3 *bbox)
229{
230        ObjectContainer::const_iterator oit, oit_end = objects.end();
231
232        if (!exportSingleMesh)
233        {
234                for (oit = objects.begin(); oit != oit_end; ++ oit)
235                {
236                        if (bbox && Overlap(*bbox, (*oit)->GetBox()))
237                        {
238                                if (0) SetForcedMaterial(RandomMaterial());
239                                ExportIntersectable(*oit);
240                        }
241                }
242
243                return;
244        }
245
246       
247        ///////////////////////////////////////////
248        //-- all objects exported as one mesh
249        //-- hack: currently works only for triangles
250
251        PolygonContainer polys;
252
253        for (oit = objects.begin(); oit != oit_end; ++ oit)
254        {
255                Intersectable *obj = *oit;
256
257                if (bbox && !Overlap(*bbox, (*oit)->GetBox()))
258                        continue;
259
260                switch (obj->Type())
261                {
262                case Intersectable::TRIANGLE_INTERSECTABLE:
263                        {
264                                TriangleIntersectable *ti = dynamic_cast<TriangleIntersectable *>(obj);
265                                polys.push_back(new Polygon3(ti->GetItem()));
266                break;
267                        }
268                default:
269                        cout << "merging of object type " << obj->Type() << " not implemented yet" << endl;
270                        break;
271                }
272        }
273
274        Mesh dummyMesh;
275        PolygonContainer::const_iterator pit, pit_end = polys.end();
276
277        for (pit = polys.begin(); pit != pit_end; ++ pit)
278        {
279                Polygon3 *poly = (*pit);
280                IncludePolyInMesh(*poly, dummyMesh);
281        }
282       
283        ExportMesh(&dummyMesh);
284        CLEAR_CONTAINER(polys);
285}
286
287
288
289}
Note: See TracBrowser for help on using the repository browser.