source: trunk/VUT/GtpVisibilityPreprocessor/src/Preprocessor.cpp @ 538

Revision 538, 10.5 KB checked in by mattausch, 18 years ago (diff)
Line 
1#include "SceneGraph.h"
2#include "Exporter.h"
3#include "UnigraphicsParser.h"
4#include "X3dParser.h"
5#include "Preprocessor.h"
6#include "ViewCell.h"
7#include "Environment.h"
8#include "ViewCellsManager.h"
9#include "ViewCellBsp.h"
10#include "VspBspTree.h"
11#include "VspKdTree.h"
12#include "RenderSimulator.h"
13#include "GlRenderer.h"
14
15Preprocessor *preprocessor;
16
17Preprocessor::Preprocessor():
18mKdTree(NULL),
19mBspTree(NULL),
20mVspKdTree(NULL),
21mVspBspTree(NULL),
22mViewCellsManager(NULL)
23{
24  environment->GetBoolValue("Preprocessor.useGlRenderer", mUseGlRenderer);
25 
26  // renderer will be constructed when the scene graph and viewcell manager will be known
27  renderer = NULL;
28 
29  environment->GetBoolValue("Preprocessor.useGlDebugger", mUseGlDebugger);
30}
31
32
33Preprocessor::~Preprocessor()
34{
35  DEL_PTR(mViewCellsManager);
36  DEL_PTR(mBspTree);
37  DEL_PTR(mKdTree);
38  DEL_PTR(mVspKdTree);
39  DEL_PTR(mVspBspTree);
40}
41
42int
43SplitFilenames(const string str, vector<string> &filenames)
44{
45        int pos = 0;
46
47        while(1) {
48                int npos = (int)str.find(';', pos);
49               
50                if (npos < 0 || npos - pos < 1)
51                        break;
52                filenames.push_back(string(str, pos, npos - pos));
53                pos = npos + 1;
54        }
55       
56        filenames.push_back(string(str, pos, str.size() - pos));
57        return (int)filenames.size();
58}
59
60bool
61Preprocessor::LoadScene(const string filename)
62{
63        // use leaf nodes of the original spatial hiearrchy as occludees
64        mSceneGraph = new SceneGraph;
65 
66        Parser *parser;
67        vector<string> filenames;
68        int files = SplitFilenames(filename, filenames);
69        cout<<files<<endl;
70        bool result = false;
71        if (files == 1) {
72               
73                if (strstr(filename.c_str(), ".x3d"))
74                        parser = new X3dParser;
75                else
76                        parser = new UnigraphicsParser;
77
78                cout<<filename<<endl;
79                result = parser->ParseFile(filename, &mSceneGraph->mRoot);
80
81                delete parser;
82
83        } else {
84                // root for different files
85                mSceneGraph->mRoot = new SceneGraphNode;
86                for (int i= 0; i < filenames.size(); i++) {
87                        if (strstr(filenames[i].c_str(), ".x3d"))
88                                parser = new X3dParser;
89                        else
90                                parser = new UnigraphicsParser;
91                       
92                        SceneGraphNode *node;
93                        if (parser->ParseFile(filenames[i], &node)) {
94                                mSceneGraph->mRoot->mChildren.push_back(node);
95                                // at least one file parsed
96                                result = true;
97                        }
98                        delete parser;
99                }
100        }
101       
102
103        if (result) {
104         
105          mSceneGraph->AssignObjectIds();
106          int intersectables, faces;
107          mSceneGraph->GetStatistics(intersectables, faces);
108          cout<<filename<<" parsed successfully."<<endl;
109          cout<<"#NUM_OBJECTS (Total numner of objects)\n"<<intersectables<<endl;
110          cout<<"#NUM_FACES (Total numner of faces)\n"<<faces<<endl;
111          mSceneGraph->CollectObjects(&mObjects);
112          mSceneGraph->mRoot->UpdateBox();
113        }
114       
115       
116        return result;
117}
118
119bool
120Preprocessor::ExportPreprocessedData(const string filename)
121{
122  return false;
123}
124
125bool
126Preprocessor::BuildKdTree()
127{
128  mKdTree = new KdTree;
129  // add mesh instances of the scene graph to the root of the tree
130  KdLeaf *root = (KdLeaf *)mKdTree->GetRoot();
131  mSceneGraph->CollectObjects(&root->mObjects);
132 
133  mKdTree->Construct();
134  return true;
135}
136
137void
138Preprocessor::KdTreeStatistics(ostream &s)
139{
140  s<<mKdTree->GetStatistics();
141}
142
143void
144Preprocessor::BspTreeStatistics(ostream &s)
145{
146        s << mBspTree->GetStatistics();
147}
148
149bool
150Preprocessor::Export( const string filename,
151                                          const bool scene,
152                                          const bool kdtree,
153                                          const bool bsptree
154                                          )
155{
156  Exporter *exporter = Exporter::GetExporter(filename);
157       
158  if (exporter) {
159    if (scene)
160      exporter->ExportScene(mSceneGraph->mRoot);
161
162    if (kdtree) {
163      exporter->SetWireframe();
164      exporter->ExportKdTree(*mKdTree);
165    }
166
167        if (bsptree) {
168                //exporter->SetWireframe();
169                exporter->ExportBspTree(*mBspTree);
170        }
171
172    delete exporter;
173    return true;
174  }
175
176  return false;
177}
178
179
180bool Preprocessor::PrepareViewCells()
181{
182        //-- parse type of view cell container
183        char viewCellsStr[64];
184        environment->GetStringValue("ViewCells.type", viewCellsStr);
185
186        int constructionSamples = 0;
187       
188        if (strcmp(viewCellsStr, "kdTree") == 0)
189        {
190                mViewCellsManager = new KdViewCellsManager(mKdTree);
191        }
192        else if (strcmp(viewCellsStr, "bspTree") == 0)
193        {
194                mBspTree = new BspTree();
195
196                Debug << "view cell type: Bsp" << endl;
197
198                environment->GetIntValue("BspTree.Construction.samples", constructionSamples);
199                mViewCellsManager = new BspViewCellsManager(mBspTree, constructionSamples);
200        }
201        else if (strcmp(viewCellsStr, "vspBspTree") == 0)
202        {
203                mVspBspTree = new VspBspTree();
204
205                Debug << "view cell type: VspBsp" << endl;
206
207                environment->GetIntValue("VspBspTree.Construction.samples", constructionSamples);
208                mViewCellsManager = new VspBspViewCellsManager(mVspBspTree, constructionSamples);
209        }
210        else if (strcmp(viewCellsStr, "vspKdTree") == 0)
211        {
212                mVspKdTree = new VspKdTree();           
213       
214                environment->GetIntValue("VspKdTree.Construction.samples", constructionSamples);
215        mViewCellsManager = new VspKdViewCellsManager(mVspKdTree, constructionSamples);
216        }
217        else if (strcmp(viewCellsStr, "sceneDependent") == 0)
218        {
219                //TODO
220                mBspTree = new BspTree();
221
222                Debug << "view cell type: Bsp" << endl;
223                environment->GetIntValue("BspTree.Construction.samples", constructionSamples);
224                mViewCellsManager = new BspViewCellsManager(mBspTree, constructionSamples);
225        }
226        else
227        {
228                cerr<<"Wrong view cells type" << viewCellsStr << endl;
229                exit(1);
230        }
231
232        float objRenderCost = 0, vcOverhead = 0, moveSpeed = 0;
233
234        environment->GetFloatValue("Simulation.objRenderCost",objRenderCost);
235        environment->GetFloatValue("Simulation.vcOverhead", vcOverhead);
236        environment->GetFloatValue("Simulation.moveSpeed", moveSpeed);
237
238        mRenderSimulator =
239                new RenderSimulator(mViewCellsManager, objRenderCost, vcOverhead, moveSpeed);
240       
241        int postProcessSamples = 0;
242        int visSamples = 0;
243
244        environment->GetIntValue("ViewCells.PostProcess.samples", postProcessSamples);
245        environment->GetIntValue("ViewCells.Visualization.samples", visSamples);
246
247        mViewCellsManager->SetPostProcessSamples(postProcessSamples);
248        mViewCellsManager->SetVisualizationSamples(visSamples);
249        mViewCellsManager->SetRenderer(mRenderSimulator);
250
251       
252        //-- parse view cells construction method
253        environment->GetBoolValue("ViewCells.loadFromFile", mLoadViewCells);
254        char buf[100];
255        if (mLoadViewCells)
256        {
257                environment->GetStringValue("ViewCells.filename", buf);
258                mViewCellsFilename = buf;
259        }
260        if (mUseGlRenderer || mUseGlDebugger)
261          renderer = new GlRendererBuffer(1024, 768, mSceneGraph, mViewCellsManager, mKdTree);
262
263
264        environment->GetBoolValue("Preprocessor.detectEmptyViewSpace", mDetectEmptyViewSpace);
265       
266
267
268        return true;
269}
270
271
272// use ascii format to store rays
273#define USE_ASCII 0
274
275
276inline bool ilt(Intersectable *obj1, Intersectable *obj2)
277{
278        return obj1->mId < obj2->mId;
279}
280
281
282bool Preprocessor::LoadSamples(VssRayContainer &samples,
283                                                           ObjectContainer &objects) const
284{
285        std::stable_sort(objects.begin(), objects.end(), ilt);
286        char fileName[100];
287        environment->GetStringValue("Preprocessor.samplesFilename", fileName);
288       
289    Vector3 origin, termination;
290        // HACK: needed only for lower_bound algorithm to find the
291        // intersected objects
292        MeshInstance sObj(NULL);
293        MeshInstance tObj(NULL);
294
295#if USE_ASCII
296        ifstream samplesIn(fileName, ios::binary);
297        if (!samplesIn.is_open())
298                return false;
299
300        string buf;
301        while (!(getline(samplesIn, buf)).eof())
302        {
303                sscanf(buf.c_str(), "%f %f %f %f %f %f %d %d",
304                           &origin.x, &origin.y, &origin.z,
305                           &termination.x, &termination.y, &termination.z,
306                           &(sObj.mId), &(tObj.mId));
307               
308                Intersectable *sourceObj = NULL;
309                Intersectable *termObj = NULL;
310               
311                if (sObj.mId >= 0)
312                {
313                        ObjectContainer::iterator oit =
314                                lower_bound(objects.begin(), objects.end(), &sObj, ilt);
315                        sourceObj = *oit;
316                }
317               
318                if (tObj.mId >= 0)
319                {
320                        ObjectContainer::iterator oit =
321                                lower_bound(objects.begin(), objects.end(), &tObj, ilt);
322                        termObj = *oit;
323                }
324
325                samples.push_back(new VssRay(origin, termination, sourceObj, termObj));
326        }
327#else
328        ifstream samplesIn(fileName, ios::binary);
329        if (!samplesIn.is_open())
330                return false;
331
332        while (1)
333        {
334                 samplesIn.read(reinterpret_cast<char *>(&origin), sizeof(Vector3));
335                 samplesIn.read(reinterpret_cast<char *>(&termination), sizeof(Vector3));
336                 samplesIn.read(reinterpret_cast<char *>(&(sObj.mId)), sizeof(int));
337                 samplesIn.read(reinterpret_cast<char *>(&(tObj.mId)), sizeof(int));
338               
339                 if (samplesIn.eof())
340                        break;
341
342                Intersectable *sourceObj = NULL;
343                Intersectable *termObj = NULL;
344               
345                if (sObj.mId >= 0)
346                {
347                        ObjectContainer::iterator oit =
348                                lower_bound(objects.begin(), objects.end(), &sObj, ilt);
349                        sourceObj = *oit;
350                }
351               
352                if (tObj.mId >= 0)
353                {
354                        ObjectContainer::iterator oit =
355                                lower_bound(objects.begin(), objects.end(), &tObj, ilt);
356                        termObj = *oit;
357                }
358
359                samples.push_back(new VssRay(origin, termination, sourceObj, termObj));
360        }
361
362#endif
363        samplesIn.close();
364
365        return true;
366}
367
368
369bool Preprocessor::ExportSamples(const VssRayContainer &samples) const
370{
371        char fileName[100];
372        environment->GetStringValue("Preprocessor.samplesFilename", fileName);
373       
374
375        VssRayContainer::const_iterator it, it_end = samples.end();
376       
377#if USE_ASCII
378        ofstream samplesOut(fileName);
379        if (!samplesOut.is_open())
380                return false;
381
382        for (it = samples.begin(); it != it_end; ++ it)
383        {
384                VssRay *ray = *it;
385                int sourceid = ray->mOriginObject ? ray->mOriginObject->mId : -1;               
386                int termid = ray->mTerminationObject ? ray->mTerminationObject->mId : -1;       
387
388                samplesOut << ray->GetOrigin().x << " " << ray->GetOrigin().y << " " << ray->GetOrigin().z << " "
389                                   << ray->GetTermination().x << " " << ray->GetTermination().y << " " << ray->GetTermination().z << " "
390                                   << sourceid << " " << termid << "\n";
391        }
392#else
393        ofstream samplesOut(fileName, ios::binary);
394        if (!samplesOut.is_open())
395                return false;
396
397        for (it = samples.begin(); it != it_end; ++ it)
398        {       
399                VssRay *ray = *it;
400                Vector3 origin(ray->GetOrigin());
401                Vector3 termination(ray->GetTermination());
402               
403                int sourceid = ray->mOriginObject ? ray->mOriginObject->mId : -1;               
404                int termid = ray->mTerminationObject ? ray->mTerminationObject->mId : -1;               
405
406                samplesOut.write(reinterpret_cast<char *>(&origin), sizeof(Vector3));
407                samplesOut.write(reinterpret_cast<char *>(&termination), sizeof(Vector3));
408                samplesOut.write(reinterpret_cast<char *>(&sourceid), sizeof(int));
409                samplesOut.write(reinterpret_cast<char *>(&termid), sizeof(int));
410    }
411#endif
412        samplesOut.close();
413        return true;
414}
Note: See TracBrowser for help on using the repository browser.