summaryrefslogtreecommitdiff
path: root/sdk/rwsdk/include/d3d8/rwplcore.h
diff options
context:
space:
mode:
Diffstat (limited to 'sdk/rwsdk/include/d3d8/rwplcore.h')
-rw-r--r--sdk/rwsdk/include/d3d8/rwplcore.h6271
1 files changed, 6271 insertions, 0 deletions
diff --git a/sdk/rwsdk/include/d3d8/rwplcore.h b/sdk/rwsdk/include/d3d8/rwplcore.h
new file mode 100644
index 00000000..3740ae60
--- /dev/null
+++ b/sdk/rwsdk/include/d3d8/rwplcore.h
@@ -0,0 +1,6271 @@
+/******************************************/
+/* */
+/* RenderWare(TM) Graphics Library */
+/* */
+/******************************************/
+
+/*
+ * This file is a product of Criterion Software Ltd.
+ *
+ * This file is provided as is with no warranties of any kind and is
+ * provided without any obligation on Criterion Software Ltd.
+ * or Canon Inc. to assist in its use or modification.
+ *
+ * Criterion Software Ltd. and Canon Inc. will not, under any
+ * circumstances, be liable for any lost revenue or other damages
+ * arising from the use of this file.
+ *
+ * Copyright (c) 1999. Criterion Software Ltd.
+ * All Rights Reserved.
+ */
+
+/*************************************************************************
+ *
+ * Filename: <C:/daily/rwsdk/include/d3d8/rwplcore.h>
+ * Automatically Generated on: Thu Jan 23 11:06:23 2003
+ *
+ ************************************************************************/
+
+#ifndef RWPLCORE_H
+#define RWPLCORE_H
+
+/*--- System Header Files ---*/
+#include <stdarg.h>
+#include <stddef.h>
+#include <stdio.h>
+#include <stdlib.h>
+
+
+/*--- Automatically derived from: C:/daily/rwsdk/os/win/ostypes.h ---*/
+#ifndef WIN_OSTYPES_H
+#define WIN_OSTYPES_H
+
+#define rwLITTLEENDIAN /* This is a little endian machine */
+
+typedef long RwFixed;
+typedef int RwInt32;
+typedef unsigned int RwUInt32;
+typedef short RwInt16;
+typedef unsigned short RwUInt16;
+typedef unsigned char RwUInt8;
+typedef signed char RwInt8;
+
+#ifdef RWUNICODE
+typedef wchar_t RwChar;
+#else /* RWUNICODE */
+typedef char RwChar;
+#endif /* RWUNICODE */
+typedef float RwReal;
+typedef RwInt32 RwBool;
+
+#ifdef _MSC_VER
+typedef __int64 RwInt64;
+typedef unsigned __int64 RwUInt64;
+#define RWZERO64 ((RwUInt64)0)
+#else /* _MSC_VER */
+
+typedef struct _RwUInt64 RwUInt64;
+typedef struct _RwInt64 RwInt64;
+
+/* We'll do it with structures (can't do maths on these, but OK for allocation): */
+#if (!defined(DOXYGEN))
+#ifdef rwBIGENDIAN
+struct _RwUInt64
+{
+ RwUInt32 top;
+ RwUInt32 bottom;
+};
+
+struct _RwInt64
+{
+ RwInt32 top;
+ RwUInt32 bottom;
+};
+
+#else /* rwBIGENDIAN */
+#ifdef rwLITTLEENDIAN
+struct _RwUInt64
+{
+ RwUInt32 bottom;
+ RwUInt32 top;
+};
+
+struct _RwInt64
+{
+ RwUInt32 bottom;
+ RwInt32 top;
+};
+
+#else /* rwLITTLEENDIAN */
+#error "ENDIAN-ness undefined!"
+#endif /* rwLITTLEENDIAN */
+#endif /* rwBIGENDIAN */
+#endif /* (!defined(DOXYGEN)) */
+
+#define RWZERO64 { (RwUInt32)0, (RwUInt32)0 }
+#endif /* _MSC_VER */
+
+typedef struct _RwUInt128 RwUInt128;
+typedef struct _RwInt128 RwInt128;
+
+/* We'll do it with structures
+ * (can't do maths on these, but OK for allocation): */
+#if (!defined(DOXYGEN))
+#ifdef rwBIGENDIAN
+struct _RwUInt128
+{
+ RwUInt64 top;
+ RwUInt64 bottom;
+};
+
+struct _RwInt128
+{
+ RwInt64 top;
+ RwUInt64 bottom;
+};
+
+#else /* rwBIGENDIAN */
+#ifdef rwLITTLEENDIAN
+struct _RwUInt128
+{
+ RwUInt64 bottom;
+ RwUInt64 top;
+};
+
+struct _RwInt128
+{
+ RwUInt64 bottom;
+ RwInt64 top;
+};
+
+#else /* rwLITTLEENDIAN */
+#error "ENDIAN-ness undefined!"
+#endif /* rwLITTLEENDIAN */
+#endif /* rwBIGENDIAN */
+#endif /* (!defined(DOXYGEN)) */
+
+#define RWZERO128 { RWZERO64, RWZERO64 }
+
+/* Limits of types */
+#define RwInt32MAXVAL 0x7FFFFFFF
+#define RwInt32MINVAL 0x80000000
+#define RwUInt32MAXVAL 0xFFFFFFFF
+#define RwUInt32MINVAL 0x00000000
+#define RwRealMAXVAL (RwReal)(3.40282347e+38)
+#define RwRealMINVAL (RwReal)(1.17549435e-38)
+#define RwInt16MAXVAL 0x7FFF
+#define RwInt16MINVAL 0x8000
+#define RwUInt16MAXVAL 0xFFFF
+#define RwUInt16MINVAL 0x0000
+
+/* Structure alignment */
+#define RWALIGN(type, x) type /* nothing */
+#define rwMATRIXALIGNMENT sizeof(RwUInt32)
+#define rwFRAMEALIGNMENT sizeof(RwUInt32)
+#define rwV4DALIGNMENT sizeof(RwUInt32)
+
+#if (!defined(rwMALLOCALIGNMENT))
+#define rwMALLOCALIGNMENT sizeof(RwUInt32)
+#endif /* (!defined(rwMALLOCALIGNMENT) */
+
+#if (defined(_MSC_VER))
+
+#if (defined(RWVERBOSE))
+#include <tchar.h>
+#pragma comment (lib , "advapi32.LIB") /* Registry functions */
+
+/*
+ * registry code
+ */
+
+#if (defined(RpWinRegGetDWordValue))
+#undef RpWinRegGetDWordValue
+#endif /* (defined(RpWinRegGetDWordValue)) */
+
+#define RpWinRegGetDWordValue(_result, _hKey, _name, _val) \
+MACRO_START \
+{ \
+ DWORD _size; \
+ DWORD _type; \
+ LONG _status; \
+ \
+ _status = \
+ RegQueryValueEx((_hKey), (_name), 0, &_type, NULL, &_size); \
+ (_result) = ((ERROR_SUCCESS == _status) && (REG_DWORD == _type)); \
+ \
+ if ((_result)) \
+ { \
+ _status = \
+ RegQueryValueEx((_hKey), (_name), 0, &_type, \
+ (BYTE *) (_val), &_size); \
+ (_result) = (ERROR_SUCCESS == _status); \
+ } \
+} \
+MACRO_STOP
+
+#if (defined(RpWinRegGetBinaryValue))
+#undef RpWinRegGetBinaryValue
+#endif /* (defined(RpWinRegGetBinaryValue)) */
+
+#define RpWinRegGetBinaryValue(_result, _hKey, _name, _val) \
+MACRO_START \
+{ \
+ DWORD _size; \
+ DWORD _type; \
+ LONG _status; \
+ \
+ _status = \
+ RegQueryValueEx((_hKey), (_name), 0, &_type, NULL, &_size); \
+ (_result) = \
+ ((ERROR_SUCCESS == _status) && \
+ (REG_BINARY == _type) && (0 < _size)); \
+ \
+ if ((_result)) \
+ { \
+ *(_val) = RwMalloc(sizeof(BYTE) * _size); \
+ (_result) = (NULL != *(_val)); \
+ \
+ if ((_result)) \
+ { \
+ \
+ _status = \
+ RegQueryValueEx((_hKey), \
+ (_name), 0, &_type, \
+ (BYTE *) * (_val), &_size); \
+ (_result =) (ERROR_SUCCESS == _status); \
+ \
+ if (!(_result)) \
+ { \
+ RwFree(*(_val)); \
+ *(_val) = NULL; \
+ } \
+ \
+ } \
+ \
+ } \
+} \
+MACRO_STOP
+
+#if (defined(RpWinRegGetStringValue))
+#undef RpWinRegGetStringValue
+#endif /* (defined(RpWinRegGetStringValue)) */
+
+#define RpWinRegGetStringValue(_result, _hKey, _name, _val) \
+MACRO_START \
+{ \
+ DWORD _size; \
+ DWORD _type; \
+ LONG _status; \
+ \
+ _status = \
+ RegQueryValueEx((_hKey), (_name), 0, &_type, NULL, &_size); \
+ (_result) = \
+ ((ERROR_SUCCESS == _status) && \
+ (REG_SZ == _type) && (0 < _size)); \
+ \
+ if ((_result)) \
+ { \
+ \
+ *(_val) = RwMalloc(sizeof(TCHAR) * _size); \
+ (_result) = (NULL != *(_val)); \
+ \
+ if ((_result)) \
+ { \
+ _status = \
+ RegQueryValueEx((_hKey), (_name), 0, &_type, \
+ (BYTE *) * (_val), &_size); \
+ (_result) = (ERROR_SUCCESS == _status); \
+ \
+ if (!(_result)) \
+ { \
+ RwFree(*(_val)); \
+ *(_val) = NULL; \
+ } \
+ } \
+ } \
+} \
+MACRO_STOP
+
+/* ------------------------------------------------------------------- */
+
+#define RpWinRegCloseKey(hKey) \
+MACRO_START \
+{ \
+ RegCloseKey(hKey); \
+} \
+MACRO_STOP
+
+/* ------------------------------------------------------------------- */
+
+#define RpWinRegOpenMachineKey(result) \
+MACRO_START \
+{ \
+ static const TCHAR RenderWareKey[] = \
+ "Software\\Criterion\\RenderWare"; \
+ DWORD disposition; \
+ LONG status = \
+ RegCreateKeyEx(HKEY_LOCAL_MACHINE, RenderWareKey, 0, \
+ REG_NONE, REG_OPTION_NON_VOLATILE, \
+ KEY_READ | KEY_WRITE, \
+ NULL, &result, &disposition); \
+ \
+ if (status != ERROR_SUCCESS) \
+ { \
+ result = NULL; \
+ } \
+} \
+MACRO_STOP
+
+/* ------------------------------------------------------------------- */
+
+#if (defined(RWGETWINREGDWORD))
+#undef RWGETWINREGDWORD
+#endif /* (defined(RWGETWINREGDWORD)) */
+
+#define RWGETWINREGDWORD(result, match) \
+MACRO_START \
+{ \
+ HKEY hKey; \
+ \
+ RpWinRegOpenMachineKey(hKey); \
+ if (hKey) \
+ { \
+ RwBool success; \
+ \
+ RpWinRegGetDWordValue(success, hKey, match, \
+ &result); \
+ \
+ RpWinRegCloseKey(hKey); \
+ } \
+} \
+MACRO_STOP
+
+#if (defined(RWGETWINREGBINARY))
+#undef RWGETWINREGBINARY
+#endif /* (defined(RWGETWINREGBINARY)) */
+
+#define RWGETWINREGBINARY(result, match) \
+MACRO_START \
+{ \
+ HKEY hKey; \
+ \
+ result = NULL; \
+ RpWinRegOpenMachineKey(hKey); \
+ if (hKey) \
+ { \
+ RwBool success; \
+ \
+ RpWinRegGetBinaryValue(success, hKey, match, \
+ &result, NULL); \
+ \
+ if (!success) \
+ result = NULL; \
+ \
+ RpWinRegCloseKey(hKey); \
+ } \
+} \
+MACRO_STOP
+
+#if (defined(RWGETWINREGSTRING))
+#undef RWGETWINREGSTRING
+#endif /* (defined(RWGETWINREGSTRING)) */
+
+#define RWGETWINREGSTRING(result, match) \
+MACRO_START \
+{ \
+ HKEY hKey; \
+ \
+ result = NULL; \
+ RpWinRegOpenMachineKey(hKey); \
+ if (hKey) \
+ { \
+ RwBool success; \
+ \
+ RpWinRegGetStringValue(success, hKey, match, \
+ &result); \
+ \
+ if (!success) \
+ result = NULL; \
+ \
+ RpWinRegCloseKey(hKey); \
+ } \
+} \
+MACRO_STOP
+
+#if (defined(_DEBUG))
+
+#if (defined(RWREGSETBREAKALLOC))
+#undef RWREGSETBREAKALLOC
+#endif /* (defined(RWREGSETBREAKALLOC)) */
+
+#define RWREGSETBREAKALLOC(_name) \
+MACRO_START \
+{ \
+ char _message[256]; \
+ long _lBreakAlloc = -1; \
+ \
+ RWGETWINREGDWORD(_lBreakAlloc, _name); \
+ \
+ RWCRTSETBREAKALLOC(_lBreakAlloc); \
+ \
+ _snprintf(_message, sizeof(_message), \
+ "%s(%d): RWCRTSETBREAKALLOC(%ld)\n", \
+ __FILE__, __LINE__, \
+ _lBreakAlloc); \
+ OutputDebugString(_message); \
+ \
+} \
+MACRO_STOP
+
+#if (defined(RWREGSETDEBUGTRACE))
+#undef RWREGSETDEBUGTRACE
+#endif /* (defined(RWREGSETDEBUGTRACE)) */
+
+#define RWREGSETDEBUGTRACE(_name) \
+MACRO_START \
+{ \
+ char _message[256]; \
+ long _lDebugtrace = 0; \
+ \
+ RWGETWINREGDWORD(_lDebugtrace, _name); \
+ \
+ RwDebugSetTraceState(_lDebugtrace); \
+ \
+ _snprintf(_message, sizeof(_message), \
+ "%s(%d): RwDebugSetTraceState(%ld)\n", \
+ __FILE__, __LINE__, \
+ _lDebugtrace); \
+ OutputDebugString(_message); \
+ \
+} \
+MACRO_STOP
+
+#if (defined(_CRTDBG_FLAGS))
+#undef _CRTDBG_FLAGS
+#endif /* (defined(_CRTDBG_FLAGS)) */
+
+#define _CRTDBG_FLAGS \
+( _CRTDBG_ALLOC_MEM_DF || /* Turn on the debug heap allocations \
+ * and use the memory block identifiers. \
+ * This is the only flag that's on by default. */ \
+ _CRTDBG_CHECK_ALWAYS_DF || /* Check and validate all memory \
+ * on each allocation and deallocation request. \
+ * Setting this flag on is what catches the \
+ * under and overwrites \
+ * so it is very important to \
+ * get it turned on. */ \
+ _CRTDBG_CHECK_CRT_DF || /* Include _CRT_BLOCK memory allocations \
+ * in all leak detection and state differences. */ \
+ _CRTDBG_DELAY_FREE_MEM_DF || /* Instead of truly freeing memory, \
+ * keep the block allocated and \
+ * in the internal heap list. \
+ * The blocks are filled with the value0xDD \
+ * so you know the memory is freed when \
+ * looking at it in the debugger. \
+ * By also not freeing the memory, \
+ * this can help provide stress \
+ * conditions for the program. */ \
+ _CRTDBG_LEAK_CHECK_DF) /* Do memory leak checking at \
+ * the end of the program. */
+
+#endif /* (defined(_DEBUG)) */
+#endif /* (defined(RWVERBOSE)) */
+
+#include <math.h>
+/*
+ * Keep true calls to these functions since
+ * some x86 runtime libraries do not support _CIpow() etc
+ */
+#pragma function( acos, asin, cosh, fmod, pow, sinh , tanh )
+
+#if (!defined(RWINT32FROMFLOAT))
+
+static __inline RwInt32
+int32fromreal(RwReal x)
+{
+ RwInt16 savemode;
+ RwInt16 workmode;
+ RwInt32 res;
+
+ _asm
+ {
+ fnstcw savemode ; get fpu mode
+ fld dword ptr[x] ; load rwreal x
+
+ mov ax,savemode ; put fpu mode in register
+ or ah,0ch ; or-in truncate mode
+
+ mov workmode,ax ; make ready to set fpu mode
+ fldcw workmode ; set fpu to truncate mode
+ fistp dword ptr[res]; store the rwint32eger result
+ fldcw savemode ; restore fpu mode
+ }
+
+ return res;
+}
+#define RwInt32FromRealMacro(x) int32fromreal(x)
+
+#endif /* (!defined(RWINT32FROMFLOAT)) */
+
+#if (!defined(NOASM))
+static __inline RwUInt32
+RwFastRealToUInt32Inline(RwReal x)
+{
+ RwUInt32 res;
+
+ __asm FLD DWord Ptr[x];
+ __asm FISTP DWord Ptr[res];
+
+ return(res);
+}
+
+#define RwFastRealToUInt32 RwFastRealToUInt32Inline
+
+#endif /* (defined(NOASM)) */
+
+#endif /* (defined(_MSC_VER)) */
+
+#endif /* WIN_OSTYPES_H */
+
+
+/*--- Automatically derived from: C:/daily/rwsdk/src/plcore/bamath.h ---*/
+
+/****************************************************************************
+ Defines
+ */
+
+#if (!defined(RwInt32FromRealMacro))
+#define RwInt32FromRealMacro(x) \
+ ((RwInt32)(x))
+#endif /* (!defined(RwInt32FromRealMacro)) */
+
+#if (!defined(RwFastRealToUInt32))
+#define RwFastRealToUInt32(_x) \
+ ((RwUInt32)RwInt32FromRealMacro(((RwReal)(_x))))
+#endif /* (!defined(RwFastRealToUInt32)) */
+
+/*
+ * Ensure inclusion of prototypes for single precison maths functions
+ * e.g. from
+ * /usr/local/sce/ee/gcc/ee/include/math.h
+ * /Program Files/Intel/Compiler4.0/include/mathf.h
+ */
+
+#if (defined(__ICL))
+
+#if (defined(RWVERBOSE))
+
+/*
+ * See
+ * http://www.eskimo.com/~scs/C-faq/q11.17.html
+ */
+
+#define _STRINGIFY(X) #X
+#define _STRINGIFY_EXP(X) _STRINGIFY(X)
+
+#pragma message ("Intel Compiler Version " _STRINGIFY_EXP(__ICL) ":" __FILE__ "(" _STRINGIFY_EXP(__LINE__) ")\n")
+#pragma comment ( user, "comment:" "Intel Compiler Version " _STRINGIFY_EXP(__ICL) ":" __FILE__ "(" _STRINGIFY_EXP(__LINE__) ")\n")
+
+#endif /* (defined(RWVERBOSE)) */
+
+#if (400 <= __ICL)
+#if (defined(__cplusplus))
+#define _INC_MATH
+#endif /* (defined(__cplusplus)) */
+#include <mathf.h>
+#else /* (400 < __ICL) */
+#undef RW_USE_SPF
+#endif /* (400 < __ICL) */
+
+#endif /* (defined(__ICL)) */
+
+#include <math.h>
+
+#define _RW_C1 ( (float) 4.1666667908e-02 )
+#define _RW_C2 ( (float)-1.3888889225e-03 )
+#define _RW_C3 ( (float) 2.4801587642e-05 )
+#define _RW_C4 ( (float)-2.7557314297e-07 )
+#define _RW_C5 ( (float) 2.0875723372e-09 )
+#define _RW_C6 ( (float)-1.1359647598e-11 )
+#define _RW_S1 ( (float)-1.6666667163e-01 )
+#define _RW_S2 ( (float) 8.3333337680e-03 )
+#define _RW_S3 ( (float)-1.9841270114e-04 )
+#define _RW_S4 ( (float) 2.7557314297e-06 )
+#define _RW_S5 ( (float)-2.5050759689e-08 )
+#define _RW_S6 ( (float) 1.5896910177e-10 )
+#define _RW_one ( (float) 1.0000000000e+00 )
+#define _RW_pS0 ( (float) 1.6666667163e-01 )
+#define _RW_pS1 ( (float)-3.2556581497e-01 )
+#define _RW_pS2 ( (float) 2.0121252537e-01 )
+#define _RW_pS3 ( (float)-4.0055535734e-02 )
+#define _RW_pS4 ( (float) 7.9153501429e-04 )
+#define _RW_pS5 ( (float) 3.4793309169e-05 )
+#define _RW_pi ( (float) 3.1415925026e+00 )
+#define _RW_pi_tol ( (float) 0.0312500000e+00 )
+#define _RW_pio2_hi ( (float) 1.5707962513e+00 )
+#define _RW_pio2_lo ( (float) 7.5497894159e-08 )
+#define _RW_qS1 ( (float)-2.4033949375e+00 )
+#define _RW_qS2 ( (float) 2.0209457874e+00 )
+#define _RW_qS3 ( (float)-6.8828397989e-01 )
+#define _RW_qS4 ( (float) 7.7038154006e-02 )
+
+#define RwCosMinusPiToPiMacro(result, x) \
+MACRO_START \
+{ \
+ const float z = x * x; \
+ const float r = ( z * (_RW_C1 + \
+ z * (_RW_C2 + \
+ z * (_RW_C3 + \
+ z * (_RW_C4 + \
+ z * (_RW_C5 + \
+ z * _RW_C6)))))); \
+ result = (_RW_one - ((float) 0.5 * z - (z * r ))); \
+} \
+MACRO_STOP
+
+#define RwSinMinusPiToPiMacro(result, x) \
+do \
+{ \
+ const float z = x * x; \
+ const float v = z * x; \
+ const float r = ( _RW_S2 + \
+ z * (_RW_S3 + \
+ z * (_RW_S4 + \
+ z * (_RW_S5 + \
+ z * _RW_S6))) ); \
+ result = x + v * (_RW_S1 + z * r); \
+} \
+while(0)
+
+typedef union _rwIEEEFloatShapeType _rwIEEEFloatShapeType;
+
+#if (!defined(DOXYGEN))
+union _rwIEEEFloatShapeType
+{
+ float value;
+ unsigned int word;
+};
+#endif /* (!defined(DOXYGEN)) */
+
+#define _RW_GET_FLOAT_WORD(i,d) \
+do { \
+ _rwIEEEFloatShapeType gf_u; \
+ gf_u.value = (d); \
+ (i) = gf_u.word; \
+} while (0)
+
+/* Set a float from a 32 bit int. */
+
+#define _RW_SET_FLOAT_WORD(d,i) \
+do { \
+ _rwIEEEFloatShapeType sf_u; \
+ sf_u.word = (i); \
+ (d) = sf_u.value; \
+} while (0)
+
+#define RwIEEEACosfMacro(result, x) \
+do \
+{ \
+ float z, p, q, r, w, s, c, df; \
+ int hx, ix; \
+ \
+ _RW_GET_FLOAT_WORD(hx, x); \
+ ix = hx & 0x7fffffff; \
+ if (ix >= 0x3f800000) \
+ { /* |x|>=1 */ \
+ if (hx > 0) \
+ { \
+ /* acos(1) = 0 */ \
+ result = (0.0); \
+ } \
+ else \
+ { \
+ /* acos(-1)= _RW_pi */ \
+ result = (_RW_pi + (float) 2.0 * _RW_pio2_lo); \
+ } \
+ \
+ } \
+ else if (ix < 0x3f000000) \
+ { /* |x| < 0.5 */ \
+ if (ix <= 0x23000000) \
+ { \
+ /*if |x|<2**-57 */ \
+ result = (_RW_pio2_hi + _RW_pio2_lo); \
+ } \
+ else \
+ { \
+ z = x * x; \
+ p = z * (_RW_pS0 + \
+ z * (_RW_pS1 + \
+ z * (_RW_pS2 + \
+ z * (_RW_pS3 + \
+ z * (_RW_pS4 + z * _RW_pS5))))); \
+ q = _RW_one + z * (_RW_qS1 + \
+ z * (_RW_qS2 + \
+ z * (_RW_qS3 + z * _RW_qS4))); \
+ r = p / q; \
+ result = (_RW_pio2_hi - (x - (_RW_pio2_lo - x * r))); \
+ } \
+ \
+ } \
+ else if (hx < 0) \
+ { /* x < -0.5 */ \
+ z = (_RW_one + x) * (float) 0.5; \
+ p = z * (_RW_pS0 + \
+ z * (_RW_pS1 + \
+ z * (_RW_pS2 + \
+ z * (_RW_pS3 + \
+ z * (_RW_pS4 + z * _RW_pS5))))); \
+ q = _RW_one + z * (_RW_qS1 + \
+ z * (_RW_qS2 + z * (_RW_qS3 + z * _RW_qS4))); \
+ rwSqrtMacro(&s, z); \
+ r = p / q; \
+ w = r * s - _RW_pio2_lo; \
+ result = (_RW_pi - (float) 2.0 * (s + w)); \
+ } \
+ else \
+ { /* x > 0.5 */ \
+ int idf; \
+ \
+ z = (_RW_one - x) * (float) 0.5; \
+ rwSqrtMacro(&s, z); \
+ df = s; \
+ _RW_GET_FLOAT_WORD(idf, df); \
+ _RW_SET_FLOAT_WORD(df, idf & 0xfffff000); \
+ c = (z - df * df) / (s + df); \
+ p = z * (_RW_pS0 + \
+ z * (_RW_pS1 + \
+ z * (_RW_pS2 + \
+ z * (_RW_pS3 + \
+ z * (_RW_pS4 + z * _RW_pS5))))); \
+ q = _RW_one + z * (_RW_qS1 + \
+ z * (_RW_qS2 + z * (_RW_qS3 + z * _RW_qS4))); \
+ r = p / q; \
+ w = r * s + c; \
+ result = ((float) 2.0 * (df + w)); \
+ } \
+} \
+while(0)
+
+#if (defined(RW_USE_SPF))
+
+#define RwACos(_x) acosf(_x)
+#define RwACosh(_x) acoshf(_x)
+#define RwASin(_x) asinf(_x)
+#define RwASinh(_x) asinhf(_x)
+
+#if (!defined(__ICL))
+/*
+ * No SPF version in
+ * Program Files/Intel/compilerXXX/include/mathf.h
+ * of atan2()
+ */
+#define RwATan2(_x, _y) atan2f(_x, _y)
+#endif /* (!defined(__ICL)) */
+
+#define RwATan(_x) atanf(_x)
+#define RwATanh(_x) atanhf(_x)
+#define RwCabs() cabsf()
+#define RwCbrt(_x) cbrtf(_x)
+#define RwCeil(_x) ceilf(_x)
+#define RwCopysign(_x, _y) copysignf(_x, _y)
+#define RwCos(_x) cosf(_x)
+#define RwCosh(_x) coshf(_x)
+#define RwDrem(_x, _y) dremf(_x, _y)
+#define RwErfc(_x) erfcf(_x)
+#define RwErf(_x) erff(_x)
+#define RwExp(_x) expf(_x)
+#define RwExpm1(_x) expm1f(_x)
+#define RwFinite(_x) finitef(_x)
+#define RwIlogb(_x) ilogbf(_x)
+#define RwIsinf(_x) isinff(_x)
+#define RwIsnan(_x) isnanf(_x)
+#define RwFabs(_x) fabsf(_x)
+#define RwFloor(_x) floorf(_x)
+#define RwFmod(_x, _y) fmodf(_x, _y)
+#define RwFrexp(_x, _iptr) frexpf(_x, _iptr)
+#define RwGamma(_x) gammaf(_x)
+#define RwGammaf_(_x, _iptr) gammaf_r(_x, _iptr)
+#define RwHypot(_x, _y) hypotf(_x, _y)
+#define RwInfinity() infinityf()
+#define RwJ0(_x) j0f(_x)
+#define RwJ1(_x) j1f(_x)
+#define RwJn(_i, _x) jnf(_i, _x)
+#define RwLdexp(_x, _i) ldexpf(_x, _i)
+#define RwLgamma(_x) lgammaf(_x)
+#define RwLgammaf_(_x, _iptr) lgammaf_r(_x, _iptr)
+#define RwLog10(_x) log10f(_x)
+#define RwLog1p(_x) log1pf(_x)
+#define RwLog(_x) logf(_x)
+#define RwModf(_x, _y) modff(_x, _y)
+#define RwNan() nanf()
+#define RwNextafter(_x, _y) nextafterf(_x, _y)
+#define RwPow(_x, _y) powf(_x, _y)
+#define RwRemainder(_x, _y) remainderf(_x, _y)
+#define RwRint(_x) rintf(_x)
+#define RwScalbn(_x, _i) scalbnf(_x, _i)
+#define RwSin(_x) sinf(_x)
+#define RwSinh(_x) sinhf(_x)
+/* rwSqrtMacro/rwInvSqrtMacro are overloaded in drvmodel.h
+ * (if they are at all) and wrapped as func/macro below */
+#define RwTan(_x) tanf(_x)
+#define RwTanh(_x) tanhf(_x)
+#define RwY0(_x) y0f(_x)
+#define RwY1(_x) y1f(_x)
+#define RwYn(_i, _x) ynf(_i, _x)
+
+#endif /* (defined(RW_USE_SPF)) */
+
+#if (!defined(RwACos))
+#define RwACos(_x) acos(_x)
+#endif /* (!defined(RwACos)) */
+#if (!defined(RwACosh))
+#define RwACosh(_x) acosh(_x)
+#endif /* (!defined(RwACosh)) */
+#if (!defined(RwASin))
+#define RwASin(_x) asin(_x)
+#endif /* (!defined(RwASin)) */
+#if (!defined(RwASinh))
+#define RwASinh(_x) asinh(_x)
+#endif /* (!defined(RwASinh)) */
+#if (!defined(RwATan2))
+#define RwATan2(_x, _y) atan2(_x, _y)
+#endif /* (!defined(RwATan2)) */
+#if (!defined(RwATan))
+#define RwATan(_x) atan(_x)
+#endif /* (!defined(RwATan)) */
+#if (!defined(RwATanh))
+#define RwATanh(_x) atanh(_x)
+#endif /* (!defined(RwATanh)) */
+#if (!defined(RwCabs))
+#define RwCabs() cabs()
+#endif /* (!defined(RwCabs)) */
+#if (!defined(RwCbrt))
+#define RwCbrt(_x) cbrt(_x)
+#endif /* (!defined(RwCbrt)) */
+#if (!defined(RwCeil))
+#define RwCeil(_x) ceil(_x)
+#endif /* (!defined(RwCeil)) */
+#if (!defined(RwCopysign))
+#define RwCopysign(_x, _y) copysign(_x, _y)
+#endif /* (!defined(RwCopysign)) */
+#if (!defined(RwCos))
+#define RwCos(_x) cos(_x)
+#endif /* (!defined(RwCos)) */
+#if (!defined(RwCosh))
+#define RwCosh(_x) cosh(_x)
+#endif /* (!defined(RwCosh)) */
+#if (!defined(RwDrem))
+#define RwDrem(_x, _y) drem(_x, _y)
+#endif /* (!defined(RwDrem)) */
+#if (!defined(RwErfc))
+#define RwErfc(_x) erfc(_x)
+#endif /* (!defined(RwErfc)) */
+#if (!defined(RwEr))
+#define RwEr(_x) erf(_x)
+#endif /* (!defined(RwEr)) */
+#if (!defined(RwExp))
+#define RwExp(_x) exp(_x)
+#endif /* (!defined(RwExp)) */
+#if (!defined(RwExpm1))
+#define RwExpm1(_x) expm1(_x)
+#endif /* (!defined(RwExpm1)) */
+#if (!defined(RwFinite))
+#define RwFinite(_x) finite(_x)
+#endif /* (!defined(RwFinite)) */
+#if (!defined(RwIlogb))
+#define RwIlogb(_x) ilogb(_x)
+#endif /* (!defined(RwIlogb)) */
+#if (!defined(RwIsin))
+#define RwIsin(_x) isinf(_x)
+#endif /* (!defined(RwIsin)) */
+#if (!defined(RwIsnan))
+#define RwIsnan(_x) isnan(_x)
+#endif /* (!defined(RwIsnan)) */
+#if (!defined(RwFabs))
+#define RwFabs(_x) fabs(_x)
+#endif /* (!defined(RwFabs)) */
+#if (!defined(RwFloor))
+#define RwFloor(_x) floor(_x)
+#endif /* (!defined(RwFloor)) */
+#if (!defined(RwFmod))
+#define RwFmod(_x, _y) fmod(_x, _y)
+#endif /* (!defined(RwFmod)) */
+#if (!defined(RwFrexp))
+#define RwFrexp(_x, _iptr) frexp(_x, _iptr)
+#endif /* (!defined(RwFrexp)) */
+#if (!defined(RwGamma))
+#define RwGamma(_x) gamma(_x)
+#endif /* (!defined(RwGamma)) */
+#if (!defined(RwGammaf_))
+#define RwGammaf_(_x, _iptr) gammaf_r(_x, _iptr)
+#endif /* (!defined(RwGammaf_)) */
+#if (!defined(RwHypot))
+#define RwHypot(_x, _y) hypot(_x, _y)
+#endif /* (!defined(RwHypot)) */
+#if (!defined(RwInfinity))
+#define RwInfinity() infinity()
+#endif /* (!defined(RwInfinity)) */
+#if (!defined(RwJ0))
+#define RwJ0(_x) j0(_x)
+#endif /* (!defined(RwJ0)) */
+#if (!defined(RwJ1))
+#define RwJ1(_x) j1(_x)
+#endif /* (!defined(RwJ1)) */
+#if (!defined(RwJn))
+#define RwJn(_i, _x) jn(_i, _x)
+#endif /* (!defined(RwJn)) */
+#if (!defined(RwLdexp))
+#define RwLdexp(_x, _i) ldexp(_x, _i)
+#endif /* (!defined(RwLdexp)) */
+#if (!defined(RwLgamma))
+#define RwLgamma(_x) lgamma(_x)
+#endif /* (!defined(RwLgamma)) */
+#if (!defined(RwLgammaf_))
+#define RwLgammaf_(_x, _iptr) lgammaf_r(_x, _iptr)
+#endif /* (!defined(RwLgammaf_)) */
+#if (!defined(RwLog10))
+#define RwLog10(_x) log10(_x)
+#endif /* (!defined(RwLog10)) */
+#if (!defined(RwLog1p))
+#define RwLog1p(_x) log1p(_x)
+#endif /* (!defined(RwLog1p)) */
+#if (!defined(RwLog))
+#define RwLog(_x) log(_x)
+#endif /* (!defined(RwLog)) */
+#if (!defined(RwMod))
+#define RwMod(_x, _y) mod(_x, _y )
+#endif /* (!defined(RwMod)) */
+#if (!defined(RwNan))
+#define RwNan() nan()
+#endif /* (!defined(RwNan)) */
+#if (!defined(RwNextafter))
+#define RwNextafter(_x, _y) nextafter(_x, _y)
+#endif /* (!defined(RwNextafter)) */
+#if (!defined(RwPow))
+#define RwPow(_x, _y) pow(_x, _y)
+#endif /* (!defined(RwPow)) */
+#if (!defined(RwRemainder))
+#define RwRemainder(_x, _y) remainder(_x, _y)
+#endif /* (!defined(RwRemainder)) */
+#if (!defined(RwRint))
+#define RwRint(_x) rint(_x)
+#endif /* (!defined(RwRint)) */
+#if (!defined(RwScalbn))
+#define RwScalbn(_x, _i) scalbn(_x, _i)
+#endif /* (!defined(RwScalbn)) */
+#if (!defined(RwSin))
+#define RwSin(_x) sin(_x)
+#endif /* (!defined(RwSin)) */
+#if (!defined(RwSinh))
+#define RwSinh(_x) sinh(_x)
+#endif /* (!defined(RwSinh)) */
+#if (!defined(rwSqrt))
+/* NOTE: this is overloaded in drvmodel.h for some targets (SKY2 and XBOX atm)
+ * [we do in fact do overload w/ sqrtf there, if RW_USE_SPF,
+ * for D3D8, OpenGL and SoftRas] */
+#define rwSqrt(_result, _x) rwSqrtMacro(_result, _x)
+#endif /* (!defined(rwSqrt)) */
+#if (!defined(rwInvSqrt))
+/* NOTE: this is overloaded in drvmodel.h for some targets (SKY2 and XBOX atm)
+ * [we do in fact do overload w/ (1 / sqrtf) there, if RW_USE_SPF,
+ * for D3D8, OpenGL and SoftRas] */
+#define rwInvSqrt(_recip, _x) rwInvSqrtMacro(_recip, _x)
+#endif /* (!defined(rwInvSqrt)) */
+#if (!defined(RwTan))
+#define RwTan(_x) tan(_x)
+#endif /* (!defined(RwTan)) */
+#if (!defined(RwTanh))
+#define RwTanh(_x) tanh(_x)
+#endif /* (!defined(RwTanh)) */
+#if (!defined(RwY0))
+#define RwY0(_x) y0(_x)
+#endif /* (!defined(RwY0)) */
+#if (!defined(RwY1))
+#define RwY1(_x) y1(_x)
+#endif /* (!defined(RwY1)) */
+#if (!defined(RwYn))
+#define RwYn(_i, _x) yn(_i, _x)
+#endif /* (!defined(RwYn)) */
+
+
+/*--- Automatically derived from: C:/daily/rwsdk/src/plcore/batypes.h ---*/
+#define rwLIBRARYBASEVERSION 0x31000
+#define rwLIBRARYCURRENTVERSION 0x34005
+
+#define rwLIBRARYVERSION31000 0x31000
+#if (rwLIBRARYVERSION31000 < rwLIBRARYBASEVERSION)
+#error "Time to remove all rwLIBRARYVERSION31000 code"
+#endif
+
+#define rwLIBRARYVERSION34001 0x34001
+#if (rwLIBRARYVERSION34001 < rwLIBRARYBASEVERSION)
+#error "Time to remove all rwLIBRARYVERSION34001 code"
+#endif
+
+#define rwLIBRARYVERSION34002 0x34002
+#if (rwLIBRARYVERSION34002 < rwLIBRARYBASEVERSION)
+#error "Time to remove all rwLIBRARYVERSION34002 code"
+#endif
+
+/*
+ * RWBUILDNUMBER
+ * This 16-bit int will be externally defined in an official build, and
+ * is used to construct chunk header library ID when streaming out. All
+ * unofficial builds will be stamped with the following:-
+ */
+#if !defined(RWBUILDNUMBER)
+#define RWBUILDNUMBER 0xffff
+#endif
+
+/* IMPORTANT:
+ * The following Doxygen comment MUST be copied into RwCore.h,
+ * so don't move it from here. */
+
+#ifndef RWADOXYGENEXTERNAL
+/**
+ * \ingroup fundamentaltypes
+ * \page fundtypesoverview Fundamental Types Overview
+ *
+ * \par Requirements
+ * \li \b Headers: rwcore.h
+ * \li \b Libraries: rwcore.lib
+ *
+ * The rwcore.lib library provides the fundamental RenderWare features.
+ *
+ * When creating a RenderWare application, this library must always be
+ * linked.
+ *
+ * Functionality includes:
+ * \li Immediate Modes (2D \ref rwim2d and 3D \ref rwim3d )
+ * \li Plugin Management
+ * \li Base Datatypes
+ * \li Cameras \ref rwcamera
+ * \li Frames \ref rwframe
+ * \li the RenderWare Engine \ref rwengine
+ *
+ * RenderWare uses an object-oriented design philosophy, so this
+ * documentation is split across a number of objects.
+ *
+ * These objects are implemented in C, so C terminology is generally
+ * used, rather than C++ -- hence 'functions' instead of 'methods' and
+ * 'elements' instead of 'members'.
+ *
+ * If you are new to RenderWare programming, please read through the
+ * supplied User Guide. The RenderWare Engine \ref rwengine API is
+ * usually the starting point for new developers.
+ */
+#endif /* RWADOXYGENEXTERNAL */
+
+#if (!defined(RWFORCEENUMSIZEINT))
+#define RWFORCEENUMSIZEINT ((RwInt32)((~((RwUInt32)0))>>1))
+#endif /* (!defined(RWFORCEENUMSIZEINT)) */
+
+/*
+ * See
+ * http://www.eskimo.com/~scs/C-faq/q11.17.html
+ */
+
+#define RW_STRINGIFY(X) #X
+#define RW_STRINGIFY_EXPANDED(X) RW_STRINGIFY(X)
+
+/****************************************************************************
+ Attributes
+ */
+
+#if (defined(__GNUC__))
+
+/* See http://www.gnu.org/software/gcc/onlinedocs/gcc_4.html#SEC91 */
+
+#if (!(defined(__cplusplus) || defined(__MWERKS__) || defined(__RWUNUSED__)))
+#define __RWUNUSED__ __attribute__ ((unused))
+#endif /* (!(defined(__cplusplus) || defined(__MWERKS__) || defined(__RWUNUSED__))) */
+
+#if (!(defined(__RWUNUSEDRELEASE__) || defined(RWVALIDATEPARAM)))
+#if (!( defined(__cplusplus) || defined(__MWERKS__) || defined(RWDEBUG)))
+#define __RWUNUSEDRELEASE__ __attribute__ ((unused))
+#endif /* (!(defined(__cplusplus) || defined(__MWERKS__) || defined(RWDEBUG))) */
+#endif /* (!(defined(__RWUNUSEDRELEASE__) || defined(RWVALIDATEPARAM))) */
+
+#if (!defined(__RWFORMAT__))
+#define __RWFORMAT__(_archetype, _string_index, _first_to_check) \
+ __attribute__ ((format (_archetype, _string_index, _first_to_check)))
+#endif /* (!defined(__RWFORMAT__)) */
+
+#endif /* (defined(__GNUC__)) */
+
+#if (!defined(__RWUNUSED__))
+#define __RWUNUSED__ /* No op */
+#endif /* (!defined(__RWUNUSED__)) */
+
+#if (!defined(__RWUNUSEDRELEASE__))
+#define __RWUNUSEDRELEASE__ /* No op */
+#endif /* (!defined(__RWUNUSEDRELEASE__)) */
+
+#if (!defined(__RWFORMAT__))
+#define __RWFORMAT__(_archetype, _string_index, _first_to_check) /* No op */
+#endif /* (!defined(__RWFORMAT__)) */
+
+/****************************************************************************
+ Calling conventions
+ */
+
+#if (defined(WIN32))
+#define RWASMCALL __cdecl
+#define RWASMAPI(TYPE) TYPE RWASMCALL
+#endif /* (defined(WIN32)) */
+
+#if (!defined(RWASMCALL))
+#define RWASMCALL /* No op */
+#endif /* (!defined(RWASMCALL)) */
+
+#if (!defined(RWASMAPI))
+#define RWASMAPI(TYPE) TYPE
+#endif /* (!defined(RWASMAPI)) */
+
+
+/* Maximum number of nested contexts */
+#define rwMAXPIPECONTEXT 10
+
+
+/****************************************************************************
+ Macro wrappers. These are needed everywhere.
+ */
+
+#ifndef MACRO_START
+#define MACRO_START do
+#endif /* MACRO_START */
+
+#ifndef MACRO_STOP
+#define MACRO_STOP while(0)
+#endif /* MACRO_STOP */
+
+/****************************************************************************
+ Types needed everywhere
+ */
+
+#ifdef FALSE
+#undef FALSE
+#endif
+#define FALSE 0
+
+#ifdef TRUE
+#undef TRUE
+#endif
+#define TRUE !FALSE
+
+/****************************************************************************
+ MS VC/C++ Specific
+ */
+
+#if (defined(_MSC_VER))
+#if (_MSC_VER>=1000)
+
+
+/*
+ * Check for correct compiler version
+ */
+#define RW_MSC_VER 1200
+
+#if (0 && !defined(RW_NO_COMPILER_CHECK))
+#if (_MSC_VER != RW_MSC_VER )
+# pragma message (__FILE__ "(" RW_STRINGIFY_EXPANDED(__LINE__) "):" "\n This compiler is a different version (" RW_STRINGIFY_EXPANDED(_MSC_VER) ")\n to the compiler used to build the RenderWare product libraries (" RW_STRINGIFY_EXPANDED(RW_MSC_VER) ") \n To turn off this warning please define RW_NO_COMPILER_CHECK " )
+# pragma comment ( user, "comment:" __FILE__ "(" RW_STRINGIFY_EXPANDED(__LINE__) "):" "\n This compiler is a different version (" RW_STRINGIFY_EXPANDED(_MSC_VER) ")\n to the compiler used to build the RenderWare product libraries (" RW_STRINGIFY_EXPANDED(RW_MSC_VER) ") \n To turn off this warning please define RW_NO_COMPILER_CHECK " )
+#endif /* (_MSC_VER != RW_MSC_VER ) */
+#endif /* (0 && !defined(RW_NO_COMPILER_CHECK)) */
+
+/*
+ * Output some compiler messages and object file comments
+ */
+
+#pragma comment ( compiler )
+
+#pragma comment ( user, "comment:" __DATE__" " __TIME__ " - " __FILE__ "(" RW_STRINGIFY_EXPANDED(__LINE__) ")")
+#pragma comment ( user, "comment:" " _MSC_VER==" RW_STRINGIFY_EXPANDED(_MSC_VER) "; _M_IX86==" RW_STRINGIFY_EXPANDED(_M_IX86))
+#if (defined(rwLIBRARYCURRENTVERSION))
+#pragma comment ( user, "comment:" "rwLIBRARYCURRENTVERSION:" RW_STRINGIFY_EXPANDED(rwLIBRARYCURRENTVERSION) )
+#endif /* (defined(rwLIBRARYCURRENTVERSION)) */
+
+#if (defined(RWDEBUG) && defined(RWVERBOSE))
+
+#if (defined(RWMEMDEBUG) && !defined(_CRTDBG_MAP_ALLOC))
+#define _CRTDBG_MAP_ALLOC
+#endif /* defined(RWMEMDEBUG) && !defined(_CRTDBG_MAP_ALLOC)) */
+#include <crtdbg.h>
+
+#pragma message (__DATE__" " __TIME__ " - " __FILE__ "(" RW_STRINGIFY_EXPANDED(__LINE__) ")" )
+#pragma message ("_MSC_VER==" RW_STRINGIFY_EXPANDED(_MSC_VER) "; _M_IX86==" RW_STRINGIFY_EXPANDED(_M_IX86))
+
+#if (defined(rwLIBRARYCURRENTVERSION))
+#pragma message ( "rwLIBRARYCURRENTVERSION:" RW_STRINGIFY_EXPANDED(rwLIBRARYCURRENTVERSION) )
+#endif /* (defined(rwLIBRARYCURRENTVERSION)) */
+
+#endif /* (defined(RWDEBUG) && defined(RWVERBOSE) ) */
+
+#endif /* (_MSC_VER>=1000) */
+#endif /* (defined(_MSC_VER)) */
+
+/*******************/
+/* Primitive types */
+/*******************/
+
+/* String construction stuff (gets us UNICODE support) */
+#ifdef RWUNICODE
+#define _RWSTRING(x) L ## x
+#else /* RWUNICODE */
+#define _RWSTRING(x) x
+#endif /* RWUNICODE */
+#define RWSTRING(x) _RWSTRING(x)
+
+/* NB volatile keyword required for VC5.0 to ensure a reload - AMB */
+typedef union RwSplitBits RwSplitBits;
+
+#if (!defined(DOXYGEN))
+union RwSplitBits
+{
+ RwReal nReal;
+ volatile RwInt32 nInt;
+ volatile RwUInt32 nUInt;
+};
+
+typedef struct RwSplitFixed RwSplitFixed;
+
+#ifdef rwBIGENDIAN
+struct RwSplitFixed
+{
+ RwInt16 integral;
+ RwUInt16 fractional;
+};
+
+#else /* rwBIGENDIAN */
+#ifdef rwLITTLEENDIAN
+struct RwSplitFixed
+{
+ RwUInt16 fractional;
+ RwInt16 integral;
+};
+
+#else /* rwLITTLEENDIAN */
+#error "ENDIAN-ness undefined!"
+#endif /* rwLITTLEENDIAN */
+#endif /* rwBIGENDIAN */
+
+typedef union RwUnionReal RwUnionReal;
+
+union RwUnionReal /* MSB is sign bit in any circumstance */
+{
+ RwReal real; /* 4 bytes interpreted as RwReal */
+ float floating; /* 4 bytes interpreted as float */
+ RwFixed fixed; /* 4 bytes interpreted as 16:16 fixed */
+ RwSplitFixed splitfixed; /* 4 bytes interpreted as 16:16 fixed */
+};
+#endif /* (!defined(DOXYGEN)) */
+
+/*****************/
+
+/* Complex types */
+
+/*****************/
+
+typedef struct RwV2d RwV2d;
+/**
+ * \ingroup rwv2d
+ * \struct RwV2d
+ * This type represents points in a 2D space, such as device
+ * space, specified by the (x, y) coordinates of the point.
+ */
+struct RwV2d
+{
+ RwReal x; /**< X value*/
+ RwReal y; /**< Y vlaue */
+};
+
+typedef struct RwV3d RwV3d;
+/**
+ * \ingroup rwv3d
+ * \struct RwV3d
+ * This type represents 3D points and vectors specified by
+ * the (x, y, z) coordinates of a 3D point or the (x, y, z) components of a
+ * 3D vector.
+ */
+struct RwV3d
+{
+ RwReal x; /**< X value */
+ RwReal y; /**< Y value */
+ RwReal z; /**< Z value */
+};
+
+#define RWV4DALIGNMENT(_v4d) \
+ (! (((rwV4DALIGNMENT)-1) & ((RwUInt32)(_v4d))))
+
+#ifndef RWADOXYGENEXTERNAL
+/**
+ * \ingroup rwv4d
+ * \struct RwV4d
+ * This type represents 4D points and vectors specified by
+ * the (x, y, z, w) coordinates of a 4D point or the (x, y, z, w) components of a
+ * 4D vector.
+ */
+#endif /* RWADOXYGENEXTERNAL */
+
+struct RwV4d
+{
+ RwReal x; /**< X value */
+ RwReal y; /**< Y value */
+ RwReal z; /**< Z value */
+ RwReal w; /**< W value */
+};
+
+typedef struct RwV4d RWALIGN(RwV4d, rwV4DALIGNMENT);
+
+
+typedef struct RwRect RwRect;
+
+#ifndef RWADOXYGENEXTERNAL
+/**
+ * \ingroup geometricaltypes
+ * \struct RwRect
+ * This type represents a 2D device space rectangle specified
+ * by the position of the top-left corner (the offset x, y) and its width (w)
+ * and height (h).
+ */
+#endif /* RWADOXYGENEXTERNAL */
+
+struct RwRect
+{
+ RwInt32 x; /**< X value of the top-left corner */
+ RwInt32 y; /**< Y value of the top-left corner */
+ RwInt32 w; /**< Width of the rectangle */
+ RwInt32 h; /**< Height of the rectangle */
+};
+
+typedef struct RwSphere RwSphere;
+#ifndef RWADOXYGENEXTERNAL
+/**
+ * \ingroup geometricaltypes
+ * \struct RwSphere
+ * This type represents a sphere specified by the position
+ * of its center and its radius
+ */
+#endif /* RWADOXYGENEXTERNAL */
+struct RwSphere
+{
+ RwV3d center; /**< Sphere center */
+ RwReal radius; /**< Sphere radius */
+};
+
+#if (!defined(RwSphereAssign))
+#define RwSphereAssign(_target, _source) \
+ ( *(_target) = *(_source) )
+#endif /* (!defined(RwSphereAssign)) */
+
+typedef struct RwLine RwLine;
+
+#ifndef RWADOXYGENEXTERNAL
+/**
+ * \ingroup geometricaltypes
+ * \struct RwLine
+ * This type represents a 3D line specified by the position
+ * of its start and end points.
+ */
+#endif /* RWADOXYGENEXTERNAL */
+struct RwLine
+{
+ RwV3d start; /**< Line start */
+ RwV3d end; /**< Line end */
+};
+
+#if (!defined(RwLineAssign))
+#define RwLineAssign(_target, _source) \
+ ( *(_target) = *(_source) )
+#endif /* (!defined(RwLineAssign)) */
+
+/* The maximum number of texture coordinates */
+#define rwMAXTEXTURECOORDS 8
+
+#ifndef RWADOXYGENEXTERNAL
+/**
+ * \ingroup fundtypesdatatypes
+ * RwTextureCoordinateIndex
+ * This type represents the index for texture coordinates.
+ */
+#endif /* RWADOXYGENEXTERNAL */
+enum RwTextureCoordinateIndex
+{
+ rwNARWTEXTURECOORDINATEINDEX = 0,
+ rwTEXTURECOORDINATEINDEX0,
+ rwTEXTURECOORDINATEINDEX1,
+ rwTEXTURECOORDINATEINDEX2,
+ rwTEXTURECOORDINATEINDEX3,
+ rwTEXTURECOORDINATEINDEX4,
+ rwTEXTURECOORDINATEINDEX5,
+ rwTEXTURECOORDINATEINDEX6,
+ rwTEXTURECOORDINATEINDEX7,
+ rwTEXTURECOORDINATEINDEXFORCEENUMSIZEINT = RWFORCEENUMSIZEINT
+};
+typedef enum RwTextureCoordinateIndex RwTextureCoordinateIndex;
+
+typedef struct RwTexCoords RwTexCoords;
+
+#ifndef RWADOXYGENEXTERNAL
+/**
+ * \ingroup fundtypesdatatypes
+ * \struct RwTexCoords
+ * This type represents the the u and v texture
+ * coordinates of a particular vertex.
+ */
+#endif /* RWADOXYGENEXTERNAL */
+struct RwTexCoords
+{
+ RwReal u; /**< U value */
+ RwReal v; /**< V value */
+};
+
+
+/* Singley linked list macros. End marked as NULL */
+
+typedef struct RwSLLink RwSLLink; /*** RwSLLink ***/
+
+#if (!defined(DOXYGEN))
+struct RwSLLink
+{
+ RwSLLink *next;
+};
+#endif /* (!defined(DOXYGEN)) */
+
+#define rwSLLinkGetData(link,type,entry) \
+ ((type *)(((RwUInt8 *)(link))-offsetof(type,entry)))
+
+#define rwSLLinkGetConstData(link,type,entry) \
+ ((const type *)(((const RwUInt8 *)(link))-offsetof(type,entry)))
+
+#define rwSLLinkInitialize(linkvar) \
+ (linkvar)->next = NULL;
+
+#define rwSLLinkGetNext(linkvar) \
+ ((linkvar)->next)
+
+typedef struct RwSingleList RwSingleList;
+
+#if (!defined(DOXYGEN))
+struct RwSingleList
+{
+ RwSLLink link;
+};
+#endif /* (!defined(DOXYGEN)) */
+
+#define rwSingleListInitialize(list) \
+ (list)->link.next= NULL;
+#define rwSingleListEmpty(list) \
+ (((list)->link.next)==NULL)
+#define rwSingleListAddSLLink(list,linkvar) \
+ ( (linkvar)->next = (list)->link.next, \
+ (list)->link.next = (linkvar) )
+#define rwSingleListGetFirstSLLink(list) \
+ ((list)->link.next)
+#define rwSingleListGetTerminator(list) (NULL)
+
+/* Doubly linked list. End marked as start (its a ring) */
+
+typedef struct RwLLLink RwLLLink; /*** RwLLLink ***/
+
+#if (!defined(DOXYGEN))
+struct RwLLLink
+{
+ RwLLLink *next;
+ RwLLLink *prev;
+};
+#endif /* (!defined(DOXYGEN)) */
+
+#define rwLLLinkGetData(linkvar,type,entry) \
+ ((type *)(((RwUInt8 *)(linkvar))-offsetof(type,entry)))
+
+#define rwLLLinkGetConstData(linkvar,type,entry) \
+ ((const type *)(((const RwUInt8 *)(linkvar))-offsetof(type,entry)))
+
+#define rwLLLinkGetNext(linkvar) \
+ ((linkvar)->next)
+
+#define rwLLLinkGetPrevious(linkvar) \
+ ((linkvar)->prev)
+
+#define rwLLLinkInitialize(linkvar) \
+ ( (linkvar)->prev = (RwLLLink *)NULL, \
+ (linkvar)->next = (RwLLLink *)NULL )
+
+#define rwLLLinkAttached(linkvar) \
+ ((linkvar)->next)
+
+typedef struct RwLinkList RwLinkList;
+
+#if (!defined(DOXYGEN))
+struct RwLinkList
+{
+ RwLLLink link;
+};
+#endif /* (!defined(DOXYGEN)) */
+
+#define rwLinkListInitialize(list) \
+ ( (list)->link.next = ((RwLLLink *)(list)), \
+ (list)->link.prev = ((RwLLLink *)(list)) )
+#define rwLinkListEmpty(list) \
+ (((list)->link.next) == (&(list)->link))
+#define rwLinkListAddLLLink(list, linkvar) \
+ ( (linkvar)->next = (list)->link.next, \
+ (linkvar)->prev = (&(list)->link), \
+ ((list)->link.next)->prev = (linkvar), \
+ (list)->link.next = (linkvar) )
+#define rwLinkListRemoveLLLink(linkvar) \
+ ( ((linkvar)->prev)->next = (linkvar)->next, \
+ ((linkvar)->next)->prev = (linkvar)->prev )
+#define rwLinkListGetFirstLLLink(list) \
+ ((list)->link.next)
+#define rwLinkListGetLastLLLink(list) \
+ ((list)->link.prev)
+#define rwLinkListGetTerminator(list) \
+ (&((list)->link))
+
+typedef struct RwSurfaceProperties RwSurfaceProperties;
+
+#ifndef RWADOXYGENEXTERNAL
+/**
+ * \ingroup fundtypesdatatypes
+ * \struct RwSurfaceProperties
+ * This type represents the ambient, diffuse and
+ * specular reflection coefficients of a particular geometry. Each coefficient
+ * is specified in the range 0.0 (no reflection) to 1.0 (maximum reflection).
+ */
+#endif /* RWADOXYGENEXTERNAL */
+struct RwSurfaceProperties
+{
+ RwReal ambient; /**< ambient reflection coefficient */
+ RwReal specular; /**< specular reflection coefficient */
+ RwReal diffuse; /**< reflection coefficient */
+};
+
+#if (!defined(RwSurfacePropertiesAssign))
+#define RwSurfacePropertiesAssign(_target, _source) \
+ ( *(_target) = *(_source) )
+#endif /* (!defined(RwSurfacePropertiesAssign)) */
+
+/**********
+ * Macros *
+ **********/
+
+/* ANSI C defines the offsetof(type,member) macro; should be in <stddef.h> */
+
+/* If not, fall back to this: */
+#ifndef offsetof
+#define offsetof(type, member) \
+ ((size_t)((RwUInt8 *)&((type *) 0)->member - (RwUInt8 *)((type *) 0)))
+#endif /* offsetof */
+
+/*
+ *
+ * Numeric Macros to handle Fixed/Floating point versions of RenderWare
+ *
+ */
+#define RWFIX_MIN (1)
+#define RWFIX_MAX (0x7fffffff)
+#define RwFixedToInt(a) ((a) >> 16)
+#define RwFixedToFloat(a) ((float)(((float)(a)) * (1.0f / 65536.0f)))
+#define RwFixedToReal(a) ((RwReal)(((RwReal)(a)) * (1.0f / 65536.0f)))
+#define RwIntToFixed(a) ((a) << 16)
+#define RwRealToFixed(a) (RwInt32FromRealMacro((a) * 65536.0f))
+#define RwRealAbs(a) ((RwReal)((a) >= (RwReal)(0.0) ? (a) : (-(a))))
+#define RwRealMin2(a,b) ((RwReal)( ((a) <= (b)) ? (a) : (b)))
+#define RwRealMax2(a,b) ((RwReal)( ((a) >= (b)) ? (a) : (b)))
+#define RwRealMin3(a,b,c) RwRealMin2(a,RwRealMin2(b,c))
+#define RwRealMax3(a,b,c) RwRealMax2(a,RwRealMax2(b,c))
+
+#ifndef NORWREALSHORTCUT
+#define RToFixed RwRealToFixed
+#define RAbs RwRealAbs
+#define FxToInt RwFixedToInt
+#define FxToFloat RwFixedToFloat
+#define FxToReal RwFixedToFloat
+
+#endif
+
+#ifndef rwPI
+#define rwPI ((RwReal)(3.1415926535f))
+#define rwPIOVER2 (rwPI / (RwReal)(2.0f))
+#endif
+#define RWRGBALONG(r,g,b,a) \
+ ((RwUInt32) (((a) << 24) | ((r) << 16) | ((g) << 8) | (b)))
+
+/* !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+
+ RwPlane
+
+ !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! */
+
+
+/*
+ * typedef for struct RwPlane
+ */
+typedef struct RwPlane RwPlane;
+
+#if (!defined(DOXYGEN))
+/*
+ * This type represents a plane
+ */
+struct RwPlane
+{
+ RwV3d normal; /**< Normal to the plane */
+ RwReal distance; /**< Distance to plane from origin in normal direction*/
+};
+#endif /* (!defined(DOXYGEN)) */
+
+/****************************************************************************
+ Defines
+ */
+
+enum RwPlaneType
+{
+ rwXPLANE = 0, /* These are deliberately multiples of sizeof(RwReal) */
+ rwYPLANE = 4,
+ rwZPLANE = 8,
+ rwPLANETYPEFORCEENUMSIZEINT = RWFORCEENUMSIZEINT
+};
+typedef enum RwPlaneType RwPlaneType;
+
+#define rwSECTORATOMIC -1
+#define rwSECTORBUILD -2 /* Only used when building a world */
+
+/* vect is a RwV3d, y is the component */
+#define GETCOORD(vect,y) \
+ (*(RwReal *)(((RwUInt8 *)(&((vect).x)))+(RwInt32)(y)))
+#define GETCONSTCOORD(vect,y) \
+ (*(const RwReal *)(((const RwUInt8 *)(&((vect).x)))+(RwInt32)(y)))
+#define SETCOORD(vect,y,value) \
+ (((*(RwReal *)(((RwUInt8 *)(&((vect).x)))+(RwInt32)(y))))=(value))
+#define SETCONSTCOORD(vect,y,value) \
+ (((*(const RwReal *) \
+ (((const RwUInt8 *) \
+ (&((vect).x)))+(RwInt32)(y))))=(value))
+#define GETCOORDINT(vect,y) \
+ (*(RwInt32 *)(((RwUInt8 *)(&((vect).x)))+(y)))
+#define GETCONSTCOORDINT(vect,y) \
+ (*(const RwInt32 *)(((const RwUInt8 *)(&((vect).x)))+(y)))
+
+
+/**
+ * \ingroup integertypes
+ * \page inttypes Integer Types
+ *
+ * RenderWare supports a number of integer types:
+ *
+ * RwInt8 8-bit signed integer.
+ * \li RwUInt8 8-bit unsigned integer.
+ * \li RwChar Character type.
+ * \li RwInt16 16-bit signed integer.
+ * \li RwUInt16 16-bit unsigned integer.
+ * \li RwInt32 32-bit signed integer.
+ * \li RwUInt32 32-bit unsigned integer.
+ * \li RwInt64 64-bit signed integer.
+ * \li RwUInt64 64-bit unsigned integer.
+ * \li RwInt128 128-bit signed integer.
+ * \li RwUInt128 128-bit unsigned integer.
+ * \li RwBool Boolean type (in 32 bits).
+ *
+ * These types should be used in applications in preference to the underlying
+ * native types.
+ *
+ * The following constants indicate the maximum and minimum values possible
+ * for the various RenderWare integer types:
+ *
+ * \li RwInt32MAXVAL Maximum RwInt32 value.
+ * \li RwInt32MINVAL Minimum RwInt32 value.
+ * \li RwUInt32MAXVAL Maximum RwUInt32 value.
+ * \li RwUInt32MINVAL Minimum RwUInt32 value.
+ * \li RwInt16MAXVAL Maximum RwInt16 value.
+ * \li RwInt16MINVAL Minimum RwInt16 value.
+ * \li RwUInt16MAXVAL Maximum RwUInt16 value.
+ * \li RwUInt16MINVAL Minimum RwUInt16 value.
+ *
+ * \see RwReal
+ */
+
+/**
+ * \ingroup realtypes
+ * \typedef RwReal
+ *
+ * RenderWare supports a single RwReal floating-point type to aid portability
+ * across platforms. This type should be used in applications in preference to
+ * the underlying native type.
+ *
+ * The constants RwRealMAXVAL and RwRealMINVAL are provided for determining
+ * the maximum and minimum values possible using the RwReal type.
+ *
+ * In addition, the following macros are available for operations on RwReal
+ * types:
+ * \li RwRealMin2(a, b) Find the minimum of two RwReal values.
+ * \li RwRealMax2(a, b) Find the maximum of two RwReal values.
+ * \li RwRealMin3(a, b, c) Find the minimum of three RwReal values.
+ * \li RwRealMax3(a, b, c) Find the maximum of three RwReal values.
+ * \li RwRealAbs(x) Find the absolute value of a RwReal value.
+ *
+ * \see \ref inttypes
+ */
+
+/**
+ * \ingroup realtypes
+ * \typedef RwFixed
+ *
+ * RenderWare supports a single RwFixed fixed-point type.
+ *
+ * Although popular in the days when integer mathematics was much faster than
+ * floating point mathematics, fixed-point math is now rarely used. It is
+ * provided because it is still useful for some processes.
+ *
+ * The maximum and minimum size of an RwFixed value are defined by the constants
+ * RWFIX_MAX and RWFIX_MIN respectively.
+ *
+ * The following macros are provided to help you work with RwFixed datatypes:
+ * \li RwFixedToInt(x) Convert an RwFixed to an integer. (The fractional portion is lost.)
+ * \li RwFixedToFloat(x) Convert an RwFixed to a float.
+ * \li RwFixedToReal(x) Convert an RwFixed to an RwReal.
+ * \li RwRealToFixed(x) Convert an RwReal to an RwFixed. (Some precision may be lost.)
+ * \li RwIntToFixed(x) Convert an RwInt32 to an RwFixed. (Some precision may be lost.)
+ */
+
+/**
+ * \ingroup integertypes
+ * \typedef RwInt8
+ *
+ * Signed 8 bit integer type.
+ * \see \ref inttypes
+ */
+
+/**
+ * \ingroup integertypes
+ * \typedef RwUInt8
+ *
+ * Unsigned 8bit integer type.
+ * \see \ref inttypes
+ */
+
+/**
+ * \ingroup integertypes
+ * \typedef RwChar
+ *
+ * Character type.
+ * \see \ref inttypes
+ */
+
+/**
+ * \ingroup integertypes
+ * \typedef RwInt16
+ *
+ * Signed 16 bit integer type.
+ * \see \ref inttypes
+ */
+
+/**
+ * \ingroup integertypes
+ * \typedef RwUInt16
+ *
+ * Unsigned 16 bit integer type.
+ * \see \ref inttypes
+ */
+
+/**
+ * \ingroup integertypes
+ * \typedef RwInt32
+ *
+ * Signed 32 bit integer type.
+ * \see \ref inttypes
+ */
+
+/**
+ * \ingroup integertypes
+ * \typedef RwUInt32
+ *
+ * Unsigned 32 bit integer type.
+ * \see \ref inttypes
+ */
+
+/**
+ * \ingroup integertypes
+ * \typedef RwInt64
+ *
+ * Signed 64 bit integer type.
+ * \see \ref inttypes
+ */
+
+/**
+ * \ingroup integertypes
+ * \typedef RwUInt64
+ *
+ * Unsigned 64 bit integer type.
+ * \see \ref inttypes
+ */
+
+/**
+ * \ingroup integertypes
+ * \typedef RwInt128
+ *
+ * Signed 128 bit integer type.
+ * \see \ref inttypes
+ */
+
+/**
+ * \ingroup integertypes
+ * \typedef RwUInt128
+ *
+ * Unsigned 128 bit integer type.
+ * \see \ref inttypes
+ */
+
+/**
+ * \ingroup integertypes
+ * \typedef RwBool
+ *
+ * Boolean type.
+ * \see \ref inttypes
+ */
+
+
+/*--- Automatically derived from: C:/daily/rwsdk/src/plcore/batype.h ---*/
+/****************************************************************************
+ Defines
+*/
+
+/*
+ * Object Types - these are used in the binary object
+ * representations and in the debug library. They must
+ * be unique. They are the old system.
+ */
+
+#define rwID_DATABASE 0x64617462 /* datb */
+
+#define MAKECHUNKID(vendorID, chunkID) (((vendorID & 0xFFFFFF) << 8) | (chunkID & 0xFF))
+#define GETOBJECTID(chunkID) (chunkID & 0xFF)
+#define GETVENDORID(chunkID) ((chunkID >> 8) & 0xFFFFFF)
+
+/***
+ *** These are the vendor IDs. A customer must reserve a vendor ID in order
+ *** to be able to write toolkits (this prevents clashes between toolkits).
+ *** We reserve some for our own use as shown below. These are all 24 bit.
+ ***
+ *** IMPORTANT NOTE: DO NOT UNDER ANY CIRCUMSTANCES CHANGE THESE VALUES. IF
+ *** YOU ARE ADDING A NEW ONE, APPEND IT!
+ ***
+ *** They must all be unique.
+ ***/
+
+enum RwPluginVendor
+{
+ rwVENDORID_CORE = 0x000000L,
+ rwVENDORID_CRITERIONTK = 0x000001L,
+ rwVENDORID_REDLINERACER = 0x000002L,
+ rwVENDORID_CSLRD = 0x000003L,
+ rwVENDORID_CRITERIONINT = 0x000004L,
+ rwVENDORID_CRITERIONWORLD = 0x000005L,
+ rwVENDORID_BETA = 0x000006L,
+ rwVENDORID_CRITERIONRM = 0x000007L,
+ rwVENDORID_CRITERIONRWA = 0x000008L, /* RenderWare Audio */
+ rwPLUGINVENDORFORCEENUMSIZEINT = RWFORCEENUMSIZEINT
+};
+typedef enum RwPluginVendor RwPluginVendor;
+
+/***
+ *** These are the core objects (8 bit IDs). They must all be unique.
+ *** We can get away without using the MAKECHUNKID macro because the
+ *** vendor ID in all cases will be zero (rwVENDORID_CORE).
+ ***
+ *** IMPORTANT NOTE: DO NOT UNDER ANY CIRCUMSTANCES CHANGE THESE VALUES. IF
+ *** YOU ARE ADDING A NEW ONE, APPEND IT!
+ ***/
+
+/* These are the internal ones. Because the core ID is 0, we can get away without
+ * using the MAKECHUNKID macro for the CORE chunks.
+ */
+
+enum RwCorePluginID
+{
+ rwID_NAOBJECT = 0x00,
+ rwID_STRUCT = 0x01,
+ rwID_STRING = 0x02,
+ rwID_EXTENSION = 0x03,
+ rwID_CAMERA = 0x05,
+ rwID_TEXTURE = 0x06,
+ rwID_MATERIAL = 0x07,
+ rwID_MATLIST = 0x08,
+ rwID_ATOMICSECT = 0x09,
+ rwID_PLANESECT = 0x0A,
+ rwID_WORLD = 0x0B,
+ rwID_SPLINE = 0x0C,
+ rwID_MATRIX = 0x0D,
+ rwID_FRAMELIST = 0x0E,
+ rwID_GEOMETRY = 0x0F,
+ rwID_CLUMP = 0x10,
+ rwID_LIGHT = 0x12,
+ rwID_UNICODESTRING = 0x13,
+ rwID_ATOMIC = 0x14,
+ rwID_TEXTURENATIVE = 0x15,
+ rwID_TEXDICTIONARY = 0x16,
+ rwID_ANIMDATABASE = 0x17,
+ rwID_IMAGE = 0x18,
+ rwID_SKINANIMATION = 0x19,
+ rwID_GEOMETRYLIST = 0x1A,
+ rwID_HANIMANIMATION = 0x1B,
+ rwID_TEAM = 0x1C,
+ rwID_CROWD = 0x1D,
+ rwID_DMORPHANIMATION = 0x1E,
+ rwID_RIGHTTORENDER = 0x1f,
+ rwID_MTEFFECTNATIVE = 0x20,
+ rwID_MTEFFECTDICT = 0x21,
+ rwID_TEAMDICTIONARY = 0x22,
+ rwID_PITEXDICTIONARY = 0x23,
+ rwID_TOC = 0x24,
+ rwID_PRTSTDGLOBALDATA = 0x25,
+ rwID_ALTPIPE = 0x26,
+ rwID_PIPEDS = 0x27,
+ /* Insert before MAX and increment MAX */
+ rwID_COREPLUGINIDMAX = 0x28,
+ rwCOREPLUGINIDFORCEENUMSIZEINT = RWFORCEENUMSIZEINT
+};
+typedef enum RwCorePluginID RwCorePluginID ;
+
+/***
+ *** These are the Criterion internal plugin extensions. Use with rwVENDORID_CRITERIONINT.
+ ***
+ *** IMPORTANT NOTE: DO NOT UNDER ANY CIRCUMSTANCES CHANGE THESE VALUES. IF
+ *** YOU ARE ADDING A NEW ONE, APPEND IT!
+ ***/
+
+enum RwCriterionPluginID
+{
+ rwID_COREPLUGIN = 0x01,
+ rwID_WORLDPLUGIN = 0x02,
+ rwID_TOOLPLUGIN = 0x03,
+ rwID_TOOL2PLUGIN = 0x04,
+ rwCRITERIONPLUGINIDFORCEENUMSIZEINT = RWFORCEENUMSIZEINT
+};
+typedef enum RwCriterionPluginID RwCriterionPluginID;
+
+
+/***
+ *** These are the Criterion internal platform identifies.
+ ***
+ *** IMPORTANT NOTE: DO NOT UNDER ANY CIRCUMSTANCES CHANGE THESE VALUES. IF
+ *** YOU ARE ADDING A NEW ONE, APPEND IT!
+ ***/
+enum RwPlatformID
+{
+ rwID_PCD3D7 = 1,
+ rwID_PCOGL,
+ rwID_MAC,
+ rwID_PS2,
+ rwID_XBOX,
+ rwID_GAMECUBE,
+ rwID_SOFTRAS,
+ rwID_PCD3D8,
+ rwPLATFROMIDFORCEENUMSIZEINT = RWFORCEENUMSIZEINT
+};
+typedef enum RwPlatformID RwPlatformID;
+
+
+/****************************************************************************
+ Global Types
+ */
+
+typedef struct RwObject RwObject;
+#ifndef RWADOXYGENEXTERNAL
+/**
+ * \ingroup rwobject
+ * \struct RwObject
+ * This should be considered an opaque type. Use
+ * the RwObject API functions to access.
+ */
+#endif /* RWADOXYGENEXTERNAL */
+
+struct RwObject
+{
+ RwUInt8 type; /**< Internal Use */
+ RwUInt8 subType; /**< Internal Use */
+ RwUInt8 flags; /**< Internal Use */
+ RwUInt8 privateFlags; /**< Internal Use */
+ void *parent; /**< Internal Use */
+ /* Often a Frame */
+};
+
+#ifndef RWADOXYGENEXTERNAL
+/**
+ * \ingroup rwobject
+ * \ref RwObjectCallBack
+ * callback function supplied for object callback functions.
+ *
+ * \param object Pointer to the current object, supplied by
+ * iterator.
+ * \param data Pointer to developer-defined data structure.
+ *
+ * \return Pointer to the current object
+ *
+ * \see RwFrameForAllObjects
+ *
+ */
+#endif /* RWADOXYGENEXTERNAL */
+
+typedef RwObject *(*RwObjectCallBack)(RwObject *object, void *data);
+
+/****************************************************************************
+ Function prototypes
+ */
+
+#ifdef __cplusplus
+extern "C"
+{
+#endif /* __cplusplus */
+
+/* TYPE METHODS */
+
+/* Creation/cloning */
+
+#define rwObjectCopy(d,s) \
+MACRO_START \
+{ \
+ ((RwObject *)(d))->type = \
+ ((const RwObject *)(s))->type; \
+ ((RwObject *)(d))->subType = \
+ ((const RwObject *)(s))->subType; \
+ ((RwObject *)(d))->flags = \
+ ((const RwObject *)(s))->flags; \
+ ((RwObject *)(d))->privateFlags = \
+ ((const RwObject *)(s))->privateFlags; \
+ ((RwObject *)(d))->parent = \
+ NULL; \
+} \
+MACRO_STOP
+
+#define rwObjectInitialize(o, t, s) \
+MACRO_START \
+{ \
+ ((RwObject *)(o))->type = (RwUInt8)(t); \
+ ((RwObject *)(o))->subType = (RwUInt8)(s); \
+ ((RwObject *)(o))->flags = 0; \
+ ((RwObject *)(o))->privateFlags = 0; \
+ ((RwObject *)(o))->parent = NULL; \
+} \
+MACRO_STOP
+
+/* Debug */
+#define RwObjectGetType(o) (((const RwObject *)(o))->type)
+
+#define rwObjectSetType(o, t) (((RwObject *)(o))->type) = (RwUInt8)(t)
+
+/* Sub type */
+#define rwObjectGetSubType(o) (((const RwObject *)(o))->subType)
+#define rwObjectSetSubType(o, t) (((RwObject *)(o))->subType) = (RwUInt8)(t)
+
+/* Flags */
+#define rwObjectGetFlags(o) (((const RwObject *)(o))->flags)
+#define rwObjectSetFlags(o, f) (((RwObject *)(o))->flags) = (RwUInt8)(f)
+#define rwObjectTestFlags(o, f) ((((const RwObject *)(o))->flags) & (RwUInt8)(f))
+
+/* Private flags */
+#define rwObjectGetPrivateFlags(c) (((const RwObject *)(c))->privateFlags)
+#define rwObjectSetPrivateFlags(c,f) (((RwObject *)(c))->privateFlags) = (RwUInt8)(f)
+#define rwObjectTestPrivateFlags(c,flag) ((((const RwObject *)(c))->privateFlags) & (RwUInt8)(flag))
+
+/* Hierarchy */
+#define rwObjectGetParent(object) (((const RwObject *)(object))->parent)
+#define rwObjectSetParent(c,p) (((RwObject *)(c))->parent) = (void *)(p)
+
+#ifdef __cplusplus
+}
+#endif /* __cplusplus */
+
+
+/*--- Automatically derived from: C:/daily/rwsdk/os/win/osintf.h ---*/
+
+/*--- Automatically derived from: C:/daily/rwsdk/src/plcore/rwstring.h ---*/
+
+/****************************************************************************
+ Defines
+ */
+
+#define rwsprintf RWSRCGLOBAL(stringFuncs).vecSprintf
+#define rwvsprintf RWSRCGLOBAL(stringFuncs).vecVsprintf
+#define rwstrcpy RWSRCGLOBAL(stringFuncs).vecStrcpy
+#define rwstrncpy RWSRCGLOBAL(stringFuncs).vecStrncpy
+#define rwstrcat RWSRCGLOBAL(stringFuncs).vecStrcat
+#define rwstrncat RWSRCGLOBAL(stringFuncs).vecStrncat
+#define rwstrrchr RWSRCGLOBAL(stringFuncs).vecStrrchr
+#define rwstrchr RWSRCGLOBAL(stringFuncs).vecStrchr
+#define rwstrstr RWSRCGLOBAL(stringFuncs).vecStrstr
+#define rwstrcmp RWSRCGLOBAL(stringFuncs).vecStrcmp
+#define rwstricmp RWSRCGLOBAL(stringFuncs).vecStricmp
+#define rwstrlen RWSRCGLOBAL(stringFuncs).vecStrlen
+#define rwstrupr RWSRCGLOBAL(stringFuncs).vecStrupr
+#define rwstrlwr RWSRCGLOBAL(stringFuncs).vecStrlwr
+#define rwstrtok RWSRCGLOBAL(stringFuncs).vecStrtok
+#define rwsscanf RWSRCGLOBAL(stringFuncs).vecSscanf
+
+#define rwstrdup(_result, _string) \
+do \
+{ \
+ _result = ((RwChar*)NULL); \
+ \
+ if (((RwChar*)NULL) != (_string)) \
+ { \
+ _result = (RwChar *) \
+ RwMalloc( (rwstrlen(_string) + 1) * \
+ sizeof (RwChar) ); \
+ \
+ if (((RwChar*)NULL) != (_result)) \
+ { \
+ rwstrcpy(_result, _string); \
+ } \
+ } \
+} \
+while (0)
+
+
+/****************************************************************************
+ Global Types
+ */
+
+typedef int (*vecSprintfFunc)(RwChar *buffer,
+ const RwChar *format,
+ ...) /* __RWFORMAT__(printf, 2, 3) */;
+typedef int (*vecVsprintfFunc)(RwChar *buffer,
+ const RwChar *format,
+ va_list argptr);
+typedef RwChar *(*vecStrcpyFunc)(RwChar *dest,
+ const RwChar *srce);
+typedef RwChar *(*vecStrncpyFunc)(RwChar *dest,
+ const RwChar *srce,
+ size_t size);
+typedef RwChar *(*vecStrcatFunc)(RwChar *dest,
+ const RwChar *srce);
+typedef RwChar *(*vecStrncatFunc)(RwChar *dest,
+ const RwChar *srce,
+ size_t size);
+typedef RwChar *(*vecStrrchrFunc)(const RwChar *string,
+ int findThis);
+typedef RwChar *(*vecStrchrFunc)(const RwChar *string,
+ int findThis);
+typedef RwChar *(*vecStrstrFunc)(const RwChar *string,
+ const RwChar *findThis);
+typedef int (*vecStrcmpFunc)(const RwChar *string1,
+ const RwChar *string2);
+typedef int (*vecStricmpFunc)(const RwChar *string1,
+ const RwChar *string2);
+typedef size_t (*vecStrlenFunc)(const RwChar *string);
+typedef RwChar *(*vecStruprFunc)(RwChar *string);
+typedef RwChar *(*vecStrlwrFunc)(RwChar *string);
+typedef RwChar *(*vecStrtokFunc)(RwChar *string, const RwChar *delimit);
+typedef int (*vecSscanfFunc)(const RwChar *buffer,
+ const RwChar *format,
+ ...) /* __RWFORMAT__(scanf, 2, 3) */;
+
+typedef struct RwStringFunctions RwStringFunctions;
+
+#if (!defined(DOXYGEN))
+struct RwStringFunctions
+{
+ vecSprintfFunc vecSprintf ;
+ vecVsprintfFunc vecVsprintf;
+ vecStrcpyFunc vecStrcpy;
+ vecStrncpyFunc vecStrncpy;
+ vecStrcatFunc vecStrcat;
+ vecStrncatFunc vecStrncat;
+ vecStrrchrFunc vecStrrchr;
+ vecStrchrFunc vecStrchr;
+ vecStrstrFunc vecStrstr;
+ vecStrcmpFunc vecStrcmp;
+ vecStricmpFunc vecStricmp;
+ vecStrlenFunc vecStrlen;
+ vecStruprFunc vecStrupr;
+ vecStrlwrFunc vecStrlwr;
+ vecStrtokFunc vecStrtok;
+ vecSscanfFunc vecSscanf;
+};
+#endif /* (!defined(DOXYGEN)) */
+
+
+/*--- Automatically derived from: C:/daily/rwsdk/src/plcore/rwdbgerr.h ---*/
+#define RWECODE(a,b) a,
+
+/* Construct an enum type with all the plugin error codes (for the app to use) */
+enum RwErrorCodePlugin_errcore
+{
+#include "errcore.def"
+ rwLASTERROR_errcore = RWFORCEENUMSIZEINT
+};
+typedef enum RwErrorCodePlugin_errcore RwErrorCodePlugin_errcore;
+
+
+#undef RWECODE
+
+
+/*--- Automatically derived from: C:/daily/rwsdk/src/plcore/resmem.h ---*/
+
+/*--- Automatically derived from: C:/daily/rwsdk/src/plcore/bamemory.h ---*/
+#if (defined(RWMEMDEBUG))
+#ifdef _XBOX
+/* Need OutputDebugString macros */
+#include <xtl.h>
+#endif
+#endif
+
+/****************************************************************************
+ Defines
+ */
+
+/*
+ * Debug fill bytes for compatibility with MSVC/C++ debug heap
+ * See
+ * \Program Files\Microsoft Visual Studio\VC98\CRT\SRC\DBGHEAP.C:
+ * static unsigned char _bNoMansLandFill = 0xFD;
+ * // fill no-man's land with this
+ * static unsigned char _bDeadLandFill = 0xDD;
+ * // fill free objects with this
+ * static unsigned char _bCleanLandFill = 0xCD;
+ * // fill new objects with this
+ */
+
+#if (!defined(rwFREELISTNOMANSLANDFILL))
+#define rwFREELISTNOMANSLANDFILL 0xFD
+#endif /* (!defined(rwFREELISTNOMANSLANDFILL)) */
+
+#if (!defined(rwFREELISTDEADLANDFILL))
+#define rwFREELISTDEADLANDFILL 0xDD
+#endif /* (!defined(rwFREELISTDEADLANDFILL)) */
+
+#if (!defined(rwFREELISTCLEANLANDFILL))
+#define rwFREELISTCLEANLANDFILL 0xCD
+#endif /* (!defined(rwFREELISTCLEANLANDFILL)) */
+
+#define RWFREELISTALIGNED(_pData, _freelist) \
+ (! (((RwUInt32)(_pData)) & ((_freelist)->alignment - 1)) )
+
+/*****************************
+ * REGULAR MEMORY ALLOCATION *
+ *****************************/
+
+/**
+ * \ingroup memoryfileinterface
+ * \def RwMalloc
+ * RwMalloc(_s) is a macro for malloc(_s).
+ */
+
+/**
+ * \ingroup memoryfileinterface
+ * \def RwFree
+ * RwFree(_p) is a macro for free(_p).
+ */
+
+/**
+ * \ingroup memoryfileinterface
+ * \def RwCalloc
+ * RwCalloc(_n, _s) is a macro for calloc(_n, _s).
+ */
+
+/**
+ * \ingroup memoryfileinterface
+ * \def RwRealloc
+ * RwRealloc(_p, _s) is a macro for realloc(_p, _s).
+ */
+
+#if ( (defined(RWMEMDEBUG)) && defined(RWDEBUG) )
+
+#if (!defined(RWNOFREELISTS))
+#define RWNOFREELISTS
+#endif /* (!defined(RWNOFREELISTS)) */
+
+#if (defined(rwPLUGIN_ID))
+#define _CLIENT_TAG \
+ ( 0xFFFF & (rwPLUGIN_ID) )
+#endif /* (defined(rwPLUGIN_ID)) */
+
+#if (!defined(_CLIENT_TAG))
+#define _CLIENT_TAG \
+ ( 0xFFFF & (MAKECHUNKID(rwVENDORID_CRITERIONTK, 0x00) ) )
+#endif /* (!defined(_CLIENT_TAG)) */
+
+# if (defined(_MSC_VER))
+# if ((_MSC_VER>=1000) && defined(_DEBUG))
+
+#if (defined(RWMEMDEBUG) && !defined(_CRTDBG_MAP_ALLOC))
+#define _CRTDBG_MAP_ALLOC
+#endif /* defined(RWMEMDEBUG) && !defined(_CRTDBG_MAP_ALLOC)) */
+#include <crtdbg.h>
+
+#define RwMalloc(_s) \
+ _malloc_dbg((_s), \
+ _CLIENT_BLOCK | ((_CLIENT_TAG)<<16), \
+ __FILE__, \
+ __LINE__)
+
+#define RwFree(_p) \
+ _free_dbg((_p), \
+ _CLIENT_BLOCK | ((_CLIENT_TAG)<<16))
+
+#define RwCalloc(_n, _s) \
+ _calloc_dbg((_n), (_s), \
+ _CLIENT_BLOCK | ((_CLIENT_TAG)<<16), \
+ __FILE__, \
+ __LINE__)
+
+#define RwRealloc(_p, _s) \
+ _realloc_dbg((_p), \
+ (_s), \
+ _CLIENT_BLOCK | ((_CLIENT_TAG)<<16), \
+ __FILE__, \
+ __LINE__)
+
+#define RWCRTORDBGFLAG(_flag) \
+ do \
+ { \
+ int _DbgFlag; \
+ \
+ _DbgFlag = _CrtSetDbgFlag(_CRTDBG_REPORT_FLAG); \
+ _DbgFlag |= (_flag); \
+ _CrtSetDbgFlag(_DbgFlag); \
+ } while(0)
+
+#define VALID_HEAP_STR \
+ __FILE__##"("##RW_STRINGIFY_EXPANDED(__LINE__)##"): valid heap\n"
+
+#define RWCRTCHECKMEMORY() \
+ do \
+ { \
+ int valid_heap; \
+ \
+ valid_heap = _CrtCheckMemory(); \
+ _ASSERTE(valid_heap); \
+ } while(0)
+
+/*
+ * if (valid_heap) \
+ * OutputDebugString(VALID_HEAP_STR); \
+ */
+
+#define NO_LEAKS_FOUND_STR \
+ __FILE__##"("##RW_STRINGIFY_EXPANDED(__LINE__)##"): no heap leaks found\n"
+
+#define RWCRTDUMPMEMORYLEAKS() \
+ do \
+ { \
+ int leaks_found; \
+ \
+ leaks_found = _CrtDumpMemoryLeaks(); \
+ _ASSERTE(!leaks_found); \
+ if (!leaks_found) \
+ OutputDebugString(NO_LEAKS_FOUND_STR); \
+ } while(0)
+
+#define HEAP_DIFFERENCES_FOUND_STR \
+ __FILE__##"("##RW_STRINGIFY_EXPANDED(__LINE__)##"): heap differences found\n"
+
+#define NO_DIFFERENCES_FOUND_STR \
+ __FILE__##"("##RW_STRINGIFY_EXPANDED(__LINE__)##"): no heap differences found\n"
+
+#define RWCRTHEAPDIFFERENCESINCE(_Then) \
+ do \
+ { \
+ /* only dump differences when \
+ * there are in fact differences */ \
+ _CrtMemState _Now; \
+ _CrtMemState _Delta; \
+ const int _DbgFlag = _CrtSetDbgFlag(_CRTDBG_REPORT_FLAG); \
+ int Differences; \
+ \
+ _CrtMemCheckpoint(&_Now); \
+ _CrtMemDifference(&_Delta, _Then, &_Now); \
+ \
+ (Differences) = ( ( 0 != _Delta.lCounts[_CLIENT_BLOCK] ) || \
+ ( 0 != _Delta.lCounts[_NORMAL_BLOCK] ) || \
+ ( (_DbgFlag & _CRTDBG_CHECK_CRT_DF) && \
+ ( 0 != _Delta.lCounts[_CRT_BLOCK]) ) ); \
+ \
+ if ( (Differences) ) \
+ { \
+ /* difference detected: dump objects since _Then. */ \
+ OutputDebugString(HEAP_DIFFERENCES_FOUND_STR); \
+ _CrtMemDumpAllObjectsSince(_Then); \
+ _CrtMemDumpStatistics(&_Delta); \
+ } \
+ else \
+ { \
+ OutputDebugString(NO_DIFFERENCES_FOUND_STR); \
+ } \
+ } while (0)
+
+#define RWCRTDBGBREAK() \
+ _CrtDbgBreak()
+
+#define RWCRTDOFORALLCLIENTOBJECTS(_f, _c) \
+ _CrtDoForAllClientObjects(_f, _c)
+
+#define RWCRTISMEMORYBLOCK(_p, _t, _r, _f, _l) \
+ _CrtIsMemoryBlock(_p, _t, _r, _f, _l)
+
+#define RWCRTISVALIDHEAPPOINTER(_p) \
+ _CrtIsValidHeapPointer(_p)
+
+#define RWCRTISVALIDPOINTER(_p, _n, _r) \
+ _CrtIsValidPointer(_p, _n, _r)
+
+#define RWCRTMEMCHECKPOINT(_s) \
+ _CrtMemCheckpoint(_s)
+
+#define RWCRTMEMDIFFERENCE(_s1, _s2, _s3) \
+ _CrtMemDifference(_s1, _s2, _s3)
+
+#define RWCRTMEMDUMPALLOBJECTSSINCE(_s) \
+ _CrtMemDumpAllObjectsSince(_s)
+
+#define RWCRTMEMDUMPSTATISTICS(_s) \
+ _CrtMemDumpStatistics(_s)
+
+#define RWCRTSETALLOCHOOK(_f) \
+ _CrtSetAllocHook(_f)
+
+#define RWCRTSETBREAKALLOC(_a) \
+ _CrtSetBreakAlloc(_a)
+
+#define RWCRTSETDBGFLAG(_f) \
+ _CrtSetDbgFlag(_f)
+
+#define RWCRTSETDUMPCLIENT(_f) \
+ _CrtSetDumpClient(_f)
+
+#define RWCRTSETREPORTFILE(_t, _f) \
+ _CrtSetReportFile(_t, _f)
+
+#define RWCRTSETREPORTHOOK(_f) \
+ _CrtSetReportHook(_f)
+
+#define RWCRTSETREPORTMODE(_t, _f) \
+ _CrtSetReportMode(_t, _f)
+
+#if (!defined(_CRTDBG_FLAGS))
+#define _CRTDBG_FLAGS \
+ ( (_CRTDBG_ALLOC_MEM_DF | _CRTDBG_DELAY_FREE_MEM_DF | \
+ _CRTDBG_CHECK_CRT_DF | _CRTDBG_LEAK_CHECK_DF) & \
+ ~(_CRTDBG_CHECK_ALWAYS_DF |_CRTDBG_RESERVED_DF) )
+#endif /* (!defined(_CRTDBG_FLAGS)) */
+
+# endif /* ((_MSC_VER>=1000) && defined(_DEBUG)) */
+# endif /* (defined(_MSC_VER)) */
+
+
+
+#if (!defined(rwDEADPTRFILL))
+#define rwDEADPTRFILL ((void *)0xDDDDDDDD)
+#endif /* (!defined(rwDEADPTRFILL)) */
+
+#endif /* (defined(RWDEBUG) && (defined(RWMEMDEBUG))) */
+
+#if (!defined(rwDEADPTRFILL))
+#define rwDEADPTRFILL (NULL)
+#endif /* (!defined(rwDEADPTRFILL)) */
+
+#if (!defined(RwMalloc))
+#define RwMalloc(_s) ((RWSRCGLOBAL(memoryFuncs).rwmalloc)((_s)))
+#endif /* (!defined(RwMalloc)) */
+
+#if (!defined(RwFree))
+#define RwFree(_p) ((RWSRCGLOBAL(memoryFuncs).rwfree)((_p)))
+#endif /* (!defined(RwFree)) */
+
+#if (!defined(RwCalloc))
+#define RwCalloc(_n, _s) ((RWSRCGLOBAL(memoryFuncs).rwcalloc)((_n), (_s)))
+#endif /* (!defined(RwCalloc)) */
+
+#if (!defined(RwRealloc))
+#define RwRealloc(_p, _s) ((RWSRCGLOBAL(memoryFuncs).rwrealloc)((_p),(_s)))
+#endif /* (!defined(RwRealloc)) */
+
+#if (!defined(RWCRTORDBGFLAG))
+#define RWCRTORDBGFLAG(_flag) /* No op */
+#endif /* (!defined(RWCRTORDBGFLAG)) */
+
+#if (!defined(RWCRTCHECKMEMORY))
+#define RWCRTCHECKMEMORY() /* No Op */
+#endif /* (!defined(RWCRTCHECKMEMORY)) */
+
+#if (!defined(RWCRTDBGBREAK))
+#define RWCRTDBGBREAK() /* No Op */
+#endif /* (!defined(RWCRTDBGBREAK)) */
+
+#if (!defined(RWCRTDOFORALLCLIENTOBJECTS))
+#define RWCRTDOFORALLCLIENTOBJECTS(_f, _c) /* No Op */
+#endif /* (!defined(RWCRTDOFORALLCLIENTOBJECTS)) */
+
+#if (!defined(RWCRTDUMPMEMORYLEAKS))
+#define RWCRTDUMPMEMORYLEAKS() /* No Op */
+#endif /* (!defined(RWCRTDUMPMEMORYLEAKS)) */
+
+#if (!defined(RWCRTHEAPDIFFERENCESINCE))
+#define RWCRTHEAPDIFFERENCESINCE(_Then) /* No Op */
+#endif /* (!defined(RWCRTHEAPDIFFERENCESINCE)) */
+
+#if (!defined(RWCRTISMEMORYBLOCK))
+#define RWCRTISMEMORYBLOCK(_p, _t, _r, _f, _l) (NULL != (_p))
+#endif /* (!defined(RWCRTISMEMORYBLOCK)) */
+
+#if (!defined(RWCRTISVALIDHEAPPOINTER))
+#define RWCRTISVALIDHEAPPOINTER(_p) (NULL != (_p))
+#endif /* (!defined(RWCRTISVALIDHEAPPOINTER)) */
+
+#if (!defined(RWCRTISVALIDPOINTER))
+#define RWCRTISVALIDPOINTER(_p, _n, _r) (NULL != (_p))
+#endif /* (!defined(RWCRTISVALIDPOINTER)) */
+
+#if (!defined(RWCRTMEMCHECKPOINT))
+#define RWCRTMEMCHECKPOINT(_s) /* No Op */
+#endif /* (!defined(RWCRTMEMCHECKPOINT)) */
+
+#if (!defined(RWCRTMEMDIFFERENCE))
+#define RWCRTMEMDIFFERENCE(_s1, _s2, _s3) /* No Op */
+#endif /* (!defined(RWCRTMEMDIFFERENCE)) */
+
+#if (!defined(RWCRTMEMDUMPALLOBJECTSSINCE))
+#define RWCRTMEMDUMPALLOBJECTSSINCE(_s) /* No Op */
+#endif /* (!defined(RWCRTMEMDUMPALLOBJECTSSINCE)) */
+
+#if (!defined(RWCRTMEMDUMPSTATISTICS))
+#define RWCRTMEMDUMPSTATISTICS(_s) (NULL)
+#endif /* (!defined(RWCRTMEMDUMPSTATISTICS)) */
+
+#if (!defined(RWCRTSETALLOCHOOK))
+#define RWCRTSETALLOCHOOK(_f) (NULL)
+#endif /* (!defined(RWCRTSETALLOCHOOK)) */
+
+#if (!defined(RWCRTSETBREAKALLOC))
+#define RWCRTSETBREAKALLOC(_a) (0)
+#endif /* (!defined(RWCRTSETBREAKALLOC)) */
+
+#if (!defined(RWCRTSETDBGFLAG))
+#define RWCRTSETDBGFLAG(_f) (0)
+#endif /* (!defined(RWCRTSETDBGFLAG)) */
+
+#if (!defined(RWCRTSETDUMPCLIENT))
+#define RWCRTSETDUMPCLIENT(_f) (NULL)
+#endif /* (!defined(RWCRTSETDUMPCLIENT)) */
+
+#if (!defined(RWCRTSETREPORTFILE))
+#define RWCRTSETREPORTFILE(_t, _f) (NULL)
+#endif /* (!defined(RWCRTSETREPORTFILE)) */
+
+#if (!defined(RWCRTSETREPORTHOOK))
+#define RWCRTSETREPORTHOOK(_f) (NULL)
+#endif /* (!defined(RWCRTSETREPORTHOOK)) */
+
+#if (!defined(RWCRTSETREPORTMODE))
+#define RWCRTSETREPORTMODE(_t, _f) (0)
+#endif /* (!defined(RWCRTSETREPORTMODE)) */
+
+#if (!defined(RWREGSETBREAKALLOC))
+#define RWREGSETBREAKALLOC(_name) /* No op */
+#endif /* (!defined(RWREGSETBREAKALLOC)) */
+
+#if (!defined(RWREGSETASSERTPRINT))
+#define RWREGSETASSERTPRINT(_name) /* No op */
+#endif /* (!defined(RWREGSETASSERTPRINT)) */
+
+#if (!defined(RWGETWINREGDWORD))
+#define RWGETWINREGDWORD(_env_var, _match) /* No op */
+#endif /* (!defined(RWGETWINREGDWORD)) */
+
+#if (!defined(RWGETWINREGBINARY))
+#define RWGETWINREGBINARY(_env_var, _match) /* No op */
+#endif /* (!defined(RWGETWINREGBINARY)) */
+
+#if (!defined(RWGETWINREGSTRING))
+#define RWGETWINREGSTRING(_env_var, _match) /* No op */
+#endif /* (!defined(RWGETWINREGSTRING)) */
+
+#if (!defined(_CRTDBG_FLAGS))
+#define _CRTDBG_FLAGS 0x33
+#endif /* (!defined(_CRTDBG_FLAGS)) */
+
+/****************************************************************************
+ Global Types
+ */
+
+typedef struct RwMemoryFunctions RwMemoryFunctions;
+/**
+ * \ingroup memoryfileinterface
+ * \struct RwMemoryFunctions
+ * This type represents the memory functions used
+ * by RenderWare. By default, the standard ANSI functions are used. The
+ * application may install an alternative interface providing that it is ANSI
+ * compliant (in RenderWare Graphics see API function RwEngineInit):
+ */
+struct RwMemoryFunctions
+{
+ /* c.f.
+ * Program Files/Microsoft Visual Studio/VC98/Include/MALLOC.H
+ */
+ void *(*rwmalloc)(size_t size); /**< rwmalloc malloc */
+ void (*rwfree)(void *mem); /**< rwfree free */
+ void *(*rwrealloc)(void *mem, size_t newSize); /**< rwrealloc realloc */
+ void *(*rwcalloc)(size_t numObj, size_t sizeObj); /**< calloc calloc */
+};
+
+ /**
+ * \ingroup rwfreelist
+ * The free list was statically allocated
+ *
+ * \see RwFreeListSetFlags
+ */
+#define rwFREELISTFLAG_STATIC 0x00000001
+
+/**
+ * \ingroup rwfreelist
+ * \hideinitializer
+ * Free blocks as soon as they are empty
+ *
+ * \see RwFreeListSetFlags
+ */
+#define rwFREELISTFLAG_FREEBLOCKS 0x00000002
+
+
+typedef struct RwFreeList RwFreeList;
+
+/**
+ * \ingroup rwfreelist
+ * Holds free list info, should be considered opaque. Use API functions to access.
+ */
+struct RwFreeList
+{
+ RwUInt32 entrySize; /**<size of an entry in the free list */
+#if (defined(RWDEBUG) && !defined(DOXYGEN))
+ RwUInt32 nonAlignedEntrySize;
+#endif /* (defined(RWDEBUG) && !defined(DOXYGEN)) */
+ RwUInt32 entriesPerBlock; /**<number of entries per free list block */
+ RwUInt32 heapSize; /**<size of the heap */
+ RwUInt32 alignment; /**<alignment of a free list entry */
+ RwLinkList blockList; /**<list of data blocks */
+ RwUInt32 flags; /**<flags which affect the behavior of the
+ free list <BR>
+ rwFREELISTFLAG_FREEBLOCKS */
+ RwLLLink link; /**<link to the free list linked list */
+
+#if (defined(RWDEBUG) && !defined(DOXYGEN))
+ const RwChar *fileCreate;
+ RwUInt32 lineCreate;
+#endif /* (defined(RWDEBUG) && !defined(DOXYGEN)) */
+};
+
+#ifndef RWADOXYGENEXTERNAL
+/**
+ * \ingroup rwfreelist
+ * \ref RwFreeListCallBack represents
+ * the function called from \ref RwFreeListForAllUsed for all used entries in a
+ * given free list.
+ *
+ * \param pMem Pointer to the start of the current entries.
+ *
+ * \param pData User-defined data pointer.
+ *
+ * \see RwFreeListForAllUsed
+ *
+ */
+#endif /* RWADOXYGENEXTERNAL */
+
+typedef void (*RwFreeListCallBack) (void *pMem, void *pData);
+typedef void *(*RwMemoryAllocFn) (RwFreeList * fl);
+typedef RwFreeList *(*RwMemoryFreeFn) (RwFreeList * fl, void *pData);
+
+/****************************************************************************
+ Function prototypes
+ */
+
+#ifdef __cplusplus
+extern "C"
+{
+#endif /* __cplusplus */
+
+extern RwMemoryFunctions *RwOsGetMemoryInterface(void);
+
+/*************
+ * FREELISTS *
+ *************/
+
+/* Allocation and freeing */
+#if (defined(RWDEBUG) && !defined(DOXYGEN))
+
+extern RwFreeList *_rwFreeListCreate(RwInt32 entrySize,
+ RwInt32 entriesPerBlock,
+ RwInt32 alignment,
+ const RwChar *fileCreate,
+ RwUInt32 lineCreate );
+
+#define RwFreeListCreate(entrySize, entriesPerBlock, alignment) \
+ _rwFreeListCreate(entrySize, \
+ entriesPerBlock, \
+ alignment, \
+ __FILE__, \
+ __LINE__)
+#else /* (defined(RWDEBUG) && !defined(DOXYGEN)) */
+
+/* legacy freelist create */
+
+extern RwFreeList *RwFreeListCreate(RwInt32 entrySize,
+ RwInt32 entriesPerBlock,
+ RwInt32 alignment);
+#endif /* (defined(RWDEBUG) && !defined(DOXYGEN)) */
+
+extern RwFreeList*
+RwFreeListCreateAndPreallocateSpace(RwInt32 entrySize,
+ RwInt32 entriesPerBlock,
+ RwInt32 alignment,
+ RwInt32 numBlocksToPreallocate,
+ RwFreeList *inPlaceSpaceForFreeListStruct );
+
+extern RwBool RwFreeListDestroy(RwFreeList * freelist);
+
+extern void RwFreeListSetFlags( RwFreeList *freeList, RwUInt32 flags );
+extern RwUInt32 RwFreeListGetFlags( RwFreeList *freeList );
+
+/* Garbage collection/enumeration */
+extern RwInt32 RwFreeListPurge(RwFreeList * freelist);
+extern RwFreeList *RwFreeListForAllUsed(RwFreeList * freelist,
+ RwFreeListCallBack
+ fpCallBack, void *pData);
+extern RwInt32 RwFreeListPurgeAllFreeLists(void);
+
+#ifdef __cplusplus
+}
+#endif /* __cplusplus */
+
+#if (defined(RWDEBUG) && defined(RWNOFREELISTS) && !defined(RWKEEPFREELISTS))
+
+#if ((defined(__MWERKS__) || defined(__GNUC__)) && defined(__R5900__))
+
+/*
+ * for more on memalign, see
+ * http://www.gnu.org/manual/glibc-2.0.6/html_chapter/libc_3.html#SEC28
+ */
+#include <rtdbmalloc.h>
+
+#define RwFreeListAlloc(_f) \
+ memalign(((_f)->alignment), (_f)->entrySize)
+
+#else /* ((defined(__MWERKS__) || defined(__GNUC__)) && defined(__R5900__)) */
+
+#define RwFreeListAlloc(_f) \
+ RwMalloc((_f)->entrySize)
+
+#endif /* ((defined(__MWERKS__) || defined(__GNUC__)) && defined(__R5900__)) */
+
+#define RwFreeListFree(_f, _p) \
+ RwFree((_p))
+
+#endif /* (defined(RWDEBUG) && defined(RWNOFREELISTS) && !defined(RWKEEPFREELISTS)) */
+
+#if (!defined(RwFreeListAlloc))
+#define RwFreeListAlloc(_f) \
+ RWSRCGLOBAL(memoryAlloc)(_f)
+#endif /* (!defined(RwFreeListAlloc)) */
+
+#if (!defined(RwFreeListFree))
+#define RwFreeListFree(_f, _p) \
+ RWSRCGLOBAL(memoryFree)(_f, _p)
+#endif /* (!defined(RwFreeListFree)) */
+
+
+/*--- Automatically derived from: C:/daily/rwsdk/src/plcore/bastream.h ---*/
+
+/****************************************************************************
+ Defines
+ */
+
+#define rwSTREAMSTACKSIZE 512
+
+/****************************************************************************
+ Global Types
+ */
+
+/**
+ * \ingroup rwstream
+ * \ref RwStreamType
+ * This type represents the different types of stream that
+ * can be used.
+ * See API section \ref rwstream
+ */
+enum RwStreamType
+{
+ rwNASTREAM = 0, /**<Invalid stream type */
+ rwSTREAMFILE, /**<File */
+ rwSTREAMFILENAME, /**<File name */
+ rwSTREAMMEMORY, /**<Memory*/
+ rwSTREAMCUSTOM, /**<Custom */
+ rwSTREAMTYPEFORCEENUMSIZEINT = RWFORCEENUMSIZEINT
+};
+typedef enum RwStreamType RwStreamType;
+
+/**
+ * \ingroup rwstream
+ * \ref RwStreamAccessType
+ * This type represents the options available for
+ * accessing a stream when it is opened.
+ * See API section \ref rwstream */
+enum RwStreamAccessType
+{
+ rwNASTREAMACCESS = 0, /**<Invalid stream access */
+ rwSTREAMREAD, /**<Read */
+ rwSTREAMWRITE, /**<Write */
+ rwSTREAMAPPEND, /**<Append */
+ rwSTREAMACCESSTYPEFORCEENUMSIZEINT = RWFORCEENUMSIZEINT
+};
+typedef enum RwStreamAccessType RwStreamAccessType;
+
+/* Memory stream */
+/**
+ * \ingroup rwstream
+ * \struct RwStreamMemory
+ * This should be considered an opaque type.
+ * Use the RwStream API functions to access.
+ */
+typedef struct RwStreamMemory RwStreamMemory;
+#if (!defined(DOXYGEN))
+struct RwStreamMemory
+{
+ RwUInt32 position; /* Current 'memory' position 0 is first byte */
+ RwUInt32 nSize; /* Space allocated currently */
+ RwUInt8 *memBlock; /* Current memory block pointer */
+};
+#endif /* (!defined(DOXYGEN)) */
+
+
+typedef union RwStreamFile RwStreamFile;
+/**
+ * \ingroup rwstream
+ * \union RwStreamFile
+ * This type is used to represent a file pointer for
+ * accessing data on disk through the stream mechanism.
+ * See API section \ref rwstream. */
+union RwStreamFile
+{
+ void *fpFile; /**< file pointer */
+ const void *constfpFile; /**< const file pointer */
+};
+
+
+/* Custom stream function pointer types */
+typedef RwBool(*rwCustomStreamFnClose) (void *data);
+typedef RwUInt32(*rwCustomStreamFnRead) (void *data, void *buffer,
+ RwUInt32 length);
+typedef RwBool(*rwCustomStreamFnWrite) (void *data,
+ const void *buffer,
+
+ RwUInt32 length);
+typedef RwBool(*rwCustomStreamFnSkip) (void *data,
+
+ RwUInt32 offset);
+
+/* Custom stream */
+/**
+ * \ingroup rwstream
+ * \struct RwStreamCustom
+ * This should be considered an opaque type.
+ * Use the RwStream API functions to access.
+ */
+typedef struct RwStreamCustom RwStreamCustom;
+#if (!defined(DOXYGEN))
+struct RwStreamCustom
+{
+ rwCustomStreamFnClose sfnclose;
+ rwCustomStreamFnRead sfnread;
+ rwCustomStreamFnWrite sfnwrite;
+ rwCustomStreamFnSkip sfnskip;
+ void *data;
+};
+#endif /* (!defined(DOXYGEN)) */
+
+/* Stream */
+
+typedef union RwStreamUnion RwStreamUnion;
+/**
+ * \ingroup rwstream
+ * \union RwStreamUnion
+ * The union of all supported stream types
+ */
+union RwStreamUnion
+{
+ RwStreamMemory memory; /**< memory */
+ RwStreamFile file; /**< file */
+ RwStreamCustom custom; /**< custom */
+};
+
+/**
+ * \ingroup rwstream
+ * \struct RwStream
+ * Binary stream for reading or writing object data.
+ * This should be considered an opaque type.
+ * Use the RwStream API functions to access.
+ */
+typedef struct RwStream RwStream;
+#if (!defined(DOXYGEN))
+struct RwStream
+{
+ RwStreamType type;
+ RwStreamAccessType accessType;
+ RwInt32 position;
+ RwStreamUnion Type;
+ RwBool rwOwned;
+};
+#endif /* (!defined(DOXYGEN)) */
+
+
+typedef struct RwMemory RwMemory;
+/**
+ * \ingroup rwstream
+ * \struct RwMemory
+ * This type represents a block of allocated memory.
+ * It is used to specify an area of memory connected to a stream of type
+ * rwSTREAMMEMORY.
+ * See \ref rwstream */
+struct RwMemory
+{
+ RwUInt8 *start; /**< starting address */
+ RwUInt32 length; /**< length in bytes*/
+};
+
+
+/****************************************************************************
+ Function prototypes
+ */
+
+#ifdef __cplusplus
+extern "C"
+{
+#endif /* __cplusplus */
+
+extern void
+RwStreamSetFreeListCreateParams( RwInt32 blockSize, RwInt32 numBlocksToPrealloc );
+
+/* Open/Close streams */
+
+extern RwStream *
+_rwStreamInitialize(RwStream *stream,
+ RwBool rwOwned,
+ RwStreamType type,
+ RwStreamAccessType accessType,
+ const void *pData);
+
+extern RwStream *
+RwStreamOpen(RwStreamType type,
+ RwStreamAccessType accessType,
+ const void *pData);
+
+extern RwBool
+RwStreamClose(RwStream * stream,
+ void *pData);
+
+
+/* Stream read/write */
+extern RwUInt32
+RwStreamRead(RwStream * stream,
+ void *buffer,
+ RwUInt32 length);
+
+extern RwStream *
+RwStreamWrite(RwStream * stream,
+ const void *buffer,
+ RwUInt32 length);
+
+
+/* Stream skipping */
+extern RwStream *
+RwStreamSkip(RwStream * stream,
+ RwUInt32 offset);
+
+
+#ifdef __cplusplus
+}
+#endif /* __cplusplus */
+
+
+/*--- Automatically derived from: C:/daily/rwsdk/src/plcore/batkreg.h ---*/
+
+/****************************************************************************
+ Global Types
+ */
+
+#ifndef RWADOXYGENEXTERNAL
+/**
+ * \ingroup rwplugin
+ * \ref RwPluginDataChunkWriteCallBack represents the function
+ * registered by \ref RwCameraRegisterPluginStream, etc. as the function that
+ * writes extension data to a binary stream.
+ *
+ * \param stream Pointer to the binary stream
+ *
+ * \param binaryLength A RwInt32 value equal to the binary
+ * size (in bytes) of the extension data that will be written to the binary
+ * stream.
+ *
+ * \param object Pointer to the object containing the extension
+ * data.
+ *
+ * \param offsetInObject A RwInt32 value equal to the byte
+ * offset of the extension data in the object.
+ *
+ * \param sizeInObject A RwInt32 value equal to the size
+ * (in bytes) of the extension data.
+ *
+ * \return Pointer to the stream
+ */
+typedef RwStream *(*RwPluginDataChunkWriteCallBack)(RwStream *stream, RwInt32 binaryLength, const void *object, RwInt32 offsetInObject, RwInt32 sizeInObject);
+
+/**
+ * \ingroup rwplugin
+ * \ref RwPluginDataChunkReadCallBack represents the function
+ * registered by \ref RwCameraRegisterPluginStream, etc. as the function that
+ * reads extension data from a binary stream.
+ *
+ * \param stream Pointer to the binary stream
+ *
+ * \param binaryLength A RwInt32 value equal to the binary
+ * size (in bytes) of the extension data that will be read from a binary
+ * stream.
+ *
+ * \param object Pointer to the object containing the extension
+ * data.
+ *
+ * \param offsetInObject A RwInt32 value equal to the byte
+ * offset of the extension data in the object.
+ *
+ * \param sizeInObject A RwInt32 value equal to the size
+ * (in bytes) of the extension data.
+ *
+ * \return Pointer to the stream
+ */
+typedef RwStream *(*RwPluginDataChunkReadCallBack)(RwStream *stream, RwInt32 binaryLength, void *object, RwInt32 offsetInObject, RwInt32 sizeInObject);
+
+/**
+ * \ingroup rwplugin
+ * \ref RwPluginDataChunkGetSizeCallBack represents the callback
+ * registered by \ref RwCameraRegisterPluginStream, etc. as the function that
+ * determines the binary size of the extension data.
+ *
+ * \param object Pointer to the object containing the extension data.
+ *
+ * \param offsetInObject A RwInt32 value equal to the byte
+ * offset of the extension data in the object.
+ *
+ * \param sizeInObject A RwInt32 value equal to the size
+ * (in bytes) of the extension data.
+ *
+ * \return A RwInt32 value equal to the size in bytes of the plugin extension data.
+ */
+typedef RwInt32(*RwPluginDataChunkGetSizeCallBack)(const void *object, RwInt32 offsetInObject, RwInt32 sizeInObject);
+
+/**
+ * \ingroup rwplugin
+ * \ref RwPluginDataChunkAlwaysCallBack represents the callback
+ * registered by \ref RwCameraSetStreamAlwaysCallBack, etc. as the
+ * function that is called after the reading of plugin stream data is
+ * finished (useful to set up plugin data for plugins that found no
+ * data in the stream, but that cannot set up the data during the
+ * \ref RwPluginObjectConstructor callback).
+ *
+ * \param object Pointer to the object containing the extension data.
+ *
+ * \param offsetInObject A RwInt32 value equal to the byte
+ * offset of the extension data in the object.
+ *
+ * \param sizeInObject A RwInt32 value equal to the size
+ * (in bytes) of the extension data.
+ *
+ * \return Returns TRUE if successful, FALSE otherwise.
+ */
+typedef RwBool(*RwPluginDataChunkAlwaysCallBack)(void *object, RwInt32 offsetInObject, RwInt32 sizeInObject);
+
+/**
+ * \ingroup rwplugin
+ * \ref RwPluginDataChunkRightsCallBack represents the callback
+ * registered by RwCameraSetStreamRightsCallBack, etc. as the
+ * function that is called after the reading of plugin stream data is
+ * finished, and the object finalised, if and only if the object's rights
+ * id was equal to that of the plugin registering the call.
+ * For convience the extension data is passed to the callback.
+ *
+ * \param object Pointer to the object containing the extension data.
+ *
+ * \param offsetInObject A RwInt32 value equal to the byte
+ * offset of the extension data in the object.
+ *
+ * \param sizeInObject A RwInt32 value equal to the size
+ * (in bytes) of the extension data.
+ *
+ * \param extraData An RwUInt32 writen with the plugin id.
+ *
+ * \return Returns TRUE if successful, FALSE otherwise.
+ */
+typedef RwBool(*RwPluginDataChunkRightsCallBack)(void *object, RwInt32 offsetInObject, RwInt32 sizeInObject, RwUInt32 extraData);
+
+/**
+ * \ingroup rwplugin
+ * \ref RwPluginObjectConstructor represents the callback
+ * registered by \ref RwEngineRegisterPlugin, \ref RwCameraRegisterPlugin, etc.
+ * as the function that initializes either the global extension data (in the
+ * case of \ref RwEngineRegisterPlugin) or the object extension data (in all
+ * other cases). Registered by \ref RwCameraSetStreamAlwaysCallBack, etc.
+ *
+ * \param object Pointer to the object (global or otherwise)
+ * that contains the extension data.
+ *
+ * \param offsetInObject A RwInt32 value equal to the
+ * byte offset of the extension data in the object.
+ *
+ * \param sizeInObject A RwInt32 value equal to the size
+ * (in bytes) of the extension data.
+ *
+ * \return Pointer to the object
+ */
+typedef void *(*RwPluginObjectConstructor)(void *object, RwInt32 offsetInObject, RwInt32 sizeInObject);
+
+/**
+ * \ingroup rwplugin
+ * \ref RwPluginObjectCopy represents the callback registered by
+ * \ref RwCameraRegisterPlugin, etc. as the function that copies the object
+ * extension data when an object is duplicated.
+ *
+ * \param dstObject Pointer to the destination object that will
+ * receive the extension data.
+ *
+ * \param srcObject Pointer to the source object containing
+ * extension data.
+ *
+ * \param offsetInObject A RwInt32 value equal to the byte offset
+ * of the extension data in the object.
+ *
+ * \param sizeInObject A RwInt32 value equal to the size
+ * (in bytes) of the extension data.
+ *
+ * \return Pointer to the object
+ */
+typedef void *(*RwPluginObjectCopy)(void *dstObject, const void *srcObject, RwInt32 offsetInObject, RwInt32 sizeInObject);
+
+/**
+ * \ingroup rwplugin
+ * \ref RwPluginObjectDestructor represents the callback registered
+ * by \ref RwEngineRegisterPlugin, \ref RwCameraRegisterPlugin, etc. as the
+ * function that destroys either the global extension data (in the case of
+ * \ref RwEngineRegisterPlugin) or the object extension data (in all other
+ * cases).
+ *
+ * \param object Pointer to the object (global or otherwise)
+ * containing the extension data.
+ *
+ * \param offsetInObject A RwInt32 value equal to the byte
+ * offset of the extension data in the object.
+ *
+ * \param sizeInObject A RwInt32 value equal to the size
+ * (in bytes) of the extension data.
+ *
+ * \return Pointer to the object.
+ */
+#endif /* RWADOXYGENEXTERNAL */
+
+typedef void *(*RwPluginObjectDestructor)(void *object, RwInt32 offsetInObject, RwInt32 sizeInObject);
+
+typedef void *(*RwPluginErrorStrCallBack)(void *);
+
+typedef struct RwPluginRegistry RwPluginRegistry;
+typedef struct RwPluginRegEntry RwPluginRegEntry;
+
+#if (!defined(DOXYGEN))
+struct RwPluginRegistry
+{
+ RwInt32 sizeOfStruct;
+ RwInt32 origSizeOfStruct;
+ RwInt32 maxSizeOfStruct;
+ RwInt32 staticAlloc;
+ RwPluginRegEntry *firstRegEntry;
+ RwPluginRegEntry *lastRegEntry;
+};
+
+struct RwPluginRegEntry
+{
+ RwInt32 offset;
+ RwInt32 size;
+ RwUInt32 pluginID;
+ RwPluginDataChunkReadCallBack readCB;
+ RwPluginDataChunkWriteCallBack writeCB;
+ RwPluginDataChunkGetSizeCallBack getSizeCB;
+ RwPluginDataChunkAlwaysCallBack alwaysCB;
+ RwPluginDataChunkRightsCallBack rightsCB;
+ RwPluginObjectConstructor constructCB;
+ RwPluginObjectDestructor destructCB;
+ RwPluginObjectCopy copyCB;
+ RwPluginErrorStrCallBack errStrCB;
+ RwPluginRegEntry *nextRegEntry;
+ RwPluginRegEntry *prevRegEntry;
+ RwPluginRegistry *parentRegistry;
+};
+#endif /* (!defined(DOXYGEN)) */
+
+
+
+/****************************************************************************
+ Function prototypes
+ */
+
+#ifdef __cplusplus
+extern "C"
+{
+#endif /* __cplusplus */
+
+
+/* Registering toolkits and allocating memory */
+extern void
+RwPluginRegistrySetFreeListCreateParams( RwInt32 blockSize, RwInt32 numBlocksToPrealloc );
+
+extern RwBool
+_rwPluginRegistrySetStaticPluginsSize(RwPluginRegistry * reg,
+ RwInt32 size);
+extern RwInt32
+_rwPluginRegistryAddPlugin(RwPluginRegistry * reg,
+ RwInt32 size,
+ RwUInt32 pluginID,
+ RwPluginObjectConstructor constructCB,
+ RwPluginObjectDestructor destructCB,
+ RwPluginObjectCopy copyCB);
+extern RwInt32
+_rwPluginRegistryGetPluginOffset(const RwPluginRegistry *reg,
+ RwUInt32 pluginID);
+
+/* Initializing/De-initializing instances */
+extern const
+RwPluginRegistry *_rwPluginRegistryInitObject(const RwPluginRegistry * reg,
+ void *object);
+extern const
+RwPluginRegistry *_rwPluginRegistryDeInitObject(const RwPluginRegistry * reg,
+ void *object);
+extern const
+RwPluginRegistry *_rwPluginRegistryCopyObject(const RwPluginRegistry * reg,
+ void *dstObject,
+ const void *srcObject);
+
+#ifdef RWDEBUG
+extern RwBool
+_rwPluginRegistryValidateObject(const RwPluginRegistry * reg,
+ const void *object);
+#endif /* RWDEBUG */
+
+
+#ifdef __cplusplus
+}
+#endif /* __cplusplus */
+
+/* Compatibility macros */
+
+#define rwPluginRegistryOpen() \
+ _rwPluginRegistryOpen()
+#define rwPluginRegistryClose() \
+ _rwPluginRegistryClose()
+#define rwPluginRegistrySetStaticPluginsSize(reg, size) \
+ _rwPluginRegistrySetStaticPluginsSize(reg, size)
+#define rwPluginRegistryAddPlugin(reg, size, pluginID, constructCB, destructCB, copyCB) \
+ _rwPluginRegistryAddPlugin(reg, size, pluginID, constructCB, destructCB, copyCB)
+#define rwPluginRegistryGetPluginOffset(reg, pluginID) \
+ _rwPluginRegistryGetPluginOffset(reg, pluginID)
+#define rwPluginRegistryInitObject(reg, object) \
+ _rwPluginRegistryInitObject(reg, object)
+#define rwPluginRegistryDeInitObject(reg, object) \
+ _rwPluginRegistryDeInitObject(reg, object)
+#define rwPluginRegistryCopyObject(reg, dstObject, srcObject) \
+ _rwPluginRegistryCopyObject(reg, dstObject, srcObject)
+#define rwPluginRegistryValidateObject(reg, object) \
+ _rwPluginRegistryValidateObject(reg, object)
+
+
+/*--- Automatically derived from: C:/daily/rwsdk/src/plcore/batkbin.h ---*/
+
+/****************************************************************************
+ Function prototypes
+ */
+
+#ifdef __cplusplus
+extern "C"
+{
+#endif /* __cplusplus */
+
+/* Plugin binary stream stuff */
+extern RwInt32 _rwPluginRegistryAddPluginStream(
+ RwPluginRegistry *reg,
+ RwUInt32 pluginID,
+ RwPluginDataChunkReadCallBack readCB,
+ RwPluginDataChunkWriteCallBack writeCB,
+ RwPluginDataChunkGetSizeCallBack getSizeCB);
+extern RwInt32 _rwPluginRegistryAddPlgnStrmlwysCB(
+ RwPluginRegistry *reg,
+ RwUInt32 pluginID,
+ RwPluginDataChunkAlwaysCallBack alwaysCB);
+extern RwInt32 _rwPluginRegistryAddPlgnStrmRightsCB(
+ RwPluginRegistry *reg,
+ RwUInt32 pluginID,
+ RwPluginDataChunkRightsCallBack rightsCB);
+extern const RwPluginRegistry *_rwPluginRegistryReadDataChunks(const RwPluginRegistry *reg,
+ RwStream *stream,
+ void *object);
+extern const RwPluginRegistry *_rwPluginRegistryWriteDataChunks(const RwPluginRegistry *reg,
+ RwStream *stream,
+ const void *object);
+extern const RwPluginRegistry *_rwPluginRegistrySkipDataChunks(const RwPluginRegistry * reg,
+ RwStream * stream);
+extern RwInt32 _rwPluginRegistryGetSize(const RwPluginRegistry *reg, const void *object);
+extern const RwPluginRegistry *_rwPluginRegistryInvokeRights(const RwPluginRegistry *reg,
+ RwUInt32 id,
+ void *obj,
+ RwUInt32 extraData);
+
+#ifdef __cplusplus
+}
+#endif /* __cplusplus */
+
+/* Compatibility macros */
+
+#define rwPluginRegistryAddPluginStream(reg, pluginID, readCB, writeCB, getSizeCB) \
+ _rwPluginRegistryAddPluginStream(reg, pluginID, readCB, writeCB, getSizeCB)
+#define rwPluginRegistryAddPluginStreamAlwaysCB(reg, pluginID, alwaysCB) \
+ _rwPluginRegistryAddPlgnStrmlwysCB(reg, pluginID, alwaysCB)
+#define rwPluginRegistryReadDataChunks(reg, stream, object) \
+ _rwPluginRegistryReadDataChunks(reg, stream, object)
+#define rwPluginRegistryWriteDataChunks(reg, stream, object) \
+ _rwPluginRegistryWriteDataChunks(reg, stream, object)
+#define rwPluginRegistrySkipDataChunks(reg, stream) \
+ _rwPluginRegistrySkipDataChunks(reg, stream)
+#define rwPluginRegistryGetSize(reg, object) \
+ _rwPluginRegistryGetSize(reg, object)
+
+
+
+/*--- Automatically derived from: C:/daily/rwsdk/src/plcore/bamatrix.h ---*/
+
+/****************************************************************************
+ Defines
+ */
+
+#define RWMATRIXALIGNMENT(_mat) \
+ (! (((rwMATRIXALIGNMENT)-1) & ((RwUInt32)(_mat))))
+
+#if (defined(RWMATRIXMONITOR))
+# if (defined(_MSC_VER))
+# if ((_MSC_VER>=1000) && defined(_DEBUG))
+
+typedef char MatrixString[1024];
+
+#define RWMATRIXPRINT(_matrix) \
+MACRO_START \
+{ \
+ MatrixString message; \
+ MatrixString output; \
+ \
+ if (NULL != (_matrix)) \
+ { \
+ const RwV3d * const _x = &(_matrix)->right; \
+ const RwV3d * const _y = &(_matrix)->up; \
+ const RwV3d * const _z = &(_matrix)->at; \
+ const RwV3d * const _w = &(_matrix)->pos; \
+ \
+ _snprintf(message, sizeof(MatrixString), \
+ "[ [ %8.4f, %8.4f, %8.4f, %8.4f ]\n" \
+ " [ %8.4f, %8.4f, %8.4f, %8.4f ]\n" \
+ " [ %8.4f, %8.4f, %8.4f, %8.4f ]\n" \
+ " [ %8.4f, %8.4f, %8.4f, %8.4f ] ]\n" \
+ " %08x == flags\n", \
+ _x->x, _x->y, _x->z, (RwReal) 0, \
+ _y->x, _y->y, _y->z, (RwReal) 0, \
+ _z->x, _z->y, _z->z, (RwReal) 0, \
+ _w->x, _w->y, _w->z, (RwReal) 1, \
+ (_matrix)->flags); \
+ } \
+ else \
+ { \
+ _snprintf(message, sizeof(MatrixString), \
+ "NULL"); \
+ } \
+ \
+ _snprintf(output, sizeof(MatrixString), \
+ "%s(%d): %s [%p] ==\n%s\n", \
+ __FILE__, __LINE__, \
+ #_matrix, _matrix, message); \
+ \
+ OutputDebugString(RWSTRING(output)); \
+} \
+MACRO_STOP
+
+# endif /* ((_MSC_VER>=1000) && defined(_DEBUG)) */
+# endif /* (defined(_MSC_VER)) */
+#endif /* (defined(RWMATRIXMONITOR)) */
+
+#if (!(defined(RWMATRIXPRINT)))
+#define RWMATRIXPRINT(_matrix) /* No op */
+#endif /* (!(defined(RWMATRIXPRINT))) */
+
+#ifndef RWADOXYGENEXTERNAL
+/**
+ * \ingroup rwmatrix
+ * enum RwOpCombineType
+ * This type represents a combination operator which
+ * can be applied to frames and matrices.
+ * The operator determines the order
+ * in which one object is combined with another
+ */
+#endif /* RWADOXYGENEXTERNAL */
+
+enum RwOpCombineType
+{
+ rwCOMBINEREPLACE = 0, /**<Replace -
+ all previous transformations are lost */
+ rwCOMBINEPRECONCAT, /**<Pre-concatenation -
+ the given transformation is applied
+ before all others */
+ rwCOMBINEPOSTCONCAT, /**<Post-concatenation -
+ the given transformation is applied
+ after all others */
+ rwOPCOMBINETYPEFORCEENUMSIZEINT = RWFORCEENUMSIZEINT
+};
+
+/*
+ * RwOpCombineType typedef for enum RwOpCombineType
+ */
+typedef enum RwOpCombineType RwOpCombineType;
+
+/* External flags (bits 0-15) */
+
+/* Internal flags (bits 16-31) */
+enum RwMatrixType
+{
+ rwMATRIXTYPENORMAL = 0x00000001,
+ rwMATRIXTYPEORTHOGONAL = 0x00000002,
+ rwMATRIXTYPEORTHONORMAL = 0x00000003,
+ rwMATRIXTYPEMASK = 0x00000003,
+ rwMATRIXTYPEFORCEENUMSIZEINT = RWFORCEENUMSIZEINT
+};
+typedef enum RwMatrixType RwMatrixType;
+
+enum RwMatrixFlag
+{
+ rwMATRIXINTERNALIDENTITY = 0x00020000,
+ rwMATRIXFLAGFORCEENUMSIZEINT = RWFORCEENUMSIZEINT
+};
+typedef enum RwMatrixFlag RwMatrixFlag;
+
+/* Flags describing what will optimize for */
+enum RwMatrixOptimizations
+{
+ rwMATRIXOPTIMIZE_IDENTITY = 0x00020000,
+ rwMATRIXOPTIMIZATIONSFORCEENUMSIZEINT = RWFORCEENUMSIZEINT
+};
+typedef enum RwMatrixOptimizations RwMatrixOptimizations;
+
+/****************************************************************************
+ Global Types
+ */
+
+#if (!defined(DOXYGEN))
+struct RwMatrixTag
+{
+ /* These are padded to be 16 byte quantities per line */
+ RwV3d right;
+ RwUInt32 flags;
+ RwV3d up;
+ RwUInt32 pad1;
+ RwV3d at;
+ RwUInt32 pad2;
+ RwV3d pos;
+ RwUInt32 pad3;
+};
+
+/*
+ * RwMatrix & RwMatrixTag must be different otherwise the alignment
+ * directive is ignored when compiling under C++ on Visual C
+ */
+typedef struct RwMatrixTag RWALIGN(RwMatrix, rwMATRIXALIGNMENT);
+
+#else
+
+/*
+ * RwMatrix must appear as the struct name & the typedef,
+ * otherwise Doxygen puts RwMatrixTag in the API ref instead of RwMatrix!
+ */
+
+/**
+ * \ingroup rwmatrix
+ * \struct RwMatrix
+ * Matrix to define transformations.
+ * This should be considered an opaque type.
+ * Use the RwMatrix API functions to access.
+ */
+typedef struct RwMatrix RWALIGN(RwMatrix, rwMATRIXALIGNMENT);
+#endif /* (!defined(DOXYGEN)) */
+
+#if (!defined(RwMatrixCopyMacro))
+#define RwMatrixCopyMacro(_target, _source) \
+ ( *(_target) = *(_source) )
+#endif /* (!defined(RwMatrixCopyMacro)) */
+
+#if (!defined(RwMatrixSetIdentityMacro))
+#define RwMatrixSetIdentityMacro(m) \
+MACRO_START \
+{ \
+ (m)->right.x = (m)->up.y = (m)->at.z = (RwReal)((1.0)); \
+ (m)->right.y = (m)->right.z = (m)->up.x = (RwReal)((0.0)); \
+ (m)->up.z = (m)->at.x = (m)->at.y = (RwReal)((0.0)); \
+ (m)->pos.x = (m)->pos.y = (m)->pos.z = (RwReal)((0.0)); \
+ rwMatrixSetFlags((m), \
+ rwMatrixGetFlags(m) | \
+ (rwMATRIXINTERNALIDENTITY | \
+ rwMATRIXTYPEORTHONORMAL)); \
+} \
+MACRO_STOP
+#endif /* (!defined(RwMatrixSetIdentityMacro)) */
+
+typedef void (RWASMCALL * rwMatrixMultFn) (RwMatrix * dstMat,
+ const RwMatrix * matA,
+ const RwMatrix * matB);
+
+typedef struct RwMatrixTolerance RwMatrixTolerance;
+
+#ifndef RWADOXYGENEXTERNAL
+/**
+ * \ingroup rwmatrix
+ * \struct RwMatrixTolerance
+ * Holds tolerances for matrix optimizations with \ref RwMatrixOptimize
+ */
+#endif /* RWADOXYGENEXTERNAL */
+struct RwMatrixTolerance
+{
+ RwReal Normal;
+ /**< Tolerance within which matrix is deemed to be normal */
+ RwReal Orthogonal;
+ /**< Tolerance within which matrix is deemed to be orthogonal */
+ RwReal Identity;
+ /**< Tolerance within which matrix is deemed to be identity */
+};
+
+
+/****************************************************************************
+ Function prototypes
+ */
+
+/* Matrix operations */
+
+#ifdef __cplusplus
+extern "C"
+{
+#endif /* __cplusplus */
+
+extern RwBool
+RwEngineGetMatrixTolerances(RwMatrixTolerance * const tolerance);
+
+extern RwBool
+RwEngineSetMatrixTolerances(const RwMatrixTolerance * const tolerance);
+
+/* Update */
+#define rwMatrixSetFlags(m, flagsbit) ((m)->flags = (flagsbit))
+#define rwMatrixGetFlags(m) ((m)->flags)
+#define rwMatrixTestFlags(m, flagsbit) ((m)->flags & (RwInt32)(flagsbit))
+
+/* Creation/destruction */
+extern void
+RwMatrixSetFreeListCreateParams( RwInt32 blockSize, RwInt32 numBlocksToPrealloc );
+
+extern RwBool
+RwMatrixDestroy(RwMatrix * mpMat);
+
+extern RwMatrix *
+RwMatrixCreate(void);
+
+#ifdef RWDEBUG
+
+/* Functions for debug */
+extern void
+RwMatrixCopy(RwMatrix * dstMatrix, const RwMatrix * srcMatrix);
+
+extern void
+RwMatrixSetIdentity(RwMatrix * matrix);
+
+#else /* RWDEBUG */
+
+#define RwMatrixCopy(dst, src) RwMatrixCopyMacro(dst, src)
+#define RwMatrixSetIdentity(m) RwMatrixSetIdentityMacro(m)
+
+#endif /* RWDEBUG */
+
+/* Matrix multiply */
+extern RwMatrix *
+RwMatrixMultiply(RwMatrix * matrixOut,
+ const RwMatrix * MatrixIn1,
+ const RwMatrix * matrixIn2);
+
+extern RwMatrix *
+RwMatrixTransform(RwMatrix * matrix,
+ const RwMatrix * transform,
+ RwOpCombineType combineOp);
+
+/* Normalise */
+extern RwMatrix *
+RwMatrixOrthoNormalize(RwMatrix * matrixOut,
+ const RwMatrix * matrixIn);
+
+/* Inversion */
+extern RwMatrix *
+RwMatrixInvert(RwMatrix * matrixOut,
+ const RwMatrix * matrixIn);
+
+/* Unary matrix operations */
+extern RwMatrix *
+RwMatrixScale(RwMatrix * matrix,
+ const RwV3d * scale,
+ RwOpCombineType combineOp);
+
+extern RwMatrix *
+RwMatrixTranslate(RwMatrix * matrix,
+ const RwV3d * translation,
+ RwOpCombineType combineOp);
+
+extern RwMatrix *
+RwMatrixRotate(RwMatrix * matrix,
+ const RwV3d * axis,
+ RwReal angle,
+ RwOpCombineType combineOp);
+
+extern RwMatrix *
+RwMatrixRotateOneMinusCosineSine(RwMatrix * matrix,
+ const RwV3d * unitAxis,
+ RwReal oneMinusCosine,
+ RwReal sine,
+ RwOpCombineType combineOp);
+
+/* Query what the matrix is */
+extern const RwMatrix *RwMatrixQueryRotate(const RwMatrix * matrix,
+ RwV3d * unitAxis,
+ RwReal * angle,
+ RwV3d * center);
+
+/* Get components */
+#ifndef RWDEBUG
+
+#define RwMatrixGetRight(m) (&(m)->right)
+#define RwMatrixGetUp(m) (&(m)->up)
+#define RwMatrixGetAt(m) (&(m)->at)
+#define RwMatrixGetPos(m) (&(m)->pos)
+
+#else /* RWDEBUG */
+
+extern RwV3d *
+RwMatrixGetRight(RwMatrix * matrix);
+
+extern RwV3d *
+RwMatrixGetUp(RwMatrix * matrix);
+
+extern RwV3d *
+RwMatrixGetAt(RwMatrix * matrix);
+
+extern RwV3d *
+RwMatrixGetPos(RwMatrix * matrix);
+
+#endif /* RWDEBUG */
+
+/* Update the internal matrix state wrt its elements */
+extern RwMatrix *
+RwMatrixUpdate(RwMatrix * matrix);
+
+/* Update the internal matrix flags wrt its elements */
+extern RwMatrix *
+RwMatrixOptimize(RwMatrix * matrix,
+ const RwMatrixTolerance *
+ tolerance);
+
+extern RwReal
+_rwMatrixDeterminant(const RwMatrix * matrix);
+
+extern RwReal
+_rwMatrixNormalError(const RwMatrix * matrix);
+
+extern RwReal
+_rwMatrixOrthogonalError(const RwMatrix * matrix);
+
+extern RwReal
+_rwMatrixIdentityError(const RwMatrix * matrix);
+
+#ifdef __cplusplus
+}
+#endif /* __cplusplus */
+
+/* Compatibility macros */
+
+#define rwMatrixSetOptimizations(optimizeFlags) \
+ _rwMatrixSetOptimizations(optimizeFlags)
+
+#define rwMatrixSetMultFn(multMat) \
+ _rwMatrixSetMultFn(multMat)
+
+#define rwMatrixOpen(instance, offset, size) \
+ _rwMatrixOpen(instance, offset, size)
+
+#define rwMatrixClose(instance, offset, size) \
+ _rwMatrixClose(instance, offset, size)
+
+/* Initialisation/deinitialisation */
+#define rwMatrixInitialize(m, t) \
+MACRO_START \
+{ \
+ rwMatrixSetFlags((m), (t)); \
+} \
+MACRO_STOP
+
+#define rwMatrixIsNormal(_matrix, _epsilon) \
+ ( (_epsilon) >= _rwMatrixNormalError(_matrix) )
+
+#define rwMatrixIsOrthogonal(_matrix, _epsilon) \
+ ( (_epsilon) >= _rwMatrixOrthogonalError(_matrix) )
+
+#define rwMatrixIsOrthonormal(_matrix, _epsilon) \
+ ( rwMatrixIsNormal(_matrix, _epsilon) && \
+ rwMatrixIsOrthogonal(_matrix, _epsilon) )
+
+#define rwMatrixIsOrthonormalPositive(_matrix, _epsilon) \
+ ( rwMatrixIsOrthonormal(_matrix, _epsilon) && \
+( (((RwReal)1) - (_epsilon)) <= _rwMatrixDeterminant(_matrix) ) )
+
+#define rwMatrixIsIdentity(_matrix, _epsilon) \
+ ( (_epsilon) >= _rwMatrixIdentityError(_matrix) )
+
+#define rwMatrixValidFlags(_matrix, _epsilon) \
+ ( (_matrix) && /* valid pointer */ \
+ ( ( !( rwMatrixGetFlags(_matrix) & /* not flagged as identity */ \
+ rwMATRIXINTERNALIDENTITY) ) || /* .. or actually is */ \
+ rwMatrixIsIdentity(_matrix, _epsilon)) && \
+ ( ( !( rwMatrixGetFlags(_matrix) & /* not flagged as normal */ \
+ rwMATRIXTYPENORMAL) ) || /* ... or actually is */ \
+ rwMatrixIsNormal(_matrix, _epsilon)) && \
+ ( ( !( rwMatrixGetFlags(_matrix) & /* not flagged as orthogonal */ \
+ rwMATRIXTYPEORTHOGONAL) ) || /* ... or actually is */ \
+ rwMatrixIsOrthogonal(_matrix, _epsilon)) )
+
+#define rwMat01Det(_mAA) \
+ ( (_mAA) )
+
+#define rwMat02Det(_mAA, _mAB, \
+ _mBA, _mBB) \
+ ( (_mAA) * rwMat01Det(_mBB) \
+ - (_mAB) * rwMat01Det(_mBA) \
+ )
+
+#define rwMat03Det(_mAA, _mAB, _mAC, \
+ _mBA, _mBB, _mBC, \
+ _mCA, _mCB, _mCC) \
+ ( (_mAA) * rwMat02Det(_mBB, _mBC, \
+ _mCB, _mCC) \
+ - (_mAB) * rwMat02Det(_mBA, _mBC, \
+ _mCA, _mCC) \
+ + (_mAC) * rwMat02Det(_mBA, _mBB, \
+ _mCA, _mCB) \
+ )
+
+#define rwMat04Det(_mAA, _mAB, _mAC, _mAD, \
+ _mBA, _mBB, _mBC, _mBD, \
+ _mCA, _mCB, _mCC, _mCD, \
+ _mDA, _mDB, _mDC, _mDD) \
+ ( (_mAA) * rwMat03Det(_mBB, _mBC, _mBD, \
+ _mCB, _mCC, _mCD, \
+ _mDB, _mDC, _mDD) \
+ - (_mAB) * rwMat03Det(_mBA, _mBC, _mBD, \
+ _mCA, _mCC, _mCD, \
+ _mDA, _mDC, _mDD) \
+ + (_mAC) * rwMat03Det(_mBA, _mBB, _mBD, \
+ _mCA, _mCB, _mCD, \
+ _mDA, _mDB, _mDD) \
+ - (_mAD) * rwMat03Det(_mBA, _mBB, _mBC, \
+ _mCA, _mCB, _mCC, \
+ _mDA, _mDB, _mDC) \
+ )
+
+
+#define rwMat02Inv(_rAA, _rAB, \
+ _rBA, _rBB) \
+ _mAA, _mAB, \
+ _mBA, _mBB) \
+MACRO_START \
+{ \
+ RwSplitBits determinant; \
+ \
+ (_rAA) = rwMat01Det(_mBB); \
+ (_rAB) = -rwMat01Det(_mAB); \
+ \
+ determinant.nReal = ( (_rAA) * (_mAA) + \
+ (_rAB) * (_mBA) ); \
+ \
+ \
+ { \
+ const RwReal normalize = ( (determinant.nInt != 0)? \
+ (((RwReal)1)/determinant.nReal): \
+ ((RwReal)1) ); \
+ \
+ (_rAA) *= normalize; \
+ (_rAB) *= normalize; \
+ \
+ (_rBA) = -rwMat01Det(_mBA) * normalize; \
+ (_rBB) = rwMat01Det(_mAA) * normalize; \
+ } \
+} \
+MACRO_STOP
+
+#define rwMat03Inv(_rAA, _rAB, _rAC, \
+ _rBA, _rBB, _rBC, \
+ _rCA, _rCB, _rCC, \
+ _mAA, _mAB, _mAC, \
+ _mBA, _mBB, _mBC, \
+ _mCA, _mCB, _mCC) \
+MACRO_START \
+{ \
+ RwSplitBits determinant; \
+ \
+ (_rAA)= rwMat02Det(_mBB, _mBC, \
+ _mCB, _mCC); \
+ (_rAB)= -rwMat02Det(_mAB, _mAC, \
+ _mCB, _mCC); \
+ (_rAC)= rwMat02Det(_mAB, _mAC, \
+ _mBB, _mBC); \
+ \
+ determinant.nReal = ( (_rAA) * (_mAA) + \
+ (_rAB) * (_mBA) + \
+ (_rAC) * (_mCA) ); \
+ \
+ { \
+ const RwReal normalize = ( (determinant.nInt != 0)? \
+ (((RwReal)1)/determinant.nReal): \
+ ((RwReal)1) ); \
+ (_rAA) *= normalize; \
+ (_rAB) *= normalize; \
+ (_rAC) *= normalize; \
+ \
+ (_rBA)= -rwMat02Det(_mBA, _mBC, \
+ _mCA, _mCC) * normalize ; \
+ (_rBB)= rwMat02Det(_mAA, _mAC, \
+ _mCA, _mCC) * normalize ; \
+ (_rBC)= -rwMat02Det(_mAA, _mAC, \
+ _mBA, _mBC) * normalize ; \
+ \
+ (_rCA)= rwMat02Det(_mBA, _mBB, \
+ _mCA, _mCB) * normalize ; \
+ (_rCB)= -rwMat02Det(_mAA, _mAB, \
+ _mCA, _mCB) * normalize ; \
+ (_rCC)= rwMat02Det(_mAA, _mAB, \
+ _mBA, _mBB) * normalize ; \
+ } \
+ \
+} \
+MACRO_STOP
+
+#define rwMat04Inv(_rAA, _rAB, _rAC, _rAD, \
+ _rBA, _rBB, _rBC, _rBD, \
+ _rCA, _rCB, _rCC, _rCD, \
+ _rDA, _rDB, _rDC, _rDD, \
+ _mAA, _mAB, _mAC, _mAD, \
+ _mBA, _mBB, _mBC, _mBD, \
+ _mCA, _mCB, _mCC, _mCD, \
+ _mDA, _mDB, _mDC, _mDD) \
+MACRO_START \
+{ \
+ RwSplitBits determinant; \
+ \
+ (_rAA)= rwMat03Det(_mBB, _mBC, _mBD, \
+ _mCB, _mCC, _mCD, \
+ _mDB, _mDC, _mDD); \
+ (_rAB)= -rwMat03Det(_mAB, _mAC, _mAD, \
+ _mCB, _mCC, _mCD, \
+ _mDB, _mDC, _mDD); \
+ (_rAC)= rwMat03Det(_mAB, _mAC, _mAD, \
+ _mBB, _mBC, _mBD, \
+ _mDB, _mDC, _mDD); \
+ (_rAD)= -rwMat03Det(_mAB, _mAC, _mAD, \
+ _mBB, _mBC, _mBD, \
+ _mCB, _mCC, _mCD); \
+ \
+ determinant.nReal = ( (_rAA) * (_mAA) + \
+ (_rAB) * (_mBA) + \
+ (_rAC) * (_mCA) + \
+ (_rAD) * (_mDA) ); \
+ \
+ { \
+ const RwReal normalize = ( (determinant.nInt != 0)? \
+ (((RwReal)1)/determinant.nReal): \
+ ((RwReal)1) ); \
+ \
+ (_rAA) *= normalize; \
+ (_rAB) *= normalize; \
+ (_rAC) *= normalize; \
+ (_rAD) *= normalize; \
+ \
+ (_rBA)= -rwMat03Det(_mBA, _mBC, _mBD, \
+ _mCA, _mCC, _mCD, \
+ _mDA, _mDC, _mDD) * normalize ; \
+ (_rBB)= rwMat03Det(_mAA, _mAC, _mAD, \
+ _mCA, _mCC, _mCD, \
+ _mDA, _mDC, _mDD) * normalize ; \
+ (_rBC)= -rwMat03Det(_mAA, _mAC, _mAD, \
+ _mBA, _mBC, _mBD, \
+ _mDA, _mDC, _mDD) * normalize ; \
+ (_rBD)= rwMat03Det(_mAA, _mAC, _mAD, \
+ _mBA, _mBC, _mBD, \
+ _mCA, _mCC, _mCD) * normalize ; \
+ \
+ (_rCA)= rwMat03Det(_mBA, _mBB, _mBD, \
+ _mCA, _mCB, _mCD, \
+ _mDA, _mDB, _mDD) * normalize ; \
+ (_rCB)= -rwMat03Det(_mAA, _mAB, _mAD, \
+ _mCA, _mCB, _mCD, \
+ _mDA, _mDB, _mDD) * normalize ; \
+ (_rCC)= rwMat03Det(_mAA, _mAB, _mAD, \
+ _mBA, _mBB, _mBD, \
+ _mDA, _mDB, _mDD) * normalize ; \
+ (_rCD)= -rwMat03Det(_mAA, _mAB, _mAD, \
+ _mBA, _mBB, _mBD, \
+ _mCA, _mCB, _mCD) * normalize ; \
+ \
+ (_rDA)= -rwMat03Det(_mBA, _mBB, _mBC, \
+ _mCA, _mCB, _mCC, \
+ _mDA, _mDB, _mDC) * normalize ; \
+ (_rDB)= rwMat03Det(_mAA, _mAB, _mAC, \
+ _mCA, _mCB, _mCC, \
+ _mDA, _mDB, _mDC) * normalize ; \
+ (_rDC)= -rwMat03Det(_mAA, _mAB, _mAC, \
+ _mBA, _mBB, _mBC, \
+ _mDA, _mDB, _mDC) * normalize ; \
+ (_rDD)= rwMat03Det(_mAA, _mAB, _mAC, \
+ _mBA, _mBB, _mBC, \
+ _mCA, _mCB, _mCC) * normalize ; \
+ } \
+} \
+MACRO_STOP
+
+
+/*--- Automatically derived from: C:/daily/rwsdk/driver/d3d8/drvmodel.h ---*/
+#ifndef D3D8_DRVMODEL_H
+#define D3D8_DRVMODEL_H
+
+#if (defined(__ICL))
+/* Avoid voluminous
+ * 'warning #344: typedef name has already been declared (with same type)'
+ * warnings from MS include files
+ */
+#pragma warning( disable : 344 )
+#endif /* (defined(__ICL)) */
+
+
+#if (defined(RWDEBUG))
+#if (defined(RWMEMDEBUG) && !defined(_CRTDBG_MAP_ALLOC))
+#define _CRTDBG_MAP_ALLOC
+#endif /* defined(RWMEMDEBUG) && !defined(_CRTDBG_MAP_ALLOC)) */
+#include <crtdbg.h>
+#define ERR_WRAP(A) (_rwRePrintErrorDDD3D((A), __FILE__, __LINE__))
+#endif /* (defined(RWDEBUG)) */
+
+#if (!defined(ERR_WRAP))
+#define ERR_WRAP(A) (A)
+#endif /* (!defined(ERR_WRAP)) */
+
+/****************************************************************************
+ Defines
+ */
+
+/* Set true depth information (for fogging, eg) */
+#define RwIm2DVertexSetCameraX(vert, camx) /* Nothing */
+#define RwIm2DVertexSetCameraY(vert, camy) /* Nothing */
+#define RwIm2DVertexSetCameraZ(vert, camz) /* Nothing */
+
+#define RwIm2DVertexSetRecipCameraZ(vert, recipz) ((vert)->rhw = recipz)
+
+#define RwIm2DVertexGetCameraX(vert) (cause an error)
+#define RwIm2DVertexGetCameraY(vert) (cause an error)
+#define RwIm2DVertexGetCameraZ(vert) (cause an error)
+#define RwIm2DVertexGetRecipCameraZ(vert) ((vert)->rhw)
+
+/* Set screen space coordinates in a device vertex */
+#define RwIm2DVertexSetScreenX(vert, scrnx) ((vert)->x = (scrnx))
+#define RwIm2DVertexSetScreenY(vert, scrny) ((vert)->y = (scrny))
+#define RwIm2DVertexSetScreenZ(vert, scrnz) ((vert)->z = (scrnz))
+#define RwIm2DVertexGetScreenX(vert) ((vert)->x)
+#define RwIm2DVertexGetScreenY(vert) ((vert)->y)
+#define RwIm2DVertexGetScreenZ(vert) ((vert)->z)
+
+/* Set texture coordinates in a device vertex */
+#define RwIm2DVertexSetU(vert, texU, recipz) ((vert)->u = (texU))
+#define RwIm2DVertexSetV(vert, texV, recipz) ((vert)->v = (texV))
+#define RwIm2DVertexGetU(vert) ((vert)->u)
+#define RwIm2DVertexGetV(vert) ((vert)->v)
+
+/* Modify the luminance stuff */
+#define RwIm2DVertexSetRealRGBA(vert, red, green, blue, alpha) \
+ ((vert)->emissiveColor = \
+ (((RwFastRealToUInt32(alpha)) << 24) | \
+ ((RwFastRealToUInt32(red)) << 16) | \
+ ((RwFastRealToUInt32(green)) << 8) | \
+ ((RwFastRealToUInt32(blue)))))
+
+#define RwIm2DVertexSetIntRGBA(vert, red, green, blue, alpha) \
+ ((vert)->emissiveColor = \
+ ((((RwUInt32)(alpha)) << 24) | \
+ (((RwUInt32)(red)) << 16) | \
+ (((RwUInt32)(green)) << 8) | \
+ (((RwUInt32)(blue)))))
+
+#define RwIm2DVertexGetRed(vert) \
+ (((vert)->emissiveColor >> 16) & 0xFF)
+
+#define RwIm2DVertexGetGreen(vert) \
+ (((vert)->emissiveColor >> 8) & 0xFF)
+
+#define RwIm2DVertexGetBlue(vert) \
+ ((vert)->emissiveColor & 0xFF)
+
+#define RwIm2DVertexGetAlpha(vert) \
+ (((vert)->emissiveColor >> 24) & 0xFF)
+
+#define RwIm2DVertexCopyRGBA(dst, src) \
+ ((dst)->emissiveColor = (src)->emissiveColor)
+
+/* Clipper stuff */
+
+#define RwIm2DVertexClipRGBA(o, i, n, f) \
+MACRO_START \
+{ \
+ const RwInt32 _factor = \
+ (RwFastRealToUInt32(i * (RwReal)(255))) & 255; \
+ \
+ (o)->emissiveColor = \
+ (((((RwIm2DVertexGetAlpha(f) - RwIm2DVertexGetAlpha(n)) * \
+ _factor) >> 8) + RwIm2DVertexGetAlpha(n)) << 24) | \
+ (((((RwIm2DVertexGetRed(f) - RwIm2DVertexGetRed(n)) * \
+ _factor) >> 8) + RwIm2DVertexGetRed(n)) << 16) | \
+ (((((RwIm2DVertexGetGreen(f) - RwIm2DVertexGetGreen(n)) * \
+ _factor) >> 8) + RwIm2DVertexGetGreen(n)) << 8) | \
+ (((((RwIm2DVertexGetBlue(f) - RwIm2DVertexGetBlue(n)) * \
+ _factor) >> 8) + RwIm2DVertexGetBlue(n))); \
+} \
+MACRO_STOP
+
+/****************************************************************************
+ Global Types
+ */
+
+/* We use RwD3D8Vertex to drive the hardware in 2D mode */
+
+/*
+ * D3D8 vertex structure definition for 2D geometry
+ */
+#if !defined(RWADOXYGENEXTERNAL)
+typedef struct RwD3D8Vertex RwD3D8Vertex;
+/**
+ * \ingroup rwcoredriverd3d8
+ * \struct RwD3D8Vertex
+ * D3D8 vertex structure definition for 2D geometry
+ */
+struct RwD3D8Vertex
+{
+ RwReal x; /**< Screen X */
+ RwReal y; /**< Screen Y */
+ RwReal z; /**< Screen Z */
+ RwReal rhw; /**< Reciprocal of homogeneous W */
+
+ RwUInt32 emissiveColor; /**< Vertex color */
+
+ RwReal u; /**< Texture coordinate U */
+ RwReal v; /**< Texture coordinate V */
+};
+#endif /* !defined(RWADOXYGENEXTERNAL) */
+
+/* Define types used */
+
+#if !defined(RWADOXYGENEXTERNAL)
+/**
+ * \ingroup rwcoredriverd3d8
+ * \ref RwIm2DVertex
+ * Typedef for a RenderWare Graphics Immediate Mode 2D Vertex
+ */
+typedef RwD3D8Vertex RwIm2DVertex;
+#endif /* !defined(RWADOXYGENEXTERNAL) */
+
+#if !defined(RWADOXYGENEXTERNAL)
+/**
+ * \ingroup rwcoredriverd3d8
+ * \ref RxVertexIndex
+ *
+ * Typedef for a RenderWare Graphics PowerPipe Immediate
+ * Mode Vertex
+ */
+typedef RwUInt16 RxVertexIndex;
+#endif /* !defined(RWADOXYGENEXTERNAL) */
+
+#if !defined(RWADOXYGENEXTERNAL)
+
+/**
+ * \ingroup rwcoredriverd3d8
+ * \ref RwImVertexIndex
+ * Typedef for a RenderWare Graphics Immediate Mode Vertex.
+ */
+typedef RxVertexIndex RwImVertexIndex;
+#endif /* !defined(RWADOXYGENEXTERNAL) */
+
+#if !defined(RWADOXYGENEXTERNAL)
+
+/**
+ * \ingroup rwcoredriverd3d8
+ * \struct RwD3D8Metrics
+ * Structure containing metrics counters
+ */
+typedef struct
+{
+ RwUInt32 numRenderStateChanges; /**< Number of Render States changed */
+ RwUInt32 numTextureStageStateChanges; /**< Number of Texture Stage States changed */
+ RwUInt32 numMaterialChanges; /**< Number of Material changes */
+ RwUInt32 numLightsChanged; /**< Number of Lights changed */
+ RwUInt32 numVBSwitches; /**< Number of Vertex Buffer switches */
+}
+RwD3D8Metrics;
+#endif /* !defined(RWADOXYGENEXTERNAL) */
+
+#endif /* D3D8_DRVMODEL_H */
+
+/*--- Automatically derived from: C:/daily/rwsdk/src/plcore/bavector.h ---*/
+
+/*
+ * Typedef for pointer to Vector multiplication by Matrix function
+ */
+
+typedef RwV3d *(*rwVectorMultFn) (RwV3d * pointsOut,
+ const RwV3d * pointsIn,
+ RwInt32 numPoints,
+ const RwMatrix * matrix);
+
+
+/* If sqrt is overloaded for this platform, we will remove
+ * all the sqrt table stuff from the build entirely
+ * currently applies to SKY2 and XBOX - IDBS [2/11/2001]
+ * [and, if using the intel compiler version 400 or above,
+ * we will use the single-precision float "sqrtf" under
+ * D3D8, OpenGL or SoftRas] */
+#if (defined(rwSqrtMacro))
+#define RWNOSQRTTABLE
+#endif /* (defined(rwSqrtMacro)) */
+#if (defined(rwInvSqrtMacro))
+#define RWNOINVSQRTTABLE
+#endif /* (defined(rwSqrtMacro)) */
+
+#if (!defined(rwSqrtMacro))
+#define rwSqrtMacro(_root, _input) \
+ ( *(_root) = _rwSqrt(_input) )
+#endif /* (!defined(rwSqrtMacro)) */
+
+#if (!defined(rwInvSqrtMacro))
+#define rwInvSqrtMacro(_recip, _input) \
+ ( *(_recip) = _rwInvSqrt(_input) )
+#endif /* (!defined(rwInvSqrtMacro)) */
+
+#if (!defined(rwSqrtInvSqrtMacro))
+#define rwSqrtInvSqrtMacro(_root, _recip, _input) \
+MACRO_START \
+{ \
+ RwReal _tmp = _input; \
+ rwSqrt((_root), _tmp); \
+ rwInvSqrt((_recip), _tmp); \
+} \
+MACRO_STOP
+#endif /* (!defined(rwSqrtInvSqrtMacro)) */
+
+/* Vector operations Macros */
+
+#if (!defined(RwV2dAssignMacro))
+#define RwV2dAssignMacro(_target, _source) \
+ ( *(_target) = *(_source) )
+#endif /* (!defined(RwV2dAssignMacro)) */
+
+#define RwV2dAddMacro(o, a, b) \
+MACRO_START \
+{ \
+ (o)->x = (((a)->x) + ( (b)->x)); \
+ (o)->y = (((a)->y) + ( (b)->y)); \
+} \
+MACRO_STOP
+
+#define RwV2dSubMacro(o, a, b) \
+MACRO_START \
+{ \
+ (o)->x = (((a)->x) - ( (b)->x)); \
+ (o)->y = (((a)->y) - ( (b)->y)); \
+} \
+MACRO_STOP
+
+#define RwV2dScaleMacro(o, i, s) \
+MACRO_START \
+{ \
+ (o)->x = (((i)->x) * ( (s))); \
+ (o)->y = (((i)->y) * ( (s))); \
+} \
+MACRO_STOP
+
+#define RwV2dDotProductMacro(a,b) \
+ (( ((((a)->x) * ( (b)->x))) + \
+ ( (((a)->y) * ( (b)->y)))))
+
+#define _rwV2dNormalizeMacro(_result, _out, _in) \
+MACRO_START \
+{ \
+ RwReal length2 = RwV2dDotProductMacro((_in), (_in)); \
+ rwInvSqrtMacro(&(_result), length2); \
+ RwV2dScaleMacro((_out), (_in), (_result)); \
+} \
+MACRO_STOP
+
+#define RwV2dNormalizeMacro(_result, _out, _in) \
+MACRO_START \
+{ \
+ RwReal length2 = RwV2dDotProductMacro((_in), (_in)); \
+ RwReal recip; \
+ \
+ rwSqrtInvSqrtMacro(&(_result), &recip, length2); \
+ RwV2dScaleMacro((_out), (_in), recip); \
+} \
+MACRO_STOP
+
+#define RwV2dLengthMacro(_result, _in) \
+MACRO_START \
+{ \
+ (_result) = RwV2dDotProductMacro(_in, _in); \
+ rwSqrtMacro(&(_result), (_result)); \
+} \
+MACRO_STOP
+
+#define RwV2dLineNormalMacro(_o, _a, _b) \
+MACRO_START \
+{ \
+ RwReal recip; \
+ \
+ (_o)->y = (((_b)->x) - ( (_a)->x)); \
+ (_o)->x = (((_a)->y) - ( (_b)->y)); \
+ _rwV2dNormalizeMacro(recip, _o,_o); \
+} \
+MACRO_STOP
+
+#define RwV2dPerpMacro(o, a) \
+MACRO_START \
+{ \
+ (o)->x = -(a)->y; \
+ (o)->y = (a)->x; \
+} \
+MACRO_STOP
+
+/* RwV3d */
+
+#if (!defined(RwV3dAssignMacro))
+#define RwV3dAssignMacro(_target, _source) \
+ ( *(_target) = *(_source) )
+#endif /* (!defined(RwV3dAssignMacro)) */
+
+
+#define RwV3dAddMacro(o, a, b) \
+MACRO_START \
+{ \
+ (o)->x = (((a)->x) + ( (b)->x)); \
+ (o)->y = (((a)->y) + ( (b)->y)); \
+ (o)->z = (((a)->z) + ( (b)->z)); \
+} \
+MACRO_STOP
+
+#define RwV3dSubMacro(o, a, b) \
+MACRO_START \
+{ \
+ (o)->x = (((a)->x) - ( (b)->x)); \
+ (o)->y = (((a)->y) - ( (b)->y)); \
+ (o)->z = (((a)->z) - ( (b)->z)); \
+} \
+MACRO_STOP
+
+#define RwV3dScaleMacro(o, a, s) \
+MACRO_START \
+{ \
+ (o)->x = (((a)->x) * ( (s))); \
+ (o)->y = (((a)->y) * ( (s))); \
+ (o)->z = (((a)->z) * ( (s))); \
+} \
+MACRO_STOP
+
+#define RwV3dIncrementScaledMacro(o, a, s) \
+MACRO_START \
+{ \
+ (o)->x += (((a)->x) * ( (s))); \
+ (o)->y += (((a)->y) * ( (s))); \
+ (o)->z += (((a)->z) * ( (s))); \
+} \
+MACRO_STOP
+
+#define RwV3dNegateMacro(o, a) \
+MACRO_START \
+{ \
+ (o)->x = -(a)->x; \
+ (o)->y = -(a)->y; \
+ (o)->z = -(a)->z; \
+} \
+MACRO_STOP
+
+#define RwV3dDotProductMacro(a, b) \
+ ((((( (((a)->x) * ((b)->x))) + \
+ ( (((a)->y) * ((b)->y))))) + \
+ ( (((a)->z) * ((b)->z)))))
+
+#define RwV3dCrossProductMacro(o, a, b) \
+MACRO_START \
+{ \
+ (o)->x = \
+ (( (((a)->y) * ( (b)->z))) - \
+ ( (((a)->z) * ( (b)->y)))); \
+ (o)->y = \
+ (( (((a)->z) * ( (b)->x))) - \
+ ( (((a)->x) * ( (b)->z)))); \
+ (o)->z = \
+ (( (((a)->x) * ( (b)->y))) - \
+ ( (((a)->y) * ( (b)->x)))); \
+} \
+MACRO_STOP
+
+#define _rwV3dNormalizeMacro(_result, _out, _in) \
+MACRO_START \
+{ \
+ RwReal length2 = RwV3dDotProductMacro(_in, _in); \
+ rwInvSqrtMacro(&(_result), length2); \
+ RwV3dScaleMacro(_out, _in, _result); \
+} \
+MACRO_STOP
+
+#define RwV3dNormalizeMacro(_result, _out, _in) \
+MACRO_START \
+{ \
+ RwReal length2 = RwV3dDotProductMacro((_in), (_in)); \
+ RwReal recip; \
+ \
+ rwSqrtInvSqrtMacro(&(_result), &recip, length2); \
+ RwV3dScaleMacro((_out), (_in), recip); \
+} \
+MACRO_STOP
+
+#define RwV3dLengthMacro(_result, _in) \
+MACRO_START \
+{ \
+ (_result) = RwV3dDotProductMacro(_in, _in); \
+ rwSqrtMacro(&(_result), _result); \
+} \
+MACRO_STOP
+
+#if (! ( defined(RWDEBUG) || defined(RWSUPPRESSINLINE) ))
+
+#define RwV2dAssign(o, a) RwV2dAssignMacro(o, a)
+#define RwV2dAdd(o, a, b) RwV2dAddMacro(o, a, b)
+#define RwV2dSub(o, a, b) RwV2dSubMacro(o, a, b)
+#define RwV2dLineNormal(_o, _a, _b) RwV2dLineNormalMacro(_o, _a, _b)
+#define RwV2dScale(o, i, s) RwV2dScaleMacro(o, i, s)
+#define RwV2dDotProduct(a,b) RwV2dDotProductMacro(a,b)
+#define RwV2dPerp(o, a) RwV2dPerpMacro(o, a)
+#define RwV3dAssign(o, a) RwV3dAssignMacro(o, a)
+#define RwV3dAdd(o, a, b) RwV3dAddMacro(o, a, b)
+#define RwV3dSub(o, a, b) RwV3dSubMacro(o, a, b)
+#define RwV3dScale(o, a, s) RwV3dScaleMacro(o, a, s)
+#define RwV3dIncrementScaled(o, a, s) RwV3dIncrementScaledMacro(o, a, s)
+#define RwV3dNegate(o, a) RwV3dNegateMacro(o, a)
+#define RwV3dDotProduct(a, b) RwV3dDotProductMacro(a, b)
+#define RwV3dCrossProduct(o, a, b) RwV3dCrossProductMacro(o, a, b)
+
+#endif /* (! ( defined(RWDEBUG) || defined(RWSUPPRESSINLINE) )) */
+
+#define RWRAD2DEG(_x) ((_x) * (((RwReal)180)/(rwPI)))
+
+#if (!defined(rw4OVERPISQ))
+#define rw4OVERPISQ ( ((RwReal)4) / ( rwPI * rwPI ))
+#endif /* (!defined(rw4OVERPISQ)) */
+
+#if (!defined(rwPI3))
+#define rwPI3 (rwPI * (RwReal)3)
+#endif /* (!defined(rwPI3)) */
+
+#if (!defined(rwPI3OVER2))
+#define rwPI3OVER2 ( rwPI3 / (RwReal)2 )
+#endif /* (!defined(rwPI3OVER2)) */
+
+#if (!defined(rwPI3OVER8))
+#define rwPI3OVER8 (rwPI3 / (RwReal)8 )
+#endif /* (!defined(rwPI3OVER8)) */
+
+#define RwQuadSin(_x) \
+ ( rw4OVERPISQ * \
+ ( ( (_x) < 0 ) ? \
+ ( ( rwPI + (_x) ) * (_x) ) : \
+ ( ( rwPI - (_x) ) * (_x) ) ) )
+
+#define RwQuadASin(_result, _s) \
+ ( rwPIOVER2 * ( ((_s)<0) ? \
+ ( rwSqrtMacro((_result), 1.0f + (_s)) - 1 ) : \
+ ( 1 - rwSqrtMacro((_result), 1.0f - (_s)) ) ) )
+
+#define RwQuadCos(_x) \
+ ( rw4OVERPISQ * \
+ ( ( (_x) < -rwPIOVER2 ) ? \
+ ( ( -rwPI3OVER2 - (_x) ) * ( -rwPIOVER2 - (_x) ) ) : \
+ ( ( (_x) < rwPIOVER2) ? \
+ ( ( rwPIOVER2 + (_x) ) * ( rwPIOVER2 - (_x) ) ) : \
+ ( ( rwPIOVER2 - (_x) ) * ( rwPI3OVER2 - (_x) ) ) ) ) )
+
+#define RwQuadACos(_result, _c) \
+ ( rwPIOVER2 * ( ((_c)<0) ? \
+ (2.0f - rwSqrtMacro((_result), 1.0f + (_c))): \
+ rwSqrtMacro((_result), 1.0f - (_c))) )
+
+#define RwQuadTan(_x) \
+ ( rwPI3 * (_x) / ( rwPI * rwPI - (_x) * (_x) * 4.0f ) )
+
+#define RwQuadATan(_result, _t) \
+ ( ( rwSqrtMacro((_result), (rwPI3OVER8 * rwPI3OVER8) + \
+ (_t) * (_t) * (rwPIOVER2 * rwPIOVER2) ) - rwPI3OVER8 ) \
+ / ( _t) )
+
+#define RwQuadATan2(_result, _s, _c) \
+ ( ( rwSqrtMacro((_result), (_c) * (_c) * (rwPI3OVER8 * rwPI3OVER8) + \
+ (_s) * (_s) * (rwPIOVER2 * rwPIOVER2) ) \
+ - (_c) * rwPI3OVER8 ) / ( _s) )
+
+/****************************************************************************
+ Function prototypes
+ */
+
+#ifdef __cplusplus
+extern "C"
+{
+#endif /* __cplusplus */
+
+/* Other useful stuff */
+
+extern RwReal RwV3dNormalize(RwV3d * out, const RwV3d * in);
+extern RwReal RwV3dLength(const RwV3d * in);
+
+extern RwReal RwV2dLength(const RwV2d * in);
+extern RwReal RwV2dNormalize(RwV2d * out, const RwV2d * in);
+
+#if ( defined(RWDEBUG) || defined(RWSUPPRESSINLINE) )
+
+extern void RwV2dAssign(RwV2d * out,
+ const RwV2d * ina);
+extern void RwV2dAdd(RwV2d * out,
+ const RwV2d * ina, const RwV2d * inb);
+extern void RwV2dLineNormal(RwV2d * out,
+ const RwV2d * ina, const RwV2d * inb);
+extern void RwV2dSub(RwV2d * out,
+ const RwV2d * ina, const RwV2d * inb);
+extern void RwV2dPerp(RwV2d * out, const RwV2d * in);
+extern void RwV2dScale(RwV2d * out,
+ const RwV2d * in, RwReal scalar);
+extern RwReal RwV2dDotProduct(const RwV2d * ina, const RwV2d * inb);
+
+extern void RwV3dAssign(RwV3d * out,
+ const RwV3d * ina);
+extern void RwV3dAdd(RwV3d * out,
+ const RwV3d * ina, const RwV3d * inb);
+extern void RwV3dSub(RwV3d * out,
+ const RwV3d * ina, const RwV3d * inb);
+extern void RwV3dScale(RwV3d * out,
+ const RwV3d * in, RwReal scalar);
+extern void RwV3dIncrementScaled(RwV3d * out,
+ const RwV3d * in, RwReal scalar);
+extern void RwV3dNegate(RwV3d * out, const RwV3d * in);
+extern RwReal RwV3dDotProduct(const RwV3d * ina, const RwV3d * inb);
+extern void RwV3dCrossProduct(RwV3d * out,
+ const RwV3d * ina, const RwV3d * inb);
+
+#endif /* ( defined(RWDEBUG) || defined(RWSUPPRESSINLINE) ) */
+
+/* Transform points/vectors */
+extern RwV3d *RwV3dTransformPoints(RwV3d * pointsOut,
+ const RwV3d * pointsIn,
+ RwInt32 numPoints,
+ const RwMatrix * matrix);
+extern RwV3d *RwV3dTransformVectors(RwV3d * vectorsOut,
+ const RwV3d * vectorsIn,
+ RwInt32 numPoints,
+ const RwMatrix * matrix);
+
+/* SPI */
+
+#if (!defined(RWNOSQRTTABLE))
+extern RwReal _rwSqrt(const RwReal num);
+#endif /* (!defined(RWNOSQRTTABLE)) */
+#if (!defined(RWNOINVSQRTTABLE))
+extern RwReal _rwInvSqrt(const RwReal num);
+#endif /* (!defined(RWNOINVSQRTTABLE)) */
+
+extern RwReal _rwV3dNormalize(RwV3d * out, const RwV3d * in);
+
+#ifdef __cplusplus
+}
+#endif /* __cplusplus */
+
+#define rwVectorOpen(instance, offset, size) \
+ _rwVectorOpen(instance, offset, size)
+
+#define rwVectorClose(instance, offset, size) \
+ _rwVectorClose(instance, offset, size)
+
+#define rwVectorSetMultFn(multPoint,multVector) \
+ _rwVectorSetMultFn(multPoint,multVector)
+
+
+/*--- Automatically derived from: C:/daily/rwsdk/src/plcore/balist.h ---*/
+/****************************************************************************
+ Global Types
+ */
+
+typedef struct RwSList RwSList;
+
+#if (!defined(DOXYGEN))
+struct RwSList
+{
+ RwUInt8 *listElements;
+ RwInt32 numElementsFilled;
+ RwInt32 numElementsAlloced;
+ RwInt32 entrySize;
+};
+#endif /* (!defined(DOXYGEN) */
+
+
+/****************************************************************************
+ Function prototypes
+ */
+
+#ifdef __cplusplus
+extern "C"
+{
+#endif /* __cplusplus */
+
+/* SList functions */
+extern RwSList *_rwSListCreate(RwInt32 size);
+extern RwBool _rwSListDestroy(RwSList *sList);
+extern RwBool _rwSListDestroyArray(RwUInt8 *array);
+extern void _rwSListDestroyEndEntries(RwSList *sList, RwInt32 amount);
+extern RwBool _rwSListDestroyEntry(RwSList *sList, RwInt32 entry);
+extern void _rwSListEmpty(RwSList *sList);
+extern void *_rwSListGetArray(RwSList *sList);
+extern void *_rwSListGetEntry(RwSList *sList, RwInt32 entry);
+extern void *_rwSListGetNewEntry(RwSList *sList);
+extern void *_rwSListGetNewEntries(RwSList *sList, RwInt32 entry);
+extern RwInt32 _rwSListGetNumEntries(const RwSList *sList);
+extern RwBool _rwSListReleaseArray(RwSList *sList);
+extern void *_rwSListToArray(RwSList *sList);
+
+
+#ifdef __cplusplus
+}
+#endif /* __cplusplus */
+
+/* Comparibility macros */
+
+#define rwSListCreate(size) \
+ _rwSListCreate(size)
+#define rwSListDestroy(sList) \
+ _rwSListDestroy(sList)
+#define rwSListDestroyArray(array) \
+ _rwSListDestroyArray(array)
+#define rwSListDestroyEndEntries(sList, amount) \
+ _rwSListDestroyEndEntries(sList, amount)
+#define rwSListDestroyEntry(sList, entry) \
+ _rwSListDestroyEntry(sList, entry)
+#define rwSListEmpty(sList) \
+ _rwSListEmpty(sList)
+#define rwSListGetArray(sList) \
+ _rwSListGetArray(sList)
+#define rwSListGetEntry(sList, entry) \
+ _rwSListGetEntry(sList, entry)
+#define rwSListGetNewEntry(sList) \
+ _rwSListGetNewEntry(sList)
+#define rwSListGetNewEntries(sList, entry) \
+ _rwSListGetNewEntries(sList, entry)
+#define rwSListGetNumEntries(sList) \
+ _rwSListGetNumEntries(sList)
+#define rwSListReleaseArray(sList) \
+ _rwSListReleaseArray(sList)
+#define rwSListToArray(sList) \
+ _rwSListToArray(sList)
+
+
+/*--- Automatically derived from: C:/daily/rwsdk/src/plcore/baimmedi.h ---*/
+
+/****************************************************************************
+ Defines
+ */
+
+
+/* !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+
+ Immediate mode interface V2.0
+
+ !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! */
+
+#ifndef RWADOXYGENEXTERNAL
+/**
+ * \ingroup rwrenderstate
+ * RwRenderState represents the global state variables that control
+ * rendering. These may be set and queried using the
+ * \ref RwRenderStateSet and \ref RwRenderStateGet functions respectively.
+ *
+ * Refer to the \ref rwrenderstateoverview for an overview of this system.
+ *
+ * \note The texture render states (raster, address & filter modes) would
+ * normally just be used when rendering in immediate mode and should be
+ * specificied completely every time a texture is used. Retained mode
+ * pipelines will frequently set theses states internally, usually based on
+ * \ref RwTexture objects.
+ */
+#endif /* RWADOXYGENEXTERNAL */
+enum RwRenderState
+{
+ rwRENDERSTATENARENDERSTATE = 0,
+
+ rwRENDERSTATETEXTURERASTER,
+ /**<Raster used for texturing (normally used in immediate mode).
+ * The value is a pointer to an \ref RwRaster.
+ */
+ rwRENDERSTATETEXTUREADDRESS,
+ /**<\ref RwTextureAddressMode: wrap, clamp, mirror or border.
+ */
+ rwRENDERSTATETEXTUREADDRESSU,
+ /**<\ref RwTextureAddressMode in u only.
+ */
+ rwRENDERSTATETEXTUREADDRESSV,
+ /**<\ref RwTextureAddressMode in v only.
+ */
+ rwRENDERSTATETEXTUREPERSPECTIVE,
+ /**<Perspective correction on/off (always enabled on many platforms).
+ */
+ rwRENDERSTATEZTESTENABLE,
+ /**<Z-buffer test on/off.
+ */
+ rwRENDERSTATESHADEMODE,
+ /**<\ref RwShadeMode: flat or gouraud shading.
+ */
+ rwRENDERSTATEZWRITEENABLE,
+ /**<Z-buffer write on/off.
+ */
+ rwRENDERSTATETEXTUREFILTER,
+ /**<\ref RwTextureFilterMode: point sample, bilinear, trilinear, etc.
+ */
+ rwRENDERSTATESRCBLEND,
+ /**<\ref RwBlendFunction used to modulate the source pixel color
+ * when blending to the frame buffer.
+ */
+ rwRENDERSTATEDESTBLEND,
+ /**<\ref RwBlendFunction used to modulate the destination pixel
+ * color in the frame buffer when blending. The resulting pixel
+ * color is given by the formula
+ * (SRCBLEND * srcColor + DESTBLEND * destColor) for each RGB
+ * component. For a particular platform, not all combinations
+ * of blend function are allowed (see platform specific
+ * restrictions).
+ */
+ rwRENDERSTATEVERTEXALPHAENABLE,
+ /**<Alpha blending on/off (always enabled on some platforms).
+ * This is normally used in immediate mode to enable alpha blending
+ * when vertex colors or texture rasters have transparency. Retained
+ * mode pipelines will usually set this state based on material colors
+ * and textures.
+ */
+ rwRENDERSTATEBORDERCOLOR,
+ /**<Border color for \ref RwTextureAddressMode
+ * \ref rwTEXTUREADDRESSBORDER. The value should be a packed
+ * RwUInt32 in a platform specific format. The macro
+ * RWRGBALONG(r, g, b, a) may be used to construct this using
+ * 8-bit color components.
+ */
+ rwRENDERSTATEFOGENABLE,
+ /**<Fogging on/off (all polygons will be fogged).
+ */
+ rwRENDERSTATEFOGCOLOR,
+ /**<Color used for fogging. The value should be a packed RwUInt32
+ * in a platform specific format. The macro RWRGBALONG(r, g, b, a)
+ * may be used to construct this using 8-bit color components.
+ */
+ rwRENDERSTATEFOGTYPE,
+ /**<\ref RwFogType, the type of fogging to use.
+ */
+ rwRENDERSTATEFOGDENSITY,
+ /**<Fog density for \ref RwFogType of
+ * \ref rwFOGTYPEEXPONENTIAL or \ref rwFOGTYPEEXPONENTIAL2.
+ * The value should be a pointer to an RwReal in the
+ * range 0 to 1.
+ */
+ rwRENDERSTATECULLMODE = 20,
+ /**<\ref RwCullMode, for selecting front/back face culling, or
+ * no culling.
+ */
+ rwRENDERSTATESTENCILENABLE,
+ /**<Stenciling on/off.
+ * <i> Supported on Xbox, D3D8, and OpenGL only. </i>
+ */
+ rwRENDERSTATESTENCILFAIL,
+ /**<\ref RwStencilOperation used when the stencil test passes.
+ * <i> Supported on Xbox, D3D8, and OpenGL only. </i>
+ */
+ rwRENDERSTATESTENCILZFAIL,
+ /**<\ref RwStencilOperation used when the stencil test passes and
+ * the depth test (z-test) fails.
+ * <i> Supported on Xbox, D3D8, and OpenGL only. </i>
+ */
+ rwRENDERSTATESTENCILPASS,
+ /**<Stencil operation used when both the stencil and the depth
+ * (z) tests pass.
+ * <i> Supported on Xbox, D3D8, and OpenGL only. </i>
+ */
+ rwRENDERSTATESTENCILFUNCTION,
+ /**<\ref RwStencilFunction for the stencil test.
+ * <i> Supported on Xbox, D3D8, and OpenGL only. </i>
+ */
+ rwRENDERSTATESTENCILFUNCTIONREF,
+ /**<Integer reference value for the stencil test.
+ * <i> Supported on Xbox, D3D8, and OpenGL only. </i>
+ */
+ rwRENDERSTATESTENCILFUNCTIONMASK,
+ /**<Mask applied to the reference value and each stencil buffer
+ * entry to determine the significant bits for the stencil test.
+ * <i> Supported on Xbox, D3D8, and OpenGL only. </i>
+ */
+ rwRENDERSTATESTENCILFUNCTIONWRITEMASK,
+ /**<Write mask applied to values written into the stencil buffer.
+ * <i> Supported on Xbox, D3D8, and OpenGL only. </i>
+ */
+
+ rwRENDERSTATEFORCEENUMSIZEINT = RWFORCEENUMSIZEINT
+};
+typedef enum RwRenderState RwRenderState;
+
+#ifndef RWADOXYGENEXTERNAL
+/**
+ * \ingroup rwrenderstate
+ * RwShadeMode represents the available shading modes that may be
+ * set using the \ref RwRenderState \ref rwRENDERSTATESHADEMODE.
+ */
+#endif /* RWADOXYGENEXTERNAL */
+enum RwShadeMode
+{
+ rwSHADEMODENASHADEMODE = 0,
+ rwSHADEMODEFLAT, /**<Flat shading */
+ rwSHADEMODEGOURAUD, /**<Gouraud shading */
+ rwSHADEMODEFORCEENUMSIZEINT = RWFORCEENUMSIZEINT
+};
+typedef enum RwShadeMode RwShadeMode;
+
+#ifndef RWADOXYGENEXTERNAL
+/**
+ * \ingroup rwrenderstate
+ * RwTextureFilterMode represents the texture filtering modes that may
+ * be set using the \ref RwRenderState \ref rwRENDERSTATETEXTUREFILTER in
+ * immediate mode, or \ref RwTextureSetFilterMode in retained mode.
+ */
+#endif /* RWADOXYGENEXTERNAL */
+enum RwTextureFilterMode
+{
+ rwFILTERNAFILTERMODE = 0,
+ rwFILTERNEAREST, /**<Point sampled */
+ rwFILTERLINEAR, /**<Bilinear */
+ rwFILTERMIPNEAREST, /**<Point sampled per pixel mip map */
+ rwFILTERMIPLINEAR, /**<Bilinear per pixel mipmap */
+ rwFILTERLINEARMIPNEAREST, /**<MipMap interp point sampled */
+ rwFILTERLINEARMIPLINEAR, /**<Trilinear */
+ rwTEXTUREFILTERMODEFORCEENUMSIZEINT = RWFORCEENUMSIZEINT
+};
+typedef enum RwTextureFilterMode RwTextureFilterMode;
+
+#ifndef RWADOXYGENEXTERNAL
+/**
+ * \ingroup rwrenderstate
+ * RwFogType represents the fog modes available when setting the
+ * \ref RwRenderState \ref rwRENDERSTATEFOGTYPE. Note that a particular
+ * platform may not support all of these modes (see platform specific
+ * restrictions).
+ */
+#endif /* RWADOXYGENEXTERNAL */
+enum RwFogType
+{
+ rwFOGTYPENAFOGTYPE = 0,
+ rwFOGTYPELINEAR, /**<Linear fog */
+ rwFOGTYPEEXPONENTIAL, /**<Exponential fog */
+ rwFOGTYPEEXPONENTIAL2, /**<Exponential^2 fog */
+ rwFOGTYPEFORCEENUMSIZEINT = RWFORCEENUMSIZEINT
+};
+typedef enum RwFogType RwFogType;
+
+#ifndef RWADOXYGENEXTERNAL
+/**
+ * \ingroup rwrenderstate
+ * RwBlendFunction represents the options available when changing the
+ * \ref RwRenderState setting for \ref rwRENDERSTATESRCBLEND and
+ * \ref rwRENDERSTATEDESTBLEND. The values are factors used to modulate
+ * either the source or destination pixel color when blending to
+ * the frame buffer. Note the some combinations are not allowed on
+ * certain platforms (see platform specific restrictions).
+ *
+ * In the following list, the factors applied to each color component are
+ * listed explicitly. A subscript s refers to a source value while a subscript
+ * d refers to a destination value. Note that blending in the alpha channel is
+ * only applicable when the frame buffer actually contains alpha, and that
+ * the precise operation is platform specific. For instance, the
+ * source alpha value might simply be written to the alpha channel with
+ * no blending.
+ */
+#endif /* RWADOXYGENEXTERNAL */
+enum RwBlendFunction
+{
+ rwBLENDNABLEND = 0,
+ rwBLENDZERO, /**<(0, 0, 0, 0 ) */
+ rwBLENDONE, /**<(1, 1, 1, 1 ) */
+ rwBLENDSRCCOLOR, /**<(Rs, Gs, Bs, As ) */
+ rwBLENDINVSRCCOLOR, /**<(1-Rs, 1-Gs, 1-Bs, 1-As) */
+ rwBLENDSRCALPHA, /**<(As, As, As, As ) */
+ rwBLENDINVSRCALPHA, /**<(1-As, 1-As, 1-As, 1-As) */
+ rwBLENDDESTALPHA, /**<(Ad, Ad, Ad, Ad ) */
+ rwBLENDINVDESTALPHA, /**<(1-Ad, 1-Ad, 1-Ad, 1-Ad) */
+ rwBLENDDESTCOLOR, /**<(Rd, Gd, Bd, Ad ) */
+ rwBLENDINVDESTCOLOR, /**<(1-Rd, 1-Gd, 1-Bd, 1-Ad) */
+ rwBLENDSRCALPHASAT, /**<(f, f, f, 1 ) f = min (As, 1-Ad) */
+ rwBLENDFUNCTIONFORCEENUMSIZEINT = RWFORCEENUMSIZEINT
+};
+typedef enum RwBlendFunction RwBlendFunction;
+
+#ifndef RWADOXYGENEXTERNAL
+/**
+ * \ingroup rwrenderstate
+ * RwTextureAddressMode represents the addressing modes available
+ * when mapping textures to polygons using UV texture coordinates.
+ * This may be set in immediate mode via the \ref RwRenderState
+ * \ref rwRENDERSTATETEXTUREADDRESS, or via \ref RwTextureSetAddressing
+ * for an \ref RwTexture object.
+ */
+#endif /* RWADOXYGENEXTERNAL */
+enum RwTextureAddressMode
+{
+ rwTEXTUREADDRESSNATEXTUREADDRESS = 0,
+ rwTEXTUREADDRESSWRAP, /**<UV wraps (tiles) */
+ rwTEXTUREADDRESSMIRROR, /**<Alternate UV is flipped */
+ rwTEXTUREADDRESSCLAMP, /**<UV is clamped to 0-1 */
+ rwTEXTUREADDRESSBORDER, /**<Border color takes effect outside of 0-1 */
+ rwTEXTUREADDRESSMODEFORCEENUMSIZEINT = RWFORCEENUMSIZEINT
+};
+typedef enum RwTextureAddressMode RwTextureAddressMode;
+
+#ifndef RWADOXYGENEXTERNAL
+/**
+ * \ingroup rwrenderstate
+ * RwStencilOperation represents the stencil operations that may be
+ * performed depending on the results of stencil/z-buffer tests.
+ * The operation may be set for the various tests
+ * via the \ref RwRenderState settings \ref rwRENDERSTATESTENCILFAIL,
+ * \ref rwRENDERSTATESTENCILZFAIL and \ref rwRENDERSTATESTENCILPASS.
+ */
+#endif /* RWADOXYGENEXTERNAL */
+enum RwStencilOperation
+{
+ rwSTENCILOPERATIONNASTENCILOPERATION = 0,
+
+ rwSTENCILOPERATIONKEEP,
+ /**<Do not update the entry in the stencil buffer */
+ rwSTENCILOPERATIONZERO,
+ /**<Set the stencil-buffer entry to 0 */
+ rwSTENCILOPERATIONREPLACE,
+ /**<Replace the stencil-buffer entry with reference value */
+ rwSTENCILOPERATIONINCRSAT,
+ /**<Increment the stencil-buffer entry, clamping to the
+ * maximum value */
+ rwSTENCILOPERATIONDECRSAT,
+ /**<Decrement the stencil-buffer entry, clamping to zero */
+ rwSTENCILOPERATIONINVERT,
+ /**<Invert the bits in the stencil-buffer entry */
+ rwSTENCILOPERATIONINCR,
+ /**<Increment the stencil-buffer entry, wrapping to zero if
+ * the new value exceeds the maximum value */
+ rwSTENCILOPERATIONDECR,
+ /**<Decrement the stencil-buffer entry, wrapping to the maximum
+ * value if the new value is less than zero */
+
+ rwSTENCILOPERATIONFORCEENUMSIZEINT = RWFORCEENUMSIZEINT
+};
+typedef enum RwStencilOperation RwStencilOperation;
+
+#ifndef RWADOXYGENEXTERNAL
+/**
+ * \ingroup rwrenderstate
+ * RwStencilFunction represents the comparison functions available for
+ * a stencil test. The function may be selected via the
+ * \ref RwRenderState setting \ref rwRENDERSTATESTENCILFUNCTION.
+ */
+#endif /* RWADOXYGENEXTERNAL */
+enum RwStencilFunction
+{
+ rwSTENCILFUNCTIONNASTENCILFUNCTION = 0,
+
+ rwSTENCILFUNCTIONNEVER,
+ /**<Always fail the test */
+ rwSTENCILFUNCTIONLESS,
+ /**<Accept the new pixel if its value is less than the value of
+ * the current pixel */
+ rwSTENCILFUNCTIONEQUAL,
+ /**<Accept the new pixel if its value equals the value of the
+ * current pixel */
+ rwSTENCILFUNCTIONLESSEQUAL,
+ /**<Accept the new pixel if its value is less than or equal to
+ * the value of the current pixel */
+ rwSTENCILFUNCTIONGREATER,
+ /**<Accept the new pixel if its value is greater than the value
+ * of the current pixel */
+ rwSTENCILFUNCTIONNOTEQUAL,
+ /**<Accept the new pixel if its value does not equal the value of
+ * the current pixel */
+ rwSTENCILFUNCTIONGREATEREQUAL,
+ /**<Accept the new pixel if its value is greater than or equal
+ * to the value of the current pixel */
+ rwSTENCILFUNCTIONALWAYS,
+ /**<Always pass the test */
+
+ rwSTENCILFUNCTIONFORCEENUMSIZEINT = RWFORCEENUMSIZEINT
+};
+typedef enum RwStencilFunction RwStencilFunction;
+
+#ifndef RWADOXYGENEXTERNAL
+/**
+ * \ingroup rwrenderstate
+ * RwCullMode represents the options available for culling polygons
+ * during rendering. The cull mode may be set via the \ref RwRenderState
+ * setting \ref rwRENDERSTATECULLMODE.
+ */
+#endif /* RWADOXYGENEXTERNAL */
+enum RwCullMode
+{
+ rwCULLMODENACULLMODE = 0,
+
+ rwCULLMODECULLNONE,
+ /**<Both front and back-facing triangles are drawn. */
+ rwCULLMODECULLBACK,
+ /**<Only front-facing triangles are drawn */
+ rwCULLMODECULLFRONT,
+ /**<Only back-facing triangles are drawn */
+
+ rwCULLMODEFORCEENUMSIZEINT = RWFORCEENUMSIZEINT
+};
+typedef enum RwCullMode RwCullMode;
+
+#ifndef RWADOXYGENEXTERNAL
+/**
+ * \ingroup immediatemodedatatypes
+ * RwPrimitiveType
+ * This type represents the different types of indexed
+ * line and indexed triangle primitives that are available when rendering 2D
+ * and 3D immediate mode objects (see API functions \ref RwIm2DRenderIndexedPrimitive,
+ * \ref RwIm2DRenderPrimitive, \ref RwIm3DRenderIndexedPrimitive and \ref RwIm3DRenderPrimitive).
+ * Indices are into a vertex list and must be defined in a counter-clockwise order
+ * (as seen from the camera) to be visible.
+ */
+#endif /* RWADOXYGENEXTERNAL */
+enum RwPrimitiveType
+{
+ rwPRIMTYPENAPRIMTYPE = 0, /**<Invalid primative type */
+ rwPRIMTYPELINELIST = 1, /**<Unconnected line segments, each line is specified by
+ * both its start and end index, independently of other lines
+ * (for example, 3 segments specified as 0-1, 2-3, 4-5) */
+ rwPRIMTYPEPOLYLINE = 2, /**<Connected line segments, each line's start index
+ * (except the first) is specified by the index of the end of
+ * the previous segment (for example, 3 segments specified as
+ * 0-1, 1-2, 2-3) */
+ rwPRIMTYPETRILIST = 3, /**<Unconnected triangles: each triangle is specified by
+ * three indices, independently of other triangles (for example,
+ * 3 triangles specified as 0-1-2, 3-4-5, 6-7-8) */
+ rwPRIMTYPETRISTRIP = 4, /**<Connected triangles sharing an edge with, at most, one
+ * other forming a series (for example, 3 triangles specified
+ * as 0-2-1, 1-2-3-, 2-4-3) */
+ rwPRIMTYPETRIFAN = 5 , /**<Connected triangles sharing an edge with, at most,
+ * two others forming a fan (for example, 3 triangles specified
+ * as 0-2-1, 0-3-2, 0-4-3) */
+ rwPRIMTYPEPOINTLIST = 6, /**<Points 1, 2, 3, etc. This is not
+ * supported by the default RenderWare
+ * immediate or retained-mode pipelines
+ * (except on PlayStation 2), it is intended
+ * for use by user-created pipelines */
+ rwPRIMITIVETYPEFORCEENUMSIZEINT = RWFORCEENUMSIZEINT
+};
+typedef enum RwPrimitiveType RwPrimitiveType;
+
+
+
+
+/****************************************************************************
+ Function prototypes
+ */
+
+#ifdef __cplusplus
+extern "C"
+{
+#endif /* __cplusplus */
+
+/* Expose Z buffer range */
+extern RwReal RwIm2DGetNearScreenZ(void);
+extern RwReal RwIm2DGetFarScreenZ(void);
+
+extern RwBool RwRenderStateGet(RwRenderState state, void *value);
+extern RwBool RwRenderStateSet(RwRenderState state, void *value);
+
+extern RwBool RwIm2DRenderLine(RwIm2DVertex *vertices, RwInt32 numVertices, RwInt32 vert1, RwInt32 vert2);
+extern RwBool RwIm2DRenderTriangle(RwIm2DVertex *vertices, RwInt32 numVertices,
+ RwInt32 vert1, RwInt32 vert2, RwInt32 vert3 );
+extern RwBool RwIm2DRenderPrimitive(RwPrimitiveType primType, RwIm2DVertex *vertices, RwInt32 numVertices);
+extern RwBool RwIm2DRenderIndexedPrimitive(RwPrimitiveType primType, RwIm2DVertex *vertices, RwInt32 numVertices,
+ RwImVertexIndex *indices, RwInt32 numIndices);
+
+#ifdef __cplusplus
+}
+#endif /* __cplusplus */
+
+
+/*--- Automatically derived from: C:/daily/rwsdk/src/plcore/badevice.h ---*/
+/***************************************************************************/
+/************************* System Requests *********************************/
+/***************************************************************************/
+
+/* Device controls:
+ *
+ * rwDEVICESYSTEMOPEN(NULL, RwEngineOpenParams *openParams, 0)
+ * rwDEVICESYSTEMCLOSE(NULL, NULL, 0)
+ * rwDEVICESYSTEMSTART(NULL, NULL, 0)
+ * rwDEVICESYSTEMSTOP(NULL, NULL, 0)
+ * rwDEVICESYSTEMREGISTER(RwDevice *coreDeviceBlock, RwMemoryFunctions *memFuncs, 0)
+ * rwDEVICESYSTEMGETNUMMODES(RwInt32 *numModes, NULL, 0)
+ * rwDEVICESYSTEMGETMODEINFO(RwVideoMode *modeinfo, NULL, RwInt32 modeNum)
+ * rwDEVICESYSTEMUSEMODE(NULL, NULL, RwInt32 modeNum)
+ * rwDEVICESYSTEMFOCUS(NULL, NULL, RwBool gainFocus)
+ * rwDEVICESYSTEMINITPIPELINE(NULL, NULL, 0)
+ * rwDEVICESYSTEMGETMODE(RwInt32 *curMode, NULL, 0)
+ * rwDEVICESYSTEMSTANDARDS(RwStandardFunc *fnPtrArray, NULL, RwInt32 arraySize)
+ * rwDEVICESYSTEMGETTEXMEMSIZE(RwInt32 *texMemSizeOut, NULL, 0)
+ * rwDEVICESYSTEMGETNUMSUBSYSTEMS(RwInt32 *numSubSystemsOut, NULL, 0)
+ * rwDEVICESYSTEMGETSUBSYSTEMINFO(RwSubSystemInfo *subSystemInfo, NULL, RwInt32 subSystemNum)
+ * rwDEVICESYSTEMGETCURRENTSUBSYSTEM(RwInt32 *curSubSystem, NULL, 0)
+ * rwDEVICESYSTEMSETSUBSYSTEM(NULL, NULL, RwInt32 subSystemNum)
+ * rwDEVICESYSTEMFINALIZESTART(NULL, NULL, 0)
+ * rwDEVICESYSTEMINITIATESTOP(NULL, NULL, 0)
+ * rwDEVICESYSTEMRXPIPELINEREQUESTPIPE(RxPipeline **pipelineRef, NULL, RwInt32 pipeType)
+ * rwDEVICESYSTEMDD - start of device specific controls
+ */
+
+#define rwPIPETYPEMATERIAL 0
+#define rwPIPETYPEWORLDSECTORINSTANCE 1
+#define rwPIPETYPEATOMICINSTANCE 2
+
+enum RwCoreDeviceSystemFn
+{
+ rwDEVICESYSTEMOPEN = 0x00,
+ rwDEVICESYSTEMCLOSE,
+ rwDEVICESYSTEMSTART,
+ rwDEVICESYSTEMSTOP,
+ rwDEVICESYSTEMREGISTER,
+ rwDEVICESYSTEMGETNUMMODES,
+ rwDEVICESYSTEMGETMODEINFO,
+ rwDEVICESYSTEMUSEMODE,
+ rwDEVICESYSTEMFOCUS,
+ rwDEVICESYSTEMINITPIPELINE,
+ rwDEVICESYSTEMGETMODE,
+ rwDEVICESYSTEMSTANDARDS,
+ rwDEVICESYSTEMGETTEXMEMSIZE,
+ rwDEVICESYSTEMGETNUMSUBSYSTEMS,
+ rwDEVICESYSTEMGETSUBSYSTEMINFO,
+ rwDEVICESYSTEMGETCURRENTSUBSYSTEM,
+ rwDEVICESYSTEMSETSUBSYSTEM,
+ rwDEVICESYSTEMFINALIZESTART,
+ rwDEVICESYSTEMINITIATESTOP,
+ rwDEVICESYSTEMGETMAXTEXTURESIZE,
+ rwDEVICESYSTEMRXPIPELINEREQUESTPIPE,
+ rwDEVICESYSTEMGETMETRICBLOCK,
+ rwDEVICESYSTEMDD = 0x1000,
+ rwCOREDEVICESYSTEMFNFORCEENUMSIZEINT = RWFORCEENUMSIZEINT
+};
+typedef enum RwCoreDeviceSystemFn RwCoreDeviceSystemFn;
+
+/******************************************************************************/
+/********************* Standard functions *************************************/
+/******************************************************************************/
+
+#define rwSTANDARDNASTANDARD 0
+#define rwSTANDARDCAMERABEGINUPDATE 1 /* Start 3d camera update */
+#define rwSTANDARDRGBTOPIXEL 2 /* For an RGB value return a pixel value */
+#define rwSTANDARDPIXELTORGB 3 /* For a pixel value returns a RGB value */
+#define rwSTANDARDRASTERCREATE 4 /* Create an raster */
+#define rwSTANDARDRASTERDESTROY 5 /* Raster destroy */
+#define rwSTANDARDIMAGEGETRASTER 6 /* Get image from a raster */
+#define rwSTANDARDRASTERSETIMAGE 7 /* Set raster from an image */
+#define rwSTANDARDTEXTURESETRASTER 8 /* Set texture's raster */
+#define rwSTANDARDIMAGEFINDRASTERFORMAT 9 /* Find a suitable raster format for an image */
+#define rwSTANDARDCAMERAENDUPDATE 10 /* End 3d camera update */
+#define rwSTANDARDSETRASTERCONTEXT 11 /* Start destination of 2d operations */
+#define rwSTANDARDRASTERSUBRASTER 12 /* Make a raster inside another raster */
+#define rwSTANDARDRASTERCLEARRECT 13 /* Clear a rectangle of the current dest raster */
+#define rwSTANDARDRASTERCLEAR 14 /* Clear the current dest raster */
+#define rwSTANDARDRASTERLOCK 15 /* Lock a raster to get it's pixels */
+#define rwSTANDARDRASTERUNLOCK 16 /* Unlock a raster to return it's pixels */
+#define rwSTANDARDRASTERRENDER 17 /* Render a raster (not scaled, but masked) */
+#define rwSTANDARDRASTERRENDERSCALED 18 /* Render a raster (scaled and masked) */
+#define rwSTANDARDRASTERRENDERFAST 19 /* Render a raster (not scaled or masked) */
+#define rwSTANDARDRASTERSHOWRASTER 20 /* Show a camera raster */
+#define rwSTANDARDCAMERACLEAR 21 /* Clear a camera's raster and/or Z raster */
+#define rwSTANDARDHINTRENDERF2B 22 /* Set hint for rendering direction in the world */
+#define rwSTANDARDRASTERLOCKPALETTE 23 /* Lock a raster to get it's palette */
+#define rwSTANDARDRASTERUNLOCKPALETTE 24 /* Unlock a raster to return it's palette */
+#define rwSTANDARDNATIVETEXTUREGETSIZE 25 /* Get size of native texture when written to a stream */
+#define rwSTANDARDNATIVETEXTUREREAD 26 /* Read native texture from the stream */
+#define rwSTANDARDNATIVETEXTUREWRITE 27 /* Write native texture to the stream */
+#define rwSTANDARDRASTERGETMIPLEVELS 28 /* Get the number of mip levels in a raster */
+#define rwSTANDARDNUMOFSTANDARD 29
+
+/****************************************************************************
+ Global Types
+ */
+
+/* Standard functions */
+typedef RwBool (*RwStandardFunc)(void *pOut,void *pInOut,RwInt32 nI);
+
+typedef struct RwEngineOpenParams RwEngineOpenParams;
+
+#ifndef RWADOXYGENEXTERNAL
+/**
+ * \ingroup rwengine
+ * \struct RwEngineOpenParams
+ * This type is used to specify device dependent parameters
+ * for use by the API function \ref RwEngineOpen.
+ * For a Windows application the displayID field
+ * should be set to the window's handle (of type HWND).
+ * For NULL and sky libraries displayID=0:
+ */
+#endif /* RWADOXYGENEXTERNAL */
+struct RwEngineOpenParams
+{
+ void *displayID; /**< Display Identifier */
+};
+
+/* nOption is one of a list of possible System defines (see above) */
+typedef RwBool
+ (*RwSystemFunc)(RwInt32 nOption,
+ void *pOut,
+ void *pInOut,
+ RwInt32 nIn);
+
+/* Device block */
+typedef RwBool
+ (*RwRenderStateSetFunction)(RwRenderState nState,void *pParam);
+
+typedef RwBool
+ (*RwRenderStateGetFunction)(RwRenderState nState,void *pParam);
+
+typedef RwBool
+ (*RwIm2DRenderLineFunction)(RwIm2DVertex *vertices,
+ RwInt32 numVertices,
+ RwInt32 vert1,
+ RwInt32 vert2);
+
+typedef RwBool
+ (*RwIm2DRenderTriangleFunction)(RwIm2DVertex *vertices,
+ RwInt32 numVertices,
+ RwInt32 vert1,
+ RwInt32 vert2,
+ RwInt32 vert3);
+
+typedef RwBool
+ (*RwIm2DRenderPrimitiveFunction)(RwPrimitiveType primType,
+ RwIm2DVertex *vertices,
+ RwInt32 numVertices);
+
+typedef RwBool
+ (*RwIm2DRenderIndexedPrimitiveFunction)(RwPrimitiveType primType,
+ RwIm2DVertex *vertices,
+ RwInt32 numVertices,
+ RwImVertexIndex *indices,
+ RwInt32 numIndices);
+
+typedef RwBool
+ (*RwIm3DRenderLineFunction)(RwInt32 vert1,
+ RwInt32 vert2);
+
+typedef RwBool
+ (*RwIm3DRenderTriangleFunction)(RwInt32 vert1,
+ RwInt32 vert2,
+ RwInt32 vert3);
+
+typedef RwBool
+ (*RwIm3DRenderPrimitiveFunction)(RwPrimitiveType primType);
+
+typedef RwBool
+ (*RwIm3DRenderIndexedPrimitiveFunction)(RwPrimitiveType primtype,
+ RwImVertexIndex *indices,
+ RwInt32 numIndices);
+
+
+typedef struct RwDevice RwDevice;
+
+#if (!defined(DOXYGEN))
+/*
+ * struct RwDevice
+ * Structure describing a display device
+ */
+struct RwDevice
+{
+ RwReal gammaCorrection; /* Gamma correction */
+ RwSystemFunc fpSystem; /* System handler */
+ RwReal zBufferNear; /* Near Z buffer value */
+ RwReal zBufferFar; /* Far Z buffer value */
+
+ /* Immediate mode functions */
+ RwRenderStateSetFunction fpRenderStateSet; /* Internal Use */
+ RwRenderStateGetFunction fpRenderStateGet; /* Internal Use */
+
+ /* Render functions */
+ RwIm2DRenderLineFunction fpIm2DRenderLine; /* Internal Use */
+ RwIm2DRenderTriangleFunction fpIm2DRenderTriangle; /* Internal Use */
+ RwIm2DRenderPrimitiveFunction fpIm2DRenderPrimitive; /* Internal Use */
+ RwIm2DRenderIndexedPrimitiveFunction fpIm2DRenderIndexedPrimitive; /* Internal Use */
+
+ RwIm3DRenderLineFunction fpIm3DRenderLine; /* Internal Use */
+ RwIm3DRenderTriangleFunction fpIm3DRenderTriangle; /* Internal Use */
+ RwIm3DRenderPrimitiveFunction fpIm3DRenderPrimitive; /* Internal Use */
+ RwIm3DRenderIndexedPrimitiveFunction fpIm3DRenderIndexedPrimitive; /* Internal Use */
+};
+
+#endif /* (!defined(DOXYGEN)) */
+
+typedef struct RwMetrics RwMetrics;
+#ifndef RWADOXYGENEXTERNAL
+/**
+ * \ingroup rwengine
+ * \struct RwMetrics
+ * This structure provides information about the performance
+ * of the application. The metrics are recorded only in the metrics
+ * libraries. To use metrics you should compile with the RWMETRICS
+ * preprocessor symbol defines, and link with the metrics libraries
+ * that ship with the SDK. The metrics are recorded on a per-frame
+ * basis. Each platform may provide additional information that
+ * is specific to that platform. Note that either the
+ * \ref numTextureUploads or \ref numResourceAllocs being non-zero can
+ * be considered as bad news and will indicate a significantly
+ * reduced rendering performance.
+ */
+#endif /* RWADOXYGENEXTERNAL */
+struct RwMetrics
+{
+ RwUInt32 numTriangles; /**< Number of triangles processed */
+ RwUInt32 numProcTriangles; /**< Number of mesh triangles processed */
+ RwUInt32 numVertices; /**< Number of vertices processed */
+ RwUInt32 numTextureUploads; /**< Number of textures swapped */
+ RwUInt32 sizeTextureUploads; /**< Size of textures swapped */
+ RwUInt32 numResourceAllocs; /**< Number of resource blocks swapped */
+ void *devSpecificMetrics; /**< Device specific metrics */
+};
+
+#define SUBSYSTEMNAME_MAXLEN 80
+
+typedef struct RwSubSystemInfo RwSubSystemInfo;
+#ifndef RWADOXYGENEXTERNAL
+/**
+ * \ingroup rwengine
+ * \struct RwSubSystemInfo
+ * This type is used to represent information about a device.
+ * The only available field specifies a character string
+ * which identifies the subsystem
+ * (see API function \ref RwEngineGetSubSystemInfo). */
+#endif /* RWADOXYGENEXTERNAL */
+struct RwSubSystemInfo
+{
+ RwChar name[SUBSYSTEMNAME_MAXLEN]; /**< Sub system string */
+};
+
+
+/* Video modes */
+/* These are flag bits which may be ORd */
+
+#ifndef RWADOXYGENEXTERNAL
+/**
+ * \ingroup rwengine
+ * RwVideoModeFlag
+ * These flags specify the type of display that RenderWare
+ * will use. The flags may be OR'd together to build composite modes.
+ * Note that not all modes are supported on all platforms.
+ */
+#endif /* RWADOXYGENEXTERNAL */
+enum RwVideoModeFlag
+{
+ rwVIDEOMODEEXCLUSIVE = 0x1, /**<Exclusive (i.e. full-screen) */
+ rwVIDEOMODEINTERLACE = 0x2, /**<Interlaced */
+ rwVIDEOMODEFFINTERLACE = 0x4, /**<Flicker Free Interlaced */
+ rwVIDEOMODEFSAA0 = 0x8, /**< \if sky2
+ * Full-screen antialiasing mode 0
+ * \endif */
+ rwVIDEOMODEFSAA1 = 0x10, /**< \if sky2
+ * Full-screen antialiasing mode 1
+ * \endif */
+ rwVIDEOMODEFLAGFORCEENUMSIZEINT = RWFORCEENUMSIZEINT
+};
+typedef enum RwVideoModeFlag RwVideoModeFlag;
+
+typedef struct RwVideoMode RwVideoMode;
+#ifndef RWADOXYGENEXTERNAL
+/**
+ * \ingroup rwengine
+ * \struct RwVideoMode
+ * This type represents a video mode available on a device specified
+ * by the frame buffer resolution (width and height) and depth,
+ * and a flag indicating whether the device has exclusive use of
+ * the mode (see API function \ref RwEngineGetVideoModeInfo):
+ */
+#endif /* RWADOXYGENEXTERNAL */
+struct RwVideoMode
+{
+ RwInt32 width; /**< Width */
+ RwInt32 height; /**< Height */
+ RwInt32 depth; /**< Depth */
+ RwVideoModeFlag flags; /**< Flags */
+};
+
+#ifndef RWADOXYGENEXTERNAL
+/**
+ * \ingroup rwengine
+ * RwEngineInitFlag
+ * Engine initialization flags. An application can use
+ * these to control the memory manager that RenderWare uses for dynamic
+ * memory management. By default RenderWare uses FreeLists. This is the
+ * preferred way of using RenderWare. If the application does not want
+ * RenderWare to use the memory manager, then the application can pass
+ * rwENGINEINITNOFREELISTS as the argument to \ref RwEngineInit and
+ * RenderWare will replace freelist calls to corresponding calls to
+ * RwMalloc and RwFree. This will result in more memory management
+ * related calls.
+ */
+#endif /* RWADOXYGENEXTERNAL */
+enum RwEngineInitFlag
+{
+ rwENGINEINITFREELISTS = 0, /**<Use Freelists */
+ rwENGINEINITNOFREELISTS = 0x1, /**<Don't use Freelists */
+ rwENGINEINITFLAGFORCEENUMSIZEINT = RWFORCEENUMSIZEINT
+};
+typedef enum RwEngineInitFlag RwEngineInitFlag;
+
+/****************************************************************************
+ Function prototypes
+ */
+
+#ifdef __cplusplus
+extern "C"
+{
+#endif /* __cplusplus */
+
+/* Get the library binary version */
+extern RwInt32 RwEngineGetVersion(void);
+
+/* Sequence of events to get RenderWare up and running */
+extern RwBool RwEngineInit(const RwMemoryFunctions *memFuncs,
+ RwUInt32 initFlags,
+ RwUInt32 resArenaSize);
+extern RwInt32 RwEngineRegisterPlugin(RwInt32 size, RwUInt32 pluginID,
+ RwPluginObjectConstructor initCB,
+ RwPluginObjectDestructor termCB);
+extern RwInt32 RwEngineGetPluginOffset(RwUInt32 pluginID);
+extern RwBool RwEngineOpen(RwEngineOpenParams *initParams);
+extern RwBool RwEngineStart(void);
+extern RwBool RwEngineStop(void);
+extern RwBool RwEngineClose(void);
+extern RwBool RwEngineTerm(void);
+
+/* Finding out about the rendering sub systems available */
+extern RwInt32 RwEngineGetNumSubSystems(void);
+extern RwSubSystemInfo *RwEngineGetSubSystemInfo(RwSubSystemInfo *subSystemInfo, RwInt32 subSystemIndex);
+extern RwInt32 RwEngineGetCurrentSubSystem(void);
+extern RwBool RwEngineSetSubSystem(RwInt32 subSystemIndex);
+
+/* Finding out about the modes available */
+extern RwInt32 RwEngineGetNumVideoModes(void);
+extern RwVideoMode *RwEngineGetVideoModeInfo(RwVideoMode *modeinfo, RwInt32 modeIndex);
+extern RwInt32 RwEngineGetCurrentVideoMode(void);
+extern RwBool RwEngineSetVideoMode(RwInt32 modeIndex);
+
+/* Finding out how much texture memory is available */
+extern RwInt32 RwEngineGetTextureMemorySize(void);
+extern RwInt32 RwEngineGetMaxTextureSize(void);
+
+/* Getting/Releasing the focus */
+extern RwBool RwEngineSetFocus(RwBool enable);
+
+/* Getting metrics */
+extern RwMetrics *RwEngineGetMetrics(void);
+
+#ifdef __cplusplus
+}
+#endif /* __cplusplus */
+
+
+/*--- Automatically derived from: C:/daily/rwsdk/src/plcore/bafsys.h ---*/
+
+/****************************************************************************
+ Global Types
+ */
+
+/*
+ * rwFnFexist
+ * Returns TRUE if file with given name exists, FALSE if it doesn't.
+ */
+typedef RwBool (*rwFnFexist)(const RwChar *name);
+
+/*
+ * rwFnFopen
+ * Mimics ANSI C Standard Library fopen.
+ */
+typedef void *(*rwFnFopen)(const RwChar *name, const RwChar *mode);
+
+/*
+ * rwFnFclose
+ * Mimics ANSI C Standard Library fclose.
+ */
+typedef int (*rwFnFclose)(void *fptr);
+
+/*
+ * rwFnFread
+ * Mimics ANSI C Standard Library fread.
+ */
+typedef size_t (*rwFnFread)(void *addr, size_t size, size_t count, void *fptr);
+
+/*
+ * rwFnFwrite
+ * Mimics ANSI C Standard Library fwrite.
+ */
+typedef size_t (*rwFnFwrite)(const void *addr, size_t size, size_t count, void *fptr);
+
+/*
+ * rwFnFgets
+ * Mimics ANSI C Standard Library fgets.
+ */
+typedef RwChar *(*rwFnFgets)(RwChar *buffer, int maxLen, void *fptr);
+
+/*
+ * rwFnFputs
+ * Mimics ANSI C Standard Library fputs.
+ */
+typedef int (*rwFnFputs)(const RwChar *buffer, void *fptr);
+
+/*
+ * rwFnFeof
+ * Mimics ANSI C Standard Library feof.
+ */
+typedef int (*rwFnFeof)(void *fptr);
+
+/*
+ * rwFnFseek
+ * Mimics ANSI C Standard Library fseek.
+ */
+typedef int (*rwFnFseek)(void *fptr, long offset, int origin);
+
+/*
+ * rwFnFflush
+ * Mimics ANSI C Standard Library fflush.
+ */
+typedef int (*rwFnFflush)(void *fptr);
+
+/*
+ * rwFnFtell
+ * Mimics ANSI C Standard Library ftell.
+ */
+typedef int (*rwFnFtell)(void *fptr);
+
+
+typedef struct RwFileFunctions RwFileFunctions;
+/**
+ * \ingroup memoryfileinterface
+ * \struct RwFileFunctions
+ * This type is used to specify the file access
+ * functions used by RenderWare. The default file system uses the standard
+ * ANSI functions. The application may install an alternative file system
+ * providing it complies with the ANSI interface -- see API
+ * function \ref RwOsGetFileInterface.
+ *
+ * The function types associated with this type are defined as follows
+ *
+ * \verbatim
+ RwBool (*rwFnFexist)(const RwChar *name)
+ void *(*rwFnFopen)(const RwChar *name, const RwChar *access)
+ int (*rwFnFclose)(void *fptr)
+ size_t (*rwFnFread)(void *addr, size_t size, size_t count, void *fptr)
+ size_t (*rwFnFwrite)(const void *addr, size_t size, size_t count,
+ void *fptr)
+ RwChar *(*rwFnFgets)(RwChar *buffer, int maxLen, void *fptr)
+ int (*rwFnFputs)(const RwChar *buffer, void *fptr)
+ int (*rwFnFeof)(void *fptr)
+ int (*rwFnFseek)(void *fptr, long offset, int origin)
+ int (*rwFnFflush)(void *fptr)
+ int (*rwFnFtell)(void *fptr)
+ \endverbatim
+ * Note the function argument lists are consistent with the ANSI
+ * standard file access interface:
+ */
+struct RwFileFunctions
+{
+ rwFnFexist rwfexist; /**< Pointer to fexist function */
+ rwFnFopen rwfopen; /**< Pointer to fopen function */
+ rwFnFclose rwfclose; /**< Pointer to fclose function */
+ rwFnFread rwfread; /**< Pointer to fread function */
+ rwFnFwrite rwfwrite; /**< Pointer to fwrite function */
+ rwFnFgets rwfgets; /**< Pointer to fgets function */
+ rwFnFputs rwfputs; /**< Pointer to puts function */
+ rwFnFeof rwfeof; /**< Pointer to feof function */
+ rwFnFseek rwfseek; /**< Pointer to fseek function */
+ rwFnFflush rwfflush; /**< Pointer to fflush function */
+ rwFnFtell rwftell; /**< Pointer to ftell function */
+};
+
+
+#ifdef __cplusplus
+extern "C"
+{
+#endif /* __cplusplus */
+
+extern RwFileFunctions *RwOsGetFileInterface(void);
+
+#ifdef __cplusplus
+}
+#endif /* __cplusplus */
+
+
+/*--- Automatically derived from: C:/daily/rwsdk/src/plcore/baerr.h ---*/
+/****************************************************************************
+ Global Types
+ */
+
+typedef struct RwError RwError;
+#ifndef RWADOXYGENEXTERNAL
+/**
+ * \ingroup rwerror
+ * \struct RwError
+ * This type represents a RenderWare error specified by the
+ * ID of the plugin that the error was issued from (pluginID) and the error
+ * code itself (errorCode) (see API function \ref RwErrorGet).
+ * \param pluginID The ID of the plugin that issued the error.
+ * \param errorCode A value representing the error code.
+ */
+#endif /* RWADOXYGENEXTERNAL */
+struct RwError
+{
+ RwInt32 pluginID; /**< Internal Use */
+ RwInt32 errorCode; /**< Internal Use */
+};
+
+#define RWECODE(a,b) a,
+
+/* common errors have the MSB set */
+
+enum RwErrorCodeCommon
+{
+ E_RW_NOERROR = (int)0x80000000L,
+#include "errcom.def"
+ E_RW_LASTERROR = RWFORCEENUMSIZEINT
+};
+typedef enum RwErrorCodeCommon RwErrorCodeCommon;
+
+#undef RWECODE
+
+/****************************************************************************
+ Function prototypes
+ */
+
+#ifdef __cplusplus
+extern "C"
+{
+#endif /* __cplusplus */
+
+extern RwError *RwErrorGet(RwError *code);
+extern RwError *RwErrorSet(RwError *code);
+extern RwInt32 _rwerror(RwInt32 code, ...);
+
+#ifdef __cplusplus
+}
+#endif /* __cplusplus */
+
+
+/*--- Automatically derived from: C:/daily/rwsdk/src/plcore/badebug.h ---*/
+
+/****************************************************************************
+ Global Types
+ */
+
+/**
+ * \ingroup rwdebug
+ * RwDebugType
+ * This type represents the different types of debug and
+ * trace messages that can be sent to the currently installed debug handler
+ * (see API function \ref RwDebugSendMessage)*/
+enum RwDebugType
+{
+ rwNADEBUGTYPE = 0, /**<Invalid */
+ rwDEBUGASSERT, /**<Send an assert message */
+ rwDEBUGERROR, /**<Send an error message */
+ rwDEBUGMESSAGE, /**<Send an informational message */
+ rwDEBUGTRACE, /**<Send a trace message */
+ rwDEBUGTYPEFORCEENUMSIZEINT = RWFORCEENUMSIZEINT
+};
+typedef enum RwDebugType RwDebugType;
+
+/**
+ * \ingroup rwdebug
+ * \ref RwDebugHandler
+ * This type represents the
+ * function called from \ref RwDebugSendMessage for sending a message to the
+ * RenderWare debug stream.
+ *
+ * \param type Type of debug message (assert, error, etc.).
+ *
+ * \param string Pointer to a string containing the error
+ * message.
+ *
+ * \see RwDebugSetHandler
+ */
+typedef void (*RwDebugHandler) (RwDebugType type,
+
+ const RwChar * string);
+
+#ifdef RWDEBUG
+
+#define RwDebugSendMessage(type, funcName, message) \
+ _rwDebugSendMessage(type, \
+ RWSTRING(__FILE__), \
+ __LINE__, \
+ funcName, \
+ message)
+
+/****************************************************************************
+ Function prototypes
+ */
+
+#ifdef __cplusplus
+extern "C"
+{
+#endif /* __cplusplus */
+
+/* Setting the debug message handler */
+extern RwDebugHandler RwDebugSetHandler(RwDebugHandler handler);
+extern void RwDebugSetTraceState(RwBool state);
+
+extern void _rwDebugSendMessage(RwDebugType type,
+ const RwChar * file,
+ const RwInt32 line,
+ const RwChar * funcName,
+ const RwChar * message);
+
+/* Sending a message */
+extern RwChar *_rwdberrcommon(RwInt32 code, ...);
+
+#if (!defined(DOXYGEN))
+/* Doxy doesn't appear to like the __RWFORMAT__ attribute */
+extern RwChar *_rwdbsprintf(const RwChar * format,
+ ...) __RWFORMAT__(printf, 1, 2);
+#endif /* (!defined(DOXYGEN)) */
+
+#ifdef __cplusplus
+}
+#endif /* __cplusplus */
+
+#else /* RWDEBUG */
+
+#define RwDebugSetHandler(handler)
+#define RwDebugSetTraceState(state)
+#define RwDebugSendMessage(type, funcName, message)
+
+#if (!defined(RWREGSETDEBUGTRACE))
+#define RWREGSETDEBUGTRACE(_name) /* No op */
+#endif /* (!defined(RWREGSETDEBUGTRACE)) */
+
+#endif /* RWDEBUG */
+
+
+/*--- Automatically derived from: C:/daily/rwsdk/src/plcore/balibtyp.h ---*/
+/* Finding MSBs */
+
+#define RWBYTEFINDMSB(a) \
+ (_rwMsbBit[(a)]-1)
+
+#define RWWORDFINDMSB(a) \
+ (((a)&0xff00)?RWBYTEFINDMSB((a)>>8)+8: RWBYTEFINDMSB(a))
+
+#define RWLONGFINDMSB(a) \
+ (((a)&0xffff0000UL)?RWWORDFINDMSB((a)>>16)+16: RWWORDFINDMSB(a))
+
+/****************************************************************************
+ Defines
+ */
+
+/* macros used to access plugin data in objects */
+#define RWPLUGINOFFSET(_type, _base, _offset) \
+ ((_type *)((RwUInt8 *)(_base) + (_offset)))
+
+#define RWPLUGINOFFSETCONST(_type, _base, _offset) \
+ ((const _type *)((const RwUInt8 *)(_base) + (_offset)))
+
+/* macro used to access global data structure (the root type is RwGlobals) */
+#define RWSRCGLOBAL(variable) \
+ (((RwGlobals *)RwEngineInstance)->variable)
+
+#define RWASSERTISTYPE(_f, _t) \
+ RWASSERT((((const RwObject *)(_f))->type)==(_t))
+
+/****************************************************************************
+ Global Types
+ */
+
+enum RwEngineStatus
+{
+ rwENGINESTATUSIDLE = 0, /* This needs to be zero */
+ rwENGINESTATUSINITED = 1,
+ rwENGINESTATUSOPENED = 2,
+ rwENGINESTATUSSTARTED = 3,
+ rwENGINESTATUSFORCEENUMSIZEINT = RWFORCEENUMSIZEINT
+};
+typedef enum RwEngineStatus RwEngineStatus;
+
+typedef struct RwGlobals RwGlobals;
+
+#if (!defined(DOXYGEN))
+struct RwGlobals
+{
+#ifdef RWDEBUG
+ RwDebugHandler debugFunction; /* debug string handler */
+ void *debugFile; /* debug output file */
+ RwInt32 debugStackDepth; /* current depth of function stack */
+ RwBool debugTrace; /* is function tracing enabled */
+#endif
+
+ /* Current entities */
+ void *curCamera; /* Current camera */
+ void *curWorld; /* Current World */
+
+ /* Checking counters */
+ RwUInt16 renderFrame; /* Camera display count */
+ RwUInt16 lightFrame; /* Used to ensure each light is applied only once. */
+ RwUInt16 pad[2]; /* Longword align it again */
+
+ /* For the currently accessed device */
+ RwDevice dOpenDevice;
+
+ /* Standard renderers and functions */
+ RwStandardFunc stdFunc[rwSTANDARDNUMOFSTANDARD];
+
+ /* All of the frames which have been updated */
+ RwLinkList dirtyFrameList;
+
+ /* The file functions */
+ RwFileFunctions fileFuncs;
+
+ /* The string functions */
+ RwStringFunctions stringFuncs;
+
+ /* The memory allocation functions */
+ RwMemoryFunctions memoryFuncs;
+#ifdef RWDEBUG
+ RwBool freeListExtraDebug;
+#endif /* RWDEBUG */
+
+ /* virtual memory alloc/free functions */
+ RwMemoryAllocFn memoryAlloc;
+ RwMemoryFreeFn memoryFree;
+
+ RwMetrics *metrics;
+
+ /* Current engine status */
+ RwEngineStatus engineStatus;
+
+ /* Resource arena init size. */
+ RwUInt32 resArenaInitSize;
+};
+
+typedef struct RwModuleInfo RwModuleInfo;
+struct RwModuleInfo
+{
+ RwInt32 globalsOffset;
+ RwInt32 numInstances;
+};
+#endif /* (!defined(DOXYGEN)) */
+
+
+
+/****************************************************************************
+ Program wide globals
+ */
+
+#ifdef __cplusplus
+extern "C"
+{
+#endif /* __cplusplus */
+
+#ifdef RWGLOBALSIZE
+extern RwUInt32 ourGlobals[RWGLOBALSIZE / sizeof(RwUInt32)];
+#define RwEngineInstance ourGlobals
+#else /* RWGLOBALSIZE */
+
+#ifdef _RWDLL
+__declspec(dllimport) extern void *RwEngineInstance;
+#else
+extern void *RwEngineInstance;
+#endif
+
+#endif /* RWGLOBALSIZE */
+
+extern RwInt8 _rwMsbBit[];
+
+#ifdef __cplusplus
+}
+#endif /* __cplusplus */
+
+
+/*--- Automatically derived from: C:/daily/rwsdk/src/plcore/baresour.h ---*/
+
+#define RWRESOURCESGLOBAL(var) (RWPLUGINOFFSET(rwResourcesGlobals, \
+ RwEngineInstance, resourcesModule.globalsOffset)->var)
+
+#ifndef RWADOXYGENEXTERNAL
+/**
+ * \ingroup rwresources
+ * \struct RwResEntry
+ * RwResEntry object. Instanced data block in resources arena.
+ * This should be considered an opaque
+ * type. Use the RwResEntry API functions to access.
+ */
+#endif /* RWADOXYGENEXTERNAL */
+
+typedef struct RwResEntry RwResEntry;
+
+#ifndef RWADOXYGENEXTERNAL
+/**
+ * \ingroup rwresources
+ * \ref RwResEntryDestroyNotify type represents the function
+ * called from \ref RwResourcesFreeResEntry (and indirectly from
+ * \ref RwResourcesEmptyArena) immediately before the memory used by the
+ * specified resources entry is released.
+ *
+ * \param resEntry Pointer to the instanced data.
+ */
+#endif /* RWADOXYGENEXTERNAL */
+typedef void (*RwResEntryDestroyNotify) (RwResEntry * resEntry);
+
+#if (!defined(DOXYGEN))
+struct RwResEntry
+{
+ RwLLLink link; /* Node in the list of resource elements */
+ RwInt32 size; /* Size of this node */
+ void *owner; /* Owner of this node */
+ RwResEntry **ownerRef; /* Pointer to pointer to this (enables de-alloc) */
+ RwResEntryDestroyNotify destroyNotify; /* This is called right before destruction */
+};
+#endif /* (!defined(DOXYGEN)) */
+
+typedef struct rwResources rwResources;
+
+#if (!defined(DOXYGEN))
+struct rwResources
+{
+ RwInt32 maxSize;
+ RwInt32 currentSize;
+ RwInt32 reusageSize;
+
+ void *memHeap;
+
+ RwLinkList entriesA;
+ RwLinkList entriesB;
+
+ RwLinkList *freeEntries;
+ RwLinkList *usedEntries;
+};
+
+
+typedef struct rwResourcesGlobals rwResourcesGlobals;
+struct rwResourcesGlobals
+{
+ rwResources res;
+};
+#endif /* (!defined(DOXYGEN)) */
+
+
+#ifdef __cplusplus
+extern "C"
+{
+#endif /* __cplusplus */
+
+/* Setting the resources arena size */
+extern RwBool RwResourcesSetArenaSize(RwUInt32 size);
+extern RwInt32 RwResourcesGetArenaSize(void);
+extern RwInt32 RwResourcesGetArenaUsage(void);
+extern RwBool RwResourcesEmptyArena(void);
+
+/* Allocate */
+extern RwResEntry *RwResourcesAllocateResEntry(void *owner,
+ RwResEntry **ownerRef,
+ RwInt32 size,
+ RwResEntryDestroyNotify
+ destroyNotify);
+/* Deallocate */
+extern RwBool RwResourcesFreeResEntry(RwResEntry * entry);
+/* Mark all as unused */
+extern void _rwResourcesPurge(void);
+#if ((defined(RWDEBUG)) || (defined(RWSUPPRESSINLINE)))
+/* Mark as used */
+extern RwResEntry *RwResourcesUseResEntry(RwResEntry * entry);
+#endif /* ((defined(RWDEBUG)) || (defined(RWSUPPRESSINLINE))) */
+
+extern RwModuleInfo resourcesModule;
+
+
+#ifdef __cplusplus
+}
+#endif /* __cplusplus */
+
+#if ((!defined(RWDEBUG)) && (!defined(RWSUPPRESSINLINE)))
+#define RwResourcesUseResEntry(_ntry) \
+ ((((_ntry)->link.next)? \
+ (rwLinkListRemoveLLLink(&((_ntry)->link)), \
+ rwLinkListAddLLLink(RWRESOURCESGLOBAL(res.usedEntries), \
+ &((_ntry)->link))): \
+ NULL), \
+ (_ntry))
+#endif /* ((!defined(RWDEBUG)) && (!defined(RWSUPPRESSINLINE))) */
+
+
+/*--- Automatically derived from: C:/daily/rwsdk/src/plcore/bacolor.h ---*/
+/****************************************************************************
+ Global Types
+ */
+
+typedef struct RwRGBAReal RwRGBAReal;
+#ifndef RWADOXYGENEXTERNAL
+/**
+ * \ingroup rwrgba
+ * \struct RwRGBAReal
+ * This structure represents a RGBA color which has
+ * components specified as real values.
+ *
+ * A color component of an RwRGBA with the value 255 generally corresponds
+ * to the associated component in an RwRGBAReal with the value 1.0f.
+ * However, any values can be substituted to denormalize/normalize
+ * RwRGBAReal and create different effects. For example, while light colors
+ * are expressed as normalized RGBA, interesting effects can be gained using
+ * larger values.
+ *
+ * It should also be noted that a color component of an RwRGBA with the
+ * value 0 generally corresponds to the associcated component in an
+ * RwRGBAReal with the value 0.0.
+ */
+#endif /* RWADOXYGENEXTERNAL */
+struct RwRGBAReal
+{
+ RwReal red; /**< red component */
+ RwReal green; /**< green component */
+ RwReal blue; /**< blue component */
+ RwReal alpha; /**< alpha component */
+};
+
+#if (!defined(RwRGBARealAssign))
+#define RwRGBARealAssign(_target, _source) \
+ ( *(_target) = *(_source) )
+#endif /* (!defined(RwRGBARealAssign)) */
+
+typedef struct RwRGBA RwRGBA;
+#ifndef RWADOXYGENEXTERNAL
+/**
+ * \ingroup rwrgba
+ * \struct RwRGBA
+ * This structure represents a RGBA color
+ * which has integer components specified in the range 0 to 255.
+ */
+#endif /* RWADOXYGENEXTERNAL */
+struct RwRGBA
+{
+ RwUInt8 red; /**< red component */
+ RwUInt8 green; /**< green component */
+ RwUInt8 blue; /**< blue component */
+ RwUInt8 alpha; /**< alpha component */
+};
+
+#if (!defined(RwRGBAAssign))
+#define RwRGBAAssign(_target, _source) \
+ ( *(_target) = *(_source) )
+#endif /* (!defined(RwRGBAAssign)) */
+
+#define RwRGBARealAddMacro(o,a,b) \
+MACRO_START \
+{ \
+ (o)->red = (((a)->red) + ( (b)->red)); \
+ (o)->green = (((a)->green) + ( (b)->green)); \
+ (o)->blue = (((a)->blue) + ( (b)->blue)); \
+ (o)->alpha = (((a)->alpha) + ( (b)->alpha)); \
+} \
+MACRO_STOP
+
+#define RwRGBARealSubMacro(o,a,b) \
+MACRO_START \
+{ \
+ (o)->red = (((a)->red) - ( (b)->red)); \
+ (o)->green = (((a)->green) - ( (b)->green)); \
+ (o)->blue = (((a)->blue) - ( (b)->blue)); \
+ (o)->alpha = (((a)->alpha) - ( (b)->alpha)); \
+} \
+MACRO_STOP
+
+#define RwRGBARealScaleMacro(o,a,scale) \
+MACRO_START \
+{ \
+ (o)->red = (((a)->red) * ( scale)); \
+ (o)->green = (((a)->green) * ( scale)); \
+ (o)->blue = (((a)->blue) * ( scale)); \
+ (o)->alpha = (((a)->alpha) * ( scale)); \
+} \
+MACRO_STOP
+
+/* Conversion macros */
+#define RwRGBAFromRwRGBARealMacro(o, i) \
+MACRO_START \
+{ \
+ RwInt32 quantize; \
+ \
+ quantize = RwInt32FromRealMacro( ((i)->red * (RwReal)255.0) \
+ + (RwReal)0.5 ); \
+ (o)->red = (RwUInt8) quantize; \
+ quantize = RwInt32FromRealMacro( ((i)->green * (RwReal)255.0) \
+ + (RwReal)0.5 ); \
+ (o)->green = (RwUInt8) quantize; \
+ quantize = RwInt32FromRealMacro( ((i)->blue * (RwReal)255.0) \
+ + (RwReal)0.5 ); \
+ (o)->blue = (RwUInt8) quantize; \
+ quantize = RwInt32FromRealMacro( ((i)->alpha * (RwReal)255.0) \
+ + (RwReal)0.5 ); \
+ (o)->alpha = (RwUInt8) quantize; \
+ \
+} \
+MACRO_STOP
+
+#define RwRGBARealFromRwRGBAMacro(o, i) \
+MACRO_START \
+{ \
+ (o)->red = \
+ (((RwReal)(((i)->red))) * ( (RwReal)((1.0/255.0)))); \
+ (o)->green = \
+ (((RwReal)(((i)->green))) * ( (RwReal)((1.0/255.0)))); \
+ (o)->blue = \
+ (((RwReal)(((i)->blue))) * ( (RwReal)((1.0/255.0)))); \
+ (o)->alpha = \
+ (((RwReal)(((i)->alpha))) * ( (RwReal)((1.0/255.0)))); \
+} \
+MACRO_STOP
+
+/****************************************************************************
+ Function prototypes
+ */
+
+#ifdef __cplusplus
+extern "C"
+{
+#endif /* __cplusplus */
+
+
+#if (! ( defined(RWDEBUG) || defined(RWSUPPRESSINLINE) ))
+
+#define RwRGBARealAdd(o,a,b) \
+ RwRGBARealAddMacro(o,a,b)
+
+#define RwRGBARealSub(o,a,b) \
+ RwRGBARealSubMacro(o,a,b)
+
+#define RwRGBARealScale(o,a,scale) \
+ RwRGBARealScaleMacro(o,a,scale)
+
+#define RwRGBAFromRwRGBAReal(o, i) \
+ RwRGBAFromRwRGBARealMacro(o, i)
+
+#define RwRGBARealFromRwRGBA(o, i) \
+ RwRGBARealFromRwRGBAMacro(o, i)
+
+#else /* (! ( defined(RWDEBUG) || defined(RWSUPPRESSINLINE) )) */
+
+/* Function versions for debug */
+extern void RwRGBARealAdd(RwRGBAReal *result,
+ const RwRGBAReal *source1,
+ const RwRGBAReal *source2);
+
+extern void RwRGBARealSub(RwRGBAReal *result,
+ const RwRGBAReal *source1,
+ const RwRGBAReal *source2);
+
+extern void RwRGBARealScale(RwRGBAReal *result,
+ const RwRGBAReal *source,
+ RwReal scalar);
+
+extern void RwRGBAFromRwRGBAReal(RwRGBA *result,
+ const RwRGBAReal *source);
+
+extern void RwRGBARealFromRwRGBA(RwRGBAReal *result,
+ RwRGBA *source);
+
+#endif /* (! ( defined(RWDEBUG) || defined(RWSUPPRESSINLINE) )) */
+
+#ifdef __cplusplus
+}
+#endif /* __cplusplus */
+
+
+/*--- Automatically derived from: C:/daily/rwsdk/src/plcore/babinmtx.h ---*/
+
+/****************************************************************************
+ Global types
+ */
+
+/* Matrix stream format */
+typedef struct rwStreamMatrix RwMatrixChunkInfo;
+typedef struct rwStreamMatrix rwStreamMatrix;
+#if (!defined(DOXYGEN))
+struct rwStreamMatrix
+{
+ RwV3d right;
+ RwV3d up;
+ RwV3d at;
+ RwV3d pos;
+ RwInt32 type;
+};
+#endif /* (!defined(DOXYGEN)) */
+
+
+/****************************************************************************
+ Function prototypes
+ */
+
+#ifdef __cplusplus
+extern "C"
+{
+#endif /* __cplusplus */
+
+/* Matrix binary format */
+extern RwUInt32 RwMatrixStreamGetSize(const RwMatrix * matrix);
+extern RwMatrix *RwMatrixStreamRead(RwStream * stream,
+ RwMatrix * matrix);
+extern const RwMatrix *RwMatrixStreamWrite(const RwMatrix * matrix,
+ RwStream * stream);
+extern RwMatrixChunkInfo *RwMatrixChunkInfoRead(RwStream * stream,
+ RwMatrixChunkInfo *
+ matrixChunkInfo,
+ RwInt32 * bytesRead);
+
+#ifdef __cplusplus
+}
+#endif /* __cplusplus */
+
+
+/*--- Automatically derived from: C:/daily/rwsdk/src/plcore/babinary.h ---*/
+/****************************************************************************
+ Defines
+ */
+
+#ifndef rwCHUNKHEADERSIZE
+#define rwCHUNKHEADERSIZE (sizeof(RwUInt32)*3)
+#endif /* rwCHUNKHEADERSIZE */
+
+/* Compatibility macro */
+#define RwStreamWriteInt(_stream, _ints, _numBytes) \
+ RwStreamWriteInt32(_stream, _ints, _numBytes)
+
+#define RwStreamReadInt(_stream, _ints, _numBytes) \
+ RwStreamReadInt32(_stream, _ints, _numBytes)
+
+#define RwMemLittleEndian(_mem, _size) \
+ RwMemLittleEndian32(_mem, _size)
+
+#define RwMemNative(_mem, _size) \
+ RwMemNative32(_mem, _size)
+
+/****************************************************************************
+ Global Types
+ */
+
+typedef struct RwChunkHeaderInfo RwChunkHeaderInfo;
+#ifndef RWADOXYGENEXTERNAL
+/**
+ * \ingroup rwstream
+ * \struct RwChunkHeaderInfo
+ * Holds data for a chunk header read from a
+ * stream with \ref RwStreamReadChunkHeaderInfo.
+ */
+#endif /* RWADOXYGENEXTERNAL */
+struct RwChunkHeaderInfo
+{
+ RwUInt32 type; /**< chunk ID - see \ref RwStreamFindChunk */
+ RwUInt32 length; /**< length of the chunk data in bytes */
+ RwUInt32 version; /**< version of the chunk data.
+ * See \ref RwEngineGetVersion. */
+ RwUInt32 buildNum; /**< build number of the RenderWare libraries
+ * previously used to stream out the data */
+ RwBool isComplex; /**< Internal Use */
+};
+
+/****************************************************************************
+ Function prototypes
+ */
+
+#ifdef __cplusplus
+extern "C"
+{
+#endif /* __cplusplus */
+
+/* Chunk header stuff */
+extern RwBool RwStreamFindChunk(RwStream *stream, RwUInt32 type,
+ RwUInt32 *lengthOut, RwUInt32 *versionOut);
+
+#define RwStreamWriteChunkHeader(stream, type, size) \
+ _rwStreamWriteVersionedChunkHeader( \
+ stream, type, size, rwLIBRARYCURRENTVERSION, RWBUILDNUMBER)
+
+extern RwStream *_rwStreamWriteVersionedChunkHeader(RwStream *stream,
+ RwInt32 type,
+ RwInt32 size,
+ RwUInt32 version,
+ RwUInt32 buildNum);
+
+extern RwStream *RwStreamWriteReal(RwStream *stream, const RwReal *reals,
+ RwUInt32 numBytes);
+extern RwStream *RwStreamWriteInt32(RwStream *stream, const RwInt32 *ints,
+ RwUInt32 numBytes);
+extern RwStream *RwStreamWriteInt16(RwStream *stream, const RwInt16 *ints,
+ RwUInt32 numBytes);
+
+extern RwStream *RwStreamReadReal(RwStream *stream, RwReal *reals,
+ RwUInt32 numBytes);
+extern RwStream *RwStreamReadInt32(RwStream *stream, RwInt32 *ints,
+ RwUInt32 numBytes);
+extern RwStream *RwStreamReadInt16(RwStream *stream, RwInt16 *ints,
+ RwUInt32 numBytes);
+
+/* Binary Portability Functions */
+extern void *RwMemLittleEndian16(void *mem, RwUInt32 size);
+extern void *RwMemLittleEndian32(void *mem, RwUInt32 size);
+extern void *RwMemNative16(void *mem, RwUInt32 size);
+extern void *RwMemNative32(void *mem, RwUInt32 size);
+extern void *RwMemRealToFloat32(void *mem, RwUInt32 size);
+extern void *RwMemFloat32ToReal(void *mem, RwUInt32 size);
+
+extern RwStream *
+RwStreamReadChunkHeaderInfo(RwStream *stream, RwChunkHeaderInfo *chunkHeaderInfo);
+
+#ifdef __cplusplus
+}
+#endif /* __cplusplus */
+
+#endif /* RWPLCORE_H */