#ifndef RPPTANK_H #define RPPTANK_H /*===========================================================================* *--- Include files ---------------------------------------------------------* *===========================================================================*/ #include "rwcore.h" #include "rpworld.h" /*---- start: ./ptank.h----*/ /** * \defgroup rpptank RpPTank * \ingroup rpplugin * * 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), */ /* free = ((int)0x10000000), */ 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 * \typedef rpptankAllocCallBack * ... */ typedef void *(* rpPTankAllocCallBack)(RpPTankData *ptankGlobal, RwInt32 maxPCount, RwUInt32 dataFlags, RwUInt32 platFlags); /** * \ingroup rpptank * \typedef rpPTankCreateCallBack * ... */ typedef RwBool (* rpPTankCreateCallBack)(RpAtomic *atomic, RpPTankData *ptankGlobal, RwInt32 maxPCount, RwUInt32 dataFlags, RwUInt32 platFlags); /** * \ingroup rpptank * \typedef rpPTankInstanceCallBack * ... */ typedef RwBool (* rpPTankInstanceCallBack)(RpAtomic *atomic, RpPTankData *ptankGlobal, RwInt32 actPCount, RwUInt32 instFlags); /** * \ingroup rpptank * \typedef 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) )\ {\ 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); #ifdef __cplusplus } #endif /* __cplusplus */ /*---- end: ./ptank.h----*/ /*---- start: c:/daily/rwsdk/plugin/ptank/d3d8/ptankplatform.h----*/ enum RpPTankD3D8Flags { rpPTANKD3D8FLAGSUSEPOINTSPRITES = 0x00000001, rpPTANKD3D8FLAGFORCEENUMSIZEINT = RWFORCEENUMSIZEINT }; /*---- end: c:/daily/rwsdk/plugin/ptank/d3d8/ptankplatform.h----*/ #endif /* RPPTANK_H */