1 ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
2 /**
3  *	Contains custom types.
4  *	\file		IceTypes.h
5  *	\author		Pierre Terdiman
6  *	\date		April, 4, 2000
7  */
8 ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
9 
10 ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
11 // Include Guard
12 #ifndef __ICETYPES_H__
13 #define __ICETYPES_H__
14 
15 ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
16 // Things to help us compile on non-windows platforms
17 
18 ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
19 
20 	#define USE_HANDLE_MANAGER
21 
22 	// Constants
23 	#define	PI					3.1415926535897932384626433832795028841971693993751f	//!< PI
24 	#define	HALFPI				1.57079632679489661923f									//!< 0.5 * PI
25 	#define	TWOPI				6.28318530717958647692f									//!< 2.0 * PI
26 	#define	INVPI				0.31830988618379067154f									//!< 1.0 / PI
27 
28 	#define	RADTODEG			57.2957795130823208768f									//!< 180.0 / PI, convert radians to degrees
29 	#define	DEGTORAD			0.01745329251994329577f									//!< PI / 180.0, convert degrees to radians
30 
31 	#define	EXP					2.71828182845904523536f									//!< e
32 	#define	INVLOG2				3.32192809488736234787f									//!< 1.0 / log10(2)
33 	#define	LN2					0.693147180559945f										//!< ln(2)
34 	#define	INVLN2				1.44269504089f											//!< 1.0f / ln(2)
35 
36 	#define	INV3				0.33333333333333333333f									//!< 1/3
37 	#define	INV6				0.16666666666666666666f									//!< 1/6
38 	#define	INV7				0.14285714285714285714f									//!< 1/7
39 	#define	INV9				0.11111111111111111111f									//!< 1/9
40 	#define	INV255				0.00392156862745098039f									//!< 1/255
41 
42 	#define	SQRT2				1.41421356237f											//!< sqrt(2)
43 	#define	INVSQRT2			0.707106781188f											//!< 1 / sqrt(2)
44 
45 	#define	SQRT3				1.73205080757f											//!< sqrt(3)
46 	#define	INVSQRT3			0.577350269189f											//!< 1 / sqrt(3)
47 
48 	#define null				0														//!< our own NULL pointer
49 
50 	// Custom types used in ICE
51 	typedef signed char			sbyte;		//!< sizeof(sbyte)	must be 1
52 	typedef unsigned char		ubyte;		//!< sizeof(ubyte)	must be 1
53 	typedef signed short		sword;		//!< sizeof(sword)	must be 2
54 	typedef unsigned short		uword;		//!< sizeof(uword)	must be 2
55 	typedef signed int			sdword;		//!< sizeof(sdword)	must be 4
56 	typedef unsigned int		udword;		//!< sizeof(udword)	must be 4
57 	typedef signed __int64		sqword;		//!< sizeof(sqword)	must be 8
58 	typedef unsigned __int64	uqword;		//!< sizeof(uqword)	must be 8
59 	typedef float				float32;	//!< sizeof(float32)	must be 4
60 	typedef double				float64;	//!< sizeof(float64)	must be 4
61 
62 	ICE_COMPILE_TIME_ASSERT(sizeof(ubyte)==1);
63 	ICE_COMPILE_TIME_ASSERT(sizeof(sbyte)==1);
64 	ICE_COMPILE_TIME_ASSERT(sizeof(sword)==2);
65 	ICE_COMPILE_TIME_ASSERT(sizeof(uword)==2);
66 	ICE_COMPILE_TIME_ASSERT(sizeof(udword)==4);
67 	ICE_COMPILE_TIME_ASSERT(sizeof(sdword)==4);
68 	ICE_COMPILE_TIME_ASSERT(sizeof(uqword)==8);
69 	ICE_COMPILE_TIME_ASSERT(sizeof(sqword)==8);
70 
71 	//! TO BE DOCUMENTED
72 	#define DECLARE_ICE_HANDLE(name)	struct name##__ { int unused; }; typedef struct name##__ *name
73 
74 	typedef udword				DynID;		//!< Dynamic identifier
75 #ifdef USE_HANDLE_MANAGER
76 	typedef udword				KID;		//!< Kernel ID
77 //	DECLARE_ICE_HANDLE(KID);
78 #else
79 	typedef uword				KID;		//!< Kernel ID
80 #endif
81 	typedef udword				RTYPE;		//!< Relationship-type (!) between owners and references
82 	#define	INVALID_ID			0xffffffff	//!< Invalid dword ID (counterpart of null pointers)
83 #ifdef USE_HANDLE_MANAGER
84 	#define	INVALID_KID			0xffffffff	//!< Invalid Kernel ID
85 #else
86 	#define	INVALID_KID			0xffff		//!< Invalid Kernel ID
87 #endif
88 	#define	INVALID_NUMBER		0xDEADBEEF	//!< Standard junk value
89 
90 	// Define BOOL if needed
91 	#ifndef BOOL
92 	typedef int	BOOL;						//!< Another boolean type.
93 	#endif
94 
95 	//! Union of a float and a sdword
96 	typedef union {
97 		float	f;							//!< The float
98 		sdword	d;							//!< The integer
99 	}scell;
100 
101 	//! Union of a float and a udword
102 	typedef union {
103 		float	f;							//!< The float
104 		udword	d;							//!< The integer
105 	}ucell;
106 
107 	// Type ranges
108 	#define	MAX_SBYTE				0x7f						//!< max possible sbyte value
109 	#define	MIN_SBYTE				0x80						//!< min possible sbyte value
110 	#define	MAX_UBYTE				0xff						//!< max possible ubyte value
111 	#define	MIN_UBYTE				0x00						//!< min possible ubyte value
112 	#define	MAX_SWORD				0x7fff						//!< max possible sword value
113 	#define	MIN_SWORD				0x8000						//!< min possible sword value
114 	#define	MAX_UWORD				0xffff						//!< max possible uword value
115 	#define	MIN_UWORD				0x0000						//!< min possible uword value
116 	#define	MAX_SDWORD				0x7fffffff					//!< max possible sdword value
117 	#define	MIN_SDWORD				0x80000000					//!< min possible sdword value
118 	#define	MAX_UDWORD				0xffffffff					//!< max possible udword value
119 	#define	MIN_UDWORD				0x00000000					//!< min possible udword value
120 	#define	MAX_FLOAT				FLT_MAX						//!< max possible float value
121 	#define	MIN_FLOAT				(-FLT_MAX)					//!< min possible loat value
122 	#define IEEE_1_0				0x3f800000					//!< integer representation of 1.0
123 	#define IEEE_255_0				0x437f0000					//!< integer representation of 255.0
124 	#define IEEE_MAX_FLOAT			0x7f7fffff					//!< integer representation of MAX_FLOAT
125 	#define IEEE_MIN_FLOAT			0xff7fffff					//!< integer representation of MIN_FLOAT
126 	#define IEEE_UNDERFLOW_LIMIT	0x1a000000
127 
128 	#define ONE_OVER_RAND_MAX		(1.0f / float(RAND_MAX))	//!< Inverse of the max possible value returned by rand()
129 
130 	typedef int					(__stdcall* PROC)();			//!< A standard procedure call.
131 	typedef bool				(*ENUMERATION)(udword value, udword param, udword context);	//!< ICE standard enumeration call
132 	typedef	void**				VTABLE;							//!< A V-Table.
133 
134 	#undef		MIN
135 	#undef		MAX
136 	#define		MIN(a, b)       ((a) < (b) ? (a) : (b))			//!< Returns the min value between a and b
137 	#define		MAX(a, b)       ((a) > (b) ? (a) : (b))			//!< Returns the max value between a and b
138 	#define		MAXMAX(a,b,c)   ((a) > (b) ? MAX (a,c) : MAX (b,c))	//!<	Returns the max value between a, b and c
139 
TMin(const T & a,const T & b)140 	template<class T>	inline_ const T&	TMin	(const T& a, const T& b)	{ return b < a ? b : a;	}
TMax(const T & a,const T & b)141 	template<class T>	inline_ const T&	TMax	(const T& a, const T& b)	{ return a < b ? b : a;	}
TSetMin(T & a,const T & b)142 	template<class T>	inline_ void		TSetMin	(T& a, const T& b)			{ if(a>b)	a = b;		}
TSetMax(T & a,const T & b)143 	template<class T>	inline_ void		TSetMax	(T& a, const T& b)			{ if(a<b)	a = b;		}
144 
145 	#define		SQR(x)			((x)*(x))						//!< Returns x square
146 	#define		CUBE(x)			((x)*(x)*(x))					//!< Returns x cube
147 
148 	#define		AND		&										//!< ...
149 	#define		OR		|										//!< ...
150 	#define		XOR		^										//!< ...
151 
152 	#define		QUADRAT(x)		((x)*(x))						//!< Returns x square
153 
154 #ifdef _WIN32
155 #   define srand48(x) srand((unsigned int) (x))
156 #	define srandom(x) srand((unsigned int) (x))
157 #	define random()   ((double) rand())
158 #   define drand48()  ((double) (((double) rand()) / ((double) RAND_MAX)))
159 #endif
160 
161 #endif // __ICETYPES_H__
162