00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015 #ifndef MACROS_H
00016 #define MACROS_H
00017
00018 #define MALLOC(a) ((a)*)simm_malloc(sizeof(a))
00019 #define ABS(a) ((a)>0?(a):(-(a)))
00020 #define DOUBLE_ABS(a) ((a)>(double)0.0?(a):(-(a)))
00021 #define DABS(a) ((a)>(double)0.0?(a):(-(a)))
00022 #define EQUAL_WITHIN_ERROR(a,b) (DABS(((a)-(b))) <= ROUNDOFF_ERROR)
00023 #define NOT_EQUAL_WITHIN_ERROR(a,b) (DABS(((a)-(b))) > ROUNDOFF_ERROR)
00024 #define EQUAL_WITHIN_TOLERANCE(a,b,c) (DABS(((a)-(b))) <= (c))
00025 #define NOT_EQUAL_WITHIN_TOLERANCE(a,b,c) (DABS(((a)-(b))) > (c))
00026 #define NEAR_LT_OR_EQ(a, b) ((b) <= (b) + ROUNDOFF_ERROR)
00027 #define NEAR_GT_OR_EQ(a, b) ((a) >= (b) - ROUNDOFF_ERROR)
00028 #define SIGN(a) ((a)>=0?(1):(-1))
00029 #define MAX(a,b) ((a)>=(b)?(a):(b))
00030 #define MIN(a,b) ((a)<=(b)?(a):(b))
00031 #define SQR(x) ((x) * (x))
00032 #define CUBE(x) ((x) * (x) * (x))
00033 #define DSIGN(a) ((a)>=0.0?(1):(-1))
00034 #define CEILING(a,b) (((a)+(b)-1)/(b))
00035 #define FREE_IFNOTNULL(p) if (p != NULL) free(p)
00036 #define STRLEN(p) (strlen(p)+1)
00037 #define CURSOR_IN_REGION_PTR(mx,my,vp) ((SBoolean) ((mx) >= (vp)->x1 && (mx) <= (vp)->x2 && \
00038 (my) >= (vp)->y1 && (my) <= (vp)->y2))
00039 #define CURSOR_IN_REGION(mx,my,vp) ((SBoolean) ((mx) >= (vp).x1 && (mx) <= (vp).x2 && \
00040 (my) >= (vp).y1 && (my) <= (vp).y2))
00041 #define PERCENT_FROM_MIDPOINT(mx,vp) (((double)(mx)-((vp)->x1+(vp)->x2)/2)/(((vp)->x2-(vp)->x1)/2))
00042 #define DISTANCE_FROM_MIDPOINT(mx,vp) (((mx)-((vp)->x1+(vp)->x2)/2))
00043 #define VECTOR_MAGNITUDE(vec) (sqrt((vec[0]*vec[0])+(vec[1]*vec[1])+(vec[2]*vec[2])))
00044 #define CHAR_IS_WHITE_SPACE(ch) ((ch) == ' ' || (ch) == '\t' || (ch) == '\n' || (ch) == '\r')
00045 #define CHAR_IS_NOT_WHITE_SPACE(ch) ((ch) != ' ' && (ch) != '\t' && (ch) != '\n' && (ch) != '\r')
00046 #define NULLIFY_STRING(str) ((str)[0] = '\0')
00047 #define STRING_IS_NULL(str) (str[0] == '\0')
00048 #define STRING_IS_NOT_NULL(str) (str[0] != '\0')
00049 #define STRINGS_ARE_EQUAL(ptr1,ptr2) (!strcmp(ptr1,ptr2))
00050 #define STRINGS_ARE_NOT_EQUAL(ptr1,ptr2) (strcmp(ptr1,ptr2))
00051 #define FORCE_VALUE_INTO_RANGE(a,b,c) if ((a)<(b)) (a)=(b); else if ((a)>(c)) (a)=(c);
00052 #define MODULATE_VALUE_INTO_RANGE(a,b,c) while ((a)<(b)) (a)+=((c)-(b)); \
00053 while ((a)>(c)) (a)-=((c)-(b));
00054 #define CHECK_DIVIDE(t,b) ((ABS(b))<TINY_NUMBER)?(ERROR_DOUBLE):((t)/(b))
00055 #define SET_BOX1221(box,a,b,c,d) (box).x1=(a);(box).x2=(b);(box).y2=(c);(box).y1=(d)
00056 #define SET_BOX(box,a,b,c,d) (box).x1=(a); (box).x2=(b); (box).y1=(c); (box).y2=(d)
00057 #define GET_PATH(mod,f1,f2) (model[mod]->pathptrs[model[mod]->numsegments*f1+f2])
00058 #define MAKE_3DVECTOR(pt1,pt2,pt3) {pt3[XX]=pt2[XX]-pt1[XX];pt3[YY]=pt2[YY]-pt1[YY];pt3[ZZ]=pt2[ZZ]-pt1[ZZ];}
00059 #define MAKE_3DVECTOR21(pt1,pt2,pt3) {pt3[XX]=pt1[XX]-pt2[XX];pt3[YY]=pt1[YY]-pt2[YY];pt3[ZZ]=pt1[ZZ]-pt2[ZZ];}
00060 #define DOT_VECTORS(u,v) ( (u[0])*(v[0]) + (u[1])*(v[1]) + (u[2])*(v[2]) )
00061 #define CALC_DETERMINANT(m) (((m[0][0]) * ((m[1][1])*(m[2][2]) - (m[1][2])*(m[2][1]))) - \
00062 ((m[0][1]) * ((m[1][0])*(m[2][2]) - (m[1][2])*(m[2][0]))) + \
00063 ((m[0][2]) * ((m[1][0])*(m[2][1]) - (m[1][1])*(m[2][0]))))
00064 #define ANGLES_APX_EQ(x, y) (DABS((x) - (y)) <= ANGLE_EPSILON)
00065 #define PTS_ARE_EQUAL(Pt1, Pt2) (BOOL_APX_EQ(Pt1[0], Pt2[0]) && \
00066 BOOL_APX_EQ(Pt1[1], Pt2[1]) && \
00067 BOOL_APX_EQ(Pt1[2], Pt2[2]))
00068
00069 #define PTS_ARE_EQUAL3(Pt1, Pt2) (BOOL_APX_EQ3(Pt1[0], Pt2[0]) && \
00070 BOOL_APX_EQ3(Pt1[1], Pt2[1]) && \
00071 BOOL_APX_EQ3(Pt1[2], Pt2[2]))
00072
00073 #define READ4(ptr,fp) {\
00074 *(((char*)(ptr)) )=getc(fp);\
00075 *(((char*)(ptr))+1)=getc(fp);\
00076 *(((char*)(ptr))+2)=getc(fp);\
00077 *(((char*)(ptr))+3)=getc(fp);\
00078 }
00079
00080 #define COPY_1X4VECTOR(from,to) {\
00081 to[0] = from[0];\
00082 to[1] = from[1];\
00083 to[2] = from[2];\
00084 to[3] = from[3];\
00085 }
00086 #define COPY_1X3VECTOR(from,to) {\
00087 to[0] = from[0];\
00088 to[1] = from[1];\
00089 to[2] = from[2];\
00090 }
00091
00092 #define MAKE_IDENTITY_MATRIX(mat) {\
00093 mat[0][1] = mat[0][2] = mat[0][3] = 0.0;\
00094 mat[1][0] = mat[1][2] = mat[1][3] = 0.0;\
00095 mat[2][0] = mat[2][1] = mat[2][3] = 0.0;\
00096 mat[3][0] = mat[3][1] = mat[3][2] = 0.0;\
00097 mat[0][0] = mat[1][1] = mat[2][2] = mat[3][3] = 1.0;\
00098 }
00099
00100 #endif