diff options
Diffstat (limited to 'sdk/rwsdk/include/d3d8/rpptank.h')
-rw-r--r-- | sdk/rwsdk/include/d3d8/rpptank.h | 828 |
1 files changed, 828 insertions, 0 deletions
diff --git a/sdk/rwsdk/include/d3d8/rpptank.h b/sdk/rwsdk/include/d3d8/rpptank.h new file mode 100644 index 00000000..d4c1116d --- /dev/null +++ b/sdk/rwsdk/include/d3d8/rpptank.h @@ -0,0 +1,828 @@ + +#ifndef RPPTANK_H +#define RPPTANK_H + +/*===========================================================================* + *--- Include files ---------------------------------------------------------* + *===========================================================================*/ + +#include "rwcore.h" +#include "rpworld.h" + +/*---- start: ./ptank.h----*/ + +/** + * \defgroup rpptank RpPTank + * \ingroup particles + * + * PTank Plugin for RenderWare. + */ + +/*--- Include files ---*/ + +#include <string.h> + +#include "rwcore.h" + +#include "rpptank.rpe" /* automatically generated header file */ + +/****************************************************************************** + * Global Types + */ + +/** + * \ingroup rpptank + * Passed to \ref RpPTankAtomicCreate, these flags specify + * the type and properties held by the particles. + * Some flags are mutually exclusive and should not be mixed. + * The debug version of the library will assert and signal these problems. + */ +enum RpPTankDataFlags +{ + rpPTANKDFLAGNONE = ((int)0x00000000), + rpPTANKDFLAGPOSITION = ((int)0x00000001), /**<Uses a position per particle*/ + rpPTANKDFLAGCOLOR = ((int)0x00000002), /**<Uses a color per particle*/ + rpPTANKDFLAGSIZE = ((int)0x00000004), /**<Uses a size per particle*/ + rpPTANKDFLAGMATRIX = ((int)0x00000008), /**<Uses a matrix per particle*/ + rpPTANKDFLAGNORMAL = ((int)0x00000010), /**<Uses a normal per particle*/ + rpPTANKDFLAG2DROTATE = ((int)0x00000020), /**<Uses a 2D rotation per particle*/ + rpPTANKDFLAGVTXCOLOR = ((int)0x00000040), /**<Uses a color per Billboard vertex*/ + rpPTANKDFLAGVTX2TEXCOORDS = ((int)0x00000080), /**<Uses Top-Left and Bottom-Right Texture coordinates*/ + rpPTANKDFLAGVTX4TEXCOORDS = ((int)0x00000100), /**<Uses a texture UV per vertex*/ +/* free = ((int)0x00000200), */ +/* free = ((int)0x00000400), */ +/* free = ((int)0x00000800), */ +/* free = ((int)0x00001000), */ +/* free = ((int)0x00002000), */ +/* free = ((int)0x00004000), */ + rpPTANKDFLAGCNSMATRIX = ((int)0x00008000), /**<Uses a constant matrix*/ + rpPTANKDFLAGCNSNORMAL = ((int)0x00010000), /**<Uses a constant normal*/ + rpPTANKDFLAGCNS2DROTATE = ((int)0x00020000), /**<Uses a constant 2D rotation*/ + rpPTANKDFLAGCNSVTXCOLOR = ((int)0x00040000), /**<Uses a constant color per Billboard vertex*/ + rpPTANKDFLAGCNSVTX2TEXCOORDS = ((int)0x00080000), /**<Uses constant Top-Left and Bottom-Right Texture coordinates*/ + rpPTANKDFLAGCNSVTX4TEXCOORDS = ((int)0x00100000), /**<Uses a constant texture UV per vertex*/ +/* free = ((int)0x00200000), */ +/* free = ((int)0x00400000), */ +/* free = ((int)0x00800000), */ + rpPTANKDFLAGUSECENTER = ((int)0x01000000), /**<The position of the particles are shifted*/ +/* free = ((int)0x04000000), */ +/* free = ((int)0x08000000), */ + rpPTANKDFLAGARRAY = ((int)0x10000000), /**<Data is organized in an array */ + rpPTANKDFLAGSTRUCTURE = ((int)0x20000000), /**<Data is organized in a structure */ + + RPPTANKDATAFLAGSFORCEENUMSIZEINT = RWFORCEENUMSIZEINT +}; +typedef enum RpPTankDataFlags RpPTankDataFlags; + +#define rpPTANKDFLAGTHINPARTICLES (rpPTANKDFLAGPOSITION) +#define rpPTANKDFLAGFATPARTICLES ( rpPTANKDFLAGPOSITION | rpPTANKDFLAGSIZE \ + | rpPTANKDFLAG2DROTATE | rpPTANKDFLAGVTXCOLOR \ + | rpPTANKDFLAGVTX4TEXCOORDS) + + +/** + * \ingroup rpptank + * Passed to \ref RpPTankAtomicLock, these flags specify + * the data accessed. + * those flags are mutually exclusive and should not be mixed. + */ +enum RpPTankDataLockFlags +{ + rpPTANKLFLAGNONE = ((int)0x00000000), + rpPTANKLFLAGPOSITION = ((int)0x00000001), /**<Access the positions buffer*/ + rpPTANKLFLAGCOLOR = ((int)0x00000002), /**<Access the colors buffer*/ + rpPTANKLFLAGSIZE = ((int)0x00000004), /**<Access the sizes buffer*/ + rpPTANKLFLAGMATRIX = ((int)0x00000008), /**<Access the matrixes buffer*/ + rpPTANKLFLAGNORMAL = ((int)0x00000010), /**<Access the normals buffer*/ + rpPTANKLFLAG2DROTATE = ((int)0x00000020), /**<Access the 2D rotations buffer*/ + rpPTANKLFLAGVTXCOLOR = ((int)0x00000040), /**<Access the colors buffer (when using a color per vertex) */ + rpPTANKLFLAGVTX2TEXCOORDS = ((int)0x00000080), /**<Access the Top-Left and Bottom-Right Texture coordinates buffer*/ + rpPTANKLFLAGVTX4TEXCOORDS = ((int)0x00000100), /**<Access the texture UVs Buffer (when using a color per vertex)*/ + + RPPTANKLOCKFLAGSFORCEENUMSIZEINT = RWFORCEENUMSIZEINT +}; +typedef enum RpPTankDataLockFlags RpPTankDataLockFlags; + + +#if (!defined(DOXYGEN)) + +/** + * \ingroup rpptank + * RpPTankInstanceFlags + */ +enum RpPTankInstanceFlags +{ + rpPTANKIFLAGNONE = ((int)0x00000000), + rpPTANKIFLAGPOSITION = ((int)0x00000001), /**<Particles position changed*/ + rpPTANKIFLAGCOLOR = ((int)0x00000002), /**<Particles color changed*/ + rpPTANKIFLAGSIZE = ((int)0x00000004), /**<Particles size changed*/ + rpPTANKIFLAGMATRIX = ((int)0x00000008), /**<Particles matrix changed*/ + rpPTANKIFLAGNORMAL = ((int)0x00000010), /**<Particles normal changed*/ + rpPTANKIFLAG2DROTATE = ((int)0x00000020), /**<Particles 2D rotation changed*/ + rpPTANKIFLAGVTXCOLOR = ((int)0x00000040), /**<Vertex color changed*/ + rpPTANKIFLAGVTX2TEXCOORDS = ((int)0x00000080), /**<Vertex 2 Texture coordinates changed*/ + rpPTANKIFLAGVTX4TEXCOORDS = ((int)0x00000100), /**<Vertex 4 Texture coordinates changed*/ +/* free = ((int)0x00000200), */ +/* free = ((int)0x00000400), */ +/* free = ((int)0x00000800), */ +/* free = ((int)0x00001000), */ + rpPTANKIFLAGCNSCOLOR = ((int)0x00002000), /**<Constant color changed*/ + rpPTANKIFLAGCNSSIZE = ((int)0x00004000), /**<Constant size changed*/ + rpPTANKIFLAGCNSMATRIX = ((int)0x00008000), /**<Constant matrix changed*/ + rpPTANKIFLAGCNSNORMAL = ((int)0x00010000), /**<Constant normal changed*/ + rpPTANKIFLAGCNS2DROTATE = ((int)0x00020000), /**<Constant 2D rotation changed*/ + rpPTANKIFLAGCNSVTXCOLOR = ((int)0x00040000), /**<Constant vertex color changed*/ + rpPTANKIFLAGCNSVTX2TEXCOORDS = ((int)0x00080000), /**<Constant vertex 2 Texture coordinates changed*/ + rpPTANKIFLAGCNSVTX4TEXCOORDS = ((int)0x00100000), /**<Constant vertex 4 Texture coordinates changed*/ +/* free = ((int)0x00200000), */ +/* free = ((int)0x00400000), */ + rpPTANKIFLAGACTNUMCHG = ((int)0x00800000), /**<Number of active particle changed*/ + rpPTANKIFLAGCENTER = ((int)0x01000000), /**<Center position changed*/ +/* free = ((int)0x04000000), */ +/* free = ((int)0x08000000), */ + rpPTANKIFLAGALPHABLENDING = ((int)0x10000000), /**<Internal Use*/ + rpPTANKIFLAGALL = ((int)0xFFFFFFFF), + + RPPTANKINSTANCEFLAGSFORCEENUMSIZEINT = RWFORCEENUMSIZEINT +}; + +typedef enum RpPTankInstanceFlags RpPTankInstanceFlags; + +#endif + +/** + * \ingroup rpptank + * Passed to \ref RpPTankAtomicLock to specify the type of access needed. + * + * Accessing data using \ref rpPTANKLOCKWRITE will force the PTank object to reinstance + * the rendered data. The instantiation of this data takes place at rendering + * time and is done once per frame. + */ +enum RpPTankLockFlags +{ + rpPTANKLOCKWRITE = ((int)0x40000000), /**<Lock data for writing. */ + rpPTANKLOCKREAD = ((int)0x80000000) /**<Lock data for reading. */ +}; + +typedef enum RpPTankLockFlags RpPTankLockFlags; + +typedef struct RpPTankLockStruct RpPTankLockStruct; + +/** + * \ingroup rpptank + * \struct RpPTankLockStruct + * Returned by \ref RpPTankAtomicLock + */ +struct RpPTankLockStruct{ + RwUInt8 *data; /**<Pointer to the locked data. */ + RwInt32 stride; /**<Stride of the data accessed. */ +}; + +typedef struct RpPTankFormatDescriptor RpPTankFormatDescriptor; + +/** + * \ingroup rpptank + * \struct RpPTankFormatDescriptor + * Returned by \ref RpPTankAtomicGetDataFormat + */ +struct RpPTankFormatDescriptor +{ + RwInt32 numClusters; /**<Number of clusters */ + RwInt32 stride; /**<Size of a single structure when using + * structure organization, 0 otherwise */ + RwInt32 dataFlags; /**<flags passed to \ref RpPTankAtomicCreate */ +}; + +#if (!defined(DOXYGEN)) + +typedef struct RpPTankData RpPTankData; + +struct RpPTankData +{ + void *data; /* PI data array + * in the A form : + * Point to the ptrList table + * in the S form : + * point to the structure + * + */ + RpPTankLockStruct clusters[9]; + + void *userData; /* void pointer for platform use */ + + RpPTankFormatDescriptor format; + + /* constant values */ + RwUInt32 srcBlend; + RwUInt32 dstBlend; + RwBool vertexAlphaBlend; + + RwV2d cCenter; + RwV2d cSize; + RwReal cRotate; + RwRGBA cColor; + RwRGBA cVtxColor[4]; + RwTexCoords cUV[4]; + RwMatrix cMatrix; +}; + + + + +/* data piece size */ +extern const RwInt32 datasize[]; + +#define RPPTANKSIZEPOSITION 0 +#define RPPTANKSIZEMATRIX 1 +#define RPPTANKSIZENORMAL 2 +#define RPPTANKSIZESIZE 3 +#define RPPTANKSIZECOLOR 4 +#define RPPTANKSIZEVTXCOLOR 5 +#define RPPTANKSIZE2DROTATE 6 +#define RPPTANKSIZEVTX2TEXCOORDS 7 +#define RPPTANKSIZEVTX4TEXCOORDS 8 + + +/** + * \ingroup rpptank + * \ref RpPTankAllocCallBack + * + * ... + */ +typedef void *(* RpPTankAllocCallBack)(RpPTankData *ptankGlobal, + RwInt32 maxPCount, + RwUInt32 dataFlags, + RwUInt32 platFlags); + +/** + * \ingroup rpptank + * \ref RpPTankCreateCallBack + * + * ... + */ +typedef RwBool (* RpPTankCreateCallBack)(RpAtomic *atomic, + RpPTankData *ptankGlobal, + RwInt32 maxPCount, + RwUInt32 dataFlags, + RwUInt32 platFlags); + +/** + * \ingroup rpptank + * \ref RpPTankInstanceCallBack + * ... + */ +typedef RwBool (* RpPTankInstanceCallBack)(RpAtomic *atomic, + RpPTankData *ptankGlobal, + RwInt32 actPCount, + RwUInt32 instFlags); + +/** + * \ingroup rpptank + * \ref RpPTankRenderCallBack + * ... + */ +typedef RwBool (* RpPTankRenderCallBack)(RpAtomic *atomic, + RpPTankData *ptankGlobal, + RwInt32 actPCount); + +typedef struct RpPTankCallBacks RpPTankCallBacks; + +struct RpPTankCallBacks +{ + RpPTankAllocCallBack alloc; + RpPTankCreateCallBack create; + RpPTankInstanceCallBack instance; + RpPTankRenderCallBack render; +}; + +/* private typedefs */ +typedef struct RpPTANKInstanceSetupData RpPTANKInstanceSetupData; + +struct RpPTANKInstanceSetupData +{ + RwBool instancePositions; + RwBool instanceUVs; + RwBool instanceColors; + RwBool instanceNormals; + + RpPTankLockStruct positionOut; + RpPTankLockStruct UVOut; + RpPTankLockStruct colorsOut; + RpPTankLockStruct normalsOut; + + RwV3d right; + RwV3d up; + +}; + +typedef void (* RpPTankGENInstancePosCallback)( + RpPTankLockStruct *dstCluster, + RwV3d *right, + RwV3d *up, + RwInt32 pCount, + RpPTankData *ptankGlobal); + +typedef void (* RpPTankGENInstanceCallback)( + RpPTankLockStruct *dstCluster, + RwInt32 pCount, + RpPTankData *ptankGlobal); + +typedef void (* RpPTankGENInstanceSetupCallback)( + RpPTANKInstanceSetupData *data, + RpAtomic *atomic, + RpPTankData *ptankGlobal, + RwInt32 actPCount, + RwUInt32 instFlags); + +typedef void (* RpPTankGENInstanceEndingCallback)( + RpPTANKInstanceSetupData *data, + RpAtomic *atomic, + RpPTankData *ptankGlobal, + RwInt32 actPCount, + RwUInt32 instFlags); + +typedef struct RpPTankAtomicExtPrv RpPTankAtomicExtPrv; + +struct RpPTankAtomicExtPrv +{ + RwInt32 maxPCount; /* max number of particles */ + RwInt32 actPCount; /* number of actives particles */ + + RwBool isAStructure; /* is in a structure of array form */ + void *rawdata; /* unaligned pointer to the PI data */ + + /* Rendering callback */ + RpAtomicCallBackRender defaultRenderCB; + + RpPTankCallBacks ptankCallBacks; + + /* Instancing CallBacks */ + RpPTankGENInstanceSetupCallback insSetupCB; + RpPTankGENInstancePosCallback insPosCB; + RpPTankGENInstanceCallback insUVCB; + RpPTankGENInstanceCallback insColorsCB; + RpPTankGENInstanceCallback insNormalsCB; + RpPTankGENInstanceEndingCallback insEndingCB; + + RwUInt32 lockFlags; + RwUInt32 instFlags; + RwUInt32 platFlags; + + RpPTankData publicData; +}; + +/*--- Plugin API Functions ---*/ + +#ifdef __cplusplus +extern "C" +{ +#endif /* __cplusplus */ + +/* private globals */ +extern RwInt32 _rpPTankAtomicDataOffset; /* Offset in RpAtomic */ + +extern RwInt32 _rpPTankGlobalsOffset; /* Offset in RwEngine */ + +/* Macro tools */ +#define RPATOMICPTANKPLUGINDATA(atomic) \ + (*RWPLUGINOFFSET(RpPTankAtomicExtPrv *, (atomic), _rpPTankAtomicDataOffset)) + +#define GLOBALPTANKPLUGINDATA() \ + (*RWPLUGINOFFSET(void *, RwEngineInstance, _rpPTankGlobalsOffset)) + +#endif + + +extern RwBool +RpPTankPluginAttach(void); + + +/* + * PTank Management API ****************************************************** + */ + +extern RpAtomic * +RpPTankAtomicCreate(RwInt32 maxParticleNum, + RwUInt32 dataFlags, + RwUInt32 platFlags); + +extern void +RpPTankAtomicDestroy(RpAtomic *ptank); + +extern RwBool +RpAtomicIsPTank(RpAtomic *atomic); + +extern const RpPTankFormatDescriptor * +RpPTankAtomicGetDataFormat(RpAtomic *atomic); + +/* + * Particles Management API ************************************************** + */ + +#define RpPTankAtomicGetActiveParticlesCountMacro(_atm)\ + (RPATOMICPTANKPLUGINDATA(_atm)->actPCount) + +#define RpPTankAtomicGetMaximumParticlesCountMacro(_atm)\ + (RPATOMICPTANKPLUGINDATA(_atm)->maxPCount) + +#define RpPTankAtomicSetActiveParticlesCountMacro(atm_,cnt_)\ +MACRO_START\ +{\ + RPATOMICPTANKPLUGINDATA(atm_)->instFlags |= rpPTANKIFLAGACTNUMCHG;\ + RPATOMICPTANKPLUGINDATA(atm_)->actPCount = cnt_;\ +}\ +MACRO_STOP + +#define RpPTankAtomicSetTextureMacro(atm_, tex_)\ +MACRO_START\ +{\ +RpMaterialSetTexture(RpGeometryGetMaterial(RpAtomicGetGeometry(atm_),0), tex_);\ +}\ +MACRO_STOP + +#define RpPTankAtomicGetTextureMacro(atm_)\ + (RpMaterialGetTexture(RpGeometryGetMaterial(RpAtomicGetGeometry(atm_),0))) + +#define RpPTankAtomicGetMaterialMacro(atm_)\ + (RpGeometryGetMaterial(RpAtomicGetGeometry(atm_),0)) + +#define RpPTankAtomicSetBlendModesMacro(atm_,src_,dst_)\ +MACRO_START\ +{\ + RPATOMICPTANKPLUGINDATA(atm_)->publicData.srcBlend = src_;\ + RPATOMICPTANKPLUGINDATA(atm_)->publicData.dstBlend = dst_;\ +}\ +MACRO_STOP + +#define RpPTankAtomicGetBlendModesMacro(atm_,src_,dst_)\ +MACRO_START\ +{\ + *src_ =\ + (RwBlendFunction)(RPATOMICPTANKPLUGINDATA(atm_)->publicData.srcBlend);\ + *dst_ =\ + (RwBlendFunction)(RPATOMICPTANKPLUGINDATA(atm_)->publicData.dstBlend);\ +}\ +MACRO_STOP + +#define RpPTankAtomicSetVertexAlphaMacro(atm_, vas_)\ +MACRO_START\ +{\ + RPATOMICPTANKPLUGINDATA(atm_)->publicData.vertexAlphaBlend = vas_;\ +}\ +MACRO_STOP + +#define RpPTankAtomicGetVertexAlphaMacro(atm_)\ + (RPATOMICPTANKPLUGINDATA(atm_)->publicData.vertexAlphaBlend) + +#define RpPTankAtomicSetConstantCenterMacro(atm_, ctr_)\ +MACRO_START\ +{\ + RPATOMICPTANKPLUGINDATA(atm_)->publicData.cCenter = *ctr_;\ + RPATOMICPTANKPLUGINDATA(atm_)->instFlags |= rpPTANKIFLAGCENTER;\ +}\ +MACRO_STOP + +#define RpPTankAtomicGetConstantCenterMacro(atm_)\ + (&(RPATOMICPTANKPLUGINDATA(atm_)->publicData.cCenter)) + + +#define RpPTankAtomicSetConstantSizeMacro(atm_, size_)\ +MACRO_START\ +{\ + RPATOMICPTANKPLUGINDATA(atm_)->publicData.cSize = *size_;\ + RPATOMICPTANKPLUGINDATA(atm_)->instFlags |= rpPTANKIFLAGCNSSIZE;\ +}\ +MACRO_STOP + +#define RpPTankAtomicGetConstantSizeMacro(atm_)\ + (&RPATOMICPTANKPLUGINDATA(atm_)->publicData.cSize) + +#define RpPTankAtomicSetConstantRotateMacro(atm_, rot_)\ +MACRO_START\ +{\ + RPATOMICPTANKPLUGINDATA(atm_)->publicData.cRotate = rot_;\ + RPATOMICPTANKPLUGINDATA(atm_)->instFlags |= rpPTANKIFLAGCNS2DROTATE;\ +}\ +MACRO_STOP + +#define RpPTankAtomicGetConstantRotateMacro(atm_)\ + (RPATOMICPTANKPLUGINDATA(atm_)->publicData.cRotate) + +#define RpPTankAtomicSetConstantMatrixMacro(atm_, mtx_)\ +MACRO_START\ +{\ + RwMatrixCopy(&(RPATOMICPTANKPLUGINDATA(atm_)->publicData.cMatrix),mtx_);\ + RPATOMICPTANKPLUGINDATA(atm_)->instFlags |= rpPTANKIFLAGCNSMATRIX;\ +}\ +MACRO_STOP + +#define RpPTankAtomicGetConstantMatrixMacro(atm_)\ + (&(RPATOMICPTANKPLUGINDATA(atm_)->publicData.cMatrix)) + +#define RpPTankAtomicSetConstantColorMacro(atm_, col_)\ +MACRO_START\ +{\ + RPATOMICPTANKPLUGINDATA(atm_)->publicData.cColor = *col_;\ + if( RpGeometryGetMaterial(RpAtomicGetGeometry(atm_),0) )\ + {\ + (void)RpMaterialSetColor(\ + RpGeometryGetMaterial(RpAtomicGetGeometry(atm_),0),\ + &RPATOMICPTANKPLUGINDATA(atm_)->publicData.cColor);\ + }\ + RPATOMICPTANKPLUGINDATA(atm_)->instFlags |= rpPTANKIFLAGCNSCOLOR;\ +}\ +MACRO_STOP + +#define RpPTankAtomicGetConstantColorMacro(atm_)\ + (&(RPATOMICPTANKPLUGINDATA(atm_)->publicData.cColor)) + +#define RpPTankAtomicSetConstantVtxColorMacro(atm_, col_)\ +MACRO_START\ +{\ + memcpy(RPATOMICPTANKPLUGINDATA(atm_)->publicData.cVtxColor,\ + col_,\ + sizeof(RwRGBA)*4);\ + RPATOMICPTANKPLUGINDATA(atm_)->instFlags |= rpPTANKIFLAGCNSVTXCOLOR;\ +}\ +MACRO_STOP + +#define RpPTankAtomicGetConstantVtxColorMacro(atm_)\ + (RPATOMICPTANKPLUGINDATA(atm_)->publicData.cVtxColor) + +#define RpPTankAtomicSetConstantVtx2TexCoordsMacro(atm_, uv_)\ +MACRO_START\ +{\ + memcpy(RPATOMICPTANKPLUGINDATA(atm_)->publicData.cUV,\ + uv_,\ + sizeof(RwTexCoords)*2);\ + RPATOMICPTANKPLUGINDATA(atm_)->instFlags |= rpPTANKIFLAGCNSVTX2TEXCOORDS;\ +}\ +MACRO_STOP + +#define RpPTankAtomicGetConstantVtx2TexCoordsMacro(atm_)\ + (RPATOMICPTANKPLUGINDATA(atm_)->publicData.cUV) + +#define RpPTankAtomicSetConstantVtx4TexCoordsMacro(atm_, uv_)\ +MACRO_START\ +{\ + memcpy(RPATOMICPTANKPLUGINDATA(atm_)->publicData.cUV,\ + uv_,\ + sizeof(RwTexCoords)*4);\ + RPATOMICPTANKPLUGINDATA(atm_)->instFlags |= rpPTANKIFLAGCNSVTX4TEXCOORDS;\ +}\ +MACRO_STOP + +#define RpPTankAtomicGetConstantVtx4TexCoordsMacro(atm_)\ + (RPATOMICPTANKPLUGINDATA(atm_)->publicData.cUV) + +#if (defined(RWDEBUG) || defined(RWSUPPRESSINLINE)) +extern RwInt32 +RpPTankAtomicGetActiveParticlesCount(RpAtomic *atomic); + +extern RwInt32 +RpPTankAtomicGetMaximumParticlesCount(RpAtomic *atomic); + +extern void +RpPTankAtomicSetActiveParticlesCount(RpAtomic *atomic, RwInt32 count); + +extern void +RpPTankAtomicSetTexture(RpAtomic *atomic, RwTexture *texture); + +extern RwTexture * +RpPTankAtomicGetTexture(RpAtomic *atomic); + +extern RpAtomic * +RpPTankAtomicSetMaterial(RpAtomic *atomic, RpMaterial *material); + +extern RpMaterial * +RpPTankAtomicGetMaterial(RpAtomic *atomic); + +extern void +RpPTankAtomicSetBlendModes(RpAtomic *atomic, + RwBlendFunction srcBlendMode, + RwBlendFunction dstBlendMode ); + +extern void +RpPTankAtomicGetBlendModes(RpAtomic *atomic, + RwBlendFunction *srcBlendMode, + RwBlendFunction *dstBlendMode ); + +extern void +RpPTankAtomicSetVertexAlpha(RpAtomic *atomic, RwBool vtxAlphaState); + +extern RwBool +RpPTankAtomicGetVertexAlpha(RpAtomic *atomic); + +extern void +RpPTankAtomicSetConstantCenter(RpAtomic *atomic, RwV2d *center); + +const RwV2d * +RpPTankAtomicGetConstantCenter(RpAtomic *atomic); + +extern void +RpPTankAtomicSetConstantSize(RpAtomic *atomic, RwV2d *size); + +extern const RwV2d * +RpPTankAtomicGetConstantSize(RpAtomic *atomic); + +extern void +RpPTankAtomicSetConstantRotate(RpAtomic *atomic, RwReal rotate); + +extern RwReal +RpPTankAtomicGetConstantRotate(RpAtomic *atomic); + +extern void +RpPTankAtomicSetConstantMatrix(RpAtomic *atomic, RwMatrix *matrix); + +extern const RwMatrix * +RpPTankAtomicGetConstantMatrix(RpAtomic *atomic); + +extern void +RpPTankAtomicSetConstantColor(RpAtomic *atomic, RwRGBA *color); + +extern const RwRGBA * +RpPTankAtomicGetConstantColor(RpAtomic *atomic); + +extern void +RpPTankAtomicSetConstantVtxColor(RpAtomic *atomic, RwRGBA *color); + +extern const RwRGBA * +RpPTankAtomicGetConstantVtxColor(RpAtomic *atomic); + +extern void +RpPTankAtomicSetConstantVtx2TexCoords(RpAtomic *atomic, RwTexCoords *UVs); + +extern const RwTexCoords * +RpPTankAtomicGetConstantVtx2TexCoords(RpAtomic *atomic); + +extern void +RpPTankAtomicSetConstantVtx4TexCoords(RpAtomic *atomic, RwTexCoords *UVs); + +extern const RwTexCoords * +RpPTankAtomicGetConstantVtx4TexCoords(RpAtomic *atomic); +#else + +#define RpPTankAtomicGetActiveParticlesCount(atm_)\ + RpPTankAtomicGetActiveParticlesCountMacro(atm_) + +#define RpPTankAtomicGetMaximumParticlesCount(atm_)\ + RpPTankAtomicGetMaximumParticlesCountMacro(atm_) + +#define RpPTankAtomicSetActiveParticlesCount(atm_,cnt_)\ + RpPTankAtomicSetActiveParticlesCountMacro(atm_,cnt_) + + +#define RpPTankAtomicSetTexture(atm_,tex_)\ + RpPTankAtomicSetTextureMacro(atm_,tex_) + +#define RpPTankAtomicGetTexture(atm_)\ + RpPTankAtomicGetTextureMacro(atm_) + +extern RpAtomic * +RpPTankAtomicSetMaterial(RpAtomic *atomic, RpMaterial *material); + +#define RpPTankAtomicGetMaterial(atm_)\ + RpPTankAtomicGetMaterialMacro(atm_) + +#define RpPTankAtomicSetBlendModes(atm_,src_,dst_)\ + RpPTankAtomicSetBlendModesMacro(atm_,src_,dst_) + +#define RpPTankAtomicGetBlendModes(atm_,src_,dst_)\ + RpPTankAtomicGetBlendModesMacro(atm_,src_,dst_) + +#define RpPTankAtomicSetVertexAlpha(atm_, vas_)\ + RpPTankAtomicSetVertexAlphaMacro(atm_, vas_) + +#define RpPTankAtomicGetVertexAlpha(atm_)\ + RpPTankAtomicGetVertexAlphaMacro(atm_) + +#define RpPTankAtomicSetConstantCenter(atm_, ctr_)\ + RpPTankAtomicSetConstantCenterMacro(atm_, ctr_) + +#define RpPTankAtomicGetConstantCenter(atm_)\ + RpPTankAtomicGetConstantCenterMacro(atm_) + +#define RpPTankAtomicSetConstantSize(atm_, size_)\ + RpPTankAtomicSetConstantSizeMacro(atm_, size_) + +#define RpPTankAtomicGetConstantSize(atm_)\ + RpPTankAtomicGetConstantSizeMacro(atm_) + +#define RpPTankAtomicSetConstantRotate(atm_, rot_)\ + RpPTankAtomicSetConstantRotateMacro(atm_, rot_) + +#define RpPTankAtomicGetConstantRotate(atm_)\ + RpPTankAtomicGetConstantRotateMacro(atm_) + +#define RpPTankAtomicSetConstantMatrix(atm_, mtx_)\ + RpPTankAtomicSetConstantMatrixMacro(atm_, mtx_) + +#define RpPTankAtomicGetConstantMatrix(atm_)\ + RpPTankAtomicGetConstantMatrixMacro(atm_) + +#define RpPTankAtomicSetConstantColor(atm_, col_)\ + RpPTankAtomicSetConstantColorMacro(atm_, col_) + +#define RpPTankAtomicGetConstantColor(atm_)\ + RpPTankAtomicGetConstantColorMacro(atm_) + +#define RpPTankAtomicSetConstantVtxColor(atm_, _col)\ + RpPTankAtomicSetConstantVtxColorMacro(atm_, _col) + +#define RpPTankAtomicGetConstantVtxColor(atm_)\ + RpPTankAtomicGetConstantVtxColorMacro(atm_) + +#define RpPTankAtomicSetConstantVtx2TexCoords(atm_, uv_)\ + RpPTankAtomicSetConstantVtx2TexCoordsMacro(atm_, uv_) + +#define RpPTankAtomicGetConstantVtx2TexCoords(atm_)\ + RpPTankAtomicGetConstantVtx2TexCoordsMacro(atm_)\ + +#define RpPTankAtomicSetConstantVtx4TexCoords(atm_, uv_)\ + RpPTankAtomicSetConstantVtx4TexCoordsMacro(atm_, uv_) + +#define RpPTankAtomicGetConstantVtx4TexCoords(atm_)\ + RpPTankAtomicGetConstantVtx4TexCoordsMacro(atm_) + +#endif + +/* + * Data access API *********************************************************** + */ + +extern RwBool +RpPTankAtomicLock(RpAtomic *atomic, RpPTankLockStruct *dst, + RwUInt32 dataFlags, RpPTankLockFlags lockFlag); + +extern void * +RpPTankAtomicLockByIndex(RpAtomic *atomic, RwInt32 idx, RwUInt32 dataFlags, RpPTankLockFlags lockFlag); + +extern RpAtomic * +RpPTankAtomicUnlock(RpAtomic *atomic); + + +/* + * Stealth functions ********************************************************* + */ +RpAtomic* +_rpPTankAtomicCreateCustom(RwInt32 maxParticleNum, + RwUInt32 dataFlags, RwUInt32 platFlags, + RpPTankCallBacks *callbacks); + +#ifdef __cplusplus +} +#endif /* __cplusplus */ + +/*---- end: ./ptank.h----*/ + +/*---- start: c:/daily/rwsdk/plugin/ptank/d3d8/ptankplatform.h----*/ + +/** + * \defgroup rpptankd3d8 D3D8 + * \ingroup rpptank + * + * D3D8 specific documentation. + */ + +/** + * \ingroup rpptankd3d8 + * \par D3D8 specific data flags + * + * <ul> + * <li> rpPTANKD3D8FLAGSUSEPOINTSPRITES selects the D3D8 optimized pipeline. At the + * moment, this pipeline use point sprites when the hardware supports them, + * which don't allow use of all the PTank flags. Only the following flags are + * supported when using the D3D8 optimized pipes: + * + * <ul> + * <li> rpPTANKDFLAGPOSITION + * <li> rpPTANKDFLAGNORMAL + * <li> rpPTANKDFLAGSIZE (if the hardware supports the D3DFVF_PSIZE vertex format flag) + * <li> rpPTANKDFLAGCOLOR + * <li> rpPTANKDFLAGUSECENTER + * <li> rpPTANKDFLAGARRAY + * <li> rpPTANKDFLAGSTRUCTURE + * </ul> + * + * The texture coordinates are generated by the hardware and can't be specified. + * </ul> + * + * If the hardware does not support point sprites, the default pipeline is used + * instead. + * + */ + +enum RpPTankD3D8Flags +{ + rpPTANKD3D8FLAGSUSEPOINTSPRITES = 0x00000001, + + rpPTANKD3D8FLAGFORCEENUMSIZEINT = RWFORCEENUMSIZEINT +}; + +typedef enum RpPTankD3D8Flags RpPTankD3D8Flags; + +/*---- end: c:/daily/rwsdk/plugin/ptank/d3d8/ptankplatform.h----*/ + +#endif /* RPPTANK_H */ + + |