mirror of
https://github.com/GTAmodding/re3.git
synced 2024-11-27 08:43:43 +00:00
6080 lines
228 KiB
C
6080 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)) */
|
|
|
|
//nobody needed that - AAP
|
|
//#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 */
|