mirror of
https://gitlab.com/GaryOderNichts/re3-wiiu.git
synced 2024-11-30 13:04:15 +01:00
829 lines
26 KiB
C
829 lines
26 KiB
C
|
|
#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 */
|
|
|
|
|