source: GTP/trunk/App/Demos/Vis/FriendlyCulling/src/common.h @ 3019

Revision 3019, 10.2 KB checked in by mattausch, 16 years ago (diff)

detected memory leaks mainly in shadowmapping!!
strange problems with deferred rendering, seems to be uninitialized sometimes (solved?)

Line 
1/** This file contains various macros, templates and constants for the ERS system.
2    @author Jiri Bittner
3*/
4
5#ifndef __COMMON_H
6#define __COMMON_H
7
8
9#include <math.h>
10#include <stdlib.h>
11#include <iostream>
12#include <fstream>
13#include <string>
14#include <limits.h>
15#include <vector>
16#include <queue>
17
18
19
20namespace CHCDemoEngine
21{
22
23struct Triangle3;
24class BvhNode;
25class BvhLeaf;
26class OcclusionQuery;
27class SceneEntity;
28
29class Shape;
30struct LODLevel;
31class Polygon3;
32class Vector3;
33class Geometry;
34struct LODLevel;
35
36
37#if defined(_MSC_VER)
38// use perftimer only on msvc
39#define USE_PERFTIMER
40
41// define __SSE__ macro as it is not defined under MSVC
42#define __SSE__
43#endif
44
45// This constant should be used for the length of the array char for filenames
46// etc., for example: char filename[MaxStringLength]
47const int MaxStringLength = 256;
48
49#if defined(_MSC_VER)
50#pragma warning(disable:4018)
51#pragma warning(disable:4800)
52//#pragma warning(disable:4244)
53
54#if 0 // Note matt: comment this out because conflicts with definition in qt library!!
55typedef unsigned int uint;
56#endif
57typedef unsigned short ushort;
58typedef unsigned char uchar;
59typedef unsigned long ulong;
60#endif
61
62#if defined(__GNUC__) || defined(_MSC_VER)
63//#define DIRCAT '.'
64#endif
65
66#if !defined(__WATCOMC__) && !defined(__CYGWIN32__) && !defined(_MSC_VER)
67#include <values.h>
68#else // __WATCOMC__
69#define M_PI 3.14159265358979323846F
70#define M_E 2.71828182845904523536F
71#define MAXFLOAT 3.40282347e+37F
72#endif // __WATCOMC__
73
74// some compilers do not define the bool yet, but it was declared by ANSI
75#if !defined(__WATCOMC__) && !defined(_MSC_VER)
76#if defined (__GNUC__) || (_BOOL)
77//#error "HAS BOOL defined"
78#define HAS_BOOL
79#endif
80#else // __WATCOMC__
81#if  (__WATCOMC__ > 1060)
82//#error "Watcom HAS BOOL defined"
83#define HAS_BOOL
84#endif
85#endif // __WATCOMC__
86
87
88#if defined(__WATCOMC__) || defined(_MSC_VER)
89#define strcasecmp stricmp
90#define strncasecmp strnicmp
91#endif // __WATCOMC__
92
93// matt
94
95#define USE_GZLIB 1
96
97#if USE_GZLIB
98
99#define OUT_BIN_MODE ios::out
100#define IN_BIN_MODE ios::in
101
102#else
103
104#ifdef sgi
105#define OUT_BIN_MODE ios::out
106#define IN_BIN_MODE ios::in
107#else // sgi
108#if defined(__WATCOMC__) || defined(_MSC_VER)
109#define OUT_BIN_MODE ios::out | ios::binary
110#define IN_BIN_MODE ios::in | ios::binary
111#else
112#define OUT_BIN_MODE ios::out | ios::bin
113#define IN_BIN_MODE ios::in | ios::bin
114#endif // __WATCOMC_
115#endif // sgi
116
117#endif
118
119//  #ifndef HAS_BOOL
120//  //enum bool {
121//  //  false = 0,
122//  //  true
123//  //};
124//  #define bool int
125//  #define false 0
126//  #define true  1
127//  #endif // HAS_BOOL
128
129typedef unsigned long dword;
130
131#ifndef NULL
132#define NULL (void *)0
133#endif // NULL
134
135typedef float Real;
136typedef unsigned char byte;
137
138
139#ifndef getch
140#define getch() getchar()
141#endif
142
143#define TRASH 1.0e-5
144
145// delete a pointer and set to NULL
146#ifndef DEL_PTR
147#define DEL_PTR(ptr) do {if (ptr) {        \
148                           delete (ptr);   \
149                                                   (ptr) = 0;}}    \
150                     while (0)
151#endif
152
153
154// delete a pointer and set to NULL
155#ifndef DEL_ARRAY_PTR
156#define DEL_ARRAY_PTR(ptr) do {if (ptr) {           \
157                                   delete [] (ptr); \
158                                                           (ptr) = 0;}}     \
159                           while (0)
160#endif
161
162
163// Clears a container (i.e., a vector of pointers) and deletes the pointers
164#ifndef CLEAR_CONTAINER
165#define CLEAR_CONTAINER(co) do { for (size_t _i = 0; _i < (co).size(); ++ _i) { \
166        DEL_PTR((co)[_i]);} \
167        (co).clear(); } \
168while (0)
169#endif
170
171
172inline int signum(const Real a, const Real thresh = TRASH)
173{
174  if (a>thresh)
175    return 1;
176  else
177    if (a<-thresh)
178      return -1;
179  return 0;
180}
181
182inline double Absd(const double a)
183{
184  return (a >= 0.0) ? a : -a;
185}
186
187inline float Abs(const float a)
188{
189  return (a >= 0.0f) ? a : -a;
190}
191
192// =======================================================
193// Comparing things
194//struct Limits {
195//  const Real thresh=TRASH;
196//  const Real small=0.1;
197//};
198
199template <class T>
200bool
201ClipValue(T &v, const T m, const T M)
202{
203  if (v<m) {
204    v = m;
205    return true;
206  }
207  if (v>M) {
208    v = M;
209    return true;
210  }
211
212  return false;
213}
214
215
216inline int eq(Real a, Real b, Real t=TRASH)
217{
218  return Abs(a-b)<t;
219}
220
221inline int leq(Real a,Real b,Real t=TRASH)
222{
223  return a - b < t;
224}
225
226inline int geq(Real a,Real b,Real t=TRASH)
227{
228  return t > b - a;
229}
230
231inline int le(Real a,Real b,Real t=TRASH)
232{
233  return !geq(a,b,t);
234}
235
236inline int ge(Real a,Real b,Real t=TRASH)
237{
238  return !leq(a,b,t);
239}
240
241// ========================================================
242
243// -------------------------------------------------------------------
244// Indents to a given stream by the number of spaces specified.
245// This routine is located in main.cpp, for lack of a better place.
246// -------------------------------------------------------------------
247void indent(std::ostream &app, int ind);
248
249// ---------------------------------------------------------
250// RandomValue
251//      Returns a random Realing-point value between the two
252//      values.  Range is inclusive; the function should
253//      occasionally return exactly a or b.
254// ---------------------------------------------------------
255inline Real RandomValue(Real a, Real b)
256{
257  Real range = (Real) Abs(a - b);
258  return ((Real)rand() / RAND_MAX) * range + ((a < b) ? a : b);
259}
260
261
262inline Real sqr(Real a)
263{
264  return a*a;
265}
266
267
268template <class T>
269void Swap(T &a,T &b)
270{
271  T c;                 
272  c = b;
273  b = a;
274  a = c;
275}
276
277template <class T>
278int eq(T &a, T &b, T &c, T &d) {
279  return a == b && c==d && b==c;
280}
281
282template <class T>
283T Min(T a,T b)
284{
285  return a<b ? a : b;
286}
287
288template <class T>
289T Max(T a,T b)
290{
291  return a>b ? a : b;
292}
293
294
295Real Random(Real maxValue);
296int Random(int maxValue);
297void Randomize();
298void Randomize(unsigned int seed);
299
300
301void GetKey(char *s=NULL);
302
303inline Real Deg2Rad(const Real a)
304{
305   return a * (M_PI / 180.0f);
306}
307
308inline Real Rad2Deg(const Real a) {
309  return a * (180.0f/M_PI);
310}
311 
312inline Real Clamp(float x, float minVal, float maxVal)
313{
314        if (x < minVal) return minVal;
315        if (x > maxVal) return maxVal;
316
317        return x;
318}
319
320
321/** Limits.
322    This class encapsulates all the concessions to Realing-point
323        error made by ray tracers.
324*/
325class Limits
326{
327public:
328        // This is the number used to reject too-close intersections.
329        // The default value is 1.0.
330        static Real Threshold;
331
332        // This is a "small" number.  Less than this number is assumed to
333        // be 0, when such things matter.
334        // The default value is 0.1.
335        static Real Small;
336
337        // This is an impractically "large" number, used for intersection
338        // parameters out to infinity (e.g. the span resulting from an
339        // FindAllIntersections operation on a plane).
340        // The default value is 100000.
341        static Real Infinity;
342};
343
344// ---------------------------------------------------------
345// EpsilonEqual(x,y)
346//   Returns if two values are equal or not (by epsilon)
347// ---------------------------------------------------------
348inline int
349EpsilonEqual(const Real &x, const Real &y)
350{
351  return fabs(x-y) < Limits::Small;
352}
353
354// ---------------------------------------------------------
355// EpsilonEqual(x)
356//   Returns if a value is zero (+/- epsilon)
357// ---------------------------------------------------------
358inline int
359EpsilonEqual(const Real &x)
360{
361  return fabs(x) < Limits::Small;
362}
363
364// ---------------------------------------------------------
365// EpsilonEqual(x,y,epsilon)
366//   Returns if two values are equal or not by a given epsilon
367// ---------------------------------------------------------
368inline int
369EpsilonEqual(const Real &x, const Real &y, const Real &epsilon)
370{
371  return fabs(x-y) < epsilon;
372}
373
374// ---------------------------------------------------------
375// InRange
376//      Returns nonzero if min <= candidate <= max.
377// ---------------------------------------------------------
378template<class T>
379inline int
380InRange(T min, T max, T candidate)
381{
382  return (candidate >= min) && (candidate <= max);
383}
384
385// --------------------------------------------------------------
386// string function with new operator
387
388inline char*
389StrDup(char *src) {
390  char *p;
391  for (p = src; *p++; );
392  char *dest = new char[p-src];
393  for ( p = dest;(*p++ = *src++) != 0; );
394  return dest;
395}
396
397
398inline char *
399StrToLower(char *src) {
400  char *p;
401  for (p = src; *p; p++)
402    *p = tolower(*p);
403  return src;
404}
405
406// return l = log2(a) if a is a power of two else -ceillog2(a)
407inline int
408GetLog2(int a)
409{
410  int i, x;
411  i = 0;
412  x = 1;
413
414  while (x < a) {
415    i++;
416    x <<= 1;
417  }
418
419  return (x==a) ? i: -i;
420}
421
422
423// return ceil(log2(a)) even if a is not a power of two
424// Example:
425// GetCeilLog2(15) = 4
426// GetCeilLog2(16) = 4
427// GetCeilLog2(17) = 5
428inline int
429GetCeilLog2(int a)
430{
431  int i, x;
432  if (a < 0)
433    return -1;
434
435  i = 0;
436  x = 1;
437
438  while (x < a) {
439    i++;
440    x <<= 1;
441  }
442
443  return i;
444}
445
446
447char *GetAbsPath(char *path);
448
449
450std::string
451ReplaceSuffix(const std::string &filename, const std::string &a, const std::string &b);
452
453
454int
455SplitFilenames(const std::string &str, std::vector<std::string> &filenames);
456
457bool
458FileExists(char *filename);
459
460bool
461CreateDir(char *dir);
462
463char *
464GetPath(const char *s);
465
466char *
467StripPath(const char *s);
468
469
470
471//////
472//-- model directory
473
474static std::string model_path("data/city/model/");
475
476
477///////////
478//-- typedefs
479
480typedef std::vector<BvhNode *> BvhNodeContainer;
481typedef std::vector<SceneEntity *> SceneEntityContainer;
482typedef std::vector<BvhLeaf *> BvhLeafContainer;
483typedef std::vector<Triangle3> TriangleContainer;
484typedef std::vector<OcclusionQuery *> QueryContainer;
485
486typedef std::queue<OcclusionQuery *> QueryQueue;
487typedef std::queue<BvhNode *> BvhNodeQueue;
488
489
490typedef std::vector<Shape *> ShapeContainer;
491typedef std::vector<Geometry *> GeometryContainer;
492typedef std::vector<LODLevel *> LODLevelContainer;
493typedef std::vector<Polygon3 *> PolygonContainer;
494typedef std::vector<LODLevel *> LODContainer;
495
496typedef std::vector<Vector3> VertexArray;
497
498typedef std::pair<float, float> Texcoord2;
499
500
501static std::ofstream Debug("debug.log");
502
503
504#define INITIAL_TRIANGLES_PER_VIRTUAL_LEAVES 1000
505
506
507}
508
509#endif
510
511
512
513
514
515
516
517
Note: See TracBrowser for help on using the repository browser.