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

Revision 2898, 10.1 KB checked in by mattausch, 16 years ago (diff)
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
29
30
31#if defined(_MSC_VER)
32// use perftimer only on msvc
33#define USE_PERFTIMER
34
35// define __SSE__ macro as it is not defined under MSVC
36#define __SSE__
37#endif
38
39// This constant should be used for the length of the array char for filenames
40// etc., for example: char filename[MaxStringLength]
41const int MaxStringLength = 256;
42
43#if defined(_MSC_VER)
44#pragma warning(disable:4018)
45#pragma warning(disable:4800)
46//#pragma warning(disable:4244)
47
48#if 0 // Note matt: comment this out because conflicts with definition in qt library!!
49typedef unsigned int uint;
50#endif
51typedef unsigned short ushort;
52typedef unsigned char uchar;
53typedef unsigned long ulong;
54#endif
55
56#if defined(__GNUC__) || defined(_MSC_VER)
57//#define DIRCAT '.'
58#endif
59
60#if !defined(__WATCOMC__) && !defined(__CYGWIN32__) && !defined(_MSC_VER)
61#include <values.h>
62#else // __WATCOMC__
63#define M_PI 3.14159265358979323846F
64#define M_E 2.71828182845904523536F
65#define MAXFLOAT 3.40282347e+37F
66#endif // __WATCOMC__
67
68// some compilers do not define the bool yet, but it was declared by ANSI
69#if !defined(__WATCOMC__) && !defined(_MSC_VER)
70#if defined (__GNUC__) || (_BOOL)
71//#error "HAS BOOL defined"
72#define HAS_BOOL
73#endif
74#else // __WATCOMC__
75#if  (__WATCOMC__ > 1060)
76//#error "Watcom HAS BOOL defined"
77#define HAS_BOOL
78#endif
79#endif // __WATCOMC__
80
81
82#if defined(__WATCOMC__) || defined(_MSC_VER)
83#define strcasecmp stricmp
84#define strncasecmp strnicmp
85#endif // __WATCOMC__
86
87// matt
88
89#define USE_GZLIB 1
90
91#if USE_GZLIB
92
93#define OUT_BIN_MODE ios::out
94#define IN_BIN_MODE ios::in
95
96#else
97
98#ifdef sgi
99#define OUT_BIN_MODE ios::out
100#define IN_BIN_MODE ios::in
101#else // sgi
102#if defined(__WATCOMC__) || defined(_MSC_VER)
103#define OUT_BIN_MODE ios::out | ios::binary
104#define IN_BIN_MODE ios::in | ios::binary
105#else
106#define OUT_BIN_MODE ios::out | ios::bin
107#define IN_BIN_MODE ios::in | ios::bin
108#endif // __WATCOMC_
109#endif // sgi
110
111#endif
112
113//  #ifndef HAS_BOOL
114//  //enum bool {
115//  //  false = 0,
116//  //  true
117//  //};
118//  #define bool int
119//  #define false 0
120//  #define true  1
121//  #endif // HAS_BOOL
122
123typedef unsigned long dword;
124
125#ifndef NULL
126#define NULL (void *)0
127#endif // NULL
128
129typedef float Real;
130typedef unsigned char byte;
131
132
133#ifndef getch
134#define getch() getchar()
135#endif
136
137#define TRASH 1.0e-5
138
139// delete a pointer and set to NULL
140#ifndef DEL_PTR
141#define DEL_PTR(ptr) do {if (ptr) {        \
142                           delete (ptr);   \
143                                                   (ptr) = 0;}}    \
144                     while (0)
145#endif
146
147
148// delete a pointer and set to NULL
149#ifndef DEL_ARRAY_PTR
150#define DEL_ARRAY_PTR(ptr) do {if (ptr) {           \
151                                   delete [] (ptr); \
152                                                           (ptr) = 0;}}     \
153                           while (0)
154#endif
155
156
157// Clears a container (i.e., a vector of pointers) and deletes the pointers
158#ifndef CLEAR_CONTAINER
159#define CLEAR_CONTAINER(co) do { for (size_t _i = 0; _i < (int)(co).size(); ++ _i) { \
160        DEL_PTR((co)[_i]);} \
161        (co).clear(); } \
162while (0)
163#endif
164
165
166inline int signum(const Real a, const Real thresh = TRASH)
167{
168  if (a>thresh)
169    return 1;
170  else
171    if (a<-thresh)
172      return -1;
173  return 0;
174}
175
176inline double Absd(const double a)
177{
178  return (a >= 0.0) ? a : -a;
179}
180
181inline float Abs(const float a)
182{
183  return (a >= 0.0f) ? a : -a;
184}
185
186// =======================================================
187// Comparing things
188//struct Limits {
189//  const Real thresh=TRASH;
190//  const Real small=0.1;
191//};
192
193template <class T>
194bool
195ClipValue(T &v, const T m, const T M)
196{
197  if (v<m) {
198    v = m;
199    return true;
200  }
201  if (v>M) {
202    v = M;
203    return true;
204  }
205
206  return false;
207}
208
209
210inline int eq(Real a, Real b, Real t=TRASH)
211{
212  return Abs(a-b)<t;
213}
214
215inline int leq(Real a,Real b,Real t=TRASH)
216{
217  return a - b < t;
218}
219
220inline int geq(Real a,Real b,Real t=TRASH)
221{
222  return t > b - a;
223}
224
225inline int le(Real a,Real b,Real t=TRASH)
226{
227  return !geq(a,b,t);
228}
229
230inline int ge(Real a,Real b,Real t=TRASH)
231{
232  return !leq(a,b,t);
233}
234
235// ========================================================
236
237// -------------------------------------------------------------------
238// Indents to a given stream by the number of spaces specified.
239// This routine is located in main.cpp, for lack of a better place.
240// -------------------------------------------------------------------
241void indent(std::ostream &app, int ind);
242
243// ---------------------------------------------------------
244// RandomValue
245//      Returns a random Realing-point value between the two
246//      values.  Range is inclusive; the function should
247//      occasionally return exactly a or b.
248// ---------------------------------------------------------
249inline Real RandomValue(Real a, Real b)
250{
251  Real range = (Real) Abs(a - b);
252  return ((Real)rand() / RAND_MAX) * range + ((a < b) ? a : b);
253}
254
255
256/*inline int
257RandomValue(int a, int b)
258{
259        int range = abs(a - b);
260        return (rand() * range) / RAND_MAX + ((a < b) ? a : b);
261}*/
262
263inline Real sqr(Real a)
264{
265  return a*a;
266}
267
268
269template <class T>
270void Swap(T &a,T &b)
271{
272  T c;                 
273  c = b;
274  b = a;
275  a = c;
276}
277
278template <class T>
279int eq(T &a, T &b, T &c, T &d) {
280  return a == b && c==d && b==c;
281}
282
283template <class T>
284T Min(T a,T b)
285{
286  return a<b ? a : b;
287}
288
289template <class T>
290T Max(T a,T b)
291{
292  return a>b ? a : b;
293}
294
295
296Real Random(Real max);
297int Random(int max);
298void Randomize();
299void Randomize(unsigned int seed);
300
301
302void GetKey(char *s=NULL);
303
304inline Real Deg2Rad(const Real a)
305{
306   return a * (M_PI / 180.0f);
307}
308
309inline Real Rad2Deg(const Real a) {
310  return a * (180.0f/M_PI);
311}
312 
313void InitTiming();
314long GetTime();
315long GetRealTime();
316Real TimeDiff(long t1, long t2);
317char *TimeString();
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 *
448GetAbsPath(char *path);
449
450char *
451strdup(char *a);
452
453std::string
454ReplaceSuffix(const std::string &filename, const std::string &a, const std::string &b);
455
456
457int
458SplitFilenames(const std::string &str, std::vector<std::string> &filenames);
459
460bool
461FileExists(char *filename);
462
463bool
464CreateDir(char *dir);
465
466char *
467GetPath(const char *s);
468
469char *
470StripPath(const char *s);
471
472
473
474//////
475//-- model directory
476
477static std::string model_path("data/city/model/");
478
479
480///////////
481//-- typedefs
482
483typedef std::vector<BvhNode *> BvhNodeContainer;
484typedef std::vector<SceneEntity *> SceneEntityContainer;
485typedef std::vector<BvhLeaf *> BvhLeafContainer;
486typedef std::vector<Triangle3> TriangleContainer;
487typedef std::vector<OcclusionQuery *> QueryContainer;
488
489typedef std::queue<OcclusionQuery *> QueryQueue;
490typedef std::queue<BvhNode *> BvhNodeQueue;
491
492static std::ofstream Debug("debug.log");
493
494
495#define INITIAL_TRIANGLES_PER_VIRTUAL_LEAVES 1000
496
497class Shape;
498typedef std::vector<Shape *> ShapeContainer;
499
500struct LODLevel;
501typedef std::vector<LODLevel *> LODLevelContainer;
502
503}
504
505#endif
506
507
508
509
510
511
512
513
Note: See TracBrowser for help on using the repository browser.