#ifndef U_TYPEDEF_HPP
#define U_TYPEDEF_HPP

/*      Константы   */
#ifndef MAXSHORT 
#define MAXSHORT 0x7FFF                 
#define MINSHORT 0x8000
#endif  /* MAXSHORT */

#ifndef MAXLONG
#define MAXLONG  0x7FFFFFFF
#define MINLONG  0x80000000
#endif  /* MAXLONG */

#ifndef MAXFLOAT
#define MAXFLOAT 3.4e+38
#endif  /* MAXFLOAT */

#ifndef MAXDOUBLE
#define MAXDOUBLE 1.7e+308
#endif  /* MAXDOUBLE */

#ifndef FLOAT_ZERO_EPSILON
#define FLOAT_ZERO_EPSILON      1e-6
#endif  /* FLOAT_ZERO_EPSILON */

#ifndef FLOAT_ZERO_EPSILON_SQUARE
#define FLOAT_ZERO_EPSILON_SQUARE      1e-12
#endif  /* FLOAT_ZERO_EPSILON_SQUARE */

#ifndef U_ASSERT
#ifdef  DEBUG
#define U_ASSERT(exp) assert(exp)
#else
#define U_ASSERT(exp)
#endif
#endif

#ifndef U_UNASSIGN
#ifdef  DEBUG
#define U_UNASSIGN(ptr) ptr=NULL
#else
#define U_UNASSIGN(ptr)
#endif
#endif

/*      Базовые типы - гарантированная длина */
typedef unsigned char     u_8;
typedef char              i_8;
typedef unsigned short    u_16;
typedef short             i_16;
typedef unsigned long     u_32;
typedef long              i_32;
typedef unsigned __int64  u_64;
typedef __int64           i_64;

/*      Удобные типы - гарантированная длина */
typedef u_8               byte;
typedef byte              *pbyte;
typedef i_8               *pchar;
typedef i_16              word;
typedef word              *pword;
typedef u_32              dword;
typedef dword             *pdword;

/*      Булевский тип - длина НЕ гарантирована ! */
#if     !defined(__cplusplus) && defined(__WATCOMC__)
typedef enum              { false, true } uboolean;
#else
typedef int               uboolean;
#define false             0
#define true              (!false)
#endif

/*      Указатель - длина НЕ гарантирована ! */
typedef void              *pvoid;
/*      Базовый скалярный тип */
#ifdef  DOUBLEVEC
typedef double            scalar_t,*scalar_p;
#else   /* !DOUBLEVEC */
typedef float             scalar_t,*scalar_p;
#endif  /* DOUBLEVEC  */

typedef scalar_t          vec_t,*vec_p;

#define size_vec          sizeof(vec_t)

/*      Векторные типы    */
typedef vec_t             vec2_t[2];
typedef vec2_t            tex_t;
typedef vec_t             vec3_t[3];
typedef vec_t             vec4_t[4];
typedef vec3_t            rgb_t;
typedef vec4_t            rgba_t;
typedef vec_t             matrix2_t[2][2];
typedef vec_t             matrix3_t[3][3];
typedef vec_t             matrix4_t[4][4];
typedef vec_t             matrix3x4_t[3][4];
typedef matrix3x4_t       transform_t;
/*      Байтовые цвета RGB и с альфа - составляющей */
typedef struct  { byte b,g,r;}        bytebgr_t;
typedef struct  { byte a,b,g,r;}      byteabgr_t;
typedef struct  { byte r,g,b;}        bytergb_t;
typedef struct  { byte r,g,b,a;}      bytergba_t;

/*      Макрос для экспортируемых функций */
#ifdef  WIN32
#define UEXPORT           __declspec(dllexport) __stdcall
#else
#define UEXPORT           __stdcall
#endif

#endif
