#pragma once
typedef rw::int8 RwInt8;
typedef rw::int16 RwInt16;
typedef rw::int32 RwInt32;
typedef rw::uint8 RwUInt8;
typedef rw::uint16 RwUInt16;
typedef rw::uint32 RwUInt32;
typedef rw::float32 RwReal;
typedef char RwChar;
typedef RwInt32 RwBool;
#define __RWUNUSED__
#ifndef FALSE
#define FALSE 0
#endif
#ifndef TRUE
#define TRUE !FALSE
#endif
// used for unicode
#define RWSTRING(x) x
typedef rw::V2d RwV2d;
typedef rw::V3d RwV3d;
typedef rw::Rect RwRect;
typedef rw::Sphere RwSphere;
enum RwTextureCoordinateIndex
{
rwNARWTEXTURECOORDINATEINDEX = 0,
rwTEXTURECOORDINATEINDEX0,
rwTEXTURECOORDINATEINDEX1,
rwTEXTURECOORDINATEINDEX2,
rwTEXTURECOORDINATEINDEX3,
rwTEXTURECOORDINATEINDEX4,
rwTEXTURECOORDINATEINDEX5,
rwTEXTURECOORDINATEINDEX6,
rwTEXTURECOORDINATEINDEX7,
};
typedef rw::TexCoords RwTexCoords;
typedef rw::SurfaceProperties RwSurfaceProperties;
#define RWRGBALONG(r,g,b,a) \
((RwUInt32) (((a) << 24) | ((r) << 16) | ((g) << 8) | (b)))
#define MAKECHUNKID(vendorID, chunkID) (((vendorID & 0xFFFFFF) << 8) | (chunkID & 0xFF))
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,
};
/*
***********************************************
*
* RwObject
*
***********************************************
*/
//struct RwObject;
typedef rw::Object RwObject;
typedef rw::Frame RwFrame;
typedef RwObject *(*RwObjectCallBack)(RwObject *object, void *data);
RwUInt8 RwObjectGetType(const RwObject *obj);
RwFrame* rwObjectGetParent(const RwObject *obj);
#define rwsprintf sprintf
#define rwvsprintf vsprintf
#define rwstrcpy strcpy
#define rwstrncpy strncpy
#define rwstrcat strcat
#define rwstrncat strncat
#define rwstrrchr strrchr
#define rwstrchr strchr
#define rwstrstr strstr
#define rwstrcmp strcmp
#define rwstricmp stricmp
#define rwstrlen strlen
#define rwstrupr strupr
#define rwstrlwr strlwr
#define rwstrtok strtok
#define rwsscanf sscanf
/*
***********************************************
*
* Memory
*
***********************************************
*/
struct RwMemoryFunctions
{
// NB: from RW 3.6 on the allocating functions take
// a hint parameter!
void *(*rwmalloc)(size_t size);
void (*rwfree)(void *mem);
void *(*rwrealloc)(void *mem, size_t newSize);
void *(*rwcalloc)(size_t numObj, size_t sizeObj);
};
void *RwMalloc(size_t size);
void RwFree(void *mem);
void *RwRealloc(void *mem, size_t newSize);
void *RwCalloc(size_t numObj, size_t sizeObj);
/*
***********************************************
*
* RwStream
*
***********************************************
*/
//struct RwStream;
typedef rw::Stream RwStream;
struct RwMemory
{
RwUInt8 *start;
RwUInt32 length;
};
enum RwStreamType
{
rwNASTREAM = 0,
rwSTREAMFILE,
rwSTREAMFILENAME,
rwSTREAMMEMORY,
rwSTREAMCUSTOM
};
enum RwStreamAccessType
{
rwNASTREAMACCESS = 0,
rwSTREAMREAD,
rwSTREAMWRITE,
rwSTREAMAPPEND
};
RwStream *RwStreamOpen(RwStreamType type, RwStreamAccessType accessType, const void *pData);
RwBool RwStreamClose(RwStream * stream, void *pData);
RwUInt32 RwStreamRead(RwStream * stream, void *buffer, RwUInt32 length);
RwStream *RwStreamWrite(RwStream * stream, const void *buffer, RwUInt32 length);
RwStream *RwStreamSkip(RwStream * stream, RwUInt32 offset);
/*
***********************************************
*
* Plugin Registry
*
***********************************************
*/
#define RWPLUGINOFFSET(_type, _base, _offset) \
((_type *)((RwUInt8 *)(_base) + (_offset)))
typedef RwStream *(*RwPluginDataChunkWriteCallBack)(RwStream *stream, RwInt32 binaryLength, const void *object, RwInt32 offsetInObject, RwInt32 sizeInObject);
typedef RwStream *(*RwPluginDataChunkReadCallBack)(RwStream *stream, RwInt32 binaryLength, void *object, RwInt32 offsetInObject, RwInt32 sizeInObject);
typedef RwInt32(*RwPluginDataChunkGetSizeCallBack)(const void *object, RwInt32 offsetInObject, RwInt32 sizeInObject);
typedef RwBool(*RwPluginDataChunkAlwaysCallBack)(void *object, RwInt32 offsetInObject, RwInt32 sizeInObject);
typedef RwBool(*RwPluginDataChunkRightsCallBack)(void *object, RwInt32 offsetInObject, RwInt32 sizeInObject, RwUInt32 extraData);
typedef void *(*RwPluginObjectConstructor)(void *object, RwInt32 offsetInObject, RwInt32 sizeInObject);
typedef void *(*RwPluginObjectCopy)(void *dstObject, const void *srcObject, RwInt32 offsetInObject, RwInt32 sizeInObject);
typedef void *(*RwPluginObjectDestructor)(void *object, RwInt32 offsetInObject, RwInt32 sizeInObject);
/*
***********************************************
*
* RwMatrix
*
***********************************************
*/
typedef rw::Matrix RwMatrix;
enum RwOpCombineType
{
rwCOMBINEREPLACE = rw::COMBINEREPLACE,
rwCOMBINEPRECONCAT = rw::COMBINEPRECONCAT,
rwCOMBINEPOSTCONCAT = rw::COMBINEPOSTCONCAT
};
enum RwMatrixType
{
rwMATRIXTYPENORMAL = rw::Matrix::TYPENORMAL,
rwMATRIXTYPEORTHOGANAL = rw::Matrix::TYPEORTHOGONAL,
rwMATRIXTYPEORTHONORMAL = rw::Matrix::TYPEORTHONORMAL,
rwMATRIXTYPEMASK = 0x00000003,
};
typedef rw::Matrix::Tolerance RwMatrixTolerance;
RwBool RwMatrixDestroy(RwMatrix *mpMat);
RwMatrix *RwMatrixCreate(void);
void RwMatrixCopy(RwMatrix * dstMatrix, const RwMatrix * srcMatrix);
void RwMatrixSetIdentity(RwMatrix * matrix);
RwMatrix *RwMatrixMultiply(RwMatrix * matrixOut, const RwMatrix * MatrixIn1, const RwMatrix * matrixIn2);
RwMatrix *RwMatrixTransform(RwMatrix * matrix, const RwMatrix * transform, RwOpCombineType combineOp);
RwMatrix *RwMatrixOrthoNormalize(RwMatrix * matrixOut, const RwMatrix * matrixIn);
RwMatrix *RwMatrixInvert(RwMatrix * matrixOut, const RwMatrix * matrixIn);
RwMatrix *RwMatrixScale(RwMatrix * matrix, const RwV3d * scale, RwOpCombineType combineOp);
RwMatrix *RwMatrixTranslate(RwMatrix * matrix, const RwV3d * translation, RwOpCombineType combineOp);
RwMatrix *RwMatrixRotate(RwMatrix * matrix, const RwV3d * axis, RwReal angle, RwOpCombineType combineOp);
RwMatrix *RwMatrixRotateOneMinusCosineSine(RwMatrix * matrix, const RwV3d * unitAxis, RwReal oneMinusCosine, RwReal sine, RwOpCombineType combineOp);
const RwMatrix *RwMatrixQueryRotate(const RwMatrix * matrix, RwV3d * unitAxis, RwReal * angle, RwV3d * center);
RwV3d *RwMatrixGetRight(RwMatrix * matrix);
RwV3d *RwMatrixGetUp(RwMatrix * matrix);
RwV3d *RwMatrixGetAt(RwMatrix * matrix);
RwV3d *RwMatrixGetPos(RwMatrix * matrix);
RwMatrix *RwMatrixUpdate(RwMatrix * matrix);
RwMatrix *RwMatrixOptimize(RwMatrix * matrix, const RwMatrixTolerance *tolerance);
/*
***********************************************
*
* RwRGBA
*
***********************************************
*/
typedef rw::RGBA RwRGBA;
typedef rw::RGBAf RwRGBAReal;
inline void RwRGBAAssign(RwRGBA *target, const RwRGBA *source) { *target = *source; }
RwReal RwV3dNormalize(RwV3d * out, const RwV3d * in);
RwReal RwV3dLength(const RwV3d * in);
RwReal RwV2dLength(const RwV2d * in);
RwReal RwV2dNormalize(RwV2d * out, const RwV2d * in);
void RwV2dAssign(RwV2d * out, const RwV2d * ina);
void RwV2dAdd(RwV2d * out, const RwV2d * ina, const RwV2d * inb);
void RwV2dLineNormal(RwV2d * out, const RwV2d * ina, const RwV2d * inb);
void RwV2dSub(RwV2d * out, const RwV2d * ina, const RwV2d * inb);
void RwV2dPerp(RwV2d * out, const RwV2d * in);
void RwV2dScale(RwV2d * out, const RwV2d * in, RwReal scalar);
RwReal RwV2dDotProduct(const RwV2d * ina, const RwV2d * inb);
void RwV3dAssign(RwV3d * out, const RwV3d * ina);
void RwV3dAdd(RwV3d * out, const RwV3d * ina, const RwV3d * inb);
void RwV3dSub(RwV3d * out, const RwV3d * ina, const RwV3d * inb);
void RwV3dScale(RwV3d * out, const RwV3d * in, RwReal scalar);
void RwV3dIncrementScaled(RwV3d * out, const RwV3d * in, RwReal scalar);
void RwV3dNegate(RwV3d * out, const RwV3d * in);
RwReal RwV3dDotProduct(const RwV3d * ina, const RwV3d * inb);
void RwV3dCrossProduct(RwV3d * out, const RwV3d * ina, const RwV3d * inb);
RwV3d *RwV3dTransformPoints(RwV3d * pointsOut, const RwV3d * pointsIn, RwInt32 numPoints, const RwMatrix * matrix);
RwV3d *RwV3dTransformVectors(RwV3d * vectorsOut, const RwV3d * vectorsIn, RwInt32 numPoints, const RwMatrix * matrix);
/*
***********************************************
*
* Render States
*
***********************************************
*/
// not librw because we don't support all of them (yet?) - mapping in wrapper functions
enum RwRenderState
{
rwRENDERSTATENARENDERSTATE = 0,
rwRENDERSTATETEXTURERASTER,
rwRENDERSTATETEXTUREADDRESS,
rwRENDERSTATETEXTUREADDRESSU,
rwRENDERSTATETEXTUREADDRESSV,
rwRENDERSTATETEXTUREPERSPECTIVE,
rwRENDERSTATEZTESTENABLE,
rwRENDERSTATESHADEMODE,
rwRENDERSTATEZWRITEENABLE,
rwRENDERSTATETEXTUREFILTER,
rwRENDERSTATESRCBLEND,
rwRENDERSTATEDESTBLEND,
rwRENDERSTATEVERTEXALPHAENABLE,
rwRENDERSTATEBORDERCOLOR,
rwRENDERSTATEFOGENABLE,
rwRENDERSTATEFOGCOLOR,
rwRENDERSTATEFOGTYPE,
rwRENDERSTATEFOGDENSITY,
rwRENDERSTATEFOGTABLE,
rwRENDERSTATEALPHAPRIMITIVEBUFFER,
rwRENDERSTATECULLMODE,
rwRENDERSTATESTENCILENABLE,
rwRENDERSTATESTENCILFAIL,
rwRENDERSTATESTENCILZFAIL,
rwRENDERSTATESTENCILPASS,
rwRENDERSTATESTENCILFUNCTION,
rwRENDERSTATESTENCILFUNCTIONREF,
rwRENDERSTATESTENCILFUNCTIONMASK,
rwRENDERSTATESTENCILFUNCTIONWRITEMASK
};
// not supported - we only do gouraud
enum RwShadeMode
{
rwSHADEMODENASHADEMODE = 0,
rwSHADEMODEFLAT,
rwSHADEMODEGOURAUD
};
enum RwBlendFunction
{
rwBLENDNABLEND = 0,
rwBLENDZERO = rw::BLENDZERO,
rwBLENDONE = rw::BLENDONE,
rwBLENDSRCCOLOR = rw::BLENDSRCCOLOR,
rwBLENDINVSRCCOLOR = rw::BLENDINVSRCCOLOR,
rwBLENDSRCALPHA = rw::BLENDSRCALPHA,
rwBLENDINVSRCALPHA = rw::BLENDINVSRCALPHA,
rwBLENDDESTALPHA = rw::BLENDDESTALPHA,
rwBLENDINVDESTALPHA = rw::BLENDINVDESTALPHA,
rwBLENDDESTCOLOR = rw::BLENDDESTCOLOR,
rwBLENDINVDESTCOLOR = rw::BLENDINVDESTCOLOR,
rwBLENDSRCALPHASAT = rw::BLENDSRCALPHASAT
};
// unsupported - we only need linear
enum RwFogType
{
rwFOGTYPENAFOGTYPE = 0,
rwFOGTYPELINEAR,
rwFOGTYPEEXPONENTIAL,
rwFOGTYPEEXPONENTIAL2
};
enum RwTextureFilterMode
{
rwFILTERNAFILTERMODE = 0,
rwFILTERNEAREST = rw::Texture::NEAREST,
rwFILTERLINEAR = rw::Texture::LINEAR,
rwFILTERMIPNEAREST = rw::Texture::MIPNEAREST,
rwFILTERMIPLINEAR = rw::Texture::MIPLINEAR,
rwFILTERLINEARMIPNEAREST = rw::Texture::LINEARMIPNEAREST,
rwFILTERLINEARMIPLINEAR = rw::Texture::LINEARMIPLINEAR
};
enum RwTextureAddressMode
{
rwTEXTUREADDRESSNATEXTUREADDRESS = 0,
rwTEXTUREADDRESSWRAP = rw::Texture::WRAP,
rwTEXTUREADDRESSMIRROR = rw::Texture::MIRROR,
rwTEXTUREADDRESSCLAMP = rw::Texture::CLAMP,
rwTEXTUREADDRESSBORDER = rw::Texture::BORDER
};
enum RwCullMode
{
rwCULLMODENACULLMODE = 0,
rwCULLMODECULLNONE = rw::CULLNONE,
rwCULLMODECULLBACK = rw::CULLBACK,
rwCULLMODECULLFRONT = rw::CULLFRONT
};
enum RwPrimitiveType
{
rwPRIMTYPENAPRIMTYPE = rw::PRIMTYPENONE,
rwPRIMTYPELINELIST = rw::PRIMTYPELINELIST,
rwPRIMTYPEPOLYLINE = rw::PRIMTYPEPOLYLINE,
rwPRIMTYPETRILIST = rw::PRIMTYPETRILIST,
rwPRIMTYPETRISTRIP = rw::PRIMTYPETRISTRIP,
rwPRIMTYPETRIFAN = rw::PRIMTYPETRIFAN,
rwPRIMTYPEPOINTLIST = rw::PRIMTYPEPOINTLIST
};
RwBool RwRenderStateGet(RwRenderState state, void *value);
RwBool RwRenderStateSet(RwRenderState state, void *value);
/*
***********************************************
*
* Engine
*
***********************************************
*/
struct RwEngineOpenParams
{
void *displayID;
};
typedef rw::SubSystemInfo RwSubSystemInfo;
enum RwVideoModeFlag
{
rwVIDEOMODEEXCLUSIVE = rw::VIDEOMODEEXCLUSIVE,
/*
rwVIDEOMODEINTERLACE = 0x2,
rwVIDEOMODEFFINTERLACE = 0x4,
rwVIDEOMODEFSAA0 = 0x8,
rwVIDEOMODEFSAA1 = 0x10
*/
};
typedef rw::VideoMode RwVideoMode;
#if 0
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 */
};
RwFileFunctions *RwOsGetFileInterface(void);
#endif
RwBool RwEngineInit(RwMemoryFunctions *memFuncs, RwUInt32 initFlags, RwUInt32 resArenaSize);
RwInt32 RwEngineRegisterPlugin(RwInt32 size, RwUInt32 pluginID, RwPluginObjectConstructor initCB, RwPluginObjectDestructor termCB);
RwInt32 RwEngineGetPluginOffset(RwUInt32 pluginID);
RwBool RwEngineOpen(RwEngineOpenParams *initParams);
RwBool RwEngineStart(void);
RwBool RwEngineStop(void);
RwBool RwEngineClose(void);
RwBool RwEngineTerm(void);
RwInt32 RwEngineGetNumSubSystems(void);
RwSubSystemInfo *RwEngineGetSubSystemInfo(RwSubSystemInfo *subSystemInfo, RwInt32 subSystemIndex);
RwInt32 RwEngineGetCurrentSubSystem(void);
RwBool RwEngineSetSubSystem(RwInt32 subSystemIndex);
RwInt32 RwEngineGetNumVideoModes(void);
RwVideoMode *RwEngineGetVideoModeInfo(RwVideoMode *modeinfo, RwInt32 modeIndex);
RwInt32 RwEngineGetCurrentVideoMode(void);
RwBool RwEngineSetVideoMode(RwInt32 modeIndex);
RwInt32 RwEngineGetTextureMemorySize(void);
RwInt32 RwEngineGetMaxTextureSize(void);
/*
***********************************************
*
* Binary stream
*
***********************************************
*/
RwBool RwStreamFindChunk(RwStream *stream, RwUInt32 type, RwUInt32 *lengthOut, RwUInt32 *versionOut);