quake4-sdk/source/idlib/Lib.h

331 lines
8.9 KiB
C++

#ifndef __LIB_H__
#define __LIB_H__
/*
===============================================================================
idLib contains stateless support classes and concrete types. Some classes
do have static variables, but such variables are initialized once and
read-only after initialization (they do not maintain a modifiable state).
The interface pointers idSys, idCommon, idCVarSystem and idFileSystem
should be set before using idLib. The pointers stored here should not
be used by any part of the engine except for idLib.
The frameNumber should be continuously set to the number of the current
frame if frame base memory logging is required.
===============================================================================
*/
class idLib {
public:
static class idSys * sys;
static class idCommon * common;
static class idCVarSystem * cvarSystem;
static class idFileSystem * fileSystem;
static int frameNumber;
static void Init( void );
static void ShutDown( void );
// wrapper to idCommon functions
static void Error( const char *fmt, ... );
static void Warning( const char *fmt, ... );
};
/*
===============================================================================
Asserts and Exceptions
===============================================================================
*/
/*
The verify(x) macro just returns true or false in release mode, but breaks
in debug mode. That way the code can take a non-fatal path in release mode
if something that's not supposed to happen happens.
if ( !verify(game) ) {
// This should never happen!
return;
}
*/
#ifdef _DEBUG
#define ID_CONDITIONAL_ASSERT
void AssertFailed( const char *file, int line, const char *expression );
#undef assert
#ifdef ID_CONDITIONAL_ASSERT
// lets you disable an assertion at runtime when needed
// could extend this to count and produce an assert log - useful for 'release with asserts' builds
#define assert( x ) \
{ \
volatile static bool assert_enabled = true; \
if ( assert_enabled ) { \
if ( x ) { } else AssertFailed( __FILE__, __LINE__, #x ); \
} \
}
#define verify( x ) \
( \
( ( x ) ? true : ( \
( { \
volatile static bool assert_enabled = true; \
if ( assert_enabled ) { AssertFailed( __FILE__, __LINE__, #x ); } \
} ) \
, false ) ) \
)
#else
#define assert( x ) if ( x ) { } else AssertFailed( __FILE__, __LINE__, #x )
#define verify( x ) ( ( x ) ? true : ( AssertFailed( __FILE__, __LINE__, #x ), false ) )
#endif
#else
#undef assert
#define assert( x )
#define verify( x ) ( ( x ) ? true : false )
#endif
#define assert_8_byte_aligned( pointer ) assert( (((UINT_PTR)(pointer))&7) == 0 );
#define assert_16_byte_aligned( pointer ) assert( (((UINT_PTR)(pointer))&15) == 0 );
#define assert_32_byte_aligned( pointer ) assert( (((UINT_PTR)(pointer))&31) == 0 );
#ifndef __TYPE_INFO_GEN__
#define compile_time_assert( x ) { typedef int compile_time_assert_failed[(x) ? 1 : -1]; }
#define file_scoped_compile_time_assert( x ) extern int compile_time_assert_failed[(x) ? 1 : -1]
#define assert_sizeof( type, size ) file_scoped_compile_time_assert( sizeof( type ) == size )
#define assert_offsetof( type, field, offset ) file_scoped_compile_time_assert( offsetof( type, field ) == offset )
#define assert_sizeof_8_byte_multiple( type ) file_scoped_compile_time_assert( ( sizeof( type ) & 8 ) == 0 )
#define assert_sizeof_16_byte_multiple( type ) file_scoped_compile_time_assert( ( sizeof( type ) & 15 ) == 0 )
#define assert_sizeof_32_byte_multiple( type ) file_scoped_compile_time_assert( ( sizeof( type ) & 31 ) == 0 )
#else
#define compile_time_assert( x )
#define file_scoped_compile_time_assert( x )
#define assert_sizeof( type, size )
#define assert_offsetof( type, field, offset )
#define assert_sizeof_16_byte_multiple( type )
#endif
class idException {
public:
char error[2048];
idException( const char *text = "" ) { strcpy( error, text ); }
};
/*
===============================================================================
Types and defines used throughout the engine.
===============================================================================
*/
typedef unsigned char byte; // 8 bits
typedef unsigned short word; // 16 bits
typedef unsigned int dword; // 32 bits
typedef unsigned int uint;
typedef unsigned long ulong;
typedef int qhandle_t;
class idFile;
class idVec3;
#ifdef _XENON
#define ID_VEC4_ALIGN __declspec(align(16))
#else
#define ID_VEC4_ALIGN
#endif
class ID_VEC4_ALIGN idVec4;
#ifndef NULL
#define NULL ((void *)0)
#endif
#ifndef BIT
#define BIT( num ) ( 1 << ( num ) )
#endif
#define MAX_STRING_CHARS 1024 // max length of a string
// maximum world size
#define MAX_WORLD_COORD ( 128 * 1024 )
#define MIN_WORLD_COORD ( -128 * 1024 )
#define MAX_WORLD_SIZE ( MAX_WORLD_COORD - MIN_WORLD_COORD )
// basic colors
extern ID_VEC4_ALIGN idVec4 colorBlack;
extern ID_VEC4_ALIGN idVec4 colorWhite;
extern ID_VEC4_ALIGN idVec4 colorRed;
extern ID_VEC4_ALIGN idVec4 colorGreen;
extern ID_VEC4_ALIGN idVec4 colorBlue;
extern ID_VEC4_ALIGN idVec4 colorYellow;
extern ID_VEC4_ALIGN idVec4 colorMagenta;
extern ID_VEC4_ALIGN idVec4 colorCyan;
extern ID_VEC4_ALIGN idVec4 colorOrange;
extern ID_VEC4_ALIGN idVec4 colorPurple;
extern ID_VEC4_ALIGN idVec4 colorPink;
extern ID_VEC4_ALIGN idVec4 colorBrown;
extern ID_VEC4_ALIGN idVec4 colorLtGrey;
extern ID_VEC4_ALIGN idVec4 colorMdGrey;
extern ID_VEC4_ALIGN idVec4 colorDkGrey;
// packs color floats in the range [0,1] into an integer
dword PackColor( const idVec3 &color );
void UnpackColor( const dword color, idVec3 &unpackedColor );
dword PackColor( const idVec4 &color );
void UnpackColor( const dword color, idVec4 &unpackedColor );
// little/big endian conversion
short BigShort( short l );
short LittleShort( short l );
int BigLong( int l );
int LittleLong( int l );
float BigFloat( float l );
float LittleFloat( float l );
void BigRevBytes( void *bp, int elsize, int elcount );
void LittleRevBytes( void *bp, int elsize, int elcount );
void Swap_Init( void );
bool Swap_IsBigEndian( void );
// for base64
void SixtetsForInt( byte *out, int src);
int IntForSixtets( byte *in );
/*
===============================================================================
idLib headers.
===============================================================================
*/
#include "math/Math.h"
// memory management and arrays
#include "Heap.h"
// RAVEN BEGIN
// dluetscher: added includes for new heap/memory management system
#ifdef _RV_MEM_SYS_SUPPORT
#include "rvHeapArena.h"
#include "rvHeap.h"
#include "rvMemSys.h"
#endif
// RAVEN END
#include "containers/List.h"
// math
#include "math/Simd.h"
#include "math/Random.h"
#include "math/Complex.h"
#include "math/Vector.h"
#include "math/Matrix.h"
#include "math/Mat3x4.h"
#include "math/Angles.h"
#include "math/Quat.h"
#include "math/Rotation.h"
#include "math/Plane.h"
#include "math/Pluecker.h"
#include "math/Polynomial.h"
#include "math/Extrapolate.h"
#include "math/Interpolate.h"
#include "math/Curve.h"
#include "math/Ode.h"
#include "math/Lcp.h"
// RAVEN BEGIN
#include "math/Radians.h"
#include "math/FFT.h"
// RAVEN END
// bounding volumes
#include "bv/Sphere.h"
#include "bv/Bounds.h"
#include "bv/Box.h"
#include "bv/Frustum.h"
// geometry
#include "geometry/DrawVert.h"
#include "geometry/JointTransform.h"
#include "geometry/Winding.h"
#include "geometry/Winding2D.h"
#include "geometry/Surface.h"
#include "geometry/Surface_Patch.h"
#include "geometry/Surface_Polytope.h"
#include "geometry/Surface_SweptSpline.h"
#include "geometry/TraceModel.h"
// RAVEN BEGIN
// dluetscher: added some headers for new vertex formats
#ifdef _MD5R_SUPPORT
#include "geometry/rvVertex.h"
#endif
// RAVEN END
// text manipulation
#include "Str.h"
#include "Token.h"
#include "Lexer.h"
#include "Parser.h"
#include "Base64.h"
#include "CmdArgs.h"
// containers
#include "containers/BTree.h"
#include "containers/BinSearch.h"
#include "containers/HashIndex.h"
#include "containers/HashTable.h"
#include "containers/StaticList.h"
#include "containers/LinkList.h"
#include "containers/Hierarchy.h"
#include "containers/Queue.h"
#include "containers/Stack.h"
#include "containers/StrList.h"
#include "containers/StrPool.h"
#include "containers/VectorSet.h"
#include "containers/PlaneSet.h"
#include "containers/rvBlockPool.h"
// RAVEN BEGIN
// ddynerman: a pair
#include "containers/Pair.h"
// ddynerman: algorithms
#include "algorithms/MultifieldSort.h"
// RAVEN END
// hashing
#include "hashing/CRC8.h"
#include "hashing/CRC16.h"
#include "hashing/CRC32.h"
#include "hashing/Honeyman.h"
#include "hashing/MD4.h"
#include "hashing/MD5.h"
// misc
#include "Dict.h"
#include "LangDict.h"
#include "BitMsg.h"
#include "MapFile.h"
#include "Timer.h"
// RAVEN BEGIN
// jsinger: xenon needs these because the simd class is no longer virtual
#ifdef _XENON
#include "math/Simd_generic.h"
#include "math/Simd_Xenon.h"
#include "Threads/ThreadEventManager.h"
#include "Threads/WorkerThreadManager.h"
#endif
// RAVEN END
#endif /* !__LIB_H__ */