re3/rwsdk/include/d3d8/rwplcore.h

6081 lines
228 KiB
C

/******************************************/
/* */
/* 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: Wed Jul 10 10:45:00 2002
*
************************************************************************/
#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): */
#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 */
#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): */
#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 */
#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(_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
RwFastRealToUInt32(RwReal x)
{
RwUInt32 res;
__asm FLD DWord Ptr[x];
__asm FISTP DWord Ptr[res];
return(res);
}
#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;
union _rwIEEEFloatShapeType
{
float value;
unsigned int word;
};
#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 D3D7, 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 D3D7, 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 0x33002
/*
* 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. */
/**
* \ingroup rwcore
* \page rwcoreoverview Core Library Overview
*
* LIBRARY: rwcore.lib
* HEADER: rwcore.h
*
* This 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.
*/
#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))
/* #include <windows.h> */
#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;
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 */
};
/*****************/
/* Complex types */
/*****************/
/**
* \ingroup datatypes
* \typedef RwV2d
* typedef for struct RwV2d
*/
typedef struct RwV2d RwV2d;
/**
* \ingroup datatypes
* \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 */
};
/**
* \ingroup datatypes
* \typedef RwV3d
* typedef for struct RwV3d
*/
typedef struct RwV3d RwV3d;
/**
* \ingroup datatypes
* \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))))
/**
* \ingroup datatypes
* \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.
*/
struct RwV4d
{
RwReal x; /**< X value */
RwReal y; /**< Y value */
RwReal z; /**< Z value */
RwReal w; /**< W value */
};
/**
* \ingroup datatypes
* \typedef RwV4d
* typedef for struct RwV4d
*/
typedef struct RwV4d RWALIGN(RwV4d, rwV4DALIGNMENT);
/**
* \ingroup datatypes
* \typedef RwRect
* typedef for struct RwRect
*/
typedef struct RwRect RwRect;
/**
* \ingroup datatypes
* \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).
*/
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 */
};
/**
* \ingroup datatypes
* \typedef RwSphere
* typedef for struct RwSphere
*/
typedef struct RwSphere RwSphere;
/**
* \ingroup datatypes
* \struct RwSphere
* This type represents a sphere specified by the position
* of its center and its radius
*/
struct RwSphere
{
RwV3d center; /**< Sphere center */
RwReal radius; /**< Sphere radius */
};
#if (!defined(RwSphereAssign))
#define RwSphereAssign(_target, _source) \
( *(_target) = *(_source) )
#endif /* (!defined(RwSphereAssign)) */
/**
* \ingroup datatypes
* \typedef RwLine
* typedef for struct RwLine
*/
typedef struct RwLine RwLine;
/**
* \ingroup datatypes
* \struct RwLine
* This type represents a 3D line specified by the position
* of its start and end points.
*/
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
/**
* \ingroup datatypes
* RwTextureCoordinateIndex
* This type represents the index for texture coordinates.
*/
enum RwTextureCoordinateIndex
{
rwNARWTEXTURECOORDINATEINDEX = 0,
rwTEXTURECOORDINATEINDEX0,
rwTEXTURECOORDINATEINDEX1,
rwTEXTURECOORDINATEINDEX2,
rwTEXTURECOORDINATEINDEX3,
rwTEXTURECOORDINATEINDEX4,
rwTEXTURECOORDINATEINDEX5,
rwTEXTURECOORDINATEINDEX6,
rwTEXTURECOORDINATEINDEX7,
rwTEXTURECOORDINATEINDEXFORCEENUMSIZEINT = RWFORCEENUMSIZEINT
};
typedef enum RwTextureCoordinateIndex RwTextureCoordinateIndex;
/**
* \ingroup datatypes
* \typedef RwTexCoords
* typedef for struct RwTexCoords
*/
typedef struct RwTexCoords RwTexCoords;
/**
* \ingroup datatypes
* \struct RwTexCoords
* This type represents the the u and v texture
* coordinates of a particular vertex.
*/
struct RwTexCoords
{
RwReal u; /**< U value */
RwReal v; /**< V value */
};
/* Singley linked list macros. End marked as NULL */
typedef struct RwSLLink RwSLLink; /*** RwSLLink ***/
struct RwSLLink
{
RwSLLink *next;
};
#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;
struct RwSingleList
{
RwSLLink link;
};
#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 ***/
struct RwLLLink
{
RwLLLink *next;
RwLLLink *prev;
};
#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;
struct RwLinkList
{
RwLLLink link;
};
#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))
/**
* \ingroup datatypes
* \typedef RwSurfaceProperties
* typedef for struct RwSurfaceProperties
*/
typedef struct RwSurfaceProperties RwSurfaceProperties;
/**
* \ingroup datatypes
* \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).
*/
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 RwFixedCast(A) (RwInt32FromRealMacro((A) * 65536.0f))
#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 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 FxCast RwFixedCast
#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;
/*
* This type represents a plane
*/
struct RwPlane
{
RwV3d normal; /**< Normal to the plane */
RwReal distance; /**< Distance to plane from origin in normal direction*/
};
/****************************************************************************
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 SETCONTCOORD(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 rwcore
* \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 datatypes
* \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 datatypes
* \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 RwFixedCast(x) Cast the integer portion of an RwFixed to another type.
* \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.)
*/
/**
* \ingroup datatypes
* \typedef RwInt8
*
* Signed 8 bit integer type.
* \see \ref inttypes
*/
/**
* \ingroup datatypes
* \typedef RwUInt8
*
* Unsigned 8bit integer type.
* \see \ref inttypes
*/
/**
* \ingroup datatypes
* \typedef RwChar
*
* Character type.
* \see \ref inttypes
*/
/**
* \ingroup datatypes
* \typedef RwInt16
*
* Signed 16 bit integer type.
* \see \ref inttypes
*/
/**
* \ingroup datatypes
* \typedef RwUInt16
*
* Unsigned 16 bit integer type.
* \see \ref inttypes
*/
/**
* \ingroup datatypes
* \typedef RwInt32
*
* Signed 32 bit integer type.
* \see \ref inttypes
*/
/**
* \ingroup datatypes
* \typedef RwUInt32
*
* Unsigned 32 bit integer type.
* \see \ref inttypes
*/
/**
* \ingroup datatypes
* \typedef RwInt64
*
* Signed 64 bit integer type.
* \see \ref inttypes
*/
/**
* \ingroup datatypes
* \typedef RwUInt64
*
* Unsigned 64 bit integer type.
* \see \ref inttypes
*/
/**
* \ingroup datatypes
* \typedef RwInt128
*
* Signed 128 bit integer type.
* \see \ref inttypes
*/
/**
* \ingroup datatypes
* \typedef RwUInt128
*
* Unsigned 128 bit integer type.
* \see \ref inttypes
*/
/**
* \ingroup datatypes
* \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,
/* Insert before MAX and increment MAX */
rwID_COREPLUGINIDMAX = 0x26,
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;
/**
* \ingroup datatypes
* \struct RwObject
* This should be considered an opaque type. Use
* the RwObject API functions to access.
*/
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 */
};
/**
* \ingroup datatypes
* \typedef RwObjectCallBack
* callback function supplied for object callback functions.
*
* \return Pointer to the current object
*
* \param object Pointer to the current object, supplied by
* iterator.
* \param data Pointer to developer-defined data structure.
*
* \see RwFrameForAllObjects
*
*/
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;
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;
};
/*--- 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)->alignmentMinusOne)) )
/*****************************
* REGULAR MEMORY ALLOCATION *
*****************************/
/**
* \ingroup rwmem
* \def RwMalloc
* RwMalloc(_s) is a macro for malloc(_s).
*/
/**
* \ingroup rwmem
* \def RwFree
* RwFree(_p) is a macro for free(_p).
*/
/**
* \ingroup rwmem
* \def RwCalloc
* RwCalloc(_n, _s) is a macro for calloc(_n, _s).
*/
/**
* \ingroup rwmem
* \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))
/* Pick up _ASSERTE() macro */
/* #include <windows.h> */
#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 datatypes
* \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 (see API function \ref 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 */
};
typedef struct RwFreeBlock RwFreeBlock;
/*
* Freelists -- from Page 131
* Advanced Animation and Rendering Techniques
* Alan Watt and Mark Watt
* Addison-Wesley 1993,
* ISBN 0-201-54412-1:
*
* "Lastly, on a more general note concerning speedups for renderers, the
* implementor should be aware that a lot of suggestions for improving
* efficiency fall into the category of ingenious, but complex,
* algorithms for very specific contexts that may save a few microseconds
* but which make your code unreadable. A more general computer science
* perspective that takes a `global view' of the renderer can be more
* fruitful. For example, the renderer devotes a lot of time to
* allocating and deallocating chunks of memory for storing data. A lot
* of these chunks are always the same size - such as those that are
* continually required to store the data structure for fragment lists.
* Using memory management techniques that recognize this fact can yield
* considerable dividends. One such scheme would be to hold a series of
* empty lists in memory for all the commonly used data structures. An
* empty list for fragments, say, would contain a list of previously
* allocated, but no longer needed, fragment structures. When the
* renderer needs memory for a new fragment, it looks first at this empty
* list. If there is nothing there it allocates space directly,
* otherwise it takes a fragments off the end of the list and uses that.
* Conversely, when the renderer no longer needs a fragment, instead of
* freeing it, it goes onto the end of the empty list. In the authors'
* experience, replacing the naive allocate/deallocate scheme with this
* way of managing memory can result in 100% speedup. "
*/
struct RwFreeBlock
{
RwFreeBlock *nextBlock;
};
typedef struct RwFreeList RwFreeList;
struct RwFreeList
{
void **freeListStack; /* Stack of unused entries */
void **freeListStackTop; /* Pointer to the top of the stack */
RwFreeBlock *firstBlock; /* Data start */
RwInt32 blockSize; /* Size of block in bytes */
RwInt32 entrySize; /* Entry size */
RwInt32 alignmentMinusOne; /* Entry alignment minus 1 */
RwInt32 entriesPerBlock; /* Amount of space in a block */
RwInt32 entriesAllocated; /* Total slots allocated
* (but not necessarily being used */
/* All freelists */
RwLLLink lFreeList;
#if (defined(RWDEBUG) && !defined(DOXYGEN))
const RwChar *fileCreate;
RwUInt32 lineCreate;
#endif /* (defined(RWDEBUG) && !defined(DOXYGEN)) */
};
/**
* \ingroup datatypes
* \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
*
*/
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)) */
extern RwFreeList *RwFreeListCreate(RwInt32 entrySize,
RwInt32 entriesPerBlock,
RwInt32 alignment);
#endif /* (defined(RWDEBUG) && !defined(DOXYGEN)) */
extern RwBool RwFreeListDestroy(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((1 + (_f)->alignmentMinusOne), (_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 datatypes
* \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 datatypes
* \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 datatypes
* \typedef 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 datatypes
* \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 datatypes
* \typedef 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 datatypes
* \union RwStreamUnion
* The union of all supported stream types
*/
union RwStreamUnion
{
RwStreamMemory memory; /**< memory */
RwStreamFile file; /**< file */
RwStreamCustom custom; /**< custom */
};
/**
* \ingroup datatypes
* \typedef 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 datatypes
* \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 */
/* 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
*/
/**
* \ingroup datatypes
* \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 datatypes
* \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 datatypes
* \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 datatypes
* \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.
*/
typedef RwBool(*RwPluginDataChunkAlwaysCallBack)(void *object, RwInt32 offsetInObject, RwInt32 sizeInObject);
/**
* \ingroup datatypes
* \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.
*/
typedef RwBool(*RwPluginDataChunkRightsCallBack)(void *object, RwInt32 offsetInObject, RwInt32 sizeInObject, RwUInt32 extraData);
/**
* \ingroup datatypes
* \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 datatypes
* \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 datatypes
* \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.
*/
typedef void *(*RwPluginObjectDestructor)(void *object, RwInt32 offsetInObject, RwInt32 sizeInObject);
typedef void *(*RwPluginErrorStrCallBack)(void *);
typedef struct RwPluginRegistry RwPluginRegistry;
typedef struct RwPluginRegEntry RwPluginRegEntry;
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;
};
/****************************************************************************
Function prototypes
*/
#ifdef __cplusplus
extern "C"
{
#endif /* __cplusplus */
/* Registering toolkits and allocating memory */
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))) */
/**
* \ingroup datatypes
* 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
*/
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
};
/**
* \ingroup datatypes
* \typedef RwOpCombineType typedef for enum RwOpCombineType
*/
typedef enum RwOpCombineType RwOpCombineType;
/* External flags (bits 0-15) */
/* Internal flags (bits 16-31) */
enum RwMatrixType
{
rwMATRIXTYPENORMAL = 0x00000001,
rwMATRIXTYPEORTHOGANAL = 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 datatypes
* \typedef 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);
/*
* \ingroup datatypes
* \typedef RwMatrixTolerance
* Typedef for RwMatrixTolerance structure
*/
typedef struct RwMatrixTolerance RwMatrixTolerance;
/*
* \ingroup datatypes
* \struct RwMatrixTolerance
* Holds tolerances for matrix optimizations with \ref RwMatrixOptimize
*/
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 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 */ \
rwMATRIXTYPEORTHOGANAL) ) || /* ... 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)) */
#include <windows.h>
#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
/* LEGACY-SUPPORT macros */
#define RWIM2DVERTEXSetCameraX(vert, camx) RwIm2DVertexSetCameraX(vert, camx)
#define RWIM2DVERTEXSetCameraY(vert, camy) RwIm2DVertexSetCameraY(vert, camy)
#define RWIM2DVERTEXSetCameraZ(vert, camz) RwIm2DVertexSetCameraZ(vert, camz)
#define RWIM2DVERTEXSetRecipCameraZ(vert, recipz) \
RwIm2DVertexSetRecipCameraZ(vert, recipz)
#define RWIM2DVERTEXGetCameraX(vert) RwIm2DVertexGetCameraX(vert)
#define RWIM2DVERTEXGetCameraY(vert) RwIm2DVertexGetCameraY(vert)
#define RWIM2DVERTEXGetCameraZ(vert) RwIm2DVertexGetCameraZ(vert)
#define RWIM2DVERTEXGetRecipCameraZ(vert) RwIm2DVertexGetRecipCameraZ(vert)
#define RWIM2DVERTEXSetScreenX(vert, scrnx) RwIm2DVertexSetScreenX(vert, scrnx)
#define RWIM2DVERTEXSetScreenY(vert, scrny) RwIm2DVertexSetScreenY(vert, scrny)
#define RWIM2DVERTEXSetScreenZ(vert, scrnz) RwIm2DVertexSetScreenZ(vert, scrnz)
#define RWIM2DVERTEXGetScreenX(vert) RwIm2DVertexGetScreenX(vert)
#define RWIM2DVERTEXGetScreenY(vert) RwIm2DVertexGetScreenY(vert)
#define RWIM2DVERTEXGetScreenZ(vert) RwIm2DVertexGetScreenZ(vert)
#define RWIM2DVERTEXSetU(vert, u, recipz) RwIm2DVertexSetU(vert, u, recipz)
#define RWIM2DVERTEXSetV(vert, v, recipz) RwIm2DVertexSetV(vert, v, recipz)
#define RWIM2DVERTEXGetU(vert) RwIm2DVertexGetU(vert)
#define RWIM2DVERTEXGetV(vert) RwIm2DVertexGetV(vert)
#define RWIM2DVERTEXSetRealRGBA(vert, red, green, blue, alpha) \
RwIm2DVertexSetRealRGBA(vert, red, green, blue, alpha)
#define RWIM2DVERTEXSetIntRGBA(vert, red, green, blue, alpha) \
RwIm2DVertexSetIntRGBA(vert, red, green, blue, alpha)
#define RWIM2DVERTEXGetRed(vert) RwIm2DVertexGetRed(vert)
#define RWIM2DVERTEXGetGreen(vert) RwIm2DVertexGetGreen(vert)
#define RWIM2DVERTEXGetBlue(vert) RwIm2DVertexGetBlue(vert)
#define RWIM2DVERTEXGetAlpha(vert) RwIm2DVertexGetAlpha(vert)
#define RWIM2DVERTEXCopyRGBA(dst, src) RwIm2DVertexCopyRGBA(dst, src)
#define RWIM2DVERTEXClipRGBA(o, i, n, f) RwIm2DVertexClipRGBA(o, i, n, f)
/****************************************************************************
Global Types
*/
/* We use RwD3D8Vertex to drive the hardware in 2D mode */
/**
* \ingroup rwcoredriverd3d8
* \typedef RwD3D8Vertex
* D3D8 vertex structure definition for 2D geometry
*/
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 */
};
/* Define types used */
/**
* \ingroup rwcoredriverd3d8
* \typedef RwIm2DVertex
* Typedef for a RenderWare Graphics Immediate Mode 2D Vertex
*/
typedef RwD3D8Vertex RwIm2DVertex;
/* LEGACY-SUPPORT macro */
/**
* \ingroup rwcoredriverd3d8
* \def RWIM2DVERTEX
* RWIM2DVERTEX is a legacy macro for RwIm2DVertex
*/
#define RWIM2DVERTEX RwIm2DVertex
/**
* \ingroup rwcoredriverd3d8
* \typedef RxVertexIndex
*
* Typedef for a RenderWare Graphics PowerPipe Immediate
* Mode Vertex
*/
typedef RwUInt16 RxVertexIndex;
/**
* \ingroup rwcoredriverd3d8
* \typedef RwImVertexIndex
* Typedef for a RenderWare Graphics Immediate Mode Vertex.
*/
typedef RxVertexIndex RwImVertexIndex;
/* LEGACY-SUPPORT macro */
/**
* \ingroup rwcoredriverd3d8
* \def RWIMVERTEXINDEX
* RWIMVERTEXINDEX is a legacy macro for RwImVertexIndex
*/
#define RWIMVERTEXINDEX RwImVertexIndex
/**
* \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 */
}
RwD3D8Metrics;
#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
* D3D7, 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;
struct RwSList
{
RwUInt8 *listElements;
RwInt32 numElementsFilled;
RwInt32 numElementsAlloced;
RwInt32 entrySize;
};
/****************************************************************************
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
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! */
/**
* \ingroup datatypes
* RwRenderState
* This type represents the various render states that
* can be set using the API function \ref RwRenderStateSet. This function also
* takes a render state value or pointer to an object depending on the type.
* For render states that are toggles, the value should be TRUE to switch the
* state on and FALSE to turn it off.
*
* Note that many of these render states may not be supported on certain
* platforms. The \ref RwRenderStateSet functions will return FALSE in such cases.
*/
enum RwRenderState
{
rwRENDERSTATENARENDERSTATE = 0,
rwRENDERSTATETEXTURERASTER, /**<Raster to texture with. \ref RwRenderStateSet
* takes 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 */
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, /**<Source alpha \ref RwBlendFunction: src alpha, 1-src alpha, etc */
rwRENDERSTATEDESTBLEND, /**<Destination alpha \ref RwBlendFunction */
rwRENDERSTATEVERTEXALPHAENABLE, /**<Vertex alpha transparency on/off */
rwRENDERSTATEBORDERCOLOR, /**<Border color for \ref RwTextureAddressMode rwTEXTUREADDRESSBORDER.
* The value should be a packed RwUInt32 in ARGB form. 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 ARGB form. The macro RWRGBALONG(r, g, b, a) may be used to
* construct this using 8-bit color components */
rwRENDERSTATEFOGTYPE, /**<Sets \ref RwFogType, the type of fogging to use */
rwRENDERSTATEFOGDENSITY, /**<Select the fog density for \ref RwFogType of rwFOGTYPEEXPONENTIAL
* or rwFOGTYPEEXPONENTIAL2. The value should be a pointer to
* an RwReal in the range 0 to 1. */
rwRENDERSTATEFOGTABLE, /**<Install a 256 entry fog table placed between fog distance and far
* clip-plane */
rwRENDERSTATEALPHAPRIMITIVEBUFFER, /**<Render transparent alpha polygons last - on/off. \e Not \e supported
* \e on \e any \e platform.*/
rwRENDERSTATECULLMODE, /**<Sets \ref RwCullMode, for selecting face culling. */
rwRENDERSTATESTENCILENABLE, /**< TRUE to enable stenciling, or FALSE to disable stenciling.
* \e Supported \e on \e Xbox, \e D3D8, \e and \e OpenGL \e only. */
rwRENDERSTATESTENCILFAIL, /**< Stencil test operator for the fail case.
* \e Supported \e on \e Xbox, \e D3D8, \e and \e OpenGL \e only */
rwRENDERSTATESTENCILZFAIL, /**< Stencil operation to perform if the stencil test passes
* and the depth test (z-test) fails.
* \e Supported \e on \e Xbox, \e D3D8, \e and \e OpenGL \e only */
rwRENDERSTATESTENCILPASS, /**< Stencil operation to perform if both the stencil and the
* depth (z) tests pass.
* \e Supported \e on \e Xbox, \e D3D8, \e and \e OpenGL \e only */
rwRENDERSTATESTENCILFUNCTION, /**< Comparison function for the stencil test.
* \e Supported \e on \e Xbox, \e D3D8, \e and \e OpenGL \e only */
rwRENDERSTATESTENCILFUNCTIONREF, /**< Integer reference value for the stencil test.
* \e Supported \e on \e Xbox, \e D3D8, \e and \e OpenGL \e only */
rwRENDERSTATESTENCILFUNCTIONMASK, /**< Mask applied to the reference value and each stencil buffer
* entry to determine the significant bits for the stencil test.
* \e Supported \e on \e Xbox, \e D3D8, \e and \e OpenGL \e only */
rwRENDERSTATESTENCILFUNCTIONWRITEMASK, /**< Write mask applied to values written into the stencil buffer.
* \e Supported \e on \e Xbox, \e D3D8, \e and \e OpenGL \e only */
rwRENDERSTATEFORCEENUMSIZEINT = RWFORCEENUMSIZEINT
};
typedef enum RwRenderState RwRenderState;
/**
* \ingroup datatypes
* RwShadeMode
* This type represents the options available for setting the
* rwRENDERSTATESHADEMODE render state */
enum RwShadeMode
{
rwSHADEMODENASHADEMODE = 0, /**<Invalid shading mode */
rwSHADEMODEFLAT, /**<Flat shading */
rwSHADEMODEGOURAUD, /**<Gouraud shading */
rwSHADEMODEFORCEENUMSIZEINT = RWFORCEENUMSIZEINT
};
typedef enum RwShadeMode RwShadeMode;
/**
* \ingroup datatypes
* RwTextureFilterMode
* This type represents the options available for texture
* filtering (see API functions \ref RwTextureSetFilterMode and \ref RwRenderStateSet)*/
enum RwTextureFilterMode
{
rwFILTERNAFILTERMODE = 0, /**<Invalid filter mode */
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;
/**
* \ingroup datatypes
* RwFogType
* This type represents the options available to the
* rwRENDERSTATEFOGTYPE render state (see \ref RwRenderState);*/
enum RwFogType
{
rwFOGTYPENAFOGTYPE = 0, /**<Invalid fog type */
rwFOGTYPELINEAR, /**<Linear fog */
rwFOGTYPEEXPONENTIAL, /**<Exponential fog */
rwFOGTYPEEXPONENTIAL2, /**<Exponential^2 fog */
rwFOGTYPEFORCEENUMSIZEINT = RWFORCEENUMSIZEINT
};
typedef enum RwFogType RwFogType;
/**
* \ingroup datatypes
* RwBlendFunction
* This type represents the options available
* to the rwRENDERSTATESRCBLEND and rwRENDERSTATEDESTBLEND render states
* (see \ref RwRenderState). In the following description,
* a subscript s refers to a source value while subscript d refers to a
* destination value.*/
enum RwBlendFunction
{
rwBLENDNABLEND = 0, /**<Invalid blend mode */
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;
/**
* \ingroup datatypes
* RwTextureAddressMode
* This type represents the options available for
* applying textures to polygons (see API functions \ref RwTextureSetAddressing
* and \ref RwRenderStateSet, and the \ref RwRenderState type) */
enum RwTextureAddressMode
{
rwTEXTUREADDRESSNATEXTUREADDRESS = 0, /**<Invalid addressing mode */
rwTEXTUREADDRESSWRAP, /**<UV wraps (tiles) */
rwTEXTUREADDRESSMIRROR, /**<Alternate UV is flipped */
rwTEXTUREADDRESSCLAMP, /**<UV is clamped to 0-1 */
rwTEXTUREADDRESSBORDER, /**<Border colour takes effect outside of 0-1 */
rwTEXTUREADDRESSMODEFORCEENUMSIZEINT = RWFORCEENUMSIZEINT
};
typedef enum RwTextureAddressMode RwTextureAddressMode;
/**
* \ingroup datatypes
* RwStencilOperation
* This type represents the stencil operations to perform
* based on the results of the
* \ref rwRENDERSTATESTENCILFAIL, \ref rwRENDERSTATESTENCILZFAIL
* and \ref rwRENDERSTATESTENCILPASS tests.
*/
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;
/**
* \ingroup datatypes
* RwStencilFunction
* This type represents the options available for
* the comparison function for the stencil test \ref rwRENDERSTATESTENCILFUNCTION.
*/
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;
/**
* \ingroup datatypes
* RwCullMode
* This type represents the options available for culling polygons during rendering.
* and \ref RwRenderStateSet, and the \ref RwRenderState type) */
enum RwCullMode
{
rwCULLMODENACULLMODE = 0,
rwCULLMODECULLNONE, /**< Both front and back-facing triangles are drawn. */
rwCULLMODECULLBACK, /**< Just front-facing triangles are drawn */
rwCULLMODECULLFRONT, /**< Just rear-facing triangles are drawn */
rwCULLMODEFORCEENUMSIZEINT = RWFORCEENUMSIZEINT
};
typedef enum RwCullMode RwCullMode;
/**
* \ingroup datatypes
* 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.*/
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;
/**
* \ingroup datatypes
* \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:
*/
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;
/**
* \ingroup datatypes
* \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 */
};
typedef struct RwMetrics RwMetrics;
/**
* \ingroup datatypes
* \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.
*/
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;
/**
* \ingroup datatypes
* \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). */
struct RwSubSystemInfo
{
RwChar name[SUBSYSTEMNAME_MAXLEN]; /**< Sub system string */
};
/* Video modes */
/* These are flag bits which may be ORd */
/**
* \ingroup datatypes
* 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.
*/
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;
/**
* \ingroup datatypes
* \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): */
struct RwVideoMode
{
RwInt32 width; /**< Width */
RwInt32 height; /**< Height */
RwInt32 depth; /**< Depth */
RwVideoModeFlag flags; /**< Flags */
};
/**
* \ingroup datatypes
* 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.
*/
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(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
*/
/*
* \typedef rwFnFexist
* Returns TRUE if file with given name exists, FALSE if it doesn't.
*/
typedef RwBool (*rwFnFexist)(const RwChar *name);
/*
* \typedef rwFnFopen
* Mimics ANSI C Standard Library fopen.
*/
typedef void *(*rwFnFopen)(const RwChar *name, const RwChar *mode);
/*
* \typedef rwFnFclose
* Mimics ANSI C Standard Library fclose.
*/
typedef int (*rwFnFclose)(void *fptr);
/*
* \typedef rwFnFread
* Mimics ANSI C Standard Library fread.
*/
typedef size_t (*rwFnFread)(void *addr, size_t size, size_t count, void *fptr);
/*
* \typedef rwFnFwrite
* Mimics ANSI C Standard Library fwrite.
*/
typedef size_t (*rwFnFwrite)(const void *addr, size_t size, size_t count, void *fptr);
/*
* \typedef rwFnFgets
* Mimics ANSI C Standard Library fgets.
*/
typedef RwChar *(*rwFnFgets)(RwChar *buffer, int maxLen, void *fptr);
/*
* \typedef rwFnFputs
* Mimics ANSI C Standard Library fputs.
*/
typedef int (*rwFnFputs)(const RwChar *buffer, void *fptr);
/*
* \typedef rwFnFeof
* Mimics ANSI C Standard Library feof.
*/
typedef int (*rwFnFeof)(void *fptr);
/*
* \typedef rwFnFseek
* Mimics ANSI C Standard Library fseek.
*/
typedef int (*rwFnFseek)(void *fptr, long offset, int origin);
/*
* \typedef rwFnFflush
* Mimics ANSI C Standard Library fflush.
*/
typedef int (*rwFnFflush)(void *fptr);
/*
* \typedef rwFnFtell
* Mimics ANSI C Standard Library ftell.
*/
typedef int (*rwFnFtell)(void *fptr);
/**
* \ingroup datatypes
* \typedef RwFileFunctions
* typedef for struct RwFileFunctions
*/
typedef struct RwFileFunctions RwFileFunctions;
/**
* \ingroup datatypes
* \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;
/**
* \ingroup datatypes
* \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.
*/
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 datatypes
* 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 datatypes
* \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, ...);
extern RwChar *_rwdbsprintf(const RwChar * format,
...) __RWFORMAT__(printf, 1, 2);
#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;
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;
};
/****************************************************************************
Program wide globals
*/
#ifdef __cplusplus
extern "C"
{
#endif /* __cplusplus */
#ifdef RWGLOBALSIZE
extern RwUInt32 ourGlobals[RWGLOBALSIZE / sizeof(RwUInt32)];
#define RwEngineInstance ourGlobals
#else /* RWGLOBALSIZE */
extern void *RwEngineInstance;
#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)
/**
* \ingroup datatypes
* \typedef RwResEntry
* RwResEntry object. Instanced data block in resources arena.
* This should be considered an opaque
* type. Use the RwResEntry API functions to access.
*/
typedef struct RwResEntry RwResEntry;
/**
* \ingroup datatypes
* \typedef RwResEntryDestroyNotify
* This 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.
*/
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;
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;
};
#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;
/**
* \ingroup datatypes
* \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.
*/
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;
/**
* \ingroup datatypes
* \struct RwRGBA
* This structure represents a RGBA color
* which has integer components specified in the range 0 to 255. */
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;
struct rwStreamMatrix
{
RwV3d right;
RwV3d up;
RwV3d at;
RwV3d pos;
RwInt32 type;
};
/****************************************************************************
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;
/**
* \ingroup datatypes
* \struct RwChunkHeaderInfo
* Holds data for a chunk header read from a
* stream with \ref RwStreamReadChunkHeaderInfo. */
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 */