source: GTP/trunk/Lib/Vis/Preprocessing/src/main.cpp @ 1414

Revision 1414, 6.8 KB checked in by mattausch, 18 years ago (diff)

fixed kd tree loading / exporting

Line 
1#ifdef GTP_INTERNAL
2//#define USE_QT 0
3#endif
4//#define USE_QT 0
5#define USE_THREADS 1
6
7#ifdef UNICODE
8#undef UNICODE
9#endif
10
11#include <windows.h>
12#include <stdio.h>
13#include <crtdbg.h>
14
15#include "SamplingPreprocessor.h"
16#include "VssPreprocessor.h"
17#include "RssPreprocessor.h"
18#include "ExactPreprocessor.h"
19#include "Parser.h"
20#include "UnigraphicsParser.h"
21#include "X3dParser.h"
22#include "Environment.h"
23#include "Camera.h"
24#include "MeshKdTree.h"
25#include "Exporter.h"
26#include "ViewCell.h"
27#include "SceneGraph.h"
28
29#if USE_THREADS && !USE_QT
30#include "BoostPreprocessorThread.h"
31#endif
32
33#include "RenderSampler.h"
34#include "ResourceManager.h"
35#include "GlRenderer.h"
36
37#if USE_QT
38#include "QtPreprocessorThread.h"
39#include "QtGlRenderer.h"
40#endif
41
42#define USE_EXE_PATH false
43
44
45using namespace GtpVisibilityPreprocessor;
46
47Preprocessor *preprocessor = NULL;
48GlRendererWidget *rendererWidget = NULL;
49
50// DLL function signature
51typedef GlRendererWidget *(*importFunction)(Preprocessor *);
52
53
54
55
56void Cleanup()
57{
58        DEL_PTR(rendererWidget);
59        DEL_PTR(preprocessor);
60
61        Environment::DelSingleton();
62        MeshManager::DelSingleton();
63        MaterialManager::DelSingleton();
64}
65
66
67
68
69string ReplaceSuffix(string filename,
70                                         string a,
71                                         string b)
72{
73  string result = filename;
74
75  int pos = (int)filename.rfind(a, (int)filename.size() - 1);
76  if (pos == filename.size() - a.size()) {
77        result.replace(pos, a.size(), b);
78  }
79  return result;
80}
81
82int
83main(int argc, char **argv)
84{
85
86        //Now just call this function at the start of your program and if you're
87        //compiling in debug mode (F5), any leaks will be displayed in the Output
88        //window when the program shuts down. If you're not in debug mode this will
89        //be ignored. Use it as you will!
90        //note: from GDNet Direct [3.8.04 - 3.14.04] void detectMemoryLeaks() {
91#if 0
92  _CrtSetDbgFlag(_CRTDBG_LEAK_CHECK_DF|_CRTDBG_ALLOC_MEM_DF);
93  _CrtSetReportMode(_CRT_ASSERT,_CRTDBG_MODE_FILE);
94  _CrtSetReportFile(_CRT_ASSERT,_CRTDBG_FILE_STDERR);
95#endif
96
97        int returnCode = 0;
98       
99        InitTiming();
100
101        Debug.open("debug.log");
102 
103        Environment::GetSingleton()->Parse(argc, argv, USE_EXE_PATH);
104        MeshKdTree::ParseEnvironment();
105
106       
107        char buff[128];
108        Environment::GetSingleton()->GetStringValue("Preprocessor.type", buff);
109        string preprocessorType(buff);
110
111        if (preprocessorType == "vss")
112        {
113                preprocessor = new VssPreprocessor();
114        }
115        else
116        {
117                if (preprocessorType == "rss")
118                {
119                        preprocessor = new RssPreprocessor();
120                }
121                else
122                {
123                        if (preprocessorType == "exact")
124                        {
125                                preprocessor = new ExactPreprocessor();
126                        }
127                        else
128                        {
129                                if (preprocessorType == "sampling")
130                                {
131                                        preprocessor = new SamplingPreprocessor();
132                                }
133                                else
134                                {       
135                                        if (preprocessorType == "render")
136                                        {
137                                                preprocessor = new RenderSampler();
138                                        }
139                                        else
140                                        {
141                                                Environment::DelSingleton();
142                                                cerr<<"Unknown preprocessor type"<<endl;
143                                                Debug<<"Unknown preprocessor type"<<endl;
144                                                exit(1);
145                                        }
146                                }
147                        }
148                }
149        }
150
151        ////////////////////////////////////////
152        //-- load scene
153
154        Environment::GetSingleton()->GetStringValue("Scene.filename", buff);
155        string filename(buff);
156
157        if (!preprocessor->LoadScene(filename))
158        {
159                cout << "loading file " << filename << " failed" << endl;
160                Cleanup();
161                exit(1);
162        }
163
164        string rayCastFile = ReplaceSuffix(filename, ".obj", ".kdf");
165
166        //-- initialize external ray casters
167        if (preprocessor->InitRayCast(rayCastFile))
168        {
169                cout << "ray casting initialized!" << endl;
170        }
171        else
172        {
173                cout << "ray casting initialization failed" << endl;
174                Cleanup();
175                exit(1);
176        }
177
178        bool loadKdTree, exportKdTree;
179
180        Environment::GetSingleton()->GetBoolValue("Preprocessor.loadKdTree", loadKdTree);
181
182        const string kdtreename("kd.bin.gz");
183
184        if (!loadKdTree)
185        {
186                //-- build new kd tree from scene geometry
187                preprocessor->BuildKdTree();
188                preprocessor->KdTreeStatistics(cout);
189        }
190        else
191        {
192                const long startTime = GetTime();
193                cout << "loading kd tree ... ";
194
195                if (!preprocessor->LoadKdTree(kdtreename))
196                {
197                        cout << "error loading kd tree with filename " << kdtreename << endl;
198                        Cleanup();
199                        exit(1);
200                }
201                cout << "finished in " << TimeDiff(startTime, GetTime()) * 1e-3 << " secs" << endl;
202
203                if (0)
204                {
205                        Exporter *exporter = Exporter::GetExporter("dummykd.x3d");
206                       
207                        if (exporter)
208                        {
209                                exporter->ExportKdTree(*preprocessor->mKdTree, true);
210                                delete exporter;
211                        }
212                }
213        }
214
215        Environment::GetSingleton()->GetBoolValue("Preprocessor.exportKdTree", exportKdTree);
216
217        if (exportKdTree)
218        {
219                const long startTime = GetTime();
220                cout << "exporting kd tree ... ";
221                if (!preprocessor->ExportKdTree(kdtreename))
222                {
223                        cout << " error exporting kd tree with filename " << kdtreename << endl;
224                }
225                else
226                {
227                        cout << "finished in " << TimeDiff(startTime, GetTime()) * 1e-3 << " secs" << endl;
228                }
229        }
230
231
232        // parse view cells related options
233        preprocessor->PrepareViewCells();
234
235        if (0)
236        {
237                preprocessor->Export(filename + "-out.x3d", true, false, false);
238                preprocessor->Export(filename + "-kdtree.x3d", false, true, false);     
239        }
240
241        // create a preprocessor thread (note: capsulates calls to boost fuctions!)
242        //PreprocessorThread *pt = PreprocessorThreadFactory::Create(preprocessor);
243#if USE_THREADS
244        PreprocessorThread *pt;
245
246#if USE_QT
247        pt = new QtPreprocessorThread(preprocessor);
248#else
249        pt = new BoostPreprocessorThread(preprocessor);
250#endif
251#endif
252
253       
254        bool guiSupported = false;
255        if (preprocessor->mUseGlRenderer || preprocessor->mUseGlDebugger)
256          {
257                cout << "using gl widget" << endl;
258                // create and run the preprocessor application in a parallel thread
259#if USE_THREADS
260                pt->InitThread();
261                pt->RunThread();
262#endif
263               
264#if USE_QT             
265                // display the render widget
266                if (!rendererWidget)
267                {
268                  // create a qt application first (must be created before any opengl widget ...)
269                  QApplication *app = new QApplication(argc, NULL);
270                 
271                  if (!QGLFormat::hasOpenGL() || !QGLPixelBuffer::hasOpenGLPbuffers()) {
272                        QMessageBox::information(0, "OpenGL pbuffers",
273                                                                         "This system does not support OpenGL/pbuffers.",
274                                                                         QMessageBox::Ok);
275                        return NULL;
276                  }
277                 
278                 
279                  rendererWidget = new QtGlRendererWidget(preprocessor->mSceneGraph,
280                                                                                                  preprocessor->mViewCellsManager,
281                                                                                                  preprocessor->mKdTree);
282
283                  rendererWidget->Show();
284                  guiSupported = true;
285                }
286
287                qApp->exec();   
288#endif
289          }
290       
291        if (!guiSupported) {
292          preprocessor->mUseGlRenderer = false;
293          preprocessor->mUseGlDebugger = false;
294        }
295       
296        if (!(preprocessor->mUseGlRenderer || preprocessor->mUseGlDebugger)) {
297          // just call the mail method -> will be executed in the main thread
298#if USE_THREADS
299          pt->RunThread();
300#endif
301        }
302       
303        Cleanup();
304       
305        return returnCode;
306}
307
Note: See TracBrowser for help on using the repository browser.