svn merge -r 22111:22138 https://svn.blender.org/svnroot/bf-blender/branches/blender2...
[blender.git] / source / blender / blenkernel / BKE_utildefines.h
1 /* 
2         $Id$
3
4  *
5  * ***** BEGIN GPL LICENSE BLOCK *****
6  *
7  * This program is free software; you can redistribute it and/or
8  * modify it under the terms of the GNU General Public License
9  * as published by the Free Software Foundation; either version 2
10  * of the License, or (at your option) any later version.
11  *
12  * This program is distributed in the hope that it will be useful,
13  * but WITHOUT ANY WARRANTY; without even the implied warranty of
14  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15  * GNU General Public License for more details.
16  *
17  * You should have received a copy of the GNU General Public License
18  * along with this program; if not, write to the Free Software Foundation,
19  * Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
20  *
21  * The Original Code is Copyright (C) 2001-2002 by NaN Holding BV.
22  * All rights reserved.
23  *
24  * The Original Code is: all of this file.
25  *
26  * Contributor(s): none yet.
27  *
28  * ***** END GPL LICENSE BLOCK *****
29 */
30
31 #ifndef BKE_UTILDEFINES_H
32 #define BKE_UTILDEFINES_H
33
34 #ifndef FALSE
35 #define FALSE 0
36 #endif
37
38 #ifndef TRUE
39 #define TRUE 1
40 #endif
41
42 /* these values need to be hardcoded in structs, dna does not recognize defines */
43 /* also defined in DNA_space_types.h */
44 #ifndef FILE_MAXDIR
45 #define FILE_MAXDIR                     160
46 #define FILE_MAXFILE            80
47 #define FILE_MAX                        240
48 #endif
49
50 #define ELEM(a, b, c)           ( (a)==(b) || (a)==(c) )
51 #define ELEM3(a, b, c, d)       ( ELEM(a, b, c) || (a)==(d) )
52 #define ELEM4(a, b, c, d, e)    ( ELEM(a, b, c) || ELEM(a, d, e) )
53 #define ELEM5(a, b, c, d, e, f) ( ELEM(a, b, c) || ELEM3(a, d, e, f) )
54 #define ELEM6(a, b, c, d, e, f, g)      ( ELEM(a, b, c) || ELEM4(a, d, e, f, g) )
55 #define ELEM7(a, b, c, d, e, f, g, h)   ( ELEM3(a, b, c, d) || ELEM4(a, e, f, g, h) )
56 #define ELEM8(a, b, c, d, e, f, g, h, i)        ( ELEM4(a, b, c, d, e) || ELEM4(a, f, g, h, i) )
57 #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) )
58 #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) )
59 #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) )
60
61 /* shift around elements */
62 #define SHIFT3(type, a, b, c) { type tmp; tmp = a; a = c; c = b; b = tmp; }
63 #define SHIFT4(type, a, b, c, d) { type tmp; tmp = a; a = d; d = c; c = b; b = tmp; }
64
65 /* string compare */
66 #define STREQ(str, a)           ( strcmp((str), (a))==0 )
67 #define STREQ2(str, a, b)       ( STREQ(str, a) || STREQ(str, b) )
68 #define STREQ3(str, a, b, c)    ( STREQ2(str, a, b) || STREQ(str, c) )
69
70 /* min/max */
71 #define MIN2(x,y)               ( (x)<(y) ? (x) : (y) )
72 #define MIN3(x,y,z)             MIN2( MIN2((x),(y)) , (z) )
73 #define MIN4(x,y,z,a)           MIN2( MIN2((x),(y)) , MIN2((z),(a)) )
74
75 #define MAX2(x,y)               ( (x)>(y) ? (x) : (y) )
76 #define MAX3(x,y,z)             MAX2( MAX2((x),(y)) , (z) )
77 #define MAX4(x,y,z,a)           MAX2( MAX2((x),(y)) , MAX2((z),(a)) )
78
79 #define INIT_MINMAX(min, max) { (min)[0]= (min)[1]= (min)[2]= 1.0e30f; (max)[0]= (max)[1]= (max)[2]= -1.0e30f; }
80
81 #define INIT_MINMAX2(min, max) { (min)[0]= (min)[1]= 1.0e30f; (max)[0]= (max)[1]= -1.0e30f; }
82
83 #define DO_MIN(vec, min) { if( (min)[0]>(vec)[0] ) (min)[0]= (vec)[0];      \
84                                                           if( (min)[1]>(vec)[1] ) (min)[1]= (vec)[1];   \
85                                                           if( (min)[2]>(vec)[2] ) (min)[2]= (vec)[2]; } \
86
87 #define DO_MAX(vec, max) { if( (max)[0]<(vec)[0] ) (max)[0]= (vec)[0];          \
88                                                           if( (max)[1]<(vec)[1] ) (max)[1]= (vec)[1];   \
89                                                           if( (max)[2]<(vec)[2] ) (max)[2]= (vec)[2]; } \
90
91 #define DO_MINMAX(vec, min, max) { if( (min)[0]>(vec)[0] ) (min)[0]= (vec)[0]; \
92                                                           if( (min)[1]>(vec)[1] ) (min)[1]= (vec)[1]; \
93                                                           if( (min)[2]>(vec)[2] ) (min)[2]= (vec)[2]; \
94                                                           if( (max)[0]<(vec)[0] ) (max)[0]= (vec)[0]; \
95                                                           if( (max)[1]<(vec)[1] ) (max)[1]= (vec)[1]; \
96                                                           if( (max)[2]<(vec)[2] ) (max)[2]= (vec)[2]; } \
97
98 #define DO_MINMAX2(vec, min, max) { if( (min)[0]>(vec)[0] ) (min)[0]= (vec)[0]; \
99                                                           if( (min)[1]>(vec)[1] ) (min)[1]= (vec)[1]; \
100                                                           if( (max)[0]<(vec)[0] ) (max)[0]= (vec)[0]; \
101                                                           if( (max)[1]<(vec)[1] ) (max)[1]= (vec)[1]; }
102
103 #define MINSIZE(val, size)      ( ((val)>=0.0) ? (((val)<(size)) ? (size): (val)) : ( ((val)>(-size)) ? (-size) : (val)))
104
105 /* some math and copy defines */
106
107 #define SWAP(type, a, b)        { type sw_ap; sw_ap=(a); (a)=(b); (b)=sw_ap; }
108
109 #define ABS(a)                                  ( (a)<0 ? (-(a)) : (a) )
110
111 #define AVG2(x, y)              ( 0.5 * ((x) + (y)) )
112
113 #define FTOCHAR(val) ((val)<=0.0f)? 0 : (((val)>(1.0f-0.5f/255.0f))? 255 : (char)((255.0f*(val))+0.5f))
114
115 #define VECCOPY(v1,v2)          {*(v1)= *(v2); *(v1+1)= *(v2+1); *(v1+2)= *(v2+2);}
116 #define VECCOPY2D(v1,v2)          {*(v1)= *(v2); *(v1+1)= *(v2+1);}
117 #define QUATCOPY(v1,v2)         {*(v1)= *(v2); *(v1+1)= *(v2+1); *(v1+2)= *(v2+2); *(v1+3)= *(v2+3);}
118 #define LONGCOPY(a, b, c)       {int lcpc=c, *lcpa=(int *)a, *lcpb=(int *)b; while(lcpc-->0) *(lcpa++)= *(lcpb++);}
119
120
121 #define VECADD(v1,v2,v3)        {*(v1)= *(v2) + *(v3); *(v1+1)= *(v2+1) + *(v3+1); *(v1+2)= *(v2+2) + *(v3+2);}
122 #define VECSUB(v1,v2,v3)        {*(v1)= *(v2) - *(v3); *(v1+1)= *(v2+1) - *(v3+1); *(v1+2)= *(v2+2) - *(v3+2);}
123 #define VECSUB2D(v1,v2,v3)      {*(v1)= *(v2) - *(v3); *(v1+1)= *(v2+1) - *(v3+1);}
124 #define VECADDFAC(v1,v2,v3,fac) {*(v1)= *(v2) + *(v3)*(fac); *(v1+1)= *(v2+1) + *(v3+1)*(fac); *(v1+2)= *(v2+2) + *(v3+2)*(fac);}
125 #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);}
126
127 #define INPR(v1, v2)            ( (v1)[0]*(v2)[0] + (v1)[1]*(v2)[1] + (v1)[2]*(v2)[2] )
128
129
130 /* some misc stuff.... */
131 #define CLAMP(a, b, c)          if((a)<(b)) (a)=(b); else if((a)>(c)) (a)=(c)
132 #define CLAMPIS(a, b, c) ((a)<(b) ? (b) : (a)>(c) ? (c) : (a))
133 #define CLAMPTEST(a, b, c)      if((b)<(c)) {CLAMP(a, b, c);} else {CLAMP(a, c, b);}
134
135 #define IS_EQ(a,b) ((fabs((double)(a)-(b)) >= (double) FLT_EPSILON) ? 0 : 1)
136
137 #define IS_EQT(a, b, c) ((a > b)? (((a-b) <= c)? 1:0) : ((((b-a) <= c)? 1:0)))
138 #define IN_RANGE(a, b, c) ((b < c)? ((b<a && a<c)? 1:0) : ((c<a && a<b)? 1:0))
139 #define IN_RANGE_INCL(a, b, c) ((b < c)? ((b<=a && a<=c)? 1:0) : ((c<=a && a<=b)? 1:0))
140
141 /* this weirdo pops up in two places ... */
142 #if !defined(WIN32)
143 #ifndef O_BINARY
144 #define O_BINARY 0
145 #endif
146 #endif
147
148 /* INTEGER CODES */
149 #if defined(__sgi) || defined (__sparc) || defined (__sparc__) || defined (__PPC__) || defined (__ppc__) || defined (__hppa__) || defined (__BIG_ENDIAN__)
150         /* Big Endian */
151 #define MAKE_ID(a,b,c,d) ( (int)(a)<<24 | (int)(b)<<16 | (c)<<8 | (d) )
152 #else
153         /* Little Endian */
154 #define MAKE_ID(a,b,c,d) ( (int)(d)<<24 | (int)(c)<<16 | (b)<<8 | (a) )
155 #endif
156
157 #define ID_NEW(a)               if( (a) && (a)->id.newid ) (a)= (void *)(a)->id.newid
158
159 #define FORM MAKE_ID('F','O','R','M')
160
161 #define BLEN MAKE_ID('B','L','E','N')
162 #define DER_ MAKE_ID('D','E','R','_')
163 #define V100 MAKE_ID('V','1','0','0')
164
165 #define DATA MAKE_ID('D','A','T','A')
166 #define GLOB MAKE_ID('G','L','O','B')
167 #define IMAG MAKE_ID('I','M','A','G')
168
169 #define DNA1 MAKE_ID('D','N','A','1')
170 #define TEST MAKE_ID('T','E','S','T')
171 #define REND MAKE_ID('R','E','N','D')
172 #define USER MAKE_ID('U','S','E','R')
173
174 #define ENDB MAKE_ID('E','N','D','B')
175
176
177 /* This one rotates the bytes in an int */
178 #define SWITCH_INT(a) { \
179         char s_i, *p_i; \
180         p_i= (char *)&(a); \
181         s_i=p_i[0]; p_i[0]=p_i[3]; p_i[3]=s_i; \
182         s_i=p_i[1]; p_i[1]=p_i[2]; p_i[2]=s_i; }
183
184 #define SWITCH_SHORT(a) { \
185         char s_i, *p_i; \
186         p_i= (char *)&(a); \
187         s_i=p_i[0]; p_i[0]=p_i[1]; p_i[1]=s_i; }
188
189
190 /* Bit operations */
191 #define BTST(a,b)       ( ( (a) & 1<<(b) )!=0 )   
192 #define BNTST(a,b)      ( ( (a) & 1<<(b) )==0 )
193 #define BTST2(a,b,c)    ( BTST( (a), (b) ) || BTST( (a), (c) ) )
194 #define BSET(a,b)       ( (a) | 1<<(b) )
195 #define BCLR(a,b)       ( (a) & ~(1<<(b)) )
196 /* bit-row */
197 #define BROW(min, max)  (((max)>=31? 0xFFFFFFFF: (1<<(max+1))-1) - ((min)? ((1<<(min))-1):0) )
198
199
200 #ifdef GS
201 #undef GS
202 #endif
203 #define GS(a)   (*((short *)(a)))
204
205 /* Warning-free macros for storing ints in pointers. Use these _only_
206  * for storing an int in a pointer, not a pointer in an int (64bit)! */
207 #define SET_INT_IN_POINTER(i) ((void*)(intptr_t)(i))
208 #define GET_INT_FROM_POINTER(i) ((int)(intptr_t)(i))
209
210 #endif
211