[#24267] Hook fails after Solidify
[blender.git] / source / blender / blenkernel / BKE_utildefines.h
1 /* 
2  * $Id$
3  *
4  * ***** BEGIN GPL LICENSE BLOCK *****
5  *
6  * This program is free software; you can redistribute it and/or
7  * modify it under the terms of the GNU General Public License
8  * as published by the Free Software Foundation; either version 2
9  * of the License, or (at your option) any later version.
10  *
11  * This program is distributed in the hope that it will be useful,
12  * but WITHOUT ANY WARRANTY; without even the implied warranty of
13  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14  * GNU General Public License for more details.
15  *
16  * You should have received a copy of the GNU General Public License
17  * along with this program; if not, write to the Free Software Foundation,
18  * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
19  *
20  * The Original Code is Copyright (C) 2001-2002 by NaN Holding BV.
21  * All rights reserved.
22  *
23  * The Original Code is: all of this file.
24  *
25  * Contributor(s): none yet.
26  *
27  * ***** END GPL LICENSE BLOCK *****
28 */
29
30 #ifndef BKE_UTILDEFINES_H
31 #define BKE_UTILDEFINES_H
32
33 #ifndef FALSE
34 #define FALSE 0
35 #endif
36
37 #ifndef TRUE
38 #define TRUE 1
39 #endif
40
41 /* Macro to convert a value to string in the preprocessor
42  * STRINGIFY_ARG: gives the defined name in the string
43  * STRINGIFY: gives the defined value. */
44 #define STRINGIFY_ARG(x) #x
45 #define STRINGIFY(x) STRINGIFY_ARG(x)
46
47 /* useful for debugging */
48 #define AT __FILE__ ":" STRINGIFY(__LINE__)
49
50
51 #ifdef __GNUC__
52 #  define UNUSED(x) UNUSED_ ## x __attribute__((__unused__))
53 #else
54 #  define UNUSED(x) UNUSED_ ## x
55 #endif
56
57 /* these values need to be hardcoded in structs, dna does not recognize defines */
58 /* also defined in DNA_space_types.h */
59 #ifndef FILE_MAXDIR
60 #define FILE_MAXDIR                     160
61 #define FILE_MAXFILE            80
62 #define FILE_MAX                        240
63 #endif
64
65 #define ELEM(a, b, c)           ( (a)==(b) || (a)==(c) )
66 #define ELEM3(a, b, c, d)       ( ELEM(a, b, c) || (a)==(d) )
67 #define ELEM4(a, b, c, d, e)    ( ELEM(a, b, c) || ELEM(a, d, e) )
68 #define ELEM5(a, b, c, d, e, f) ( ELEM(a, b, c) || ELEM3(a, d, e, f) )
69 #define ELEM6(a, b, c, d, e, f, g)      ( ELEM(a, b, c) || ELEM4(a, d, e, f, g) )
70 #define ELEM7(a, b, c, d, e, f, g, h)   ( ELEM3(a, b, c, d) || ELEM4(a, e, f, g, h) )
71 #define ELEM8(a, b, c, d, e, f, g, h, i)        ( ELEM4(a, b, c, d, e) || ELEM4(a, f, g, h, i) )
72 #define ELEM9(a, b, c, d, e, f, g, h, i, j)        ( ELEM4(a, b, c, d, e) || ELEM5(a, f, g, h, i, j) )
73 #define ELEM10(a, b, c, d, e, f, g, h, i, j, k)        ( ELEM4(a, b, c, d, e) || ELEM6(a, f, g, h, i, j, k) )
74 #define ELEM11(a, b, c, d, e, f, g, h, i, j, k, l)        ( ELEM4(a, b, c, d, e) || ELEM7(a, f, g, h, i, j, k, l) )
75
76 /* shift around elements */
77 #define SHIFT3(type, a, b, c) { type tmp; tmp = a; a = c; c = b; b = tmp; }
78 #define SHIFT4(type, a, b, c, d) { type tmp; tmp = a; a = d; d = c; c = b; b = tmp; }
79
80 /* min/max */
81 #define MIN2(x,y)               ( (x)<(y) ? (x) : (y) )
82 #define MIN3(x,y,z)             MIN2( MIN2((x),(y)) , (z) )
83 #define MIN4(x,y,z,a)           MIN2( MIN2((x),(y)) , MIN2((z),(a)) )
84
85 #define MAX2(x,y)               ( (x)>(y) ? (x) : (y) )
86 #define MAX3(x,y,z)             MAX2( MAX2((x),(y)) , (z) )
87 #define MAX4(x,y,z,a)           MAX2( MAX2((x),(y)) , MAX2((z),(a)) )
88
89 #define INIT_MINMAX(min, max) { (min)[0]= (min)[1]= (min)[2]= 1.0e30f; (max)[0]= (max)[1]= (max)[2]= -1.0e30f; }
90
91 #define INIT_MINMAX2(min, max) { (min)[0]= (min)[1]= 1.0e30f; (max)[0]= (max)[1]= -1.0e30f; }
92
93 #define DO_MIN(vec, min) { if( (min)[0]>(vec)[0] ) (min)[0]= (vec)[0];      \
94                                                           if( (min)[1]>(vec)[1] ) (min)[1]= (vec)[1];   \
95                                                           if( (min)[2]>(vec)[2] ) (min)[2]= (vec)[2]; } \
96
97 #define DO_MAX(vec, max) { if( (max)[0]<(vec)[0] ) (max)[0]= (vec)[0];          \
98                                                           if( (max)[1]<(vec)[1] ) (max)[1]= (vec)[1];   \
99                                                           if( (max)[2]<(vec)[2] ) (max)[2]= (vec)[2]; } \
100
101 #define DO_MINMAX(vec, min, max) { if( (min)[0]>(vec)[0] ) (min)[0]= (vec)[0]; \
102                                                           if( (min)[1]>(vec)[1] ) (min)[1]= (vec)[1]; \
103                                                           if( (min)[2]>(vec)[2] ) (min)[2]= (vec)[2]; \
104                                                           if( (max)[0]<(vec)[0] ) (max)[0]= (vec)[0]; \
105                                                           if( (max)[1]<(vec)[1] ) (max)[1]= (vec)[1]; \
106                                                           if( (max)[2]<(vec)[2] ) (max)[2]= (vec)[2]; } \
107
108 #define DO_MINMAX2(vec, min, max) { if( (min)[0]>(vec)[0] ) (min)[0]= (vec)[0]; \
109                                                           if( (min)[1]>(vec)[1] ) (min)[1]= (vec)[1]; \
110                                                           if( (max)[0]<(vec)[0] ) (max)[0]= (vec)[0]; \
111                                                           if( (max)[1]<(vec)[1] ) (max)[1]= (vec)[1]; }
112
113 /* some math and copy defines */
114
115 #ifndef SWAP
116 #define SWAP(type, a, b)        { type sw_ap; sw_ap=(a); (a)=(b); (b)=sw_ap; }
117 #endif
118
119 #define ABS(a)                                  ( (a)<0 ? (-(a)) : (a) )
120
121 #define AVG2(x, y)              ( 0.5 * ((x) + (y)) )
122
123 #define FTOCHAR(val) ((val)<=0.0f)? 0 : (((val)>(1.0f-0.5f/255.0f))? 255 : (char)((255.0f*(val))+0.5f))
124 #define FTOUSHORT(val) ((val >= 1.0f-0.5f/65535)? 65535: (val <= 0.0f)? 0: (unsigned short)(val*65535.0f + 0.5f))
125
126 #define VECCOPY(v1,v2)          {*(v1)= *(v2); *(v1+1)= *(v2+1); *(v1+2)= *(v2+2);}
127 #define VECCOPY2D(v1,v2)          {*(v1)= *(v2); *(v1+1)= *(v2+1);}
128 #define QUATCOPY(v1,v2)         {*(v1)= *(v2); *(v1+1)= *(v2+1); *(v1+2)= *(v2+2); *(v1+3)= *(v2+3);}
129 #define LONGCOPY(a, b, c)       {int lcpc=c, *lcpa=(int *)a, *lcpb=(int *)b; while(lcpc-->0) *(lcpa++)= *(lcpb++);}
130
131
132 #define VECADD(v1,v2,v3)        {*(v1)= *(v2) + *(v3); *(v1+1)= *(v2+1) + *(v3+1); *(v1+2)= *(v2+2) + *(v3+2);}
133 #define VECSUB(v1,v2,v3)        {*(v1)= *(v2) - *(v3); *(v1+1)= *(v2+1) - *(v3+1); *(v1+2)= *(v2+2) - *(v3+2);}
134 #define VECSUB2D(v1,v2,v3)      {*(v1)= *(v2) - *(v3); *(v1+1)= *(v2+1) - *(v3+1);}
135 #define VECADDFAC(v1,v2,v3,fac) {*(v1)= *(v2) + *(v3)*(fac); *(v1+1)= *(v2+1) + *(v3+1)*(fac); *(v1+2)= *(v2+2) + *(v3+2)*(fac);}
136 #define VECSUBFAC(v1,v2,v3,fac) {*(v1)= *(v2) - *(v3)*(fac); *(v1+1)= *(v2+1) - *(v3+1)*(fac); *(v1+2)= *(v2+2) - *(v3+2)*(fac);}
137 #define QUATADDFAC(v1,v2,v3,fac) {*(v1)= *(v2) + *(v3)*(fac); *(v1+1)= *(v2+1) + *(v3+1)*(fac); *(v1+2)= *(v2+2) + *(v3+2)*(fac); *(v1+3)= *(v2+3) + *(v3+3)*(fac);}
138
139 #define INPR(v1, v2)            ( (v1)[0]*(v2)[0] + (v1)[1]*(v2)[1] + (v1)[2]*(v2)[2] )
140
141
142 /* some misc stuff.... */
143 #define CLAMP(a, b, c)          if((a)<(b)) (a)=(b); else if((a)>(c)) (a)=(c)
144 #define CLAMPIS(a, b, c) ((a)<(b) ? (b) : (a)>(c) ? (c) : (a))
145 #define CLAMPTEST(a, b, c)      if((b)<(c)) {CLAMP(a, b, c);} else {CLAMP(a, c, b);}
146
147 #define IS_EQ(a,b) ((fabs((double)(a)-(b)) >= (double) FLT_EPSILON) ? 0 : 1)
148
149 #define IS_EQT(a, b, c) ((a > b)? (((a-b) <= c)? 1:0) : ((((b-a) <= c)? 1:0)))
150 #define IN_RANGE(a, b, c) ((b < c)? ((b<a && a<c)? 1:0) : ((c<a && a<b)? 1:0))
151 #define IN_RANGE_INCL(a, b, c) ((b < c)? ((b<=a && a<=c)? 1:0) : ((c<=a && a<=b)? 1:0))
152
153 /* this weirdo pops up in two places ... */
154 #if !defined(WIN32)
155 #ifndef O_BINARY
156 #define O_BINARY 0
157 #endif
158 #endif
159
160 /* INTEGER CODES */
161 #if defined(__sgi) || defined (__sparc) || defined (__sparc__) || defined (__PPC__) || defined (__ppc__) || defined (__hppa__) || defined (__BIG_ENDIAN__)
162         /* Big Endian */
163 #define MAKE_ID(a,b,c,d) ( (int)(a)<<24 | (int)(b)<<16 | (c)<<8 | (d) )
164 #else
165         /* Little Endian */
166 #define MAKE_ID(a,b,c,d) ( (int)(d)<<24 | (int)(c)<<16 | (b)<<8 | (a) )
167 #endif
168
169 #define ID_NEW(a)               if( (a) && (a)->id.newid ) (a)= (void *)(a)->id.newid
170
171 #define FORM MAKE_ID('F','O','R','M')
172
173 #define BLEN MAKE_ID('B','L','E','N')
174 #define DER_ MAKE_ID('D','E','R','_')
175 #define V100 MAKE_ID('V','1','0','0')
176
177 #define DATA MAKE_ID('D','A','T','A')
178 #define GLOB MAKE_ID('G','L','O','B')
179 #define IMAG MAKE_ID('I','M','A','G')
180
181 #define DNA1 MAKE_ID('D','N','A','1')
182 #define TEST MAKE_ID('T','E','S','T') /* used as preview between 'REND' and 'GLOB' */
183 #define REND MAKE_ID('R','E','N','D')
184 #define USER MAKE_ID('U','S','E','R')
185
186 #define ENDB MAKE_ID('E','N','D','B')
187
188
189 /* This one rotates the bytes in an int64, int (32) and short (16) */
190 #define SWITCH_INT64(a) { \
191         char s_i, *p_i; \
192         p_i= (char *)&(a); \
193         s_i=p_i[0]; p_i[0]=p_i[7]; p_i[7]=s_i; \
194         s_i=p_i[1]; p_i[1]=p_i[6]; p_i[6]=s_i; \
195         s_i=p_i[2]; p_i[2]=p_i[5]; p_i[5]=s_i; \
196         s_i=p_i[3]; p_i[3]=p_i[4]; p_i[4]=s_i; }
197
198 #define SWITCH_INT(a) { \
199         char s_i, *p_i; \
200         p_i= (char *)&(a); \
201         s_i=p_i[0]; p_i[0]=p_i[3]; p_i[3]=s_i; \
202         s_i=p_i[1]; p_i[1]=p_i[2]; p_i[2]=s_i; }
203
204 #define SWITCH_SHORT(a) { \
205         char s_i, *p_i; \
206         p_i= (char *)&(a); \
207         s_i=p_i[0]; p_i[0]=p_i[1]; p_i[1]=s_i; }
208
209
210 /* Bit operations */
211 #define BTST(a,b)       ( ( (a) & 1<<(b) )!=0 )   
212 #define BNTST(a,b)      ( ( (a) & 1<<(b) )==0 )
213 #define BTST2(a,b,c)    ( BTST( (a), (b) ) || BTST( (a), (c) ) )
214 #define BSET(a,b)       ( (a) | 1<<(b) )
215 #define BCLR(a,b)       ( (a) & ~(1<<(b)) )
216 /* bit-row */
217 #define BROW(min, max)  (((max)>=31? 0xFFFFFFFF: (1<<(max+1))-1) - ((min)? ((1<<(min))-1):0) )
218
219
220 #ifdef GS
221 #undef GS
222 #endif
223 #define GS(a)   (*((short *)(a)))
224
225 /* Warning-free macros for storing ints in pointers. Use these _only_
226  * for storing an int in a pointer, not a pointer in an int (64bit)! */
227 #define SET_INT_IN_POINTER(i) ((void*)(intptr_t)(i))
228 #define GET_INT_FROM_POINTER(i) ((int)(intptr_t)(i))
229
230 /*little array macro library.  example of usage:
231
232 int *arr = NULL;
233 V_DECLARE(arr);
234 int i;
235
236 for (i=0; i<10; i++) {
237         V_GROW(arr);
238         arr[i] = something;
239 }
240 V_FREE(arr);
241
242 arrays are buffered, using double-buffering (so on each reallocation,
243 the array size is doubled).  supposedly this should give good Big Oh
244 behaviour, though it may not be the best in practice.
245 */
246
247 #define V_DECLARE(vec) int _##vec##_count=0; void *_##vec##_tmp
248
249 /*in the future, I plan on having V_DECLARE allocate stack memory it'll
250   use at first, and switch over to heap when it needs more.  that'll mess
251   up cases where you'd want to use this API to build a dynamic list for
252   non-local use, so all such cases should use this macro.*/
253 #define V_DYNDECLARE(vec) V_DECLARE(vec)
254
255 /*this returns the entire size of the array, including any buffering.*/
256 #define V_SIZE(vec) ((signed int)((vec)==NULL ? 0 : MEM_allocN_len(vec) / sizeof(*vec)))
257
258 /*this returns the logical size of the array, not including buffering.*/
259 #define V_COUNT(vec) _##vec##_count
260
261 /*grow the array by one.  zeroes the new elements.*/
262 #define V_GROW(vec) \
263         V_SIZE(vec) > _##vec##_count ? _##vec##_count++ : \
264         ((_##vec##_tmp = MEM_callocN(sizeof(*vec)*(_##vec##_count*2+2), #vec " " __FILE__ " ")),\
265         (vec && memcpy(_##vec##_tmp, vec, sizeof(*vec) * _##vec##_count)),\
266         (vec && (MEM_freeN(vec),1)),\
267         (vec = _##vec##_tmp),\
268         _##vec##_count++)
269
270 #define V_FREE(vec) if (vec) MEM_freeN(vec);
271
272 /*resets the logical size of an array to zero, but doesn't
273   free the memory.*/
274 #define V_RESET(vec) _##vec##_count=0
275
276 /*set the count of the array*/
277 #define V_SETCOUNT(vec, count) _##vec##_count = (count)
278
279 /*little macro so inline keyword works*/
280 #if defined(_MSC_VER)
281 #define BM_INLINE static __forceinline
282 #else
283 #define BM_INLINE static inline __attribute((always_inline))
284 #endif
285
286 #define BMEMSET(mem, val, size) {unsigned int _i; char *_c = (char*) mem; for (_i=0; _i<size; _i++) *_c++ = val;}
287
288 #endif