SVN maintenance.
[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 /* these values need to be hardcoded in structs, dna does not recognize defines */
42 /* also defined in DNA_space_types.h */
43 #ifndef FILE_MAXDIR
44 #define FILE_MAXDIR                     160
45 #define FILE_MAXFILE            80
46 #define FILE_MAX                        240
47 #endif
48
49 #define ELEM(a, b, c)           ( (a)==(b) || (a)==(c) )
50 #define ELEM3(a, b, c, d)       ( ELEM(a, b, c) || (a)==(d) )
51 #define ELEM4(a, b, c, d, e)    ( ELEM(a, b, c) || ELEM(a, d, e) )
52 #define ELEM5(a, b, c, d, e, f) ( ELEM(a, b, c) || ELEM3(a, d, e, f) )
53 #define ELEM6(a, b, c, d, e, f, g)      ( ELEM(a, b, c) || ELEM4(a, d, e, f, g) )
54 #define ELEM7(a, b, c, d, e, f, g, h)   ( ELEM3(a, b, c, d) || ELEM4(a, e, f, g, h) )
55 #define ELEM8(a, b, c, d, e, f, g, h, i)        ( ELEM4(a, b, c, d, e) || ELEM4(a, f, g, h, i) )
56 #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) )
57 #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) )
58 #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) )
59
60 /* shift around elements */
61 #define SHIFT3(type, a, b, c) { type tmp; tmp = a; a = c; c = b; b = tmp; }
62 #define SHIFT4(type, a, b, c, d) { type tmp; tmp = a; a = d; d = c; c = b; b = tmp; }
63
64 /* min/max */
65 #define MIN2(x,y)               ( (x)<(y) ? (x) : (y) )
66 #define MIN3(x,y,z)             MIN2( MIN2((x),(y)) , (z) )
67 #define MIN4(x,y,z,a)           MIN2( MIN2((x),(y)) , MIN2((z),(a)) )
68
69 #define MAX2(x,y)               ( (x)>(y) ? (x) : (y) )
70 #define MAX3(x,y,z)             MAX2( MAX2((x),(y)) , (z) )
71 #define MAX4(x,y,z,a)           MAX2( MAX2((x),(y)) , MAX2((z),(a)) )
72
73 #define INIT_MINMAX(min, max) { (min)[0]= (min)[1]= (min)[2]= 1.0e30f; (max)[0]= (max)[1]= (max)[2]= -1.0e30f; }
74
75 #define INIT_MINMAX2(min, max) { (min)[0]= (min)[1]= 1.0e30f; (max)[0]= (max)[1]= -1.0e30f; }
76
77 #define DO_MIN(vec, min) { if( (min)[0]>(vec)[0] ) (min)[0]= (vec)[0];      \
78                                                           if( (min)[1]>(vec)[1] ) (min)[1]= (vec)[1];   \
79                                                           if( (min)[2]>(vec)[2] ) (min)[2]= (vec)[2]; } \
80
81 #define DO_MAX(vec, max) { if( (max)[0]<(vec)[0] ) (max)[0]= (vec)[0];          \
82                                                           if( (max)[1]<(vec)[1] ) (max)[1]= (vec)[1];   \
83                                                           if( (max)[2]<(vec)[2] ) (max)[2]= (vec)[2]; } \
84
85 #define DO_MINMAX(vec, min, max) { if( (min)[0]>(vec)[0] ) (min)[0]= (vec)[0]; \
86                                                           if( (min)[1]>(vec)[1] ) (min)[1]= (vec)[1]; \
87                                                           if( (min)[2]>(vec)[2] ) (min)[2]= (vec)[2]; \
88                                                           if( (max)[0]<(vec)[0] ) (max)[0]= (vec)[0]; \
89                                                           if( (max)[1]<(vec)[1] ) (max)[1]= (vec)[1]; \
90                                                           if( (max)[2]<(vec)[2] ) (max)[2]= (vec)[2]; } \
91
92 #define DO_MINMAX2(vec, min, max) { if( (min)[0]>(vec)[0] ) (min)[0]= (vec)[0]; \
93                                                           if( (min)[1]>(vec)[1] ) (min)[1]= (vec)[1]; \
94                                                           if( (max)[0]<(vec)[0] ) (max)[0]= (vec)[0]; \
95                                                           if( (max)[1]<(vec)[1] ) (max)[1]= (vec)[1]; }
96
97 /* some math and copy defines */
98
99 #ifndef SWAP
100 #define SWAP(type, a, b)        { type sw_ap; sw_ap=(a); (a)=(b); (b)=sw_ap; }
101 #endif
102
103 #define ABS(a)                                  ( (a)<0 ? (-(a)) : (a) )
104
105 #define AVG2(x, y)              ( 0.5 * ((x) + (y)) )
106
107 #define FTOCHAR(val) ((val)<=0.0f)? 0 : (((val)>(1.0f-0.5f/255.0f))? 255 : (char)((255.0f*(val))+0.5f))
108
109 #define VECCOPY(v1,v2)          {*(v1)= *(v2); *(v1+1)= *(v2+1); *(v1+2)= *(v2+2);}
110 #define VECCOPY2D(v1,v2)          {*(v1)= *(v2); *(v1+1)= *(v2+1);}
111 #define QUATCOPY(v1,v2)         {*(v1)= *(v2); *(v1+1)= *(v2+1); *(v1+2)= *(v2+2); *(v1+3)= *(v2+3);}
112 #define LONGCOPY(a, b, c)       {int lcpc=c, *lcpa=(int *)a, *lcpb=(int *)b; while(lcpc-->0) *(lcpa++)= *(lcpb++);}
113
114
115 #define VECADD(v1,v2,v3)        {*(v1)= *(v2) + *(v3); *(v1+1)= *(v2+1) + *(v3+1); *(v1+2)= *(v2+2) + *(v3+2);}
116 #define VECSUB(v1,v2,v3)        {*(v1)= *(v2) - *(v3); *(v1+1)= *(v2+1) - *(v3+1); *(v1+2)= *(v2+2) - *(v3+2);}
117 #define VECSUB2D(v1,v2,v3)      {*(v1)= *(v2) - *(v3); *(v1+1)= *(v2+1) - *(v3+1);}
118 #define VECADDFAC(v1,v2,v3,fac) {*(v1)= *(v2) + *(v3)*(fac); *(v1+1)= *(v2+1) + *(v3+1)*(fac); *(v1+2)= *(v2+2) + *(v3+2)*(fac);}
119 #define VECSUBFAC(v1,v2,v3,fac) {*(v1)= *(v2) - *(v3)*(fac); *(v1+1)= *(v2+1) - *(v3+1)*(fac); *(v1+2)= *(v2+2) - *(v3+2)*(fac);}
120 #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);}
121
122 #define INPR(v1, v2)            ( (v1)[0]*(v2)[0] + (v1)[1]*(v2)[1] + (v1)[2]*(v2)[2] )
123
124
125 /* some misc stuff.... */
126 #define CLAMP(a, b, c)          if((a)<(b)) (a)=(b); else if((a)>(c)) (a)=(c)
127 #define CLAMPIS(a, b, c) ((a)<(b) ? (b) : (a)>(c) ? (c) : (a))
128 #define CLAMPTEST(a, b, c)      if((b)<(c)) {CLAMP(a, b, c);} else {CLAMP(a, c, b);}
129
130 #define IS_EQ(a,b) ((fabs((double)(a)-(b)) >= (double) FLT_EPSILON) ? 0 : 1)
131
132 #define IS_EQT(a, b, c) ((a > b)? (((a-b) <= c)? 1:0) : ((((b-a) <= c)? 1:0)))
133 #define IN_RANGE(a, b, c) ((b < c)? ((b<a && a<c)? 1:0) : ((c<a && a<b)? 1:0))
134 #define IN_RANGE_INCL(a, b, c) ((b < c)? ((b<=a && a<=c)? 1:0) : ((c<=a && a<=b)? 1:0))
135
136 /* this weirdo pops up in two places ... */
137 #if !defined(WIN32)
138 #ifndef O_BINARY
139 #define O_BINARY 0
140 #endif
141 #endif
142
143 /* INTEGER CODES */
144 #if defined(__sgi) || defined (__sparc) || defined (__sparc__) || defined (__PPC__) || defined (__ppc__) || defined (__hppa__) || defined (__BIG_ENDIAN__)
145         /* Big Endian */
146 #define MAKE_ID(a,b,c,d) ( (int)(a)<<24 | (int)(b)<<16 | (c)<<8 | (d) )
147 #else
148         /* Little Endian */
149 #define MAKE_ID(a,b,c,d) ( (int)(d)<<24 | (int)(c)<<16 | (b)<<8 | (a) )
150 #endif
151
152 #define ID_NEW(a)               if( (a) && (a)->id.newid ) (a)= (void *)(a)->id.newid
153
154 #define FORM MAKE_ID('F','O','R','M')
155
156 #define BLEN MAKE_ID('B','L','E','N')
157 #define DER_ MAKE_ID('D','E','R','_')
158 #define V100 MAKE_ID('V','1','0','0')
159
160 #define DATA MAKE_ID('D','A','T','A')
161 #define GLOB MAKE_ID('G','L','O','B')
162 #define IMAG MAKE_ID('I','M','A','G')
163
164 #define DNA1 MAKE_ID('D','N','A','1')
165 #define TEST MAKE_ID('T','E','S','T')
166 #define REND MAKE_ID('R','E','N','D')
167 #define USER MAKE_ID('U','S','E','R')
168
169 #define ENDB MAKE_ID('E','N','D','B')
170
171
172 /* This one rotates the bytes in an int64, int (32) and short (16) */
173 #define SWITCH_INT64(a) { \
174         char s_i, *p_i; \
175         p_i= (char *)&(a); \
176         s_i=p_i[0]; p_i[0]=p_i[7]; p_i[7]=s_i; \
177         s_i=p_i[1]; p_i[1]=p_i[6]; p_i[6]=s_i; \
178         s_i=p_i[2]; p_i[2]=p_i[5]; p_i[5]=s_i; \
179         s_i=p_i[3]; p_i[3]=p_i[4]; p_i[4]=s_i; }
180
181 #define SWITCH_INT(a) { \
182         char s_i, *p_i; \
183         p_i= (char *)&(a); \
184         s_i=p_i[0]; p_i[0]=p_i[3]; p_i[3]=s_i; \
185         s_i=p_i[1]; p_i[1]=p_i[2]; p_i[2]=s_i; }
186
187 #define SWITCH_SHORT(a) { \
188         char s_i, *p_i; \
189         p_i= (char *)&(a); \
190         s_i=p_i[0]; p_i[0]=p_i[1]; p_i[1]=s_i; }
191
192
193 /* Bit operations */
194 #define BTST(a,b)       ( ( (a) & 1<<(b) )!=0 )   
195 #define BNTST(a,b)      ( ( (a) & 1<<(b) )==0 )
196 #define BTST2(a,b,c)    ( BTST( (a), (b) ) || BTST( (a), (c) ) )
197 #define BSET(a,b)       ( (a) | 1<<(b) )
198 #define BCLR(a,b)       ( (a) & ~(1<<(b)) )
199 /* bit-row */
200 #define BROW(min, max)  (((max)>=31? 0xFFFFFFFF: (1<<(max+1))-1) - ((min)? ((1<<(min))-1):0) )
201
202
203 #ifdef GS
204 #undef GS
205 #endif
206 #define GS(a)   (*((short *)(a)))
207
208 /* Warning-free macros for storing ints in pointers. Use these _only_
209  * for storing an int in a pointer, not a pointer in an int (64bit)! */
210 #define SET_INT_IN_POINTER(i) ((void*)(intptr_t)(i))
211 #define GET_INT_FROM_POINTER(i) ((int)(intptr_t)(i))
212
213 /*little array macro library.  example of usage:
214
215 int *arr = NULL;
216 V_DECLARE(arr);
217 int i;
218
219 for (i=0; i<10; i++) {
220         V_GROW(arr);
221         arr[i] = something;
222 }
223 V_FREE(arr);
224
225 arrays are buffered, using double-buffering (so on each reallocation,
226 the array size is doubled).  supposedly this should give good Big Oh
227 behaviour, though it may not be the best in practice.
228 */
229
230 #define V_DECLARE(vec) int _##vec##_count=0; void *_##vec##_tmp
231
232 /*in the future, I plan on having V_DECLARE allocate stack memory it'll
233   use at first, and switch over to heap when it needs more.  that'll mess
234   up cases where you'd want to use this API to build a dynamic list for
235   non-local use, so all such cases should use this macro.*/
236 #define V_DYNDECLARE(vec) V_DECLARE(vec)
237
238 /*this returns the entire size of the array, including any buffering.*/
239 #define V_SIZE(vec) ((signed int)((vec)==NULL ? 0 : MEM_allocN_len(vec) / sizeof(*vec)))
240
241 /*this returns the logical size of the array, not including buffering.*/
242 #define V_COUNT(vec) _##vec##_count
243
244 /*grow the array by one.  zeroes the new elements.*/
245 #define V_GROW(vec) \
246         V_SIZE(vec) > _##vec##_count ? _##vec##_count++ : \
247         ((_##vec##_tmp = MEM_callocN(sizeof(*vec)*(_##vec##_count*2+2), #vec " " __FILE__ " ")),\
248         (vec && memcpy(_##vec##_tmp, vec, sizeof(*vec) * _##vec##_count)),\
249         (vec && (MEM_freeN(vec),1)),\
250         (vec = _##vec##_tmp),\
251         _##vec##_count++)
252
253 #define V_FREE(vec) if (vec) MEM_freeN(vec);
254
255 /*resets the logical size of an array to zero, but doesn't
256   free the memory.*/
257 #define V_RESET(vec) _##vec##_count=0
258
259 /*set the count of the array*/
260 #define V_SETCOUNT(vec, count) _##vec##_count = (count)
261
262 /*little macro so inline keyword works*/
263 #if defined(_MSC_VER)
264 #define BM_INLINE static __forceinline
265 #else
266 #define BM_INLINE static inline __attribute((always_inline))
267 #endif
268
269 #define BMEMSET(mem, val, size) {unsigned int _i; char *_c = (char*) mem; for (_i=0; _i<size; _i++) *_c++ = val;}
270
271 #endif