diff options
Diffstat (limited to 'sdk/rwsdk/include/d3d8/rpworld.h')
-rw-r--r-- | sdk/rwsdk/include/d3d8/rpworld.h | 3758 |
1 files changed, 3758 insertions, 0 deletions
diff --git a/sdk/rwsdk/include/d3d8/rpworld.h b/sdk/rwsdk/include/d3d8/rpworld.h new file mode 100644 index 00000000..0d0489ce --- /dev/null +++ b/sdk/rwsdk/include/d3d8/rpworld.h @@ -0,0 +1,3758 @@ +/******************************************/ +/* */ +/* 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/rpworld.h> + * Automatically Generated on: Thu Jan 23 11:06:24 2003 + * + ************************************************************************/ + +#ifndef RPWORLD_H +#define RPWORLD_H + +/*--- Check For Previous Required Includes ---*/ +#ifndef RWCORE_H +#error "Include RWCORE.H before including this file" +#endif /* RWCORE_H */ + +/*--- System Header Files ---*/ +#include <stdarg.h> +#include <stdlib.h> + +/*--- Error enumerations ---*/ +#include "rpworld.rpe" + + +/*--- Automatically derived from: C:/daily/rwsdk/world/pipe/p2/d3d8/native.h ---*/ + +/*--- Automatically derived from: C:/daily/rwsdk/world/pipe/p2/d3d8/wrldpipe.h ---*/ + +/*--- Automatically derived from: C:/daily/rwsdk/world/pipe/p2/d3d8/nodeD3D8WorldSectorAllInOne.h ---*/ + +#ifdef __cplusplus +extern "C" +{ +#endif /* __cplusplus */ + +extern RxNodeDefinition *RxNodeDefinitionGetD3D8WorldSectorAllInOne(void); +#ifdef __cplusplus +} +#endif /* __cplusplus */ + + +/*--- Automatically derived from: C:/daily/rwsdk/world/pipe/p2/d3d8/nodeD3D8AtomicAllInOne.h ---*/ +#ifdef __cplusplus +extern "C" +{ +#endif /* __cplusplus */ + +extern RxNodeDefinition *RxNodeDefinitionGetD3D8AtomicAllInOne(void); +#ifdef __cplusplus +} +#endif /* __cplusplus */ + +/*--- Automatically derived from: C:/daily/rwsdk/world/pipe/p2/d3d8/D3D8VertexBufferManager.h ---*/ +#ifdef __cplusplus +extern "C" +{ +#endif /* __cplusplus */ + +extern void RwD3D8VertexBufferManagerChangeDefaultSize(RwUInt32 defaultSize); + +extern RwBool _rxD3D8VertexBufferManagerCreate(RwUInt32 fvf, + RwUInt32 size, + void **vertexBuffer, + RwUInt32 *baseIndex); + +extern void _rxD3D8VertexBufferManagerDestroy(RwUInt32 fvf, + RwUInt32 size, + void *vertexBuffer, + RwUInt32 baseIndex); + +extern RwBool _rxD3D8VertexBufferManagerCreateNoFVF(RwUInt32 stride, + RwUInt32 size, + void **vertexBuffer, + RwUInt32 *baseIndex); + +extern void _rxD3D8VertexBufferManagerDestroyNoFVF(RwUInt32 stride, + RwUInt32 size, + void *vertexBuffer, + RwUInt32 baseIndex); + +#ifdef __cplusplus +} +#endif /* __cplusplus */ + +/*--- Automatically derived from: c:/daily/rwsdk/world/bamateri.h ---*/ + +/* + * Handling surface materials + * Materials describe how things are to appear when rendered + * + * Copyright (c) 1998 Criterion Software Ltd. + */ + +/**************************************************************************** + Global Types + */ + + +typedef struct RpMaterialChunkInfo RpMaterialChunkInfo; +typedef struct RpMaterialChunkInfo _rpMaterial; + +#if (!defined(DOXYGEN)) +struct RpMaterialChunkInfo +{ + RwInt32 flags; /* Material flags - unused currently - + * for future expansion */ + RwRGBA color; /* Color of material. */ + RwInt32 unused; /* Not used */ + RwBool textured; /* Are we textured? */ + RwSurfaceProperties surfaceProps;/* Surface properties */ +}; +#endif /* (!defined(DOXYGEN)) */ + +#if (!defined(RwMaterialAssign)) +#define RwMaterialAssign(_target, _source) \ + ( *(_target) = *(_source) ) +#endif /* (!defined(RwMaterialAssign)) */ + +/** + * \ingroup rpmaterial + * \struct RpMaterial + * Material object. This should be + * considered an opaque type. Use the RpMaterial API functions to access. + */ +typedef struct RpMaterial RpMaterial; + +#if (!defined(DOXYGEN)) +struct RpMaterial +{ + RwTexture *texture; /**< texture */ + RwRGBA color; /**< color */ + RxPipeline *pipeline; /**< pipeline */ + RwSurfaceProperties surfaceProps; /**< surfaceProps */ + RwInt16 refCount; /* C.f. rwsdk/world/bageomet.h:RpGeometry */ + RwInt16 pad; +}; +#endif /* (!defined(DOXYGEN)) */ + +/** + * \ingroup rpmaterial + * \ref RpMaterialCallBack + * represents the function called from \ref RpGeometryForAllMaterials and + * \ref RpWorldForAllMaterials for all materials referenced by polygons in a + * given geometry. This function should return a pointer to the current + * material to indicate success. The callback may return NULL to terminate + * further callbacks on the materials. + * + * \param material Pointer to the current material + * \param data Pointer to developer-defined data structure. + * + * \return Pointer to the current material. + */ +typedef RpMaterial *(*RpMaterialCallBack)(RpMaterial *material, void *data); + +/**************************************************************************** + <macro/inline functionality + */ + +#define RpMaterialAddRefMacro(_material) \ + (((_material)->refCount++), (_material)) + +#define RpMaterialAddRefVoidMacro(_material) \ +MACRO_START \ +{ \ + (_material)->refCount++; \ +} \ +MACRO_STOP + + +#define RpMaterialSetColorMacro(_material, _color) \ + (RwRGBAAssign(&((_material)->color), (_color)), (_material)) + +#define RpMaterialGetColorMacro(_material) \ + (&((_material)->color)) + +#define RpMaterialSetSurfacePropertiesMacro(_material, _surfProps) \ + (RwSurfacePropertiesAssign(&((_material)->surfaceProps), \ + (_surfProps)), (_material)) + +#define RpMaterialSetSurfacePropertiesVoidMacro(_material, _surfProps) \ +MACRO_START \ +{ \ + RwSurfacePropertiesAssign(&((_material)->surfaceProps), \ + (_surfProps)); \ +} \ +MACRO_STOP + +#define RpMaterialGetSurfacePropertiesMacro(_material) \ + (&((_material)->surfaceProps)) + +#define RpMaterialGetTextureMacro(_material) \ + ((_material)->texture) + + +#if !(defined(RWDEBUG) || defined(RWSUPPRESSINLINE)) + +#define RpMaterialAddRef(_material) \ + RpMaterialAddRefMacro(_material) + +#define RpMaterialSetColor(_material, _color) \ + RpMaterialSetColorMacro(_material, _color) + +#define RpMaterialGetColor(_material) \ + RpMaterialGetColorMacro(_material) + +#define RpMaterialSetSurfaceProperties(_material, _surfProps) \ + RpMaterialSetSurfacePropertiesMacro(_material, _surfProps) + +#define RpMaterialGetSurfaceProperties(_material) \ + RpMaterialGetSurfacePropertiesMacro(_material) + +#define RpMaterialGetTexture(_material) \ + RpMaterialGetTextureMacro(_material) + +#endif /* (defined(RWDEBUG) || defined(RWSUPPRESSINLINE)) */ + +/**************************************************************************** + Function prototypes + */ + +#ifdef __cplusplus +extern "C" +{ +#endif /* __cplusplus */ + + +extern void RpMaterialSetFreeListCreateParams( RwInt32 blockSize, + RwInt32 numBlocksToPrealloc ); + +/* Creating, destroying and referencing materials */ +extern RpMaterial *RpMaterialCreate(void); +extern RwBool RpMaterialDestroy(RpMaterial *material); +extern RpMaterial *RpMaterialClone(RpMaterial *material); + +/* Textures */ +extern RpMaterial *RpMaterialSetTexture(RpMaterial *material, RwTexture *texture); + + +#if (defined(RWDEBUG) || defined(RWSUPPRESSINLINE)) +extern RpMaterial *RpMaterialAddRef(RpMaterial *material); + +/* Textures */ +extern RwTexture *RpMaterialGetTexture(const RpMaterial *material); + +/* Setting and getting colors */ +extern RpMaterial *RpMaterialSetColor(RpMaterial *material, const RwRGBA *color); +extern const RwRGBA *RpMaterialGetColor(const RpMaterial *material); + +/* Setting and getting surface properties */ +extern RpMaterial * +RpMaterialSetSurfaceProperties(RpMaterial *material, + const RwSurfaceProperties *surfaceProperties); + +extern const RwSurfaceProperties * +RpMaterialGetSurfaceProperties(const RpMaterial *material); + +#endif /* (defined(RWDEBUG) || defined(RWSUPPRESSINLINE)) */ + + +/* Attaching toolkits */ +extern RwInt32 RpMaterialRegisterPlugin(RwInt32 size, RwUInt32 pluginID, + RwPluginObjectConstructor constructCB, + RwPluginObjectDestructor destructCB, + RwPluginObjectCopy copyCB); +extern RwInt32 RpMaterialRegisterPluginStream(RwUInt32 pluginID, + RwPluginDataChunkReadCallBack readCB, + RwPluginDataChunkWriteCallBack writeCB, + RwPluginDataChunkGetSizeCallBack getSizeCB); +extern RwInt32 RpMaterialSetStreamAlwaysCallBack( + RwUInt32 pluginID, + RwPluginDataChunkAlwaysCallBack alwaysCB); +extern RwInt32 RpMaterialSetStreamRightsCallBack(RwUInt32 pluginID, + RwPluginDataChunkRightsCallBack rightsCB); +extern RwInt32 RpMaterialGetPluginOffset(RwUInt32 pluginID); +extern RwBool RpMaterialValidatePlugins(const RpMaterial *material); + +/* Binary format */ +extern RwUInt32 RpMaterialStreamGetSize(const RpMaterial *material); +extern RpMaterial *RpMaterialStreamRead(RwStream *stream); +extern const RpMaterial *RpMaterialStreamWrite(const RpMaterial *material, RwStream *stream); +extern RpMaterialChunkInfo * +_rpMaterialChunkInfoRead(RwStream *stream, + RpMaterialChunkInfo *materialChunkInfo, + RwInt32 *bytesRead); + +#ifdef __cplusplus +} +#endif /* __cplusplus */ + +#define RpMaterialChunkInfoRead(stream, materialChunkInfo, bytesRead) \ + _rpMaterialChunkInfoRead(stream, materialChunkInfo, bytesRead) + + +/*--- Automatically derived from: c:/daily/rwsdk/world/bamatlst.h ---*/ +/**************************************************************************** + Global Types + */ + +typedef struct RpMaterialList RpMaterialList; + +#if (!defined(DOXYGEN)) +struct RpMaterialList +{ + RpMaterial **materials; + RwInt32 numMaterials; + RwInt32 space; +}; +#endif /* (!defined(DOXYGEN)) */ + +/**************************************************************************** + Function prototypes + */ + +#ifdef __cplusplus +extern "C" +{ +#endif /* __cplusplus */ + +#define rpMaterialListGetNumMaterials(mlist) ((mlist)->numMaterials) + +/* Setting up and destroying material lists */ +extern RpMaterialList *_rpMaterialListInitialize(RpMaterialList *matList); +extern RpMaterialList *_rpMaterialListDeinitialize(RpMaterialList *matList); + +/* Accessing material lists */ +extern RpMaterial ** _rpMaterialListAlloc(RwUInt32 count); +extern RpMaterial *_rpMaterialListGetMaterial(const RpMaterialList *matList, + RwInt32 matIndex); +extern RpMaterialList * _rpMaterialListSetSize(RpMaterialList * matList, + RwInt32 size); +extern RpMaterialList *_rpMaterialListCopy(RpMaterialList *matListOut, + const RpMaterialList *matListIn); +extern RwInt32 _rpMaterialListAppendMaterial(RpMaterialList *matList, + RpMaterial *material); +extern RwInt32 _rpMaterialListFindMaterialIndex(const RpMaterialList *matList, + const RpMaterial *material); + +/* Binary format */ +extern RwUInt32 _rpMaterialListStreamGetSize(const RpMaterialList *matList); +extern RpMaterialList *_rpMaterialListStreamRead(RwStream *stream, + RpMaterialList *matList); +extern const RpMaterialList *_rpMaterialListStreamWrite(const RpMaterialList *matList, + RwStream *stream); + +#ifdef __cplusplus +} +#endif /* __cplusplus */ + +#define rpMaterialListInitialize(_matList) \ + _rpMaterialListInitialize(_matList) + +#define rpMaterialListDeinitialize(_matList) \ + _rpMaterialListDeinitialize(_matList) + +#define rpMaterialListGetMaterial(_matList, _matIndex) \ + _rpMaterialListGetMaterial(_matList, _matIndex) + +#define rpMaterialListCopy(_matListOut, _matListIn) \ + _rpMaterialListCopy(_matListOut, _matListIn) + +#define rpMaterialListAppendMaterial(_matList, _material) \ + _rpMaterialListAppendMaterial(_matList, _material) + +#define rpMaterialListStreamRead(_stream, _matList) \ + _rpMaterialListStreamRead(_stream, _matList) + +#define rpMaterialListStreamWrite(_matList, _stream) \ + _rpMaterialListStreamWrite(_matList, _stream) + + +/*--- Automatically derived from: c:/daily/rwsdk/world/bamesh.h ---*/ + +/* + * + * Purpose: Provide construction and enumeration facilities for meshes. + * + * Copyright (c) 1998 Criterion Software Ltd. + */ + +#define RPMESHGLOBAL(var) \ + (RWPLUGINOFFSET(rpMeshGlobals, \ + RwEngineInstance, \ + meshModule.globalsOffset)->var) + +#define rwPRIMTYPEOR \ + (rwPRIMTYPELINELIST | \ + rwPRIMTYPEPOLYLINE | \ + rwPRIMTYPETRILIST | \ + rwPRIMTYPETRISTRIP | \ + rwPRIMTYPETRIFAN | \ + rwPRIMTYPEPOINTLIST) + +#define rpMESHHEADERPRIMTYPEOR \ + (0 /* rpMESHHEADERTRILIST*/ | \ + rpMESHHEADERTRISTRIP | \ + rpMESHHEADERTRIFAN | \ + rpMESHHEADERLINELIST | \ + rpMESHHEADERPOLYLINE | \ + rpMESHHEADERPOINTLIST) + +/**************************************************************************** + Global variables + */ + +#ifdef __cplusplus +extern "C" +{ +#endif /* __cplusplus */ + +extern RwModuleInfo meshModule; + +#ifdef __cplusplus +} +#endif /* __cplusplus */ + +/**************************************************************************** + Global types + */ + +/* + * typedef for header structure listing all meshes + * constituting a single RpGeometry or RpWorldSector + */ +typedef struct RpMeshHeader RpMeshHeader; + +/** + * \ingroup rpmesh + * \ref RpMeshHeaderFlags + * represents the different types of mesh. + * \see RpMeshHeader + */ +enum RpMeshHeaderFlags +{ + /* NOTE: trilists are denoted by absence of any other + * primtype flags, so be careful that you test: + * (triListFlag == (flags&triListFlag)) + * or: + * (0 == (flags&rpMESHHEADERPRIMMASK)) + * and not: + * (flags&triListFlag) + */ + rpMESHHEADERTRISTRIP = 0x0001, /**< Render as tristrips */ + rpMESHHEADERTRIFAN = 0x0002, /**< On PlayStation 2 these will be converted to trilists */ + rpMESHHEADERLINELIST = 0x0004, /**< Render as linelists */ + rpMESHHEADERPOLYLINE = 0x0008, /**< On PlayStation 2 these will be converted to linelists */ + rpMESHHEADERPOINTLIST = 0x0010, /**< Pointlists are supported only if rendered by + * custom pipelines; there is no default RenderWare + * way to render pointlists. */ + + rpMESHHEADERPRIMMASK = 0x00FF, /**< All bits reserved for specifying primitive type */ + rpMESHHEADERUNINDEXED = 0x0100, /**< Topology is defined implicitly by vertex + * order, ergo the mesh contains no indices */ + rpMESHHEADERFLAGSFORCEENUMSIZEINT = RWFORCEENUMSIZEINT +}; + +/* + * Typedef for RpMeshHeaderFlags enumeration + * representing the different types of mesh + */ +typedef enum RpMeshHeaderFlags RpMeshHeaderFlags; + +typedef struct rpMeshGlobals rpMeshGlobals; + +#if (!defined(DOXYGEN)) +struct rpMeshGlobals +{ + RwInt16 nextSerialNum; + RwFreeList *triStripListEntryFreeList; + RwUInt8 meshFlagsToPrimType[rpMESHHEADERPRIMTYPEOR]; + RwUInt8 primTypeToMeshFlags[rwPRIMTYPEOR]; +}; +#endif /* (!defined(DOXYGEN)) */ + +typedef struct RpBuildMeshTriangle RpBuildMeshTriangle; + +/** + * \ingroup rpmesh + * \struct RpBuildMeshTriangle + * This type represents an array of indices into + * the object vertex array. Used during the construction + * of tristrips. + * + * See API functions + * \see RpBuildMeshGeneratePreprocessTriStrip + * \see RpBuildMeshGenerateExhaustiveTriStrip + * \see RpBuildMeshGenerateTrivialTriStrip + * \see RpBuildMeshGenerateDefaultTriStrip + * and + * \see RpMeshSetTriStripMethod + * \see RpMeshGetTriStripMethod + */ +struct RpBuildMeshTriangle +{ + RwUInt16 vertIndex[3]; /**< indices into object vertex + * array. */ + RpMaterial *material; /**< pointer to material used to + * render the mesh. */ +}; + +typedef struct RpBuildMesh RpBuildMesh; + +/** + * \ingroup rpmesh + * \struct RpBuildMesh + * This type represents a mesh ready for tri stripping. + * + * See API functions + * \see RpBuildMeshGeneratePreprocessTriStrip + * \see RpBuildMeshGenerateExhaustiveTriStrip + * \see RpBuildMeshGenerateTrivialTriStrip + * \see RpBuildMeshGenerateDefaultTriStrip + * and + * \see RpMeshSetTriStripMethod + * \see RpMeshGetTriStripMethod + */ +struct RpBuildMesh +{ + RwUInt32 triangleBufferSize; /**< number of triangles + * space has been allocated + * for. */ + RwUInt32 numTriangles; /**< number of triangles to be + * tristripped. */ + RpBuildMeshTriangle *meshTriangles; /**< pointer to build mesh + * triangles. */ +}; + +typedef struct RpMesh RpMesh; + +/** + * \ingroup rpmesh + * \struct RpMesh + * This type represents a single polygon mesh. + * A mesh is defined as a collection of triangles derived from an RpGeometry + * or RpWorldSector which have a common material. + * + * See API functions \see RpGeometryForAllMeshes and + * \see RpWorldSectorForAllMeshes and + * the corresponding function callback types: + */ +struct RpMesh +{ + RxVertexIndex *indices; /**< vertex indices defining the mesh */ + RwUInt32 numIndices; /**< number of vertices in mesh */ + RpMaterial *material; /**< pointer to material used to + * render the mesh. */ +}; + +/** + * \ingroup rpmesh + * \struct RpMeshHeader + * Header for all meshes that constitute a single RpGeometry or RpWorldSector + */ +struct RpMeshHeader +{ + RwUInt32 flags; /**< \see RpMeshHeaderFlags */ + RwUInt16 numMeshes; /**< Number of meshes in object */ + RwUInt16 serialNum; /**< Determine if mesh has changed + * since last instance */ + RwUInt32 totalIndicesInMesh; /**< Total triangle index + * count in all meshes + */ + RwUInt32 firstMeshOffset; /**< Offset in bytes from end this + * structure RpMeshHeader + * to the first mesh + */ +}; + +/** + * \ingroup rpmesh + * \ref RpMeshCallBack is the callback + * function supplied to \ref RpGeometryForAllMeshes and + * \ref RpWorldSectorForAllMeshes for all meshes in a given geometry. + * + * This function should return a pointer to the current mesh to indicate + * success. The callback may return NULL to terminate further callbacks + * on the meshes. + * + * \param mesh Pointer to the current mesh, supplied by + * iterator. + * \param meshHeader Pointer to the meshes header + * \param data Pointer to developer-defined data structure. + * + * \return Returns a pointer to the current mesh if successful or NULL + * if an error occurred. + */ +typedef RpMesh *(*RpMeshCallBack) (RpMesh * mesh, + RpMeshHeader * meshHeader, + void *pData); + +/**************************************************************************** + Function prototypes + */ + +#if !(defined(RWDEBUG) || defined(RWSUPPRESSINLINE)) + +#define RpMeshHeaderGetPrimType(_mshHdr) \ + ( (RwPrimitiveType)RPMESHGLOBAL(meshFlagsToPrimType)[(_mshHdr)->flags & \ + rpMESHHEADERPRIMMASK] ) + +#define RpMeshHeaderSetPrimType(_mshHdr, _prmTyp) \ + ( (_mshHdr)->flags = \ + ((_mshHdr)->flags & ~rpMESHHEADERPRIMMASK) | \ + (rpMESHHEADERPRIMMASK & \ + RPMESHGLOBAL(primTypeToMeshFlags)[(_prmTyp) & \ + rpMESHHEADERPRIMMASK]), \ + (_mshHdr) ) + +#endif /* !(defined(RWDEBUG) || defined(RWSUPPRESSINLINE)) */ + +#ifdef __cplusplus +extern "C" +{ +#endif /* __cplusplus */ + +/* Opening and closing module */ +extern void *_rpMeshOpen(void *instance, RwInt32 offset, + RwInt32 size); +extern void *_rpMeshClose(void *instance, RwInt32 offset, + RwInt32 size); + +extern RwInt16 _rpMeshGetNextSerialNumber(void); + +/* Create a build mesh with nothing in */ +extern RpBuildMesh *_rpBuildMeshCreate(RwUInt32 bufferSize); + +/* Destroy a build mesh */ +extern RwBool _rpBuildMeshDestroy(RpBuildMesh * mesh); + +/* Destroy a build mesh */ +extern RwBool _rpMeshDestroy(RpMeshHeader * mesh); + +/* Add a triangle to a mesh */ +extern RpBuildMesh *_rpBuildMeshAddTriangle(RpBuildMesh * mesh, + RpMaterial * material, + RwInt32 vert1, + RwInt32 vert2, + RwInt32 vert3); + +#if (defined(RWDEBUG) || defined(RWSUPPRESSINLINE)) + +/* Get primtype from a mesh header */ +extern RwPrimitiveType RpMeshHeaderGetPrimType(RpMeshHeader * + meshHeader); + +/* Set primtype for a mesh header */ +extern RpMeshHeader *RpMeshHeaderSetPrimType(RpMeshHeader * + meshHeader, + RwPrimitiveType + primType); + +#endif /* (defined(RWDEBUG) || defined(RWSUPPRESSINLINE)) */ + +/* Enumerate meshes within a mesh header */ +extern RpMeshHeader *_rpMeshHeaderForAllMeshes(RpMeshHeader * + meshHeader, + RpMeshCallBack + fpCallBack, + void *pData); + +/* Mesh serialisation functions */ +extern RwStream *_rpMeshWrite(const RpMeshHeader * meshHeader, + const void *object, + RwStream * stream, + const RpMaterialList * matList); +extern RpMeshHeader *_rpMeshRead(RwStream * stream, + const void *object, + const RpMaterialList * matList); +extern RwInt32 _rpMeshSize(const RpMeshHeader *meshHeader, + const void *object); +/* Mesh header create/destroy functions */ +extern void _rpMeshHeaderDestroy(RpMeshHeader * meshHeader); +extern RpMeshHeader * _rpMeshHeaderCreate(RwUInt32 size); + + +#ifdef __cplusplus +} +#endif /* __cplusplus */ + + +/*--- Automatically derived from: c:/daily/rwsdk/world/basector.h ---*/ + +/* + * Handling atomic sectors + * Atomic sectors are use to divide up the world into manageable portions + * + * Copyright (c) 1998 Criterion Software Ltd. +*/ + +/**************************************************************************** + Defines + */ + +/* Type ID */ +#define rpWorldSector 0xff /* Not a true 'type'! */ + +#define rpMINDISTANCEBETWEENVERTICES (RwReal)(0.0001) + +#define RPV3DFROMVERTEXNORMAL(v, n) \ + (v).x = (((RwReal)((n).x)) * ( (RwReal)(1.0/128))); \ + (v).y = (((RwReal)((n).y)) * ( (RwReal)(1.0/128))); \ + (v).z = (((RwReal)((n).z)) * ( (RwReal)(1.0/128))) + +#define RPVERTEXNORMALFROMRWV3D(n, v) \ + { \ + RwFixed naTmp[3]; \ + \ + naTmp[0] = RwRealToFixed((v).x); \ + naTmp[1] = RwRealToFixed((v).y); \ + naTmp[2] = RwRealToFixed((v).z); \ + \ + if (naTmp[0] >= RwIntToFixed(1)) \ + { \ + naTmp[0] = RwIntToFixed(1)-1; \ + } \ + if (naTmp[0] <= RwIntToFixed(-1)) \ + { \ + naTmp[0] = RwIntToFixed(-1)+1; \ + } \ + if (naTmp[1] >= RwIntToFixed(1)) \ + { \ + naTmp[1] = RwIntToFixed(1)-1; \ + } \ + if (naTmp[1] <= RwIntToFixed(-1)) \ + { \ + naTmp[1] = RwIntToFixed(-1)+1; \ + } \ + if (naTmp[2] >= RwIntToFixed(1)) \ + { \ + naTmp[2] = RwIntToFixed(1)-1; \ + } \ + if (naTmp[2] <= RwIntToFixed(-1)) \ + { \ + naTmp[2] = RwIntToFixed(-1)+1; \ + } \ + \ + (n).x = (RwInt8)(naTmp[0]>>9); \ + (n).y = (RwInt8)(naTmp[1]>>9); \ + (n).z = (RwInt8)(naTmp[2]>>9); \ + } + +/**************************************************************************** + Global types + */ + +typedef struct RpVertexNormal RpVertexNormal; + +#if (!defined(DOXYGEN)) +struct RpVertexNormal +{ + RwInt8 x; + RwInt8 y; + RwInt8 z; + RwUInt8 pad; /* pad character to force alignment */ +}; + +typedef struct RpPolygon RpPolygon; + +struct RpPolygon +{ + RwUInt16 matIndex; + RwUInt16 vertIndex[3]; +}; +#endif /* (!defined(DOXYGEN)) */ + +/** + * \ingroup rpworldsector + * \struct RpWorldSector + * World Sector object. This should be + * considered an opaque type. Use the RpWorldSector API functions to access. + */ +typedef struct RpWorldSector RpWorldSector; + +#if (!defined(DOXYGEN)) +struct RpWorldSector +{ + RwInt32 type; + + RpPolygon *polygons; /* Polygons themselves */ + + RwV3d *vertices; /* Vertex positions */ + RpVertexNormal *normals; /* Vertex normals */ + + RwTexCoords *texCoords[rwMAXTEXTURECOORDS]; /* Texture coordinates */ + + RwRGBA *preLitLum; /* Pre lit luminances */ + + /* Pointer to memory allocated for vertex and poly pointers */ + RwResEntry *repEntry; + + /* Atomics in this sectors */ + /* The pointers are frigged so they look like they are pointing to + Atomics when they are pointing to here */ + RwLinkList collAtomicsInWorldSector; /* Coll priority */ + RwLinkList noCollAtomicsInWorldSector; /* No Coll priority */ + + /* Lights in an atomic sector */ + RwLinkList lightsInWorldSector; + + /* Outer bounding box of sector based on BSP planes */ + RwBBox boundingBox; + + /* Bounding box tightly enclosing geometry */ + RwBBox tightBoundingBox; + + /* The mesh which groups same material polygons together */ + RpMeshHeader *mesh; + + /* The WorldSector object pipeline for this WorldSector */ + RxPipeline *pipeline; + + /* Material list window base + * (triangles in a given sector can "see" + * the 256 materials from + * MatList[matListWindowBase] -> MatList[matListWindowBase + 255]) + */ + RwUInt16 matListWindowBase; + + RwUInt16 numVertices; /* Num vertices */ + RwUInt16 numPolygons; /* Num polygons */ + RwUInt16 pad; +}; +#endif /* (!defined(DOXYGEN)) */ + +/** + * \ingroup rpworldsector + * \ref RpWorldSectorCallBack + * represents the function called from \ref RpWorldForAllWorldSectors, + * \ref RpAtomicForAllWorldSectors and \ref RpLightForAllWorldSectors for all + * world sectors in a given world or world sectors a given atomic or light lies + * in. This function should return a pointer to the current world sector to + * indicate success. The callback may return NULL to terminate further + * callbacks on the atomic or light. + * + * \param sector Pointer to the current world sector + * \param data Pointer to developer-defined data structure. + * + * \return Pointer to the current world sector. + * + */ +typedef RpWorldSector *(*RpWorldSectorCallBack)(RpWorldSector *worldSector, void *data); + +typedef struct RpSector RpSector; + +#if (!defined(DOXYGEN)) +struct RpSector +{ + RwInt32 type; +}; + +/* NOTE: The left and right pointers can point to an RpPlaneSector or + * an RpWorldSector + * This is determined what the type is via the type value + */ + +typedef struct RpPlaneSector RpPlaneSector; + +struct RpPlaneSector +{ + RwInt32 type; + + RwReal value; + RpSector *leftSubTree; /* Sector 'left' (less) of the plane */ + RpSector *rightSubTree; /* Sector 'right' (more) of the plane */ + RwReal leftValue; + RwReal rightValue; +}; +#endif /* (!defined(DOXYGEN)) */ + +#ifdef __cplusplus +extern "C" +{ +#endif /* __cplusplus */ + +extern RwPluginRegistry sectorTKList; + +#ifdef __cplusplus +} +#endif /* __cplusplus */ + +#define RpWorldSectorGetBBoxMacro(_sctr) (&((_sctr)->boundingBox)) +#define RpWorldSectorGetTightBBoxMacro(_sctr) (&((_sctr)->tightBoundingBox)) + +#if ((!defined(RWDEBUG)) && (!defined(RWSUPPRESSINLINE))) + +#define RpWorldSectorGetBBox RpWorldSectorGetBBoxMacro +#define RpWorldSectorGetTightBBox RpWorldSectorGetTightBBoxMacro + +#endif /* (defined(RWDEBUG) || defined(RWSUPPRESSINLINE)) */ + +/**************************************************************************** + Function prototypes + */ + +#ifdef __cplusplus +extern "C" +{ +#endif /* __cplusplus */ + + +/* Get info from atomic sectors */ +extern RwInt32 RpWorldSectorGetNumPolygons(const RpWorldSector *Sector); +extern RwInt32 RpWorldSectorGetNumVertices(const RpWorldSector *Sector); + +/* Instancing and deinstancing sectors */ +extern RpWorldSector * RpWorldSectorRender(RpWorldSector *worldSector); + +extern const RpWorldSector *RpWorldSectorForAllMeshes(const RpWorldSector *sector, + RpMeshCallBack fpCallBack, + void *pData); + + +#if (defined(RWDEBUG) || defined(RWSUPPRESSINLINE)) + +extern const RwBBox *RpWorldSectorGetBBox(const RpWorldSector *sector); +extern const RwBBox *RpWorldSectorGetTightBBox(const RpWorldSector *sector); + +#endif /* (defined(RWDEBUG) || defined(RWSUPPRESSINLINE)) */ + +/* Plugins */ +extern RwInt32 RpWorldSectorRegisterPlugin(RwInt32 size, RwUInt32 pluginID, + RwPluginObjectConstructor constructCB, + RwPluginObjectDestructor destructCB, + RwPluginObjectCopy copyCB); +extern RwInt32 RpWorldSectorRegisterPluginStream(RwUInt32 pluginID, + RwPluginDataChunkReadCallBack readCB, + RwPluginDataChunkWriteCallBack writeCB, + RwPluginDataChunkGetSizeCallBack getSizeCB); +extern RwInt32 RpWorldSectorSetStreamAlwaysCallBack( + RwUInt32 pluginID, + RwPluginDataChunkAlwaysCallBack alwaysCB); +extern RwInt32 RpWorldSectorSetStreamRightsCallBack(RwUInt32 pluginID, + RwPluginDataChunkRightsCallBack rightsCB); +extern RwInt32 RpWorldSectorGetPluginOffset(RwUInt32 pluginID); +extern RwBool RpWorldSectorValidatePlugins(const RpWorldSector *sector); + +#ifdef __cplusplus +} +#endif /* __cplusplus */ + +/*--- Automatically derived from: c:/daily/rwsdk/world/bameshop.h ---*/ + +/**************************************************************************** + Defines + */ + +#define RPTRISTRIPPOLYGONMAXEDGES 3 + +/** + * \ingroup rpmesh + * \ref RpTriStripMeshCallBack is the callback to generate triangle strips + * when the triangle stripped geometries or world sectors are unlocked. + * + * \param buildMesh pointer to the mesh which the triangle strip will be + * generated from. + * \param data pointer to user-supplied data to pass to the callback + * function. + * + * \return a pointer to the constructed mesh header. + * + */ +typedef RpMeshHeader * +(*RpTriStripMeshCallBack) (RpBuildMesh *buildMesh, void *data); + + + +/**************************************************************************** + Global types + */ + +typedef struct RpTriStripEdge RpTriStripEdge; + +typedef struct RpTriStripPolygon RpTriStripPolygon; +/** + * \ingroup rpmesh + * \struct RpTriStripPolygon + * This type represents a polygon. + * + * \see RpTriStripPolygonFollowStrip + * \see RpBuildMeshGenerateTriStrip + * \see RpTriStripMeshTunnel + */ +struct RpTriStripPolygon +{ + RwLLLink inEndLink; /**< link for list of polygons joined by fewer than + 2 strip edges */ + RwLLLink inUsedLink; /**< link for list of used polygons */ + RwLLLink inFreeLink; /**< link for list of free polygons */ + RwUInt32 numEdges; /**< number of edges */ + RpTriStripEdge *edges[RPTRISTRIPPOLYGONMAXEDGES]; /**< polygon edges */ + RxVertexIndex vertIndex[RPTRISTRIPPOLYGONMAXEDGES]; /**< polygon vertex + indices */ + RwUInt32 testFrame; /**< used to prevent a tri-strip being counted by + the cost function more than once */ +}; + +/** + * \ingroup rpmesh + * \struct RpTriStripEdge + * This type represents a polygon edge which may be part of a tri-strip. + * + * \see RpTriStripPolygonFollowStrip + * \see RpBuildMeshGenerateTriStrip + * \see RpTriStripMeshTunnel + */ +struct RpTriStripEdge +{ + RwLLLink inUsedLink; /**< link for list of used edges */ + RwLLLink inFreeLink; /**< link for list of free edges */ + RpTriStripPolygon *poly1; /**< first polygon including this edge */ + RpTriStripPolygon *poly2; /**< second polygon including this edge or NULL + if this edge is only included in one */ + RxVertexIndex vert1; /**< index of first vertex of edge */ + RxVertexIndex vert2; /**< index of second vertex of edge */ + RwBool strip; /**< TRUE if the edge is part of a tri-strip */ +}; + +typedef struct RpTriStripMesh RpTriStripMesh; +/** + * \ingroup rpmesh + * \struct RpTriStripMesh + * This type represents a mesh and the tri-strips it contains. + * + * \see RpBuildMeshGenerateTriStrip + * \see RpTriStripMeshTunnel + */ +struct RpTriStripMesh +{ + RwUInt32 numPolygons; /**< the number of polygons in the mesh */ + RwLinkList polygonEndList; /**< linked list of polygons joined by fewer + than 2 strip edges. */ + RwLinkList polygonUsedList; /**< linked list of used polygons */ + RwLinkList polygonFreeList; /**< linked list of free polygons */ + RwLinkList edgeUsedList; /**< linked list of used edges */ + RwLinkList edgeFreeList; /**< linked list of free edges */ +}; + +/** + * \ingroup rpmesh + * \ref RpTriStripMeshStripCallBack represents the callback function to + * tri-strip a mesh. + * + * \param mesh Pointer to the mesh to tri-strip. + * \param data Pointer to user-supplied data. + * + * \return Returns a pointer to the current mesh if successful or NULL if an + * error occurred. + */ +typedef RpTriStripMesh * +(*RpTriStripMeshStripCallBack) (RpTriStripMesh *mesh, void *data); + +typedef struct RpTriStripData RpTriStripData; +/** + * \ingroup rpmesh + * \struct RpTriStripData + * This type represents the data required by the + * \ref RpBuildMeshGenerateTriStrip function to tri-strip a mesh. This data must + * be the user-supplied data passed into RpMeshSetTriStripMethod when using + * \ref RpBuildMeshGenerateTriStrip. + * + * \see RpMeshGetTriStripMethod + * \see RpMeshSetTriStripMethod + * \see RpBuildMeshGenerateTriStrip + * \see RpTriStripMeshTunnel + */ +struct RpTriStripData +{ + RwBool ignoreWinding; /**< TRUE to ignore winding order */ + RpTriStripMeshStripCallBack stripCB; /**< callback to tri-strip mesh */ + void *data; /**< data to supply to callback */ +}; + +/** + * \ingroup rpmesh + * \ref RpTriStripCostCallBack represents the callback function used by the + * tunnelling tri-stripper to determine the cost of a tri-strip. + * + * \param startPolygon Pointer to polygon at the start of the tri-strip. + * \param testFrame Value that must be written to the testFrame of all + * polygons in the tri-strip + * \param data Pointer to user-supplied data. + * + * \return Returns the cost of the tri-strip. + */ +typedef RwUInt32 +(*RpTriStripCostCallBack) (RpTriStripPolygon *startPolygon, RwUInt32 testFrame, void *data); + +typedef struct RpTriStripTunnelData RpTriStripTunnelData; +/** + * \ingroup rpmesh + * \struct RpTriStripTunnelData + * This type represents the data required by the + * \ref RpTriStripMeshTunnel function to tri-strip a mesh. This data must + * be the user-supplied data in the RpTriStripData structure passed into + * \ref RpMeshSetTriStripMethod as the user-supplied data when using + * \ref RpTriStripMeshTunnel. + * + * \see RpMeshGetTriStripMethod + * \see RpMeshSetTriStripMethod + * \see RpBuildMeshGenerateTriStrip + * \see RpTriStripMeshTunnel + * \see RpTriStripDefaultCost + */ +struct RpTriStripTunnelData +{ + RwReal quality; /**< the higher the value the better the + output but the longer it will take; + values greater than 1 are unlikely to + be useful */ + RwUInt32 lengthLimit; /**< the maximum tunnel length to use */ + RpTriStripCostCallBack costCB; /**< callback to determine tri-strip cost */ + void *data; /**< data to supply to callbacks */ +}; + + + +/**************************************************************************** + Global Variables + */ + + +/**************************************************************************** + Function prototypes + */ + +#ifdef __cplusplus +extern "C" +{ +#endif /* __cplusplus */ + +/* Tri-strip manipulating functions */ +extern RpTriStripPolygon * +RpTriStripPolygonFollowStrip(RpTriStripPolygon *curr, RpTriStripPolygon *prev); + +/* Callback strip costing functions */ +extern RwUInt32 +RpTriStripDefaultCost(RpTriStripPolygon *startPolygon, RwUInt32 testFrame, + void *data); + +/* Callback mesh stripping functions */ +extern RpTriStripMesh * +RpTriStripMeshTunnel(RpTriStripMesh *mesh, void *data); + +extern RpTriStripMesh * +RpTriStripMeshQuick(RpTriStripMesh *mesh, void *data); + +/* New callback mesh generating function */ +extern RpMeshHeader * +RpBuildMeshGenerateTriStrip(RpBuildMesh *buildMesh, void *data); + +/* Old callback mesh generating functions. Probably obsolete */ +extern RpMeshHeader * +RpBuildMeshGenerateTrivialTriStrip(RpBuildMesh *buildMesh, void *data); + +extern RpMeshHeader * +RpBuildMeshGenerateDefaultTriStrip(RpBuildMesh *buildmesh, void *data); + +extern RpMeshHeader * +RpBuildMeshGeneratePreprocessTriStrip(RpBuildMesh *buildmesh, void *data); + +extern RpMeshHeader * +RpBuildMeshGenerateExhaustiveTriStrip(RpBuildMesh *buildmesh, void *data); + +extern RpMeshHeader * +RpBuildMeshGenerateDefaultIgnoreWindingTriStrip(RpBuildMesh *buildmesh, + void *data); + +extern RpMeshHeader * +RpBuildMeshGeneratePreprocessIgnoreWindingTriStrip(RpBuildMesh *buildmesh, + void *data); + +extern RpMeshHeader * +RpBuildMeshGenerateExhaustiveIgnoreWindingTriStrip(RpBuildMesh *buildmesh, + void *data); + +/* Functions to set and get the global mesh tri-strip algorithm */ +extern RwBool +RpMeshSetTriStripMethod(RpTriStripMeshCallBack callback, void *data); + +extern RwBool +RpMeshGetTriStripMethod(RpTriStripMeshCallBack *callback, void **data); + + +extern RpMeshHeader * +_rpTriListMeshGenerate(RpBuildMesh *buildMesh, void *data); + +/* + * Optimise the mesh ordering + * (sort on material and place transparent materials last) + */ +extern RpMeshHeader * +_rpMeshOptimise(RpBuildMesh *buildmesh, RwUInt32 flags); + +#ifdef __cplusplus +} +#endif /* __cplusplus */ + + +#define _rpTriStripMeshTrivialGenerate(_buildMesh, _data) \ + RpBuildMeshGenerateTrivialTriStrip(_buildMesh, _data) + +#define _rpTriStripMeshDefaultGenerate(_buildmesh, _data) \ + RpBuildMeshGenerateDefaultTriStrip(_buildmesh, _data) + +#define _rpTriStripMeshPreprocessGenerate(_buildmesh, _data) \ + RpBuildMeshGeneratePreprocessTriStrip(_buildmesh, _data) + +#define _rpTriStripMeshExhaustiveGenerate(_buildmesh, _data) \ + RpBuildMeshGenerateExhaustiveTriStrip(_buildmesh, _data) + +#define _rpMeshSetTristripMethod(_callback, _data) \ + RpMeshSetTriStripMethod(_callback, _data) + +#define _rpMeshGetTristripMethod(_callback, _data) \ + RpMeshGetTriStripMethod(_callback, _data) + + + +/*--- Automatically derived from: c:/daily/rwsdk/world/balight.h ---*/ + +/* + * Lighting 3D objects. + * Lights are used to illuminate atomics and worlds + * + * Copyright (c) 1998 Criterion Software Ltd. + */ + + +/**************************************************************************** + Defines + */ + +/* Binary Light */ +typedef struct RpLightChunkInfo RpLightChunkInfo; +typedef struct RpLightChunkInfo _rpLight; + +#if (!defined(DOXYGEN)) +struct RpLightChunkInfo +{ + RwReal radius; /**< radius */ + RwReal red; /**< red */ + RwReal green; /**< green */ + RwReal blue; /**< blue */ + RwReal minusCosAngle; /**< minusCosAngle */ + RwUInt32 typeAndFlags; /**< typeAndFlags */ +}; +#endif /* (!defined(DOXYGEN)) */ + +/* Type ID */ +#define rpLIGHT 3 + +/* Beyond this the lights must be positioned */ +#define rpLIGHTPOSITIONINGSTART 0x80 + +/** + * \ingroup rplight + * \ref RpLightType are + * light sub types. This type represents the different + * types of light source that can be created using the API function \ref RpLightCreate. + * Note that lights of types rpLIGHTPOINT, rpLIGHTSPOT and rpLIGHTSPOTSOFT have linear + * intensity fall-off with distance from the source, reducing to zero at the light's radius:*/ +enum RpLightType +{ + rpNALIGHTTYPE = 0, + + /* These don't take part in the tie mechanism (no position) */ + rpLIGHTDIRECTIONAL, /**<Directional Light */ + rpLIGHTAMBIENT, /**<Ambient Light */ + + /* These do take part in the tie mechanism (do have position) */ + rpLIGHTPOINT = rpLIGHTPOSITIONINGSTART, /**<Point Light */ + rpLIGHTSPOT, /**<Spot Light */ + rpLIGHTSPOTSOFT, /**<Soft Spot Light */ + rpLIGHTTYPEFORCEENUMSIZEINT = RWFORCEENUMSIZEINT +}; +typedef enum RpLightType RpLightType; + +#define rpLIGHTMINCONEANGLE ((RwReal)0.0f) + +#if (defined(XBOX_DRVMODEL_H)) +#define rpLIGHTMAXCONEANGLE (rwPIOVER2) +#elif (defined(OPENGL_DRVMODEL_H)) +#define rpLIGHTMAXCONEANGLE (rwPIOVER2) +#elif (defined(GCN_DRVMODEL_H)) +#define rpLIGHTMAXCONEANGLE (rwPIOVER2) +#elif (defined(D3D8_DRVMODEL_H)) +#define rpLIGHTMAXCONEANGLE (rwPIOVER2) +#else +#define rpLIGHTMAXCONEANGLE (rwPI) +#endif + +/*************/ + +/*** FLAGS ***/ + +/*************/ + +/** + * \ingroup rplight + * \ref RpLightFlag defines what geometry is influenced by the light. + * The bit-field RpLightFlag specifies the options available for controlling the scope + * of a light source (see API function \ref RpLightSetFlags):*/ +enum RpLightFlag +{ + rpLIGHTLIGHTATOMICS = 0x01, /**<The light source illuminates all atomics in a world */ + rpLIGHTLIGHTWORLD = 0x02, /**<The light source illuminates all static geometry in a world */ + rpLIGHTFLAGFORCEENUMSIZEINT = RWFORCEENUMSIZEINT +}; +typedef enum RpLightFlag RpLightFlag; + +/* rpLIGHTPRIVATENOCHROMA - turns on optimisations to do with + * lights which are a shade of grey + */ +enum rpLightPrivateFlag +{ + rpLIGHTPRIVATENOCHROMA = 0x01, + rpLIGHTPRIVATEFLAGFORCEENUMSIZEINT = RWFORCEENUMSIZEINT +}; +typedef enum rpLightPrivateFlag rpLightPrivateFlag; + +/*********************/ + + +#define RWMINUSCOSFROMTAN(_minusCosAngle, _tanAngle) \ +MACRO_START \ +{ \ + const RwReal TanAngle2 = (_tanAngle) * (_tanAngle); \ + const RwReal CosAngle2 = ((RwReal)1) / ( ((RwReal)1) + TanAngle2); \ + RwReal CosAngle; \ + rwSqrtMacro(&CosAngle, CosAngle2); \ + (_minusCosAngle) = - CosAngle; \ +} \ +MACRO_STOP + +#define RWTANFROMMINUSCOS(_tanAngle, _minusCosAngle) \ +MACRO_START \ +{ \ + const RwReal CosAngle2 = (_minusCosAngle) * (_minusCosAngle); \ + const RwReal TanAngle2 = (((RwReal)1) - (CosAngle2)) / (CosAngle2); \ + rwSqrtMacro(&_tanAngle, TanAngle2); \ +} \ +MACRO_STOP + + +/** + * \ingroup rplight + * \struct RpLight + * Light object. This should be + * considered an opaque type. Use the RpLight API functions to access. + */ +typedef struct RpLight RpLight; + +#if (!defined(DOXYGEN)) +struct RpLight +{ + RwObjectHasFrame object; /**< object */ + RwReal radius; /**< radius */ + RwRGBAReal color; /**< color */ /* Light color */ + RwReal minusCosAngle; /**< minusCosAngle */ + RwLinkList WorldSectorsInLight; /**< WorldSectorsInLight */ + RwLLLink inWorld; /**< inWorld */ + RwUInt16 lightFrame; /**< lightFrame */ + RwUInt16 pad; +}; +#endif /* (!defined(DOXYGEN)) */ + +/** + * \ingroup rplight + * \ref RpLightCallBack + * represents the function called from \ref RpWorldForAllLights and + * \ref RpWorld SectorForAllLights for all lights in a given world or world + * sector. This function should return a pointer to the current light to + * indicate success. The callback may return NULL to terminate further + * callbacks on the world sector. + * + * \param light Pointer to the current light in the world + * sector. + * \param data Pointer to developer-defined data structure. + * + * \return Pointer to the current light. + */ +typedef RpLight *(*RpLightCallBack) (RpLight * light, void *data); + +typedef struct RpLightTie RpLightTie; + +/** + * \ingroup rplight + * \struct RpLightTie + * + * RpLightTie is a linked list of lights inside world sectors. These are + * created when frame hierarchies are updated as part of an \ref RwCameraBeginUpdate. + * This is used for determining which lights influence a world sector and the atomics inside it. + * Creation and destruction of RpLightTies is internal to the world plugin. + */ +struct RpLightTie +{ + /* Information for an atomic sector */ + RwLLLink lightInWorldSector; /**< Lights IN this ATOMIC SECTOR */ + RpLight *light; /**< A pointer to a light */ + + /* Information for a atomic */ + RwLLLink WorldSectorInLight; /**< Atomic sectors HOLDING this Light */ + RpWorldSector *sect; /**< A pointer to a world sector */ +}; + + +/**************************************************************************** + <macro/inline functionality + */ + +#define RpLightGetRadiusMacro(_light) \ + ((_light)->radius) + +#define RpLightGetColorMacro(_light) \ + (&((_light)->color)) + +#define RpLightSetFrameMacro(_light, _frame) \ + (rwObjectHasFrameSetFrame((_light), (_frame)), (_light)) + +#define RpLightGetFrameMacro(_light) \ + ((RwFrame *)rwObjectGetParent((_light))) + +#define RpLightGetTypeMacro(_light) \ + ((RpLightType)rwObjectGetSubType((_light))) + +#define RpLightSetFlagsMacro(_light, _flags) \ + ((rwObjectSetFlags((_light), (_flags))), (_light)) + +#define RpLightGetFlagsMacro(_light) \ + (rwObjectGetFlags((_light))) + + +#if !(defined(RWDEBUG) || defined(RWSUPPRESSINLINE)) + +#define RpLightGetRadius(_light) \ + RpLightGetRadiusMacro(_light) + +#define RpLightGetColor(_light) \ + RpLightGetColorMacro(_light) + +#define RpLightSetFrame(_light, _frame) \ + RpLightSetFrameMacro(_light, _frame) + +#define RpLightGetFrame(_light) \ + RpLightGetFrameMacro(_light) + +#define RpLightGetType(_light) \ + RpLightGetTypeMacro(_light) + +#define RpLightSetFlags(_light, _flags) \ + RpLightSetFlagsMacro(_light, _flags) + +#define RpLightGetFlags(_light) \ + RpLightGetFlagsMacro(_light) + +#endif /* !(defined(RWDEBUG) || defined(RWSUPPRESSINLINE)) */ + + +/**************************************************************************** + Function prototypes + */ + +#ifdef __cplusplus +extern "C" +{ +#endif /* __cplusplus */ + + +#if (defined(RWDEBUG) || defined(RWSUPPRESSINLINE)) +extern RwReal RpLightGetRadius(const RpLight *light); +extern const RwRGBAReal *RpLightGetColor(const RpLight *light); +extern RpLight *RpLightSetFrame(RpLight *light, RwFrame *frame); +extern RwFrame *RpLightGetFrame(const RpLight *light); +extern RpLightType RpLightGetType(const RpLight *light); +extern RpLight *RpLightSetFlags(RpLight *light, RwUInt32 flags); +extern RwUInt32 RpLightGetFlags(const RpLight *light); +#endif /* (defined(RWDEBUG) || defined(RWSUPPRESSINLINE)) */ + +/* API Functions */ +extern void RpLightSetFreeListCreateParams( RwInt32 blockSize, RwInt32 numBlocksToPrealloc ); +extern RpLight *RpLightCreate(RwInt32 type); +extern RwBool RpLightDestroy(RpLight *light); +extern RpLight *RpLightSetRadius(RpLight *light, RwReal radius); +extern RpLight *RpLightSetColor(RpLight *light, const RwRGBAReal *color); +extern RwReal RpLightGetConeAngle(const RpLight *light); +extern RpLight *RpLightSetConeAngle(RpLight * ight, RwReal angle); +extern RwUInt32 RpLightStreamGetSize(const RpLight *light); +extern RpLight *RpLightStreamRead(RwStream *stream); +extern const RpLight *RpLightStreamWrite(const RpLight *light, + RwStream *stream); +extern RpLightChunkInfo *_rpLightChunkInfoRead(RwStream *stream, + RpLightChunkInfo *lightChunkInfo, + RwInt32 *bytesRead); + +/* Attaching toolkits */ +extern RwInt32 RpLightRegisterPlugin(RwInt32 size, + RwUInt32 pluginID, + RwPluginObjectConstructor constructCB, + RwPluginObjectDestructor destructCB, + RwPluginObjectCopy copyCB); +extern RwInt32 RpLightRegisterPluginStream(RwUInt32 pluginID, + RwPluginDataChunkReadCallBack readCB, + RwPluginDataChunkWriteCallBack writeCB, + RwPluginDataChunkGetSizeCallBack getSizeCB); +extern RwInt32 RpLightSetStreamAlwaysCallBack(RwUInt32 pluginID, + RwPluginDataChunkAlwaysCallBack alwaysCB); +extern RwInt32 RpLightGetPluginOffset(RwUInt32 pluginID); +extern RwBool RpLightValidatePlugins(const RpLight * light); + +#ifdef __cplusplus +} +#endif /* __cplusplus */ + +#define RpLightChunkInfoRead(stream, lightChunkInfo, bytesRead) \ + _rpLightChunkInfoRead(stream, lightChunkInfo, bytesRead) + + +/*--- Automatically derived from: C:/daily/rwsdk/world/pipe/p2/d3d8/D3D8lights.h ---*/ +/* + * typedef for struct RpD3D8AttenuationParams + */ +typedef struct RpD3D8AttenuationParams RpD3D8AttenuationParams; +/** + * \ingroup rplightd3d8 + * \struct RpD3D8AttenuationParams + * This type represents the attenuation model of a spot or point light. + */ +struct RpD3D8AttenuationParams +{ + RwReal constant; /**< Constant attenuation coefficient */ + RwReal linear; /**< Linear attenuation coefficient */ + RwReal quadratic; /**< Quadratic attenuation coefficient */ +}; + +#ifdef __cplusplus +extern "C" +{ +#endif /* __cplusplus */ + +extern void +RpD3D8LightSetAttenuationParams(RpLight *light, + const RpD3D8AttenuationParams *params); + +extern void +RpD3D8LightGetAttenuationParams(const RpLight *light, + RpD3D8AttenuationParams *params); + +extern RwBool +_rwD3D8LightsOpen(void); + +extern RwBool +_rwD3D8LightsGlobalEnable(RpLightFlag flags); + +extern RwBool +_rwD3D8LightDirectionalEnable(RpLight *light); + +extern RwBool +_rwD3D8LightLocalEnable(RpLight *light); + +extern void +_rwD3D8LightsEnable(RwBool enable, RwUInt32 type); + +extern void +_rwD3D8LightsClose(void); + + +#ifdef __cplusplus +} +#endif /* __cplusplus */ + + +/*--- Automatically derived from: c:/daily/rwsdk/world/bageomet.h ---*/ + +/* + * Handling atomic's geometry + * Geometry describe objects, and are the building blocks for atomics + * + * Copyright (c) 1998 Criterion Software Ltd. +*/ + + +/**************************************************************************** + Defines + */ + +/* Type ID */ +#define rpGEOMETRY 8 + +/** + * \ingroup rpgeometry + * RpGeometryFlag + * Geometry type flags + * + * When creating a geometry, these flags can be OR'ed together to + * specify the format along with the rpGEOMETRYTEXCOORDSETS(n) macro if more + * than two sets of texture coordinates are required. See \ref RpGeometryCreate + * for more details. + * + * \see RpGeometryCreate(). + */ +enum RpGeometryFlag +{ + rpGEOMETRYTRISTRIP = 0x00000001, /**<This geometry's meshes can be + rendered as strips. + \ref RpMeshSetTriStripMethod is + used to change this method.*/ + rpGEOMETRYPOSITIONS = 0x00000002, /**<This geometry has positions */ + rpGEOMETRYTEXTURED = 0x00000004, /**<This geometry has only one set of + texture coordinates. Texture + coordinates are specified on a per + vertex basis */ + rpGEOMETRYPRELIT = 0x00000008, /**<This geometry has pre-light colors */ + rpGEOMETRYNORMALS = 0x00000010, /**<This geometry has vertex normals */ + rpGEOMETRYLIGHT = 0x00000020, /**<This geometry will be lit */ + rpGEOMETRYMODULATEMATERIALCOLOR = 0x00000040, /**<Modulate material color + with vertex colors + (pre-lit + lit) */ + + rpGEOMETRYTEXTURED2 = 0x00000080, /**<This geometry has at least 2 sets of + texture coordinates. */ + + /* + * These above flags were stored in the flags field in an RwObject, they + * are now stored in the flags file of the RpGeometry. + */ + + rpGEOMETRYNATIVE = 0x01000000, + rpGEOMETRYNATIVEINSTANCE = 0x02000000, + + rpGEOMETRYFLAGSMASK = 0x000000FF, + rpGEOMETRYNATIVEFLAGSMASK = 0x0F000000, + + rpGEOMETRYFLAGFORCEENUMSIZEINT = RWFORCEENUMSIZEINT +}; +typedef enum RpGeometryFlag RpGeometryFlag; + +/* Multi texture coordinate format specifier for RpGeometryCreate() */ +#define rpGEOMETRYTEXCOORDSETS(_num) ((_num & 0xff) << 16) + +/** + * \ingroup rpgeometry + * RpGeometryLockMode + * Geometry lock flags + */ +enum RpGeometryLockMode +{ + rpGEOMETRYLOCKPOLYGONS = 0x01, /**<Lock the polygons (triangle list) */ + rpGEOMETRYLOCKVERTICES = 0x02, /**<Lock the vertex positional data */ + rpGEOMETRYLOCKNORMALS = 0x04, /**<Lock the vertex normal data */ + rpGEOMETRYLOCKPRELIGHT = 0x08, /**<Lock the pre-light values */ + rpGEOMETRYLOCKTEXCOORDS = 0x10, /**<Lock the texture coordinates set 1*/ + rpGEOMETRYLOCKTEXCOORDS1 = 0x10, /**<Lock the texture coordinates set 1*/ + rpGEOMETRYLOCKTEXCOORDS2 = 0x20, /**<Lock the texture coordinates set 2*/ + rpGEOMETRYLOCKTEXCOORDS3 = 0x40, /**<Lock the texture coordinates set 3*/ + rpGEOMETRYLOCKTEXCOORDS4 = 0x80, /**<Lock the texture coordinates set 4*/ + rpGEOMETRYLOCKTEXCOORDS5 = 0x0100, /**<Lock the texture coordinates set 5*/ + rpGEOMETRYLOCKTEXCOORDS6 = 0x0200, /**<Lock the texture coordinates set 6*/ + rpGEOMETRYLOCKTEXCOORDS7 = 0x0400, /**<Lock the texture coordinates set 7*/ + rpGEOMETRYLOCKTEXCOORDS8 = 0x0800, /**<Lock the texture coordinates set 8*/ + rpGEOMETRYLOCKTEXCOORDSALL = 0x0ff0, /**<Lock all texture coordinate sets*/ + rpGEOMETRYLOCKALL = 0x0fff, /**<Combination of all the above */ + + rpGEOMETRYLOCKMODEFORCEENUMSIZEINT = RWFORCEENUMSIZEINT +}; +typedef enum RpGeometryLockMode RpGeometryLockMode; + +/* Convenience macro for generating a tex coord lock flag */ +#define rpGEOMETRYLOCKTEXCOORDSIDX(_idx) (rpGEOMETRYLOCKTEXCOORDS1 << (_idx)) + + +/**************************************************************************** + Global Types + */ + +typedef struct rpGeometryGlobals rpGeometryGlobals; + +#if (!defined(DOXYGEN)) +struct rpGeometryGlobals +{ + RwFreeList *geomFreeList; +}; +#endif /* (!defined(DOXYGEN)) */ + +/** + * \ingroup rpgeometry + * \struct RpGeometry + * Geometry object. This should be considered an opaque type. + * Use the RpGeometry API functions to access. + */ +typedef struct RpGeometry RpGeometry; + +/** + * \ingroup rpmorphtarget + * \struct RpMorphTarget + * Morph target -- vertex positions and normals. + * This should be considered an opaque type. + * Use RpMorphTarget API functions to access. + */ +typedef struct RpMorphTarget RpMorphTarget; + +#if (!defined(DOXYGEN)) +struct RpMorphTarget +{ + RpGeometry *parentGeom; + RwSphere boundingSphere; + RwV3d *verts; + RwV3d *normals; +}; +#endif /* (!defined(DOXYGEN)) */ + +typedef struct RpTriangle RpTriangle; + +/** + * \ingroup rpgeometry + * \struct RpTriangle + * This type represents a triangle in a geometry specified + * by three indices into the geometry's vertex list (vertIndex) + * together with an index in to the geometry's + * material list (matIndex) (see API function \ref RpGeometryGetTriangles) + */ +struct RpTriangle +{ + RwUInt16 vertIndex[3]; /**< vertex indices */ + RwInt16 matIndex; /**< Index into material list */ +}; + +#if (!defined(DOXYGEN)) +struct RpGeometry +{ + RwObject object; /* Generic type */ + + RwUInt32 flags; /* Geometry flags */ + + RwUInt16 lockedSinceLastInst; /* What has been locked since we last instanced - for re-instancing */ + RwInt16 refCount; /* Reference count (for keeping track of atomics referencing geometry) */ + + RwInt32 numTriangles; /* Quantity of various things (polys, verts and morph targets) */ + RwInt32 numVertices; + RwInt32 numMorphTargets; + RwInt32 numTexCoordSets; + + RpMaterialList matList; + + RpTriangle *triangles; /* The triangles */ + + RwRGBA *preLitLum; /* The pre-lighting values */ + + RwTexCoords *texCoords[rwMAXTEXTURECOORDS]; /* Texture coordinates */ + + RpMeshHeader *mesh; /* The mesh - groups polys of the same material */ + + RwResEntry *repEntry; /* Information for an instance */ + + RpMorphTarget *morphTarget; /* The Morph Target */ +}; + +typedef struct RpGeometryChunkInfo RpGeometryChunkInfo; +typedef struct RpGeometryChunkInfo _rpGeometry; + +struct RpGeometryChunkInfo +{ + RwInt32 format; /* Compression flags and number of texture coord sets */ + + RwInt32 numTriangles; + RwInt32 numVertices; + + RwInt32 numMorphTargets; +}; +#endif /* (!defined(DOXYGEN)) */ + +/* Callbacks */ + +/** + * \ingroup rpgeometry + * \ref RpGeometryCallBack represents the simple callback function for the \ref RpGeometry object. + * The callback may return NULL to terminate further callbacks on + * the geometry. + * + * \param geometry Pointer to the current geometry, supplied by iterator. + * \param data Pointer to developer-defined data structure. + * + * \return + */ +typedef RpGeometry *(*RpGeometryCallBack)(RpGeometry *geometry, void *data); + +/** + * \ingroup rpgeometry + * \ref RpGeometrySortByMaterialCallBack + * \ref RpGeometrySortByMaterialCallBack is used by + * \ref RpGeometrySortByMaterial in order to preserve the validity of plugin + * data when the vertices in an \ref RpGeometry are sorted (and some possibly + * duplicated). + * + * A vertex map table is provided to the callback - this contains, for each + * vertex in the new geometry, the index of the corresponding vertex in the + * original geometry. + * + * \param oldGeom Pointer to the source geometry. + * \param newGeom Pointer to the new, sorted geometry. + * \param remapTable Pointer to the vertex map table + * \param numberOfEntries Number of vertices in the new + * geometry (size of the map table) + */ +typedef void (*RpGeometrySortByMaterialCallBack)(const RpGeometry *oldGeom, + RpGeometry *newGeom, + RwUInt16 *remapTable, + RwUInt16 numberOfEntries); + + +/**************************************************************************** + <macro/inline functionality + */ + +#define RpMorphTargetSetBoundingSphereMacro(_mt, _sphere) \ + (RwSphereAssign(&((_mt)->boundingSphere), (_sphere)), (_mt)) + +#define RpMorphTargetGetBoundingSphereMacro(_mt) \ + (&((_mt)->boundingSphere)) + +#define RpGeometryGetNumMorphTargetsMacro(_geometry) \ + ((_geometry)->numMorphTargets) + +#define RpGeometryGetMorphTargetMacro(_geometry, _index) \ + (&((_geometry)->morphTarget[(_index)])) + +#define RpGeometryGetPreLightColorsMacro(_geometry) \ + ((_geometry)->preLitLum) + +#define RpGeometryGetVertexTexCoordsMacro(_geometry, _uvIndex) \ + ((_geometry)->texCoords[(_uvIndex) - 1]) + +#define RpGeometryGetNumTexCoordSetsMacro(_geometry) \ + ((_geometry)->numTexCoordSets) + +#define RpGeometryGetNumVerticesMacro(_geometry) \ + ((_geometry)->numVertices) + +#define RpMorphTargetGetVerticesMacro(_mt) \ + ((_mt)->verts) + +#define RpMorphTargetGetVertexNormalsMacro(_mt) \ + ((_mt)->normals) + +#define RpGeometryGetTrianglesMacro(_geometry) \ + ((_geometry)->triangles) + +#define RpGeometryGetNumTrianglesMacro(_geometry) \ + ((_geometry)->numTriangles) + +#define RpGeometryGetMaterialMacro(_geometry, _num) \ + (((_geometry)->matList.materials)[(_num)]) + +#define RpGeometryGetNumMaterialsMacro(_geometry) \ + ((_geometry)->matList.numMaterials) + +#define RpGeometryGetFlagsMacro(_geometry) \ + ((_geometry)->flags) + +#define RpGeometrySetFlagsMacro(_geometry, _flags) \ + (((_geometry)->flags = (_flags)), (_geometry)) + + +#if !(defined(RWDEBUG) || defined(RWSUPPRESSINLINE)) + +#define RpMorphTargetSetBoundingSphere(_geometry, _sphere) \ + RpMorphTargetSetBoundingSphereMacro(_geometry, _sphere) + +#define RpMorphTargetGetBoundingSphere(_geometry) \ + RpMorphTargetGetBoundingSphereMacro(_geometry) + +#define RpGeometryGetNumMorphTargets(_geometry) \ + RpGeometryGetNumMorphTargetsMacro(_geometry) + +#define RpGeometryGetMorphTarget(_geometry, _index) \ + RpGeometryGetMorphTargetMacro(_geometry, _index) + +#define RpGeometryGetPreLightColors(_geometry) \ + RpGeometryGetPreLightColorsMacro(_geometry) + +#define RpGeometryGetVertexTexCoords(_geometry, _uvIndex) \ + RpGeometryGetVertexTexCoordsMacro(_geometry, _uvIndex) + +#define RpGeometryGetNumTexCoordSets(_geometry) \ + RpGeometryGetNumTexCoordSetsMacro(_geometry) + +#define RpGeometryGetNumVertices(_geometry) \ + RpGeometryGetNumVerticesMacro(_geometry) + +#define RpMorphTargetGetVertices(_mt) \ + RpMorphTargetGetVerticesMacro(_mt) + +#define RpMorphTargetGetVertexNormals(_mt) \ + RpMorphTargetGetVertexNormalsMacro(_mt) + +#define RpGeometryGetTriangles(_geometry) \ + RpGeometryGetTrianglesMacro(_geometry) + +#define RpGeometryGetNumTriangles(_geometry) \ + RpGeometryGetNumTrianglesMacro(_geometry) + +#define RpGeometryGetMaterial(_geometry, _num) \ + RpGeometryGetMaterialMacro(_geometry, _num) + +#define RpGeometryGetNumMaterials(_geometry) \ + RpGeometryGetNumMaterialsMacro(_geometry) + +#define RpGeometryGetFlags(_geometry) \ + RpGeometryGetFlagsMacro(_geometry) + +#define RpGeometrySetFlags(_geometry, _flags) \ + RpGeometrySetFlagsMacro(_geometry, _flags) + +#endif /* !(defined(RWDEBUG) || defined(RWSUPPRESSINLINE)) */ + + +/**************************************************************************** + Function prototypes + */ + +#ifdef __cplusplus +extern "C" +{ +#endif /* __cplusplus */ + + +/* Transforms geometry morph target vertices */ + +extern RpGeometry * +RpGeometryTransform(RpGeometry *geometry, + const RwMatrix *matrix); + +/* Create geometry for a 'space' marker */ + +extern RpGeometry * +RpGeometryCreateSpace(RwReal radius); + +/* Morph targets - Accessing geometry contents */ + +#if (defined(RWDEBUG) || defined(RWSUPPRESSINLINE)) + +extern RpMorphTarget * +RpMorphTargetSetBoundingSphere(RpMorphTarget *morphTarget, + const RwSphere *boundingSphere); + +extern RwSphere * +RpMorphTargetGetBoundingSphere(RpMorphTarget *morphTarget); + +#endif /* (defined(RWDEBUG) || defined(RWSUPPRESSINLINE)) */ + +extern const RpMorphTarget * +RpMorphTargetCalcBoundingSphere(const RpMorphTarget *morphTarget, + RwSphere *boundingSphere); + +extern RwInt32 +RpGeometryAddMorphTargets(RpGeometry *geometry, + RwInt32 mtcount); + +extern RwInt32 +RpGeometryAddMorphTarget(RpGeometry *geometry); + +extern RpGeometry * +RpGeometryRemoveMorphTarget(RpGeometry *geometry, + RwInt32 morphTarget); + +#if (defined(RWDEBUG) || defined(RWSUPPRESSINLINE)) +extern RwInt32 +RpGeometryGetNumMorphTargets(const RpGeometry *geometry); + +extern RpMorphTarget * +RpGeometryGetMorphTarget(const RpGeometry *geometry, + RwInt32 morphTarget); + +extern RwRGBA * +RpGeometryGetPreLightColors(const RpGeometry *geometry); + +extern RwTexCoords * +RpGeometryGetVertexTexCoords(const RpGeometry *geometry, + RwTextureCoordinateIndex uvIndex); + +extern RwInt32 +RpGeometryGetNumTexCoordSets(const RpGeometry *geometry); + +extern RwInt32 +RpGeometryGetNumVertices (const RpGeometry *geometry); + +extern RwV3d * +RpMorphTargetGetVertices(const RpMorphTarget *morphTarget); + +extern RwV3d * +RpMorphTargetGetVertexNormals(const RpMorphTarget *morphTarget); + +extern RpTriangle * +RpGeometryGetTriangles(const RpGeometry *geometry); + +extern RwInt32 +RpGeometryGetNumTriangles(const RpGeometry *geometry); + +extern RpMaterial * +RpGeometryGetMaterial(const RpGeometry *geometry, + RwInt32 matNum); + +#endif /* (defined(RWDEBUG) || defined(RWSUPPRESSINLINE)) */ + +extern const RpGeometry * +RpGeometryTriangleSetVertexIndices(const RpGeometry *geometry, + RpTriangle *triangle, + RwUInt16 vert1, + RwUInt16 vert2, + RwUInt16 vert3); + +extern RpGeometry * +RpGeometryTriangleSetMaterial(RpGeometry *geometry, + RpTriangle *triangle, + RpMaterial *material); + +extern const RpGeometry * +RpGeometryTriangleGetVertexIndices(const RpGeometry *geometry, + const RpTriangle *triangle, + RwUInt16 *vert1, + RwUInt16 *vert2, + RwUInt16 *vert3); + +extern RpMaterial * +RpGeometryTriangleGetMaterial(const RpGeometry *geometry, + const RpTriangle *triangle); + +#if (defined(RWDEBUG) || defined(RWSUPPRESSINLINE)) +extern RwInt32 +RpGeometryGetNumMaterials(const RpGeometry *geometry); + +#endif /* (defined(RWDEBUG) || defined(RWSUPPRESSINLINE)) */ + +extern RpGeometry * +RpGeometryForAllMaterials(RpGeometry *geometry, + RpMaterialCallBack fpCallBack, + void *pData); + +/* Accessing the inards of geometry */ +extern RpGeometry * +RpGeometryLock(RpGeometry *geometry, + RwInt32 lockMode); + +extern RpGeometry * +RpGeometryUnlock(RpGeometry *geometry); + +extern const RpGeometry * +RpGeometryForAllMeshes(const RpGeometry *geometry, + RpMeshCallBack fpCallBack, + void *pData); + +/* Creation and destruction */ +extern RpGeometry * +RpGeometryCreate(RwInt32 numVert, + RwInt32 numTriangles, + RwUInt32 format); + +extern RwBool +RpGeometryDestroy(RpGeometry *geometry); + +extern RpGeometry * +_rpGeometryAddRef(RpGeometry *geometry); + +/* Attaching toolkits */ +extern RwInt32 +RpGeometryRegisterPlugin(RwInt32 size, + RwUInt32 pluginID, + RwPluginObjectConstructor constructCB, + RwPluginObjectDestructor destructCB, + RwPluginObjectCopy copyCB); + +extern RwInt32 +RpGeometryRegisterPluginStream(RwUInt32 pluginID, + RwPluginDataChunkReadCallBack readCB, + RwPluginDataChunkWriteCallBack writeCB, + RwPluginDataChunkGetSizeCallBack getSizeCB); + +extern RwInt32 +RpGeometrySetStreamAlwaysCallBack(RwUInt32 pluginID, + RwPluginDataChunkAlwaysCallBack alwaysCB); + +extern RwInt32 +RpGeometryGetPluginOffset(RwUInt32 pluginID); + +extern RwBool +RpGeometryValidatePlugins(const RpGeometry *geometry); + +/* Binary format */ +extern RwUInt32 +RpGeometryStreamGetSize(const RpGeometry *geometry); + +extern const RpGeometry * +RpGeometryStreamWrite(const RpGeometry *geometry, + RwStream *stream); + +extern RpGeometry * +RpGeometryStreamRead(RwStream *stream); + +extern RpGeometryChunkInfo * +_rpGeometryChunkInfoRead(RwStream *stream, + RpGeometryChunkInfo *geometryChunkInfo, + RwInt32 *bytesRead); + +#if (defined(RWDEBUG) || defined(RWSUPPRESSINLINE)) +/* Flags */ +extern RwUInt32 +RpGeometryGetFlags(const RpGeometry *geometry); + +extern RpGeometry * +RpGeometrySetFlags(RpGeometry *geometry, + RwUInt32 flags); + +#endif + +#ifdef __cplusplus +} +#endif /* __cplusplus */ + +#define rpGeometryAddRef(_geometry) \ + _rpGeometryAddRef(_geometry) + +#define RpGeometryChunkInfoRead(stream, geometryChunkInfo, bytesRead) \ + _rpGeometryChunkInfoRead(stream, geometryChunkInfo, bytesRead) + + +/*--- Automatically derived from: c:/daily/rwsdk/world/baclump.h ---*/ + +/* + * Clump and atomic handling. + * Clumps and atomics are the movable rendered objects in the world + * + * Copyright (c) 1998 Criterion Software Ltd. + */ + + +/**************************************************************************** + Defines + */ + +/****************************** Object type ID ******************************/ + +/* Type IDs */ + +#define rpATOMIC 1 +#define rpCLUMP 2 + +/* Interpolator flags */ +enum RpInterpolatorFlag +{ + rpINTERPOLATORDIRTYINSTANCE = 0x01, + rpINTERPOLATORDIRTYSPHERE = 0x02, + rpINTERPOLATORNOFRAMEDIRTY = 0x04, + rpINTERPOLATORFLAGFORCEENUMSIZEINT = RWFORCEENUMSIZEINT +}; +typedef enum RpInterpolatorFlag rpInterpolatorFlag; + +/** + * \ingroup rpatomic + * The bit-field type RpAtomicFlag specifies the options available for + * controlling the behavior of atomics. See API function \ref RpAtomicSetFlags. + * + * \see RpAtomicSetFlags + * \see RpAtomicGetFlags + * \see RpWorldSectorForAllCollisionAtomics + */ + +enum RpAtomicFlag +{ + rpATOMICCOLLISIONTEST = 0x01, /**<A generic collision flag to indicate + * that the atomic should be considered + * in collision tests. + */ + rpATOMICRENDER = 0x04, /**<The atomic is rendered if it is + * in the view frustum. + */ + + rpATOMICFLAGFORCEENUMSIZEINT = RWFORCEENUMSIZEINT +}; +typedef enum RpAtomicFlag RpAtomicFlag; + +/** + * \ingroup rpatomic + * \ref RpAtomicSetGeomFlag defines how an atomic references a new geometry + * + * \see RpAtomicSetGeometry + */ +enum RpAtomicSetGeomFlag +{ + rpATOMICSAMEBOUNDINGSPHERE = 0x01, /**<The bounding-sphere for the + * new geometry is assumed to be the + * same as the old one, if any, and + * should not be recalculated. + */ + + rpATOMICSETGEOMFLAGFORCEENUMSIZEINT = RWFORCEENUMSIZEINT +}; +typedef enum RpAtomicSetGeomFlag RpAtomicSetGeomFlag; + +enum RpAtomicPrivateFlag +{ + rpATOMICPRIVATEWORLDBOUNDDIRTY = 0x01, + rpATOMICPRIVATEFLAGFORCEENUMSIZEINT = RWFORCEENUMSIZEINT +}; +typedef enum RpAtomicPrivateFlag rpAtomicPrivateFlag; + + +/** + * \ingroup rpatomic + * \struct RpAtomic + * Atomic Geometry object. This should be + * considered an opaque type. Use the RpAtomic API functions to access. + */ +typedef struct RpAtomic RpAtomic; + +/** + * \ingroup rpinterpolator + * \struct RpInterpolator + * Morph Target Interpolator. + * This should be considered an opaque type. + * Use the RpInterpolator API functions to access. + */ +typedef struct RpInterpolator RpInterpolator; + +#if (!defined(DOXYGEN)) +struct RpInterpolator +{ + RwInt32 flags; /**< flags */ + RwInt16 startMorphTarget; /**< startMorphTarget */ + RwInt16 endMorphTarget; /**< endMorphTarget */ + RwReal time; /**< time */ + RwReal recipTime; /**< recipTime */ + RwReal position; /**< position */ +}; +#endif /* (!defined(DOXYGEN)) */ + +/* More callbacks */ + +/** + * \ingroup rpclump + * \struct RpClump + * Clump Geometry object. This should be + * considered an opaque type. Use the RpClump API functions to access. + */ +typedef struct RpClump RpClump; + +/** + * \ingroup rpclump + * \ref RpClumpCallBack represents the + * function called from \ref RwCameraForAllClumpsInFrustum and + * \ref RwCameraForAllClumpsNotInFrustum when a clump lies inside the current camera's + * view frustum. It is also called from \ref RpWorldForAllClumps. This function should + * return a pointer to the current clump to indicate success. The callback may return + * NULL to terminate further callbacks on the clumps. + * + * \param clump Pointer to the current clump, supplied by + * iterator. + * \param data Pointer to developer-defined data structure. + * + * \return Pointer to the current clump. + * + * \see RpWorldForAllClumps + * \see RpClumpGetCallBack + * \see RpClumpSetCallBack + * \see RwCameraForAllClumpsInFrustum + * \see RwCameraForAllClumpsNotInFrustum + */ +typedef RpClump *(*RpClumpCallBack) (RpClump * clump, void *data); + +#if (!defined(DOXYGEN)) +struct RpClump +{ + RwObject object; + + /* Information about all the Atomics */ + RwLinkList atomicList; + + /* Lists of lights and cameras */ + RwLinkList lightList; + RwLinkList cameraList; + + /* The clump in the world */ + RwLLLink inWorldLink; + + /* Clump callback */ + RpClumpCallBack callback; + + /* Render frame - used to prevent multiple invocations + * of the clump frustum callback + */ + RwUInt16 renderFrame; + RwUInt16 pad; +}; +#endif /* (!defined(DOXYGEN)) */ + +/** + * \ingroup rpatomic + * \ref RpAtomicCallBackRender represents the function called from + * \ref RpAtomicRender when the specified atomic + * lies inside the current camera's view frustum. The default callback + * initiates execution of the atomic rendering pipeline. This function should + * return a pointer to the atomic to indicate success. + * + * \param atomic Pointer to the current atomic, supplied by + * iterator. + * + * \return Returns a pointer to the atomic to indicate success. + * + * \see RpAtomicRender + */ + +typedef RpAtomic *(*RpAtomicCallBackRender) (RpAtomic * atomic); + +#if (!defined(DOXYGEN)) +struct RpAtomic +{ + RwObjectHasFrame object; + + /* Information for an instance */ + RwResEntry *repEntry; + + /* Triangles making the object */ + RpGeometry *geometry; + + /* Interpolated bounding sphere (in object space and world space) */ + RwSphere boundingSphere; + RwSphere worldBoundingSphere; + + /* Connections to other atomics */ + RpClump *clump; + RwLLLink inClumpLink; + + /* callbacks */ + RpAtomicCallBackRender renderCallBack; + + /* Interpolation animation pointer */ + RpInterpolator interpolator; + + /* Counter for checks of "render has occurred already" */ + RwUInt16 renderFrame; + RwUInt16 pad; + + /* Connections to sectors */ + RwLinkList llWorldSectorsInAtomic; + + /* The Atomic object pipeline for this Atomic */ + RxPipeline *pipeline; +}; +#endif /* (!defined(DOXYGEN)) */ + +/** + * \ingroup rpatomic + * \ref RpAtomicCallBack represents the function called from \ref RpWorldSectorForAllAtomics and + * \ref RpClumpForAllAtomics for all atomics in a given world sector or clump. + * This function should return a pointer to the current atomic to indicate + * success. The callback may return NULL to terminate further callbacks on + * the world sector. + * + * \param atomic Pointer to the current atomic, supplied by + * iterator. + * \param data Pointer to developer-defined data structure. + * + * \return Returns a pointer to the current atomic + */ +typedef RpAtomic *(*RpAtomicCallBack) (RpAtomic * atomic, void *data); + +typedef struct RpTie RpTie; + +/** + * \ingroup rpatomic + * \struct RpTie + * + * RpTie is a linked list of atomics inside world sectors. These are + * created when frame hierarchies are updated as part of an \ref RwCameraBeginUpdate. + * This is used for frustum culling atomics by world sector. + * Creation and destruction of RpTies is internal to the world plugin. + */ +struct RpTie +{ + /* Information for an atomic sector */ + RwLLLink lAtomicInWorldSector; /**< Atomics IN this ATOMIC SECTOR */ + RpAtomic *apAtom; /**< An atomic */ + + /* Information for a atomic */ + RwLLLink lWorldSectorInAtomic; /**< Atomic sectors HOLDING this atomic */ + RpWorldSector *worldSector; /**< A world sector */ +}; + +typedef struct RpClumpChunkInfo RpClumpChunkInfo; +typedef struct RpClumpChunkInfo _rpClump; +typedef struct RpClumpChunkInfo33000 _rpClump33000; + +#if (!defined(DOXYGEN)) +struct RpClumpChunkInfo +{ + RwInt32 numAtomics; + RwInt32 numLights; + RwInt32 numCameras; +}; + +struct RpClumpChunkInfo33000 +{ + RwInt32 numAtomics; +}; +#endif /* (!defined(DOXYGEN)) */ + +/**************************************************************************** + <macro/inline functionality + + */ + +/* NB "RpAtomicRender(atom++) will break it */ +#define RpAtomicRenderMacro(_atomic) \ + ((_atomic)->renderCallBack(_atomic)) + +#define RpAtomicGetGeometryMacro(_atomic) \ + ((_atomic)->geometry) + +#if (!defined(RpAtomicSetRenderCallBackMacro)) + +/* NB "RpAtomicSetRenderCallBack(atom++, callback)" will break it */ +#define RpAtomicSetRenderCallBackMacro(_atomic, _callback) \ +MACRO_START \ +{ \ + (_atomic)->renderCallBack = (_callback); \ + if (!(_atomic)->renderCallBack) \ + { \ + (_atomic)->renderCallBack = AtomicDefaultRenderCallBack; \ + } \ +} \ +MACRO_STOP + +#endif /* (!defined(RpAtomicSetRenderCallBackMacro)) */ + +#define RpAtomicGetRenderCallBackMacro(_atomic) \ + ((_atomic)->renderCallBack) + +#define RpAtomicGetInterpolatorMacro(_atomic) \ + (&((_atomic)->interpolator)) + +#define RpInterpolatorGetStartMorphTargetMacro(_intrp) \ + ((_intrp)->startMorphTarget) + +#define RpInterpolatorGetEndMorphTargetMacro(_intrp) \ + ((_intrp)->endMorphTarget) + +#define RpInterpolatorGetValueMacro(_intrp) \ + ((_intrp)->position) + +#define RpInterpolatorGetScaleMacro(_intrp) \ + ((_intrp)->time) + +/* NB "RpInterpolatorSetStartMorphTarget(interp++, target)" will break it */ +#define RpInterpolatorSetStartMorphTargetMacro(_intrp, _target, _atomic)\ + ((_intrp)->startMorphTarget = (RwInt16) (_target), \ + (_intrp)->flags |= (RwInt32)(rpINTERPOLATORDIRTYINSTANCE | \ + rpINTERPOLATORDIRTYSPHERE ), \ + ((!((_intrp)->flags & rpINTERPOLATORNOFRAMEDIRTY))? \ + ((RpAtomicGetFrame(_atomic))? \ + (RwFrameUpdateObjects(RpAtomicGetFrame(_atomic))): \ + (0)): \ + (0)), \ + (_intrp)) + +/* NB "RpInterpolatorSetEndMorphTarget(interp++, target)" will break it */ +#define RpInterpolatorSetEndMorphTargetMacro(_intrp, _target, _atomic) \ + ((_intrp)->endMorphTarget = (RwInt16) (_target), \ + (_intrp)->flags |= (RwInt32)(rpINTERPOLATORDIRTYINSTANCE | \ + rpINTERPOLATORDIRTYSPHERE ), \ + ((!((_intrp)->flags & rpINTERPOLATORNOFRAMEDIRTY))? \ + ((RpAtomicGetFrame(_atomic))? \ + (RwFrameUpdateObjects(RpAtomicGetFrame(_atomic))): \ + (0)): \ + (0)), \ + (_intrp)) + +/* NB "RpInterpolatorSetValue(interp++, value)" will break it */ +#define RpInterpolatorSetValueMacro(_intrp, _value, _atomic) \ + ((_intrp)->position = (_value), \ + (_intrp)->flags |= (RwInt32)(rpINTERPOLATORDIRTYINSTANCE | \ + rpINTERPOLATORDIRTYSPHERE ), \ + ((!((_intrp)->flags & rpINTERPOLATORNOFRAMEDIRTY))? \ + ((RpAtomicGetFrame(_atomic))? \ + (RwFrameUpdateObjects(RpAtomicGetFrame(_atomic))): \ + (0)): \ + (0)), \ + (_intrp)) + +/* NB "RpInterpolatorSetScale(interp++, *(scale++))" will break it */ +#define RpInterpolatorSetScaleMacro(_intrp, _scale, _atomic) \ + ((_intrp)->time = (_scale), \ + (_intrp)->recipTime = (RwReal) (1.0) / (_scale), \ + (_intrp)->flags |= (RwInt32)(rpINTERPOLATORDIRTYINSTANCE | \ + rpINTERPOLATORDIRTYSPHERE ), \ + ((!((_intrp)->flags & rpINTERPOLATORNOFRAMEDIRTY))? \ + ((RpAtomicGetFrame(_atomic))? \ + (RwFrameUpdateObjects(RpAtomicGetFrame(_atomic))): \ + (0)): \ + (0)), \ + (_intrp)) + +#define RpAtomicGetClumpMacro(_atomic) \ + ((_atomic)->clump) + +/* NB "RpAtomicGetBoundingSphere(atomic++)" will break it */ +#define RpAtomicGetBoundingSphereMacro(_atomic) \ + ((((_atomic)->interpolator.flags & rpINTERPOLATORDIRTYSPHERE)? \ + _rpAtomicResyncInterpolatedSphere(_atomic), 0: 0), \ + &((_atomic)->boundingSphere)) +#define RpAtomicGetFrameMacro(_atomic) \ + ((RwFrame *) rwObjectGetParent(_atomic)) + +/* NB "RpClumpSetFrame(clump++, frame)" will break it */ +#if (!defined(RpClumpSetFrameMacro)) +#define RpClumpSetFrameMacro(_clump, _frame) \ + (rwObjectSetParent(_clump, _frame), \ + (_clump)) +#endif /* (!defined(RpClumpSetFrameMacro)) */ + +#if (!defined(RpClumpSetFrameVoidMacro)) +#define RpClumpSetFrameVoidMacro(_clump, _frame) \ +MACRO_START \ +{ \ + rwObjectSetParent(_clump, _frame); \ +} \ +MACRO_STOP +#endif /* (!defined(RpClumpSetFrameVoidMacro)) */ + +#define RpClumpGetFrameMacro(_clump) \ + ((RwFrame *) rwObjectGetParent(_clump)) + +/* NB "RpAtomicSetFlags(atomic++, flags)" will break it */ +#if (!defined(RpAtomicSetFlagsMacro)) +#define RpAtomicSetFlagsMacro(_atomic, _flags) \ + (rwObjectSetFlags(_atomic, _flags), \ + (_atomic)) +#endif /* (!defined(RpAtomicSetFlagsMacro)) */ + +#define RpAtomicGetFlagsMacro(_atomic) \ + (rwObjectGetFlags(_atomic)) + +#if (! ( defined(RWDEBUG) || defined(RWSUPPRESSINLINE) )) + +#define RpAtomicRender(_atomic) \ + RpAtomicRenderMacro(_atomic) + +#define RpAtomicGetGeometry(_atomic) \ + RpAtomicGetGeometryMacro(_atomic) + +#define RpAtomicSetRenderCallBack(_atomic, _callback) \ + RpAtomicSetRenderCallBackMacro(_atomic, _callback) + +#define RpAtomicGetRenderCallBack(_atomic) \ + RpAtomicGetRenderCallBackMacro(_atomic) + +#define RpAtomicGetInterpolator(_atomic) \ + RpAtomicGetInterpolatorMacro(_atomic) + +#define RpInterpolatorGetStartMorphTarget(_intrp) \ + RpInterpolatorGetStartMorphTargetMacro(_intrp) + +#define RpInterpolatorGetEndMorphTarget(_intrp) \ + RpInterpolatorGetEndMorphTargetMacro(_intrp) + +#define RpInterpolatorGetValue(_intrp) \ + RpInterpolatorGetValueMacro(_intrp) + +#define RpInterpolatorGetScale(_intrp) \ + RpInterpolatorGetScaleMacro(_intrp) + +#define RpInterpolatorSetStartMorphTarget(_intrp, _target, _atomic) \ + RpInterpolatorSetStartMorphTargetMacro(_intrp, _target, _atomic) + +#define RpInterpolatorSetEndMorphTarget(_intrp, _target, _atomic) \ + RpInterpolatorSetEndMorphTargetMacro(_intrp, _target, _atomic) + +#define RpInterpolatorSetValue(_intrp, _value, _atomic) \ + RpInterpolatorSetValueMacro(_intrp, _value, _atomic) + +#define RpInterpolatorSetScale(_intrp, _scale, _atomic) \ + RpInterpolatorSetScaleMacro(_intrp, _scale, _atomic) + +#define RpAtomicGetClump(_atomic) \ + RpAtomicGetClumpMacro(_atomic) + +#define RpAtomicGetBoundingSphere(_atomic) \ + RpAtomicGetBoundingSphereMacro(_atomic) + +#define RpAtomicGetFrame(_atomic) \ + RpAtomicGetFrameMacro(_atomic) + +#define RpClumpSetFrame(_clump, _frame) \ + RpClumpSetFrameMacro(_clump, _frame) + +#define RpClumpGetFrame(_clump) \ + RpClumpGetFrameMacro(_clump) + +#define RpAtomicSetFlags(_atomic, _flags) \ + RpAtomicSetFlagsMacro(_atomic, _flags) + +#define RpAtomicGetFlags(_atomic) \ + RpAtomicGetFlagsMacro(_atomic) + +#endif /* (! ( defined(RWDEBUG) || defined(RWSUPPRESSINLINE) )) */ + +/**************************************************************************** + Function prototypes + */ + +#ifdef __cplusplus +extern "C" +{ +#endif /* __cplusplus */ + + +extern void +RpAtomicSetFreeListCreateParams( RwInt32 blockSize, RwInt32 numBlocksToPrealloc ); + +extern void +RpClumpSetFreeListCreateParams( RwInt32 blockSize, RwInt32 numBlocksToPrealloc ); + +/* Macro version of RpAtomicSetRenderCallBack needs this */ +extern RpAtomic * +AtomicDefaultRenderCallBack(RpAtomic * atomic); + +extern void +_rpAtomicResyncInterpolatedSphere(RpAtomic * atomic); + +extern const RwSphere * +RpAtomicGetWorldBoundingSphere(RpAtomic * atomic); + +/* Enumeration */ +extern RpClump * +RpClumpForAllAtomics(RpClump * clump, + RpAtomicCallBack callback, + void *pData); + +extern RpClump * +RpClumpForAllLights(RpClump * clump, + RpLightCallBack callback, + void *pData); + +extern RpClump * +RpClumpForAllCameras(RpClump * clump, + RwCameraCallBack callback, + void *pData); + +/* Frames */ +extern RpAtomic * +RpAtomicSetFrame(RpAtomic * atomic, + RwFrame * frame); + +/* Create a space marking clump */ +extern RpClump * +RpClumpCreateSpace(const RwV3d * position, + RwReal radius); + +/* Instancing and rendering */ +extern RpClump * +RpClumpRender(RpClump * clump); + +extern RpClump * +RpClumpRemoveAtomic(RpClump * clump, + RpAtomic * atomic); + +extern RpClump * +RpClumpAddAtomic(RpClump * clump, + RpAtomic * atomic); + +extern RpClump * +RpClumpRemoveLight(RpClump * clump, + RpLight * light); + +extern RpClump * +RpClumpAddLight(RpClump * clump, + RpLight * light); + +extern RpClump * +RpClumpRemoveCamera(RpClump * clump, + RwCamera * camera); + +extern RpClump * +RpClumpAddCamera(RpClump * clump, + RwCamera * camera); + +/* Creation and destruction of clumps */ +extern RwBool +RpClumpDestroy(RpClump * clump); + +extern RpClump * +RpClumpCreate(void); + +extern RpClump * +RpClumpClone(RpClump * clump); + +/* Creation and destruction of atomics*/ +extern RwBool +RpAtomicDestroy(RpAtomic * atomic); + +extern RpAtomic * +RpAtomicClone(RpAtomic * atomic); + +extern RpAtomic * +RpAtomicCreate(void); + +/* Setting and getting geometry for an atomic */ +extern RpAtomic * +RpAtomicSetGeometry(RpAtomic * atomic, + RpGeometry * geometry, + RwUInt32 flags); + +/* Frustum callbacks */ +extern RpClump * +RpClumpSetCallBack(RpClump * clump, + RpClumpCallBack callback); + +extern RpClumpCallBack +RpClumpGetCallBack(const RpClump * clump); + +/* The number of atomics in a clump */ +extern RwInt32 +RpClumpGetNumAtomics(RpClump * clump); + +extern RwInt32 +RpClumpGetNumLights(RpClump * clump); + +extern RwInt32 +RpClumpGetNumCameras(RpClump * clump); + +/* Light and camera extensions */ +extern RpClump * +RpLightGetClump(const RpLight *light); + +extern RpClump * +RwCameraGetClump(const RwCamera *camera); + +/* Binary format */ +extern RwUInt32 +RpAtomicStreamGetSize(RpAtomic * atomic); + +extern RpAtomic * +RpAtomicStreamRead(RwStream * stream); + +extern RpAtomic * +RpAtomicStreamWrite(RpAtomic * atomic, + RwStream * stream); + +extern RwUInt32 +RpClumpStreamGetSize(RpClump * clump); + +extern RpClump * +RpClumpStreamRead(RwStream * stream); + +extern RpClump * +RpClumpStreamWrite(RpClump * clump, + RwStream * stream); + +extern RpClumpChunkInfo * +_rpClumpChunkInfoRead(RwStream * stream, + RpClumpChunkInfo * clumpChunkInfo, + RwInt32 * bytesRead); + +/* Attaching toolkits */ +extern RwInt32 +RpAtomicRegisterPlugin(RwInt32 size, + RwUInt32 pluginID, + RwPluginObjectConstructor constructCB, + RwPluginObjectDestructor destructCB, + RwPluginObjectCopy copyCB); + +extern RwInt32 +RpClumpRegisterPlugin(RwInt32 size, + RwUInt32 pluginID, + RwPluginObjectConstructor constructCB, + RwPluginObjectDestructor destructCB, + RwPluginObjectCopy copyCB); + +extern RwInt32 +RpAtomicRegisterPluginStream(RwUInt32 pluginID, + RwPluginDataChunkReadCallBack + readCB, + RwPluginDataChunkWriteCallBack + writeCB, + RwPluginDataChunkGetSizeCallBack + getSizeCB); + +extern RwInt32 +RpAtomicSetStreamAlwaysCallBack(RwUInt32 pluginID, + RwPluginDataChunkAlwaysCallBack alwaysCB); + +extern RwInt32 +RpAtomicSetStreamRightsCallBack(RwUInt32 pluginID, + RwPluginDataChunkRightsCallBack rightsCB); + +extern RwInt32 +RpClumpRegisterPluginStream(RwUInt32 pluginID, + RwPluginDataChunkReadCallBack readCB, + RwPluginDataChunkWriteCallBack writeCB, + RwPluginDataChunkGetSizeCallBack getSizeCB); + +extern RwInt32 +RpClumpSetStreamAlwaysCallBack(RwUInt32 pluginID, + RwPluginDataChunkAlwaysCallBack alwaysCB); + +extern RwInt32 +RpAtomicGetPluginOffset(RwUInt32 pluginID); + +extern RwInt32 +RpClumpGetPluginOffset(RwUInt32 pluginID); + +extern RwBool +RpAtomicValidatePlugins(const RpAtomic * atomic); + +extern RwBool +RpClumpValidatePlugins(const RpClump * clump); + +#if ( defined(RWDEBUG) || defined(RWSUPPRESSINLINE) ) +extern RwFrame * +RpAtomicGetFrame(const RpAtomic * atomic); + +extern RwFrame * +RpClumpGetFrame(const RpClump * clump); + +extern RpClump * +RpClumpSetFrame(RpClump * clump, + RwFrame * frame); + +/* Flags */ +extern RpAtomic * +RpAtomicSetFlags(RpAtomic * atomic, + RwUInt32 flags); + +extern RwUInt32 +RpAtomicGetFlags(const RpAtomic * atomic); + +extern RwSphere * +RpAtomicGetBoundingSphere(RpAtomic * atomic); + +extern RwInt32 +RpInterpolatorGetEndMorphTarget(const RpInterpolator * interpolator); + +extern RwInt32 +RpInterpolatorGetStartMorphTarget(const RpInterpolator * interpolator); + +extern RwReal +RpInterpolatorGetValue(const RpInterpolator * interpolator); + +extern RwReal +RpInterpolatorGetScale(const RpInterpolator * interpolator); + +extern RpInterpolator * +RpInterpolatorSetEndMorphTarget(RpInterpolator * interpolator, + RwInt32 morphTarget, + RpAtomic * atomic); + +extern RpInterpolator * +RpInterpolatorSetStartMorphTarget(RpInterpolator * interpolator, + RwInt32 morphTarget, + RpAtomic * atomic); + +extern RpInterpolator * +RpInterpolatorSetValue(RpInterpolator * interpolator, + RwReal value, + RpAtomic *atomic); + +extern RpInterpolator * +RpInterpolatorSetScale(RpInterpolator * interpolator, + RwReal scale, + RpAtomic *atomic); + +extern RpAtomic * +RpAtomicRender(RpAtomic * atomic); + +/* Building clumps */ +extern RpClump * +RpAtomicGetClump(const RpAtomic * atomic); + +extern RpInterpolator * +RpAtomicGetInterpolator(RpAtomic * atomic); + +extern RpGeometry * +RpAtomicGetGeometry(const RpAtomic * atomic); + +extern void +RpAtomicSetRenderCallBack(RpAtomic * atomic, + RpAtomicCallBackRender callback); + +extern RpAtomicCallBackRender +RpAtomicGetRenderCallBack(const RpAtomic * atomic); + +#endif + +/* ( defined(RWDEBUG) || defined(RWSUPPRESSINLINE) ) */ + +extern RwBool RpAtomicInstance(RpAtomic *atomic); + +#ifdef __cplusplus +} +#endif /* __cplusplus */ + +#define RpClumpChunkInfoRead(stream, clumpChunkInfo, bytesRead) \ + _rpClumpChunkInfoRead(stream, clumpChunkInfo, bytesRead) + + +/*--- Automatically derived from: c:/daily/rwsdk/world/baworld.h ---*/ + +/* + * World handling. + * World give objects scope, and provide a mechanism for + * efficiency static object rendering. + * + * Copyright (c) 1998 Criterion Software Ltd. + * + */ + +/**************************************************************************** + Defines + */ + +/* Type ID */ +#define rpWORLD 7 + +/* RpWorld private flags (in RwObject) */ +enum RpWorldPrivateFlag +{ + rpWORLDSINGLEMALLOC = 0x01, + rpWORLDPRIVATEFLAGFORCEENUMSIZEINT = RWFORCEENUMSIZEINT +}; +typedef enum RpWorldPrivateFlag RpWorldPrivateFlag; + +/** + * \ingroup rpworldsub + * The bit-field type \ref RpWorldFlag specifies the options available + * for creating the static geometry component of a world (see API function \ref RpWorldSetFlags): + */ +enum RpWorldFlag +{ + rpWORLDTRISTRIP = 0x01, /**<This world's meshes can be rendered + as tri strips */ + rpWORLDPOSITIONS = 0x02, /**<This world has positions */ + rpWORLDTEXTURED = 0x04, /**<This world has only one set of texture coordinates */ + rpWORLDPRELIT = 0x08, /**<This world has luminance values */ + rpWORLDNORMALS = 0x10, /**<This world has normals */ + rpWORLDLIGHT = 0x20, /**<This world will be lit */ + rpWORLDMODULATEMATERIALCOLOR = 0x40, + /**<Modulate material color with vertex colors + (pre-lit + lit) */ + rpWORLDTEXTURED2 = 0x80, /**<This world has 2 or more sets of texture coordinates */ + + /* + * These above flags were stored in the flags field in an RwObject, they + * are now stored in the flags file of the RpWorld. + */ + + rpWORLDNATIVE = 0x01000000, + rpWORLDNATIVEINSTANCE = 0x02000000, + + rpWORLDFLAGSMASK = 0x000000FF, + rpWORLDNATIVEFLAGSMASK = 0x0F000000, + + rpWORLDSECTORSOVERLAP = 0x40000000, + + rpWORLDFLAGFORCEENUMSIZEINT = RWFORCEENUMSIZEINT +}; +typedef enum RpWorldFlag RpWorldFlag; + +/* Multi texture coordinate format specifier */ +#define rpWORLDTEXCOORDSETS(_num) ((_num & 0xff) << 16) + +/* Maximum depth of BSP tree */ +#define rpWORLDMAXBSPDEPTH 64 + + +/* macro/inline functionality */ +#define RpWorldGetBBoxMacro(_world) \ + (&((_world)->boundingBox)) + +#define RpWorldGetOriginMacro(_world) \ + (&((_world)->worldOrigin)) + +#define RpWorldGetNumMaterialsMacro(_world) \ + ((_world)->matList.numMaterials) + +#define RpWorldGetMaterialMacro(_world, _num) \ + (((_world)->matList.materials)[(_num)]) + +#define RpWorldGetNumClumpsMacro(_world) \ + ((_world)->numClumpsInWorld) + +#define RpWorldSetRenderOrderMacro(_world, _renderOrder) \ + (((_world)->renderOrder = _renderOrder), (_world)) + +#define RpWorldGetRenderOrderMacro(_world) \ + ((_world)->renderOrder) + +#define RpWorldSetFlagsMacro(_world, _flags) \ + (((_world)->flags = (_flags)), (_world)) + +#define RpWorldGetFlagsMacro(_world) \ + ((_world)->flags) + + +#if !(defined(RWDEBUG) || defined(RWSUPPRESSINLINE)) + +#define RpWorldGetBBox(_world) \ + RpWorldGetBBoxMacro(_world) + +#define RpWorldGetOrigin(_world) \ + RpWorldGetOriginMacro(_world) + +#define RpWorldGetNumMaterials(_world) \ + RpWorldGetNumMaterialsMacro(_world) + +#define RpWorldGetMaterial(_world, _num) \ + RpWorldGetMaterialMacro(_world, _num) + +#define RpWorldGetNumClumps(_world) \ + RpWorldGetNumClumpsMacro(_world) + +#define RpWorldSetRenderOrder(_world, _renderOrder) \ + RpWorldSetRenderOrderMacro(_world, _renderOrder) + +#define RpWorldGetRenderOrder(_world) \ + RpWorldGetRenderOrderMacro(_world) + +#define RpWorldSetFlags(_world, _flags) \ + RpWorldSetFlagsMacro(_world, _flags) + +#define RpWorldGetFlags(_world) \ + RpWorldGetFlagsMacro(_world) + +#endif /* !(defined(RWDEBUG) || defined(RWSUPPRESSINLINE)) */ + + +/**************************************************************************** + Global types + */ + + +/** + * \ingroup rpworldsub + * \ref RpWorldRenderOrder + * represents the options available for + * the rendering order of world sectors in the camera's view frustum (see + * API function \ref RpWorldSetRenderOrder). + */ +enum RpWorldRenderOrder +{ + rpWORLDRENDERNARENDERORDER = 0, + rpWORLDRENDERFRONT2BACK, /**<Renders nearest sectors first */ + rpWORLDRENDERBACK2FRONT, /**<Renders furthest sectors first */ + rpWORLDRENDERORDERFORCEENUMSIZEINT = RWFORCEENUMSIZEINT +}; +typedef enum RpWorldRenderOrder RpWorldRenderOrder; + +/** + * \ingroup rpworldsector + * \ref RpWorldSectorCallBackRender represents the function called from + * \ref RpWorldSectorRender when the specified world sector lies inside the + * current camera's view frustum. The default callback initiates execution of + * the world sector rendering pipeline. This function should return a pointer + * to the world sector to indicate success + * + * \param worldSector Pointer to the world sector to be + * rendered + * + * \return Pointer to the world sector. + * + */ +typedef RpWorldSector *(*RpWorldSectorCallBackRender) (RpWorldSector * + worldSector); + +/** + * \ingroup rpworldsub + * \struct RpWorld + * World object. This should be considered an opaque type. + * Use the RpWorld API functions to access. + */ +typedef struct RpWorld RpWorld; + +#if (!defined(DOXYGEN)) +struct RpWorld +{ + RwObject object; + + RwUInt32 flags; + + RpWorldRenderOrder renderOrder; + + /* Materials */ + RpMaterialList matList; + + /* The world stored as a BSP tree */ + RpSector *rootSector; + + /* The number of texture coordinate sets in each sector */ + RwInt32 numTexCoordSets; + + /* Render frame used when last rendered */ + RwInt32 numClumpsInWorld; + RwLLLink *currentClumpLink; + + /* All the clumps in the world */ + RwLinkList clumpList; + + /* All of the lights in the world */ + RwLinkList lightList; + + /* Directional lights in the world */ + RwLinkList directionalLightList; + + /* The worlds origin offset */ + RwV3d worldOrigin; + + /* Bounding box around the whole world */ + RwBBox boundingBox; + + /* The callbacks functions */ + RpWorldSectorCallBackRender renderCallBack; + + RxPipeline *pipeline; +}; +#endif /* (!defined(DOXYGEN)) */ + +/**************************************************************************** + Global Variables + */ + +#ifdef __cplusplus +extern "C" +{ +#endif /* __cplusplus */ + +extern RwPluginRegistry worldTKList; + +#ifdef __cplusplus +} +#endif /* __cplusplus */ + +/**************************************************************************** + Function prototypes + */ + +#ifdef __cplusplus +extern "C" +{ +#endif /* __cplusplus */ + +extern RwBool _rpWorldFindBBox(RpWorld * world, + RwBBox * boundingBox); + +/* Generate sector bounding boxes from BSP planes (not tight boxes) */ +extern RpWorld *_rpWorldSetupSectorBoundingBoxes(RpWorld *world); + + +/* These stealth-API */ +extern RwBool _rpWorldForAllGlobalLights(RpLightCallBack callBack, + void *pData); +extern RpWorldSector *_rpWorldSectorForAllLocalLights(RpWorldSector * + sector, + RpLightCallBack + callBack, + void *pData); + +extern RpWorldSector *_rpSectorDefaultRenderCallBack(RpWorldSector * + sector); + +/* Accessing worlds geometry */ +extern RpWorld *RpWorldLock(RpWorld * world); +extern RpWorld *RpWorldUnlock(RpWorld * world); + +/* Managing a list of the worlds */ +extern void _rpWorldRegisterWorld(RpWorld * world, + RwUInt32 memorySize); +extern void _rpWorldUnregisterWorld(RpWorld * world); + +/* Hook into world management */ +extern RwBool RpWorldPluginAttach(void); + +/* Enumerating objects in the world */ +extern RpWorld *RpWorldForAllClumps(RpWorld * world, + RpClumpCallBack fpCallBack, + void *pData); +extern RpWorld *RpWorldForAllMaterials(RpWorld * world, + RpMaterialCallBack fpCallBack, + void *pData); +extern RpWorld *RpWorldForAllLights(RpWorld * world, + RpLightCallBack fpCallBack, + void *pData); +extern RpWorld *RpWorldForAllWorldSectors(RpWorld * world, + RpWorldSectorCallBack + fpCallBack, void *pData); + +/* Rendering */ +extern RpWorld *RpWorldRender(RpWorld * world); + +/* Creation/destruction */ +extern RwBool RpWorldDestroy(RpWorld * world); +extern RpWorld *RpWorldCreate(RwBBox * boundingBox); +extern RwBool RpWorldInstance(RpWorld *world); + +/* Sector callbacks */ +extern RpWorld *RpWorldSetSectorRenderCallBack(RpWorld * world, + RpWorldSectorCallBackRender + fpCallBack); +extern RpWorldSectorCallBackRender RpWorldGetSectorRenderCallBack(const + RpWorld + * + world); + +/* Getting world from sector */ +extern RpWorld *RpWorldSectorGetWorld(const RpWorldSector * sector); + +extern RwInt32 RpWorldRegisterPlugin(RwInt32 size, RwUInt32 pluginID, + RwPluginObjectConstructor + constructCB, + RwPluginObjectDestructor + destructCB, + RwPluginObjectCopy copyCB); +extern RwInt32 RpWorldRegisterPluginStream(RwUInt32 pluginID, + RwPluginDataChunkReadCallBack + readCB, + RwPluginDataChunkWriteCallBack + writeCB, + RwPluginDataChunkGetSizeCallBack + getSizeCB); +extern RwInt32 RpWorldSetStreamAlwaysCallBack( + RwUInt32 pluginID, + RwPluginDataChunkAlwaysCallBack alwaysCB); +extern RwInt32 RpWorldSetStreamRightsCallBack(RwUInt32 pluginID, + RwPluginDataChunkRightsCallBack rightsCB); +extern RwInt32 RpWorldGetPluginOffset(RwUInt32 pluginID); +extern RwBool RpWorldValidatePlugins(RpWorld * world); + + +#if (defined(RWDEBUG) || defined(RWSUPPRESSINLINE)) + +/* Getting/setting */ +extern const RwBBox *RpWorldGetBBox(const RpWorld *world); +extern const RwV3d *RpWorldGetOrigin(const RpWorld *world); + +/* Accessing a worlds materials */ +extern RwInt32 RpWorldGetNumMaterials(const RpWorld *world); +extern RpMaterial *RpWorldGetMaterial(const RpWorld *world, RwInt32 matNum); + +/* Clumps */ +extern RwInt32 RpWorldGetNumClumps(RpWorld *world); + +/* Render order */ +extern RpWorld *RpWorldSetRenderOrder(RpWorld *world, + RpWorldRenderOrder renderOrder); +extern RpWorldRenderOrder RpWorldGetRenderOrder(const RpWorld *world); + +/* Flags */ +extern RpWorld *RpWorldSetFlags(RpWorld *world, RwUInt32 flags); +extern RwUInt32 RpWorldGetFlags(const RpWorld *world); + +#endif /* (defined(RWDEBUG) || defined(RWSUPPRESSINLINE)) */ + +#ifdef __cplusplus +} +#endif /* __cplusplus */ + +#define rpWorldFindBBox(_world, _boundingBox) \ + _rpWorldFindBBox(_world, _boundingBox) + +#define rpWorldForAllGlobalLights(_callBack, _pData) \ + _rpWorldForAllGlobalLights(_callBack, _pData) + +#define rpWorldSectorForAllLocalLights(_sector, _callBack, _pData) \ + _rpWorldSectorForAllLocalLights(_sector, _callBack, _pData) + +#define _rpWorldLock(_world) \ + RpWorldLock(_world) + +#define _rpWorldUnlock(_world) \ + RpWorldUnlock(_world) + +#define rpWorldLock(_world) \ + RpWorldLock(_world) + +#define rpWorldUnlock(_world) \ + RpWorldUnlock(_world) + + +/*--- Automatically derived from: C:/daily/rwsdk/world/pipe/p2/d3d8/D3D8pipe.h ---*/ + +typedef struct RxD3D8ResEntryHeader RxD3D8ResEntryHeader; +/** + * \ingroup worldextensionsd3d8 + * \struct RxD3D8ResEntryHeader + * This structure contains D3D8 resource specific components. + */ +struct RxD3D8ResEntryHeader +{ + RwUInt16 serialNumber; /**< The mesh headers serial number */ + RwUInt16 numMeshes; /**< The number of meshes */ +}; + +/* This is what I keep in memory as part of the instance data setup */ +typedef struct RxD3D8InstanceData RxD3D8InstanceData; +/** + * \ingroup worldextensionsd3d8 + * \struct RxD3D8InstanceData + * This structure contains D3D8 resource specific components. + */ +struct RxD3D8InstanceData +{ + RwUInt32 minVert; /**< The vertex index where the + meshes vertices begin. Needed for + reinstancing, not for rendering */ + + RwInt32 stride; /**< Stride of vertex */ + + RwInt32 numVertices; /**< Number of vertices in the vertex buffer */ + RwInt32 numIndices; /**< Number of indices to render the primitive */ + + RpMaterial *material; /**< The material for this instanced data */ + + RwUInt32 vertexShader; /**< Vertex shader or FVF flags */ + + RwUInt32 primType; /**< Primitive type */ + + void *indexBuffer; /**< Index buffer */ + void *vertexBuffer; /**< Vertex buffer */ + + RwUInt32 baseIndex; /**< Needed if we share the vertex buffer */ + + RwUInt8 vertexAlpha; /**< The prelight data contains alpha */ + RwUInt8 managed; /**< Created by the Vertex Buffer Manager */ + RwUInt8 remapped; /**< Vertices where remapped to save VB space */ +}; + +/** + * \ingroup worldextensionsd3d8 + * \ref RxD3D8AllInOneInstanceCallBack callback function. + * + * \param object Pointer to the object. + * \param instancedData Pointer to \ref RxD3D8InstanceData. + * \param reinstance Boolean whether to reinstance. + * + * \see RxD3D8AllInOneSetInstanceCallBack + * \see RxD3D8AllInOneGetInstanceCallBack + * \see RxNodeDefinitionGetD3D8AtomicAllInOne + * \see RxNodeDefinitionGetD3D8WorldSectorAllInOne + */ +typedef RwBool (*RxD3D8AllInOneInstanceCallBack)(void *object, + RxD3D8InstanceData *instancedData, + RwBool reinstance); + +/** + * \ingroup worldextensionsd3d8 + * \ref RxD3D8AllInOneReinstanceCallBack callback function. + * + * \param object Pointer to the object. + * \param meshHeader Const pointer to \ref RpMeshHeader. + * \param resEntry Pointer to \ref RxD3D8ResEntryHeader. + * \param instanceCallback Pointer to \ref RxD3D8AllInOneInstanceCallBack. + * + * \see RxD3D8AllInOneSetReinstanceCallBack + * \see RxD3D8AllInOneGetReinstanceCallBack + * \see RxNodeDefinitionGetD3D8AtomicAllInOne + * \see RxNodeDefinitionGetD3D8WorldSectorAllInOne + */ +typedef RwBool (*RxD3D8AllInOneReinstanceCallBack)(void *object, + RwResEntry *resEntry, + const RpMeshHeader *meshHeader, + RxD3D8AllInOneInstanceCallBack instanceCallback); + +/** + * \ingroup worldextensionsd3d8 + * \ref RxD3D8AllInOneLightingCallBack callback function. + * + * \param object Void pointer to the object. + * + * \see RxD3D8AllInOneSetLightingCallBack + * \see RxD3D8AllInOneGetLightingCallBack + * \see RxNodeDefinitionGetD3D8AtomicAllInOne + * \see RxNodeDefinitionGetD3D8WorldSectorAllInOne + */ +typedef void (*RxD3D8AllInOneLightingCallBack)(void *object); + +/** + * \ingroup worldextensionsd3d8 + * \ref RxD3D8AllInOneRenderCallBack callback function. + * + * \param repEntry Pointer to a resource entry. + * \param object Pointer to a object that the resource entry belongs to. + * \param type rpATOMIC or rwSECTORATOMIC. + * \param flags \ref RpGeometryFlag's or \ref RpWorldFlag's. + * + * \see RxD3D8AllInOneSetRenderCallBack + * \see RxD3D8AllInOneGetRenderCallBack + * \see RxNodeDefinitionGetD3D8AtomicAllInOne + * \see RxNodeDefinitionGetD3D8WorldSectorAllInOne + */ +typedef void (*RxD3D8AllInOneRenderCallBack)(RwResEntry *repEntry, + void *object, + RwUInt8 type, + RwUInt32 flags); + +#ifdef __cplusplus +extern "C" +{ +#endif /* __cplusplus */ +extern void +RxD3D8AllInOneSetInstanceCallBack(RxPipelineNode *node, + RxD3D8AllInOneInstanceCallBack callback); + +extern RxD3D8AllInOneInstanceCallBack +RxD3D8AllInOneGetInstanceCallBack(RxPipelineNode *node); + +extern void +RxD3D8AllInOneSetReinstanceCallBack(RxPipelineNode *node, + RxD3D8AllInOneReinstanceCallBack callback); + +extern RxD3D8AllInOneReinstanceCallBack +RxD3D8AllInOneGetReinstanceCallBack(RxPipelineNode *node); + +extern void +RxD3D8AllInOneSetLightingCallBack(RxPipelineNode *node, + RxD3D8AllInOneLightingCallBack callback); + +extern RxD3D8AllInOneLightingCallBack +RxD3D8AllInOneGetLightingCallBack(RxPipelineNode *node); + +extern void +RxD3D8AllInOneSetRenderCallBack(RxPipelineNode *node, + RxD3D8AllInOneRenderCallBack callback); + +extern RxD3D8AllInOneRenderCallBack +RxD3D8AllInOneGetRenderCallBack(RxPipelineNode *node); + + +#ifdef __cplusplus +} +#endif /* __cplusplus */ + +/*--- Automatically derived from: C:/daily/rwsdk/world/pipe/p2/bapipew.h ---*/ + +#define RpWorldGetDefaultSectorPipelineMacro() \ + (RXPIPELINEGLOBAL(currentWorldSectorPipeline)) + +#define RpWorldSetSectorPipelineMacro(_world, _pipeline) \ + ( ((_world)->pipeline = _pipeline), _world ) + +#define RpWorldGetSectorPipelineMacro(_world, _pipeline) \ + ( (*(_pipeline) = (_world)->pipeline), _world ) + +#define RpWorldSectorSetPipelineMacro(_sector, _pipeline) \ + ( ((_sector)->pipeline = _pipeline), _sector ) + +#define RpWorldSectorGetPipelineMacro(_sector, _pipeline) \ + ( (*(_pipeline) = (_sector)->pipeline), _sector ) + +#define RpAtomicGetDefaultPipelineMacro() \ + (RXPIPELINEGLOBAL(currentAtomicPipeline)) + +#define RpAtomicSetPipelineMacro(_atomic, _pipeline) \ + ( ((_atomic)->pipeline = _pipeline), _atomic ) + +#define RpAtomicGetPipelineMacro(_atomic, _pipeline) \ + ( (*(_pipeline) = (_atomic)->pipeline), _atomic ) + +#define RpMaterialGetDefaultPipelineMacro() \ + (RXPIPELINEGLOBAL(currentMaterialPipeline)) + +#define RpMaterialSetPipelineMacro(_material, _pipeline) \ + ( ((_material)->pipeline = _pipeline), _material ) + +#define RpMaterialGetPipelineMacro(_material, _pipeline) \ + ( (*(_pipeline) = (_material)->pipeline), _material ) + + +#if !(defined(RWDEBUG) || defined(RWSUPPRESSINLINE)) + +#define RpWorldGetDefaultSectorPipeline RpWorldGetDefaultSectorPipelineMacro +#define RpWorldSetSectorPipeline RpWorldSetSectorPipelineMacro +#define RpWorldGetSectorPipeline RpWorldGetSectorPipelineMacro +#define RpWorldSectorSetPipeline RpWorldSectorSetPipelineMacro +#define RpWorldSectorGetPipeline RpWorldSectorGetPipelineMacro + +#define RpAtomicGetDefaultPipeline RpAtomicGetDefaultPipelineMacro +#define RpAtomicSetPipeline RpAtomicSetPipelineMacro +#define RpAtomicGetPipeline RpAtomicGetPipelineMacro + +#define RpMaterialGetDefaultPipeline RpMaterialGetDefaultPipelineMacro +#define RpMaterialSetPipeline RpMaterialSetPipelineMacro +#define RpMaterialGetPipeline RpMaterialGetPipelineMacro + +#endif /* !(defined(RWDEBUG) || defined(RWSUPPRESSINLINE)) */ + + +#ifdef __cplusplus +extern "C" +{ +#endif /* __cplusplus */ + +extern RxPipeline *RpWorldSetDefaultSectorPipeline(RxPipeline *pipeline); +extern RxPipeline *RpAtomicSetDefaultPipeline(RxPipeline *pipeline); +extern RxPipeline *RpMaterialSetDefaultPipeline(RxPipeline *pipeline); + +#if (defined(RWDEBUG) || defined(RWSUPPRESSINLINE)) + +extern RxPipeline *RpWorldGetGenericSectorPipeline(void); +extern RxPipeline *RpWorldGetDefaultSectorPipeline(void); +extern RpWorld *RpWorldSetSectorPipeline(RpWorld *world, + RxPipeline *pipeline); +extern RpWorld *RpWorldGetSectorPipeline(RpWorld *world, + RxPipeline **pipeline); +extern RpWorldSector *RpWorldSectorSetPipeline(RpWorldSector *sector, + RxPipeline *pipeline); +extern RpWorldSector *RpWorldSectorGetPipeline(RpWorldSector *sector, + RxPipeline **pipeline); + +extern RxPipeline *RpAtomicGetGenericPipeline(void); +extern RxPipeline *RpAtomicGetDefaultPipeline(void); +extern RpAtomic *RpAtomicSetPipeline(RpAtomic *atomic, + RxPipeline *pipeline); +extern const RpAtomic *RpAtomicGetPipeline(const RpAtomic *const atomic, + RxPipeline **pipeline); + +extern RxPipeline *RpMaterialGetGenericPipeline(void); +extern RxPipeline *RpMaterialGetDefaultPipeline(void); +extern RpMaterial *RpMaterialSetPipeline(RpMaterial *material, + RxPipeline *pipeline); +extern RpMaterial *RpMaterialGetPipeline(RpMaterial *material, + RxPipeline **pipeline); + +#endif /* (defined(RWDEBUG) || defined(RWSUPPRESSINLINE)) */ + +extern const RpGeometry *RpGeometryIsCorrectlySorted(const RpGeometry * geometry, + RwBool * result); +extern RpGeometry *RpGeometrySortByMaterial(const RpGeometry * geometry, + RpGeometrySortByMaterialCallBack callback); + +#ifdef __cplusplus +} +#endif /* __cplusplus */ + +/* LEGACY-SUPPORT macros */ +#define RpWorldSetDefaultSectorInstancePipeline RpWorldSetDefaultSectorPipeline +#define RpWorldGetDefaultSectorInstancePipeline RpWorldGetDefaultSectorPipeline +#define RpWorldSetSectorInstancePipeline RpWorldSetSectorPipeline +#define RpWorldGetSectorInstancePipeline RpWorldGetSectorPipeline +#define RpWorldSectorSetInstancePipeline RpWorldSectorSetPipeline +#define RpWorldSectorGetInstancePipeline RpWorldSectorGetPipeline + +#define RpAtomicGetDefaultInstancePipeline RpAtomicGetDefaultPipeline +#define RpAtomicSetDefaultInstancePipeline RpAtomicSetDefaultPipeline +#define RpAtomicSetInstancePipeline RpAtomicSetPipeline +#define RpAtomicGetInstancePipeline RpAtomicGetPipeline + +#define RpMaterialSetDefaultRenderPipeline RpMaterialSetDefaultPipeline +#define RpMaterialGetDefaultRenderPipeline RpMaterialGetDefaultPipeline +#define RpMaterialSetRenderPipeline RpMaterialSetPipeline +#define RpMaterialGetRenderPipeline RpMaterialGetPipeline + + +/*--- Automatically derived from: c:/daily/rwsdk/world/baworobj.h ---*/ +/**************************************************************************** + Function prototypes + */ + +#ifdef __cplusplus +extern "C" +{ +#endif /* __cplusplus */ + +extern void RpTieSetFreeListCreateParams( RwInt32 blockSize, RwInt32 numBlocksToPrealloc ); +extern void RpLightTieSetFreeListCreateParams( RwInt32 blockSize, RwInt32 numBlocksToPrealloc ); + +/* Adding and removing cameras to/from the world */ +extern RpWorld *RpWorldRemoveCamera(RpWorld *world, RwCamera *camera); +extern RpWorld *RpWorldAddCamera(RpWorld *world, RwCamera *camera); +extern RpWorld *RwCameraGetWorld(const RwCamera *camera); + +/* Adding and removing atomics to/from the world */ +extern RpWorld *RpWorldRemoveAtomic(RpWorld *world, RpAtomic *atomic); +extern RpWorld *RpWorldAddAtomic(RpWorld *world, RpAtomic *atomic); +extern RpWorld *RpAtomicGetWorld(const RpAtomic *atomic); + +/* Adding and removing clumps to/from the world */ +extern RpWorld *RpWorldAddClump(RpWorld *world, RpClump *clump); +extern RpWorld *RpWorldRemoveClump(RpWorld *world, RpClump *clump); +extern RpWorld *RpClumpGetWorld(const RpClump *clump); + +/* Adding and removing lights to/from the world */ +extern RpWorld *RpWorldAddLight(RpWorld *world, RpLight *light); +extern RpWorld *RpWorldRemoveLight(RpWorld *world, RpLight *light); +extern RpWorld *RpLightGetWorld(const RpLight *light); + +/* Finding whats in the view frustum */ +extern RwCamera *RwCameraForAllClumpsInFrustum(RwCamera *camera, void *data); +extern RwCamera *RwCameraForAllClumpsNotInFrustum(RwCamera *camera, + RwInt32 numClumps, void *data); +extern RwCamera *RwCameraForAllSectorsInFrustum(RwCamera *camera, + RpWorldSectorCallBack callBack, + void *pData); + +/* Enumeration involving the world sectors */ +extern RpLight *RpLightForAllWorldSectors(RpLight *light, + RpWorldSectorCallBack callback, + void *data); +extern RpAtomic *RpAtomicForAllWorldSectors(RpAtomic *atomic, + RpWorldSectorCallBack callback, + void *data); +extern RpWorldSector *RpWorldSectorForAllAtomics(RpWorldSector *sector, + RpAtomicCallBack callback, + void *data); +extern RpWorldSector *RpWorldSectorForAllCollisionAtomics(RpWorldSector *sector, + RpAtomicCallBack callback, + void *data); +extern RpWorldSector *RpWorldSectorForAllLights(RpWorldSector *sector, + RpLightCallBack callback, + void *data); + +#ifdef __cplusplus +} +#endif /* __cplusplus */ + + +/*--- Automatically derived from: c:/daily/rwsdk/world/babinwor.h ---*/ +/**************************************************************************** + Global types + */ + +/* Binary Representation + * + */ +typedef struct RpWorldChunkInfoSector RpWorldSectorChunkInfo; +typedef struct RpWorldChunkInfoSector _rpWorldSector; + +#if (!defined(DOXYGEN)) +struct RpWorldChunkInfoSector +{ + RwInt32 matListWindowBase; + RwInt32 numPolygons; + RwInt32 numVertices; + RwV3d inf; + RwV3d sup; + RwBool collSectorPresent; /* unused but retains same struct size */ + RwBool unused; +}; + + +typedef struct RpPlaneSectorChunkInfo RpPlaneSectorChunkInfo; +typedef struct RpPlaneSectorChunkInfo _rpPlaneSector; + +struct RpPlaneSectorChunkInfo +{ + RwInt32 type; + RwReal value; + RwBool leftIsWorldSector; + RwBool rightIsWorldSector; + RwReal leftValue; + RwReal rightValue; +}; + +typedef struct RpWorldChunkInfo RpWorldChunkInfo; +typedef struct RpWorldChunkInfo _rpWorld; + +struct RpWorldChunkInfo +{ + RwBool rootIsWorldSector; + + RwV3d invWorldOrigin; + + RwInt32 numPolygons; + RwInt32 numVertices; + RwInt32 numPlaneSectors; + RwInt32 numWorldSectors; + RwInt32 colSectorSize; + + RwInt32 format; /* Flags about the world */ + + /* Added in 34003 */ + RwBBox boundingBox; +}; + +typedef struct rpWorldChunkInfo34000 rpWorldChunkInfo34000; + +struct rpWorldChunkInfo34000 +{ + RwBool rootIsWorldSector; + + RwV3d invWorldOrigin; + + RwSurfaceProperties surfaceProps; + + RwInt32 numPolygons; + RwInt32 numVertices; + RwInt32 numPlaneSectors; + RwInt32 numWorldSectors; + RwInt32 colSectorSize; + + RwInt32 format; /* Flags about the world */ +}; +#endif /* (!defined(DOXYGEN)) */ + +/**************************************************************************** + Function prototypes + */ + +#ifdef __cplusplus +extern "C" +{ +#endif /* __cplusplus */ + +/* Binary format */ +extern RwUInt32 RpWorldStreamGetSize(const RpWorld *world); +extern RpWorld *RpWorldStreamRead(RwStream *stream); +extern const RpWorld *RpWorldStreamWrite(const RpWorld *world, + RwStream *stream); +extern RpWorldSectorChunkInfo * +_rpWorldSectorChunkInfoRead(RwStream *stream, + RpWorldSectorChunkInfo *worldSectorChunkInfo, + RwInt32 *bytesRead); +extern RpPlaneSectorChunkInfo * +_rpPlaneSectorChunkInfoRead(RwStream *stream, + RpPlaneSectorChunkInfo *planeSectorChunkInfo, + RwInt32 *bytesRead); +extern RpWorldChunkInfo * +_rpWorldChunkInfoRead(RwStream *stream, + RpWorldChunkInfo *worldChunkInfo, + RwInt32 *bytesRead); + +#ifdef __cplusplus +} +#endif /* __cplusplus */ + +#define RpWorldSectorChunkInfoRead(stream, worldSectorChunkInfo, bytesRead) \ + _rpWorldSectorChunkInfoRead(stream, worldSectorChunkInfo, bytesRead) + +#define RpPlaneSectorChunkInfoRead(stream, planeSectorChunkInfo, bytesRead) \ + _rpPlaneSectorChunkInfoRead(stream, planeSectorChunkInfo, bytesRead) + +#define RpWorldChunkInfoRead(stream, worldChunkInfo, bytesRead) \ + _rpWorldChunkInfoRead(stream, worldChunkInfo, bytesRead) + +#endif /* RPWORLD_H */ |