fix for warnings & detecting opensource nouveau drivers.
[blender-staging.git] / intern / elbeem / intern / utilities.h
1 /******************************************************************************
2  *
3  * El'Beem - Free Surface Fluid Simulation with the Lattice Boltzmann Method
4  * Copyright 2003-2006 Nils Thuerey
5  *
6  * Global C style utility funcions
7  *
8  *****************************************************************************/
9 #ifndef UTILITIES_H
10 #include "ntl_vector3dim.h"
11
12
13 /* debugging outputs , debug level 0 (off) to 10 (max) */
14 #ifdef ELBEEM_PLUGIN
15 #ifdef DEBUG
16 #undef DEBUG
17 #endif
18 #define DEBUG 0
19 #else // ELBEEM_PLUGIN
20 #define DEBUG 10
21 #endif // ELBEEM_PLUGIN
22 extern "C" int gDebugLevel;
23
24
25 // time measurements
26 typedef unsigned long myTime_t;
27
28
29 // state of the simulation world
30 // default
31 #define SIMWORLD_INVALID       0
32 // performing init
33 #define SIMWORLD_INITIALIZING  1
34 // after init, before starting simulation
35 #define SIMWORLD_INITED        2
36 // stop of the simulation run, can be continued later
37 #define SIMWORLD_STOP          3
38 // error during init
39 #define SIMWORLD_INITERROR    -1
40 // error during simulation
41 #define SIMWORLD_PANIC        -2
42 // general error 
43 #define SIMWORLD_GENERICERROR -3
44
45 // access global state of elbeem simulator
46 void setElbeemState(int set);
47 int  getElbeemState(void);
48 int  isSimworldOk(void);
49
50 // access elbeem simulator error string
51 void setElbeemErrorString(const char* set);
52 char* getElbeemErrorString(void);
53
54
55 /* debug output function */
56 #define DM_MSG        1
57 #define DM_NOTIFY     2
58 #define DM_IMPORTANT  3
59 #define DM_WARNING    4
60 #define DM_ERROR      5
61 #define DM_DIRECT     6
62 #define DM_FATAL      7
63 void messageOutputFunc(string from, int id, string msg, myTime_t interval);
64
65 /* debugging messages defines */
66 #ifdef DEBUG 
67 #if LBM_PRECISION==2
68 #define MSGSTREAM std::ostringstream msg; msg.precision(15); msg.width(17);
69 #else
70 #define MSGSTREAM std::ostringstream msg; msg.precision(7); msg.width(9);
71 #endif
72
73 #       define debMsgDirect(mStr)                         if(gDebugLevel>0)      { std::ostringstream msg; msg << mStr; messageOutputFunc(string(""), DM_DIRECT, msg.str(), 0); }
74 #       define debMsgStd(from,id,mStr,level)              if(gDebugLevel>=level) { MSGSTREAM; msg << mStr <<"\n"; messageOutputFunc(from, id, msg.str(), 0); }
75 #       define debMsgNnl(from,id,mStr,level)              if(gDebugLevel>=level) { MSGSTREAM; msg << mStr       ; messageOutputFunc(from, id, msg.str(), 0); }
76 #       define debMsgInter(from,id,mStr,level, interval)  if(gDebugLevel>=level) { MSGSTREAM; msg << mStr <<"\n"; messageOutputFunc(from, id, msg.str(), interval); }
77 #       define debugOut(mStr,level)                       if(gDebugLevel>=level) { debMsgStd("D",DM_MSG,mStr,level); }
78 #       define debugOutNnl(mStr,level)                    if(gDebugLevel>=level) { debMsgNnl("D",DM_MSG,mStr,level); }
79 #       define debugOutInter(mStr,level, interval)        debMsgInter("D",DM_MSG ,mStr,level, interval); 
80 /* Error output function */
81 #define errMsg(from,mStr)                           if(gDebugLevel>0){ MSGSTREAM; msg << mStr <<"\n"; messageOutputFunc(from, DM_ERROR,   msg.str(), 0); }
82 #define warnMsg(from,mStr)                          if(gDebugLevel>0){ MSGSTREAM; msg << mStr <<"\n"; messageOutputFunc(from, DM_WARNING, msg.str(), 0); }
83
84 #else
85 // no messages at all...
86 #       define debMsgDirect(mStr)
87 #       define debMsgStd(from,id,mStr,level)
88 #       define debMsgNnl(from,id,mStr,level)
89 #       define debMsgInter(from,id,mStr,level, interval)
90 #       define debugOut(mStr,level)  
91 #       define debugOutNnl(mStr,level)  
92 #       define debugOutInter(mStr,level, interval) 
93 #       define errMsg(from,mStr)
94 #       define warnMsg(from,mStr)
95 #endif
96
97 #define errorOut(mStr) { errMsg("D",mStr); }
98
99 // fatal errors - have to be handled 
100 #define errFatal(from,mStr,errCode) { \
101         setElbeemState(errCode); \
102         MSGSTREAM; msg << mStr; \
103         messageOutputFunc(from, DM_FATAL, msg.str(), 0); \
104 }
105
106
107 //! helper function that converts a string to integer
108 int convertString2Int(const char *str, int alt);
109
110 //! helper function that converts a flag field to a readable integer
111 string convertFlags2String(int flags);
112
113 //! get the current system time
114 myTime_t getTime();
115 //! convert time to readable string
116 string getTimeString(myTime_t usecs);
117
118 //! helper to check if a bounding box was specified in the right way
119 bool checkBoundingBox(ntlVec3Gfx s, ntlVec3Gfx e, string checker);
120
121 //! reset color output for elbeem init
122 void resetGlobalColorSetting();
123
124
125 /*! print some vector from 3 values e.g. for ux,uy,uz */
126 #define PRINT_VEC(x,y,z) " ["<<(x)<<","<<(y)<<","<<(z)<<"] "
127
128 /*! print some vector from 3 values e.g. for ux,uy,uz */
129 #define PRINT_VEC2D(x,y) " ["<<(x)<<","<<(y)<<"] "
130
131 /*! print l'th neighbor of i,j,k as a vector, as we need ijk all the time */
132 #define PRINT_IJK_NBL PRINT_VEC(i+D::dfVecX[l],j+D::dfVecY[l],k+D::dfVecZ[l])
133
134 /*! print i,j,k as a vector, as we need ijk all the time */
135 #define PRINT_IJK PRINT_VEC(i,j,k)
136
137 /*! print i,j,k as a vector, as we need ijk all the time */
138 #define PRINT_IJ PRINT_VEC2D(i,j)
139
140 /*! print some vector from 3 values e.g. for ux,uy,uz */
141 #define PRINT_NTLVEC(v) " ["<<(v)[0]<<","<<(v)[1]<<","<<(v)[2]<<"] "
142
143 /*! print some vector from 3 values e.g. for ux,uy,uz */
144 #define PRINT_NTLVEC2D(v) " ["<<(v)[0]<<","<<(v)[1]<<"] "
145
146 /*! print a triangle */
147 #define PRINT_TRIANGLE(t,mpV)  " { "<<PRINT_VEC( (mpV[(t).getPoints()[0]][0]),(mpV[(t).getPoints()[0]][1]),(mpV[(t).getPoints()[0]][2]) )<<\
148         PRINT_VEC( (mpV[(t).getPoints()[1]][0]),(mpV[(t).getPoints()[1]][1]),(mpV[(t).getPoints()[1]][2]) )<<" | "<<\
149         PRINT_VEC( (mpV[(t).getPoints()[2]][0]),(mpV[(t).getPoints()[2]][1]),(mpV[(t).getPoints()[2]][2]) )<<" } "
150
151
152 // write png image
153 int writePng(const char *fileName, unsigned char **rowsp, int w, int h);
154
155 /* some useful templated functions 
156  * may require some operators for the classes
157  */
158
159 /* minimum */
160 #ifdef MIN
161 #undef MIN
162 #endif
163 template < class T >
164 inline T
165 MIN( T a, T b )
166 { return (a < b) ? a : b ; }
167
168 /* maximum */
169 #ifdef MAX
170 #undef MAX
171 #endif
172 template < class T >
173 inline T
174 MAX( T a, T b )
175 { return (a < b) ? b : a ; }
176
177 /* absolute value */
178 template < class T >
179 inline T
180 ABS( T a )
181 { return (0 < a) ? a : -a ; }
182
183 /* sign of the value */
184 template < class T >
185 inline T
186 SIGNUM( T a )
187 { return (0 < a) ? 1 : -1 ; }
188
189 /* sign, returns -1,0,1 depending on sign/value=0 */
190 template < class T >
191 inline T
192 SIGNUM0( T a )
193 { return (0 < a) ? 1 : ( a < 0 ? -1 : 0 ) ; }
194
195 /* round to nearest integer */
196 inline int
197 ROUND(double d)
198 { return int(d + 0.5); }
199
200 /* square function */
201 template < class T >
202 inline T
203 SQUARE( T a )
204 { return a*a; }
205
206
207 #define UTILITIES_H
208 #endif