#ifndef RPPRTSTD_H
#define RPPRTSTD_H
/*===========================================================================*
*--- Include files ---------------------------------------------------------*
*===========================================================================*/
#include "rwcore.h"
#include "rpworld.h"
/*---- start: ./prtstd.h----*/
#include "rwcore.h"
#include "rpworld.h"
#include "rpptank.h"
#include "rpprtstd.rpe"
/************************************************************************
*
*
*
************************************************************************/
/**
* \defgroup rpprtstd RpPrtStd
* \ingroup rpplugin
*
* Particle Animation Plugin for RenderWare Graphics.
*/
/*
* Current version stamp
*/
#define rpPRTSTDVERSIONSTAMP 2
/*
* Random Number Generation Macros
*/
#define PRTSTD_SRAND_MAX 0xFFFFFFFF
#define PRTSTD_SRAND_IMAX ((RwReal) 1.0 / (RwReal) PRTSTD_SRAND_MAX)
#define PRTSTD_SRAND(_seed) ((_seed) = ((_seed) * 196314165 + 907633515))
/* Real rand -1.0 .. + 1.0 */
#define PRTSTD_RSRAND(_seed) (((RwReal)((RwUInt32) (_seed) * PRTSTD_SRAND_IMAX) * \
(RwReal) 2.0) - (RwReal) 1.0)
#define PRTSTD_RSRAND2(_seed) (((RwReal)((RwReal) (_seed) * PRTSTD_SRAND_IMAX) * \
(RwReal)1.0))
/**
* \ingroup rpprtstd
* \ref RpPrtStdParticleFlags, this type represents the different properties of
* a particle.
*/
enum RpPrtStdParticleFlags
{
rpPRTSTDPARTICLEFLAGEMITTER = 0x00000001, /**<Particle is an emitter. */
rpPRTSTDPARTICLEFLAGFORCEENUMSIZEINT = RWFORCEENUMSIZEINT
};
typedef enum RpPrtStdParticleFlags RpPrtStdParticleFlags;
/**
* \ingroup rpprtstd
* \ref RpPrtStdEmitterFlags, this type represents the different properties of
* an emitter.
*/
enum RpPrtStdEmitterFlags
{
rpPRTSTDEMITTERFLAGALIVE = 0x00000001, /**< The emitter is alive and should not be removed */
rpPRTSTDEMITTERFLAGACTIVE = 0x00000002, /**< This indicates the emitter is active or idle */
rpPRTSTDEMITTERFLAGPTANK = 0x00000004, /**< The emitter uses the \ref rpptank */
rpPRTSTDEMITTERFLAGEMIT = 0x00000008, /**< This indicates the emitter can emit new particles */
rpPRTSTDEMITTERFLAGUPDATE = 0x00000010, /**< This indicates if the emitter is to be updated. */
rpPRTSTDEMITTERFLAGUPDATEPARTICLE = 0x00000020, /**< This indicated if the emitter's particles are updated. */
rpPRTSTDEMITTERFLAGRENDER = 0x00000040, /**< This indicates if the emitter is rendered. */
rpPRTSTDEMITTERFLAGRENDERPARTICLE = 0x00000080, /**< This indicates if the emitter's particles are rendered. */
rpPRTSTDEMITTERFLAGFORCEENUMSIZEINT = RWFORCEENUMSIZEINT
};
typedef enum RpPrtStdEmitterFlags RpPrtStdEmitterFlags;
/************************************************************************
*
*
*
************************************************************************/
#define rpPRTSTDPARTICLECALLBACKMAX 7
/**
* \ingroup rpprtstd
* \ref RpPrtStdParticleCallBackCode, this type represents the different callbacks for
* processing a \ref RpPrtStdParticleBatch. These callbacks will be called at various point for
* processing the particle's custom data.
*/
enum RpPrtStdParticleCallBackCode
{
rpPRTSTDPARTICLECALLBACKUPDATE = 0, /**< Particle update callback */
rpPRTSTDPARTICLECALLBACKRENDER, /**< Particle render callback */
rpPRTSTDPARTICLECALLBACKCREATE, /**< Particle create callback */
rpPRTSTDPARTICLECALLBACKDESTROY, /**< Particle destroy callback */
rpPRTSTDPARTICLECALLBACKSTREAMREAD, /**< Particle stream input callback */
rpPRTSTDPARTICLECALLBACKSTREAMWRITE, /**< Particle stream outout callback */
rpPRTSTDPARTICLECALLBACKSTREAMGETSIZE, /**< Particle stream get size callback */
rpPRTSTDPARTICLECALLBACKFORCEENUMSIZEINT = RWFORCEENUMSIZEINT
};
typedef enum RpPrtStdParticleCallBackCode RpPrtStdParticleCallBackCode;
#define rpPRTSTDEMITTERCALLBACKMAX 10
/**
* \ingroup rpprtstd
* \ref RpPrtStdEmitterCallBackCode, this type represents the different callbacks for
* processing a \ref RpPrtStdEmitter. These callbacks will be called at various point for
* processing the emitter's custom data.
*/
enum RpPrtStdEmitterCallBackCode
{
rpPRTSTDEMITTERCALLBACKEMIT = 0, /**< Emitter particle emission callback */
rpPRTSTDEMITTERCALLBACKBEGINUPDATE, /**< Emitter begin update call back */
rpPRTSTDEMITTERCALLBACKENDUPDATE, /**< Emitter end update callback */
rpPRTSTDEMITTERCALLBACKBEGINRENDER, /**< Emitter begin render callback */
rpPRTSTDEMITTERCALLBACKENDRENDER, /**< Emitter end render callback */
rpPRTSTDEMITTERCALLBACKCREATE, /**< Emitter create callback */
rpPRTSTDEMITTERCALLBACKDESTROY, /**< Emitter destroy callback */
rpPRTSTDEMITTERCALLBACKSTREAMREAD, /**< Emitter stream input callback */
rpPRTSTDEMITTERCALLBACKSTREAMWRITE, /**< Emitter stream output callback */
rpPRTSTDEMITTERCALLBACKSTREAMGETSIZE, /**< Emitter stream get size callback */
rpPRTSTDEMITTERCALLBACKFORCEENUMSIZEINT = RWFORCEENUMSIZEINT
};
typedef enum RpPrtStdEmitterCallBackCode RpPrtStdEmitterCallBackCode;
typedef RwInt32 RpPrtStdPropertyCode;
/************************************************************************
*
*
*
************************************************************************/
typedef struct RpPrtStdEmitter RWALIGN(RpPrtStdEmitter, rwMATRIXALIGNMENT);
/**
* \ingroup rpprtstd
* \typedef RpPrtStdEmitterCallBack
* \ref RpPrtStdEmitterCallBack represents the function called for processing
* a \ref RpPrtStdEmitter. There can several types of the functions, each performing a
* specific task defined by \ref RpPrtStdEmitterCallBackCode.
*
* \param atomic A pointer to the emitter's parent atomic.
* \param emt A pointer to the emitter.
* \param data A pointer to user data.
*
* \return A pointer to the emitter on success. NULL otherwise.
*/
typedef RpPrtStdEmitter *
(*RpPrtStdEmitterCallBack)
(RpAtomic *atomic, RpPrtStdEmitter *emt, void *data);
typedef struct RpPrtStdParticleBatch RWALIGN(RpPrtStdParticleBatch, rwMATRIXALIGNMENT);
/**
* \ingroup rpprtstd
* \typedef RpPrtStdParticleCallBack
* \ref RpPrtStdParticleCallBack represents the function called for processing
* a \ref RpPrtStdParticleBatch. There can be several types of the functions, each
* performing a specific task defined by \ref RpPrtStdParticleCallBackCode.
*
* \param emt A pointer to the particle batch's parent emitter.
* \param prtBatch A pointer to the particle batch.
* \param data A pointer to user data.
*
* \return A pointer to the particle batch on success. NULL otherwise.
*/
typedef RpPrtStdParticleBatch *
(*RpPrtStdParticleCallBack)
(RpPrtStdEmitter *emt, RpPrtStdParticleBatch *prtBatch, void *data);
/**
* \ingroup rpprtstd
* \typedef RpPrtStdEmitterCallBackArray
* \ref RpPrtStdEmitterCallBackArray represents a set of callback functions for
* processing a \ref RpPrtStdEmitter. All the functions are of the type \ref
* RpPrtStdEmitterCallBack.
*
* \see RpPrtStdEmitterCallBackCode
*/
typedef RpPrtStdEmitterCallBack
RpPrtStdEmitterCallBackArray[rpPRTSTDEMITTERCALLBACKMAX];
/**
* \ingroup rpprtstd
* \typedef RpPrtStdParticleCallBackArray
* \ref RpPrtStdParticleCallBackArray represents a set of callback functions for
* processing a \ref RpPrtStdParticleBatch. All the functions are of the type \ref
* RpPrtStdParticleCallBack.
*
* \see RpPrtStdParticleCallBackCode
*/
typedef RpPrtStdParticleCallBack
RpPrtStdParticleCallBackArray[rpPRTSTDPARTICLECALLBACKMAX];
/************************************************************************
*
*
*
************************************************************************/
typedef struct RpPrtStdEmitterClass RpPrtStdEmitterClass;
/**
* \ingroup rpprtstd
* \typedef RpPrtStdEClassSetupCallBack
* \ref RpPrtStdEClassSetupCallBack represents the function called for setting up an
* emitter class's set of callback function. The callback function is called
* after an emitter class is streamed in.
*
* \param eClass A pointer to an emitter class.
*
* \return A pointer to the emitter class on success. NULL otherwise.
*/
typedef RpPrtStdEmitterClass *
(*RpPrtStdEClassSetupCallBack)
(RpPrtStdEmitterClass *eClass);
typedef struct RpPrtStdParticleClass RpPrtStdParticleClass;
/**
* \ingroup rpprtstd
* \typedef RpPrtStdPClassSetupCallBack
* \ref RpPrtStdPClassSetupCallBack represents the function called for setting up an
* emitter class's set of callback function. The callback function is called
* after an emitter class is streamed in.
*
* \param pClass A pointer to a particle class.
*
* \return A pointer to the particle class on success. NULL otherwise.
*/
typedef RpPrtStdParticleClass *
(*RpPrtStdPClassSetupCallBack)
(RpPrtStdParticleClass *pClass);
/************************************************************************
*
*
*
************************************************************************/
typedef struct RpPrtStdPropertyTable RpPrtStdPropertyTable;
/**
* \ingroup rpprtstd
* \struct RpPrtStdPropertyTable
* A structure representing properties's data present in an emitter or
* particle.
* An emitter, or particle, are treated as a single block of memory. The
* property table is used to describe the data presents in the memory block.
* It stores the property's id, offset entry from the start of the memory
* block and size in bytes.
*/
struct RpPrtStdPropertyTable
{
RwUInt32 *propPtr; /**< Internal usage */
RpPrtStdPropertyTable *next; /**< Internal usage */
RwInt32 id; /**< Property table's id */
RwInt32 numProp; /**< Number of properties in the table */
RwInt32 maxProp; /**< Internal usage */
RwInt32 *propID; /**< Array of properties's id */
RwInt32 *propOffset; /**< Array of properties's offset */
RwInt32 *propSize; /**< Array of properties's size */
RwInt32 *propSizeUA; /**< Internal usage */
};
/**
* \ingroup rpprtstd
* \struct RpPrtStdEmitterClass
* A structure representing the collection of data and callbacks for an emitter. An emitter
* class is used to create emitters that share the same properties and callback functions.
* Once created, an emitter class cannot be altered. An emitter class should also not be
* destroyed if emitters of the class are still in use.
*/
struct RpPrtStdEmitterClass
{
RpPrtStdEmitterClass *next; /**< Internal usage */
RwInt32 id; /**< Emitter class's id */
RwInt32 objSize; /**< Size of the emitter */
RpPrtStdPropertyTable *propTab; /**< Reference to a table of emitter properties */
RwInt32 numCallback; /**< Number of callback arrays */
RpPrtStdEmitterCallBackArray *callback; /**< Array of emitter callback functions */
};
/**
* \ingroup rpprtstd
* \struct RpPrtStdParticleClass
* A structure representing the collection of data and callbacks for a particle. A particle
* class is used to create particle that share the same properties and callback functions.
* Once created, a particle class cannot be altered. A particle class should also not be
* destroyed if particles of the class are still in use.
*/
struct RpPrtStdParticleClass
{
RpPrtStdParticleClass *next; /**< Internal usage */
RwInt32 id; /**< Particle class's id */
RwInt32 objSize; /**< Size of a particle */
RpPrtStdPropertyTable *propTab; /**< Reference to a table of particle properties */
RwInt32 numCallback; /**< Number of callback sets */
RpPrtStdParticleCallBackArray *callback; /**< Array of particle batch callback functions */
};
/************************************************************************
*
*
*
************************************************************************/
/**
* \ingroup rpprtstd
* \struct RpPrtStdParticleBatch
* A structure repsenting a group of particles. For efficient, particles are stored
* in batches rather than individually. All live particles are stored at the head
* of batch with no gaps of dead particles. A counter is used to record the number of
* live particles in the batch. Once a batch has 0 live particles, it will removed
* from the emitter's active particle list to the inactive list.
* The first particle of the batch is given by an offset from the start of the
* particle batch.
*/
struct RpPrtStdParticleBatch
{
RpPrtStdParticleBatch *next; /**< Pointer to the next particle batch */
RpPrtStdParticleClass *prtClass; /**< Pointer to the particle's class */
RwInt32 numPrt; /**< Number of particles in the batch */
RwInt32 maxPrt; /**< Maxium number of particles in batch */
RwInt32 newPrt; /**< Start of newly emitted particles in the batch */
RwInt32 offset; /**< Offset to the first particle, from the start of the
* particle batch */
};
/**
* \ingroup rpprtstd
* \struct RpPrtStdEmitter
* A structure repsenting the mandatory data set for any emitter. Each emitter contains information of
* itself and its particles, via the emitter class and particle class respectively. It also contains the
* list of particles, in batches, it had emitted.
* Optional data are stored immediately after the mandatory set. The contents of the optional data are
* described in the emitter class's property table. The offset from the property table are from the start
* of the emitter.
*
* The type of particles emitted are given by the particle class. Each emitter may have only emitter class
* and particle class and these should not be changed during the lifetime of the emitter and its particles.
* The emitter maintains two lists of particle batches, an acitive list, contain still active particles,
* and an inactive list. The maximum number of particles in each batch is given by the prtBatchMaxPrt field.
*/
struct RpPrtStdEmitter
{
RpPrtStdEmitter *next; /**< Pointer to the next emitter */
RwUInt32 flag; /**< Emitter's property flag */
RpAtomic *atomic; /**< Pointer to emitter's parent atomic */
RpPrtStdEmitterClass *emtClass; /**< Pointer the emitter's class */
RwInt32 prtActive; /**< Number of particles emitted */
RwInt32 prtBatchMaxPrt; /**< Maximum number of particles per batch */
RpPrtStdParticleClass *prtClass; /**< Pointer to the particle's class */
RpPrtStdParticleBatch *inactiveBatch, /**< Circular linked list of inactive particle batches */
*activeBatch; /**< Circular linked list of active particle batches */
RwReal boundingSphere; /**< Emitter's bounding sphere. */
};
/************************************************************************
*
*
*
************************************************************************/
#define rpPRTSTDPROPERTYCODEEMITTER 0
#define rpPRTSTDPROPERTYCODEEMITTERSTANDARD 1
#define rpPRTSTDPROPERTYCODEEMITTERPRTCOLOR 2
#define rpPRTSTDPROPERTYCODEEMITTERPRTTEXCOORDS 3
#define rpPRTSTDPROPERTYCODEEMITTERPRTANIMFRAME 4
#define rpPRTSTDPROPERTYCODEEMITTERPRTSIZE 5
#define rpPRTSTDPROPERTYCODEEMITTERPTANK 6
#define rpPRTSTDPROPERTYCODEEMITTERPRTVELOCITY 7
#define rpPRTSTDPROPERTYCODEEMITTERPRTMATRIX 8
#define rpPRTSTDEMITTERPROPERTYCOUNT 9
#define rpPRTSTDEMITTERDATAFLAGSTANDARD 0x00000001
#define rpPRTSTDEMITTERDATAFLAGPRTCOLOR 0x00000002
#define rpPRTSTDEMITTERDATAFLAGPRTTEXCOORDS 0x00000004
#define rpPRTSTDEMITTERDATAFLAGPRTANIMFRAME 0x00000008
#define rpPRTSTDEMITTERDATAFLAGPRTSIZE 0x00000010
#define rpPRTSTDEMITTERDATAFLAGPTANK 0x00000020
#define rpPRTSTDEMITTERDATAFLAGPRTMATRIX 0x00000040
typedef struct RpPrtStdEmitterStandard RpPrtStdEmitterStandard;
/**
* \ingroup rpprtstd
* \struct RpPrtStdEmitterStandard
* A structure represent the set of properties for a basic emitter. The structure is stored as
* a single optional data in the emitter property table.
*
* The basic emitter uses a 'time' variable to control particle emissions. A large time gap between
* emission can give pulse effects where as a small time gap produces a streaming effects. Particles
* can be emitted from a single point, line, area or a volume.
*
* Particles emitted from an emitter are of the same type. An emitter cannot emit different types of
* particles. Once an emitter has reached its maximum number of particles, no further particles are
* emitted until some of the existing particles have died.
*
* Most properties have a bias value to vary the property value. This uses the seed field
* to give a degreee of randomness.
*/
struct RpPrtStdEmitterStandard
{
RwInt32 seed; /**< Seed for random number generator */
RwInt32 maxPrt; /**< Maximum number of active particles */
RwReal currTime, /**< Current timestamp for emitter */
prevTime; /**< Previous timestamp for emitter */
RwV3d force; /**< External force applied to particles */
RwV3d emtPos, /**< Emitter position */
emtSize; /**< Emitter size. This is the volume where new particles
* are emitted */
RwReal emtEmitGap, /**< Time gap between emission */
emtEmitGapBias, /**< Time gap bias */
emtPrevEmitTime, /**< Previous particle emission time */
emtEmitTime; /**< Next particle emission time */
RwInt32 emtPrtEmit, /**< Number of particle emit per emission */
emtPrtEmitBias; /**< Particle emission bias */
RwReal prtInitVel, /**< Particle's initial speed */
prtInitVelBias; /**< Particle's initial speed bias */
RwReal prtLife, /**< Particle's duration */
prtLifeBias; /**< Particle's duration bias */
RwV3d prtInitDir, /**< Particle's initial direction */
prtInitDirBias; /**< particle's initial direction bias */
RwV2d prtSize; /**< Particle's size */
RwRGBA prtColor; /**< Particle's color */
RwTexCoords prtUV[4]; /**< Particle's texture coordindates */
RwTexture *texture; /**< Particle's texture */
RwMatrix *ltm; /**< LTM to transform particle coordinates from local space
* to world space */
};
typedef struct RpPrtStdEmitterPrtColor RpPrtStdEmitterPrtColor;
/**
* \ingroup rpprtstd
* \struct RpPrtStdEmitterPrtColor
* An optional structure to represent the change in color of a particle from birth to death.
* The particles will start with the prtStartCol and ends with endPrtColor. The particle's
* life is used to interpolate the colors.
*
* If this structure is not present, then the particles will have a constant color.
*/
struct RpPrtStdEmitterPrtColor
{
RwRGBAReal prtStartCol, /**< Particle start color */
prtStartColBias; /**< Particle start color bias */
RwRGBAReal prtEndCol, /**< Particle end color */
prtEndColBias; /**< Particle end color bias */
};
typedef struct RpPrtStdEmitterPrtTexCoords RpPrtStdEmitterPrtTexCoords;
/**
* \ingroup rpprtstd
* \struct RpPrtStdEmitterPrtTexCoords
* An optional structure to represent the change in texcoords of a particle from birth to death.
* The particles will start with prtStartUV0 and prtStartUV1 and ends with endPrtEndUV0 and endPrtEndUV1.
* The particle's life is used to interpolate the texcoords.
*
* A particle can have two texcoords representing the top left and bottom right respectively. By varying
* the texcoords can give an animated texture effect on a particle.
*
* If this structure is not present, then the particles will have a constant texcoords.
*/
struct RpPrtStdEmitterPrtTexCoords
{
RwTexCoords prtStartUV0, /**< Particle start top left texcoords */
prtStartUV0Bias; /**< Particle start top left texcoords bias */
RwTexCoords prtEndUV0, /**< Particle end top left texcoords */
prtEndUV0Bias; /**< Particle end top left texcoords bias */
RwTexCoords prtStartUV1, /**< Particle start bottom right texcoords */
prtStartUV1Bias; /**< Particle start botton right texcoords bias */
RwTexCoords prtEndUV1, /**< Particle end bottom right texcoords */
prtEndUV1Bias; /**< Particle end bottom right texcoords bias */
};
typedef struct RpPrtStdEmitterPrtAnimFrame RpPrtStdEmitterPrtAnimFrame;
struct RpPrtStdEmitterPrtAnimFrame
{
RwInt32 prtNumFrames;
RwTexCoords *prtAnimFrameTexCoords;
};
typedef struct RpPrtStdEmitterPrtSize RpPrtStdEmitterPrtSize;
/**
* \ingroup rpprtstd
* \struct RpPrtStdEmitterPrtSize
* An optional structure to represent the change in size of a particle from birth to death.
* The particles will start with prtStartSize and ends with prtEndSize. The particle's life
* is used to interpolate the size.
*
* If this structure is not present, then the particles will have a constant size.
*/
struct RpPrtStdEmitterPrtSize
{
RwV2d prtStartSize, /**< Particle start size */
prtStartSizeBias; /**< Particle start size bias */
RwV2d prtEndSize, /**< Particle end size */
prtEndSizeBias; /**< Particle end size bias */
};
typedef struct RpPrtStdEmitterPrtMatrix RWALIGN(RpPrtStdEmitterPrtMatrix, rwMATRIXALIGNMENT);
struct RpPrtStdEmitterPrtMatrix
{
RwMatrix prtCnsMtx;
RwV3d prtPosMtxAt,
prtPosMtxAtBias;
RwV3d prtPosMtxUp,
prtPosMtxUpBias;
RwInt32 flags;
};
/************************************************************************
*
*
*
************************************************************************/
enum RpPrtStdPTankPropertyCode
{
rpPRTSTDPTANKPROPPARTICLESMAX = 0,
rpPRTSTDPTANKPROPDATAFLAGS,
rpPRTSTDPTANKPROPPLATFORMFLAGS,
rpPRTSTDPTANKPROPPTANK,
rpPRTSTDPTANKPROPFORCEENUMSIZEINT = RWFORCEENUMSIZEINT
};
typedef enum RpPrtStdPTankPropertyCode RpPrtStdPTankPropertyCode;
typedef struct RpPrtStdEmitterPTank RpPrtStdEmitterPTank;
struct RpPrtStdEmitterPTank
{
RwUInt32 dataFlags,
platFlags,
numPrt,
maxPrt,
updateFlags,
emitFlags;
RpAtomic *pTank;
RwChar **dataInPtrs,
**dataOutPtrs;
RwInt32 *dataStride;
};
/************************************************************************
*
*
*
************************************************************************/
#define rpPRTSTDPROPERTYCODEPARTICLESTANDARD 0
#define rpPRTSTDPROPERTYCODEPARTICLEPOSITION 1
#define rpPRTSTDPROPERTYCODEPARTICLECOLOR 2
#define rpPRTSTDPROPERTYCODEPARTICLETEXCOORDS 3
#define rpPRTSTDPROPERTYCODEPARTICLEANIMFRAME 4
#define rpPRTSTDPROPERTYCODEPARTICLESIZE 5
#define rpPRTSTDPROPERTYCODEPARTICLEVELOCITY 6
#define rpPRTSTDPROPERTYCODEPARTICLEMATRIX 7
#define rpPRTSTDPARTICLEPROPERTYCOUNT 8
#define rpPRTSTDPARTICLEDATAFLAGSTANDARD 0x00000001
#define rpPRTSTDPARTICLEDATAFLAGPOSITION 0x00000002
#define rpPRTSTDPARTICLEDATAFLAGCOLOR 0x00000004
#define rpPRTSTDPARTICLEDATAFLAGTEXCOORDS 0x00000008
#define rpPRTSTDPARTICLEDATAFLAGANIMFRAME 0x00000010
#define rpPRTSTDPARTICLEDATAFLAGSIZE 0x00000020
#define rpPRTSTDPARTICLEDATAFLAGVELOCITY 0x00000040
#define rpPRTSTDPARTICLEDATAFLAGMATRIX 0x00000080
/**
* \ingroup rpprtstd
* \struct RpPrtStdParticleStandard
* A structure represent the set of properties for a basic particle. This structure is mandatory
* for all particles.
* The structure contain the life duration of the particle. The particle will be removed when the current
* time is greater than the end time. The particle timer always starts at zero.
*
* The inverted end time is for interpolating optional particle properties.
*/
typedef struct RpPrtStdParticleStandard RpPrtStdParticleStandard;
struct RpPrtStdParticleStandard
{
RwInt32 flag; /**< Particle's property flag */
RwReal currTime, /**< Particle's curr time */
endTime, /**< Particle's end time */
invEndTime; /**< Particle's inv end for interpolation */
};
typedef struct RpPrtStdParticleColor RpPrtStdParticleColor;
/**
* \ingroup rpprtstd
* \struct RpPrtStdParticleColor
* A structure representing the change in a particle's color during its life time. The structure is optional
* and should not be used if particles have a constant color.
*/
struct RpPrtStdParticleColor
{
RwRGBAReal startCol, /**< Particle's end size bias */
deltaCol; /**< Particle's color rate of change */
};
typedef struct RpPrtStdParticleTexCoords RpPrtStdParticleTexCoords;
/**
* \ingroup rpprtstd
* \struct RpPrtStdParticleTexCoords
* A structure representing the change in a particle's texcoords during its life time. The structure is optional
* and should not be used if particles have a constant texcoords.
*/
struct RpPrtStdParticleTexCoords
{
RwTexCoords startUV0, /**< Particle's starting top left texcoords */
startUV1; /**< Particle's starting bottom right texcoords */
RwTexCoords deltaUV0, /**< Particle's top left texcoords rate of change */
deltaUV1; /**< Particle's bottom right texcoords rate of change */
};
typedef struct RpPrtStdParticleAnimFrame RpPrtStdParticleAnimFrame;
struct RpPrtStdParticleAnimFrame
{
RwInt32 frame;
RwReal delta;
};
typedef struct RpPrtStdParticleSize RpPrtStdParticleSize;
/**
* \ingroup rpprtstd
* \struct RpPrtStdParticleSize
* A structure representing the change in a particle's size during its life time. The structure is optional
* and should not be used if particles have a constant size.
*/
struct RpPrtStdParticleSize
{
RwV2d startSize, /**< Particle's starting size */
deltaSize; /**< Particle's size rate of change */
RwV2d currSize, /**< Particle's current size. Internal use only */
invCurrSize; /**< Particle's inverse current size. Internal use only */
};
/************************************************************************
*
*
*
************************************************************************/
#ifdef __cplusplus
extern "C"
{
#endif /* __cplusplus */
/************************************************************************/
extern RwBool
RpParticleStandardPluginAttach( void );
/************************************************************************/
extern RpAtomic *
RpPrtStdAtomicCreate(RpPrtStdEmitterClass *eClass, void *data);
extern RpAtomic *
RpPrtStdAtomicUpdate(RpAtomic *atomic, void *data);
extern RpAtomic *
RpPrtStdAtomicSetEmitter(RpAtomic *atomic, RpPrtStdEmitter *emt);
extern RpPrtStdEmitter *
RpPrtStdAtomicGetEmitter(RpAtomic *atomic);
extern RpAtomic *
RpPrtStdAtomicForAllEmitter(RpAtomic *atomic,
RpPrtStdEmitterCallBack callback,
void *data);
extern RpAtomic *
RpPrtStdAtomicAddEmitter(RpAtomic *,
RpPrtStdEmitter *emt);
/************************************************************************/
extern RpPrtStdEmitter *
RpPrtStdEmitterCreate(RpPrtStdEmitterClass *eClass);
extern RwBool
RpPrtStdEmitterDestroy(RpPrtStdEmitter *emt);
extern RpPrtStdEmitter *
RpPrtStdEmitterForAllParticleBatch(RpPrtStdEmitter *emt,
RpPrtStdParticleCallBack callback,
void * data);
extern RpPrtStdEmitter *
RpPrtStdEmitterAddEmitter(RpPrtStdEmitter *emtHead,
RpPrtStdEmitter *emt);
extern RpPrtStdEmitter *
RpPrtStdEmitterLinkPTank(RpPrtStdEmitter *emt,RpAtomic *ptank);
extern RpPrtStdEmitter *
RpPrtStdEmitterDestroyParticleBatch(RpPrtStdEmitter *emt);
extern RpPrtStdParticleBatch *
RpPrtStdEmitterNewParticleBatch(RpPrtStdEmitter *emt);
extern RpPrtStdEmitter *
RpPrtStdEmitterAddParticleBatch(RpPrtStdEmitter *emt,
RpPrtStdParticleBatch *prtBatch);
extern RpPrtStdEmitter *
RpPrtStdEmitterSetPClass(RpPrtStdEmitter *emt,
RpPrtStdParticleClass *pClass,
RwInt32 maxPrt);
extern RpPrtStdEmitter *
RpPrtStdEmitterGetPClass(RpPrtStdEmitter *emt,
RpPrtStdParticleClass **pClass,
RwInt32 *maxPrt);
/************************************************************************/
extern RpPrtStdParticleBatch *
RpPrtStdParticleBatchCreate(RpPrtStdParticleClass *pClass, RwInt32 maxPrt);
extern RwBool
RpPrtStdParticleBatchDestroy(RpPrtStdParticleBatch *prtBatch);
extern RpPrtStdParticleBatch *
RpPrtStdParticleBatchAddBatch(RpPrtStdParticleBatch *prtBatchHead,
RpPrtStdParticleBatch *prtBatch);
/************************************************************************/
extern RpPrtStdPropertyTable *
RpPrtStdPropTabCreate(RwInt32 numProp,
RwInt32 *propID, RwInt32 *propStride);
extern RwBool
RpPrtStdPropTabDestroy(RpPrtStdPropertyTable *propTab);
extern RpPrtStdPropertyTable *
RpPrtStdPropTabGetProperties(RpPrtStdPropertyTable *propTab,
RwInt32 *numProp,
RwInt32 **propID,
RwInt32 **propOffset,
RwInt32 **propSize);
extern RwInt32
RpPrtStdPropTabGetPropOffset(RpPrtStdPropertyTable *propTab,
RwInt32 propID);
extern RwInt32
RpPrtStdPropTabGetPropIndex(RpPrtStdPropertyTable *propTab,
RwInt32 propID);
extern RpPrtStdPropertyTable *
RpPrtStdPropTabGet(RwInt32 id);
extern RpPrtStdPropertyTable *
RpPrtStdPropTabStreamRead(RwStream *stream);
extern RpPrtStdPropertyTable *
RpPrtStdPropTabStreamWrite(RpPrtStdPropertyTable *eClass,
RwStream *stream);
extern RwInt32
RpPrtStdPropTabStreamGetSize(RpPrtStdPropertyTable *eClass);
/************************************************************************/
extern RwBool
RpPrtStdEClassDestroy(RpPrtStdEmitterClass *eClass);
extern RpPrtStdEmitterClass *
RpPrtStdEClassCreate( void );
extern RpPrtStdEmitterClass *
RpPrtStdEClassSetCallBack(RpPrtStdEmitterClass *eClass,
RwInt32 numCallback,
RpPrtStdEmitterCallBackArray *emtCB);
extern RpPrtStdEmitterClass *
RpPrtStdEClassGetCallBack(RpPrtStdEmitterClass *eClass,
RwInt32 *numCallback,
RpPrtStdEmitterCallBackArray **emtCB);
extern RpPrtStdEmitterClass *
RpPrtStdEClassSetPropTab(RpPrtStdEmitterClass *eClass,
RpPrtStdPropertyTable *propTab);
extern RpPrtStdEmitterClass *
RpPrtStdEClassGetPropTab(RpPrtStdEmitterClass *eClass,
RpPrtStdPropertyTable **propTab);
extern RpPrtStdEmitterClass *
RpPrtStdEClassGet(RwInt32 id);
extern RpPrtStdEmitterClass *
RpPrtStdEClassStreamRead(RwStream *stream);
extern RpPrtStdEmitterClass *
RpPrtStdEClassStreamWrite(RpPrtStdEmitterClass *eClass,
RwStream *stream);
extern RwInt32
RpPrtStdEClassStreamGetSize(RpPrtStdEmitterClass *eClass);
/************************************************************************/
extern RpPrtStdParticleClass *
RpPrtStdPClassCreate( void );
extern RwBool
RpPrtStdPClassDestroy(RpPrtStdParticleClass *pClass);
extern RpPrtStdParticleClass *
RpPrtStdPClassSetCallBack(RpPrtStdParticleClass *pClass,
RwInt32 numCallback,
RpPrtStdParticleCallBackArray *prtCB);
extern RpPrtStdParticleClass *
RpPrtStdPClassGetCallBack(RpPrtStdParticleClass *pClass,
RwInt32 *numCallback,
RpPrtStdParticleCallBackArray **prtCB);
extern RpPrtStdParticleClass *
RpPrtStdPClassSetPropTab(RpPrtStdParticleClass *pClass,
RpPrtStdPropertyTable *propTab);
extern RpPrtStdParticleClass *
RpPrtStdPClassGetPropTab(RpPrtStdParticleClass *pClass,
RpPrtStdPropertyTable **propTab);
extern RpPrtStdParticleClass *
RpPrtStdPClassGet(RwInt32 id);
extern RpPrtStdParticleClass *
RpPrtStdPClassStreamRead(RwStream *stream);
extern RpPrtStdParticleClass *
RpPrtStdPClassStreamWrite(RpPrtStdParticleClass *pClass,
RwStream *stream);
extern RwInt32
RpPrtStdPClassStreamGetSize(RpPrtStdParticleClass *pClass);
/************************************************************************/
extern RwBool
RpPrtStdSetEClassSetupCallBack(RpPrtStdEClassSetupCallBack emtCB);
extern RwBool
RpPrtStdGetEClassSetupCallBack(RpPrtStdEClassSetupCallBack *emtCB);
extern RwBool
RpPrtStdSetPClassSetupCallBack(RpPrtStdPClassSetupCallBack prtCB);
extern RwBool
RpPrtStdGetPClassSetupCallBack(RpPrtStdPClassSetupCallBack *prtCB);
/************************************************************************/
extern RwStream *
RpPrtStdGlobalDataStreamRead(RwStream *stream);
extern RwStream *
RpPrtStdGlobalDataStreamWrite(RwStream *stream);
extern RwInt32
RpPrtStdGlobalDataStreamGetSize( void );
/************************************************************************/
extern RpPrtStdEmitter *
RpPrtStdEmitterDefaultCB(RpAtomic * atomic,
RpPrtStdEmitter *prtEmt, void * data);
extern RpPrtStdParticleBatch *
RpPrtStdParticleDefaultCB(RpPrtStdEmitter * prtEmt,
RpPrtStdParticleBatch *prtBatch, void * data);
/************************************************************************/
extern RpPrtStdParticleBatch *
RpPrtStdParticleStdUpdateCB(RpPrtStdEmitter *emt,
RpPrtStdParticleBatch *prtBatch, void *data);
extern RpPrtStdEmitter *
RpPrtStdEmitterStdEmitCB(RpAtomic *atomic,
RpPrtStdEmitter *emt, void *data);
extern RpPrtStdEmitter *
RpPrtStdEmitterStdCreateCB(RpAtomic *atomic,
RpPrtStdEmitter *emt, void *data);
extern RpPrtStdEmitter *
RpPrtStdEmitterStdBeginUpdateCB(RpAtomic *atomic,
RpPrtStdEmitter *emt, void *data);
extern RpPrtStdEmitter *
RpPrtStdEmitterStdEndUpdateCB(RpAtomic *atomic,
RpPrtStdEmitter *emt, void *data);
extern RpPrtStdEmitter *
RpPrtStdEmitterStdRenderCB(RpAtomic *atomic,
RpPrtStdEmitter *emt, void *data);
extern RpPrtStdEmitter *
RpPrtStdEmitterStdStreamReadCB(RpAtomic *atomic,
RpPrtStdEmitter *emt, void *data);
extern RpPrtStdEmitter *
RpPrtStdEmitterStdStreamWriteCB(RpAtomic *atomic,
RpPrtStdEmitter *emt, void *data);
extern RpPrtStdEmitter *
RpPrtStdEmitterStdStreamGetSizeCB(RpAtomic *atomic,
RpPrtStdEmitter *emt, void *data);
extern RpPrtStdEmitterClass *
RpPrtStdEClassStdCreate( RwInt32 dataFlag );
extern RwInt32
RpPrtStdEClassStdCreateID( RwInt32 dataFlag );
extern RpPrtStdParticleClass *
RpPrtStdPClassStdCreate( RwInt32 dataFlag );
extern RwInt32
RpPrtStdPClassStdCreateID( RwInt32 dataFlag );
extern RpPrtStdEmitterClass *
RpPrtStdEClassStdSetupCB(RpPrtStdEmitterClass *eClass);
extern RpPrtStdParticleClass *
RpPrtStdPClassStdSetupCB(RpPrtStdParticleClass *pClass);
#ifdef __cplusplus
}
#endif /* __cplusplus */
/*---- end: ./prtstd.h----*/
/*---- start: c:/daily/rwsdk/plugin/prtstd/d3d8/prtstdplatform.h----*/
/*---- end: c:/daily/rwsdk/plugin/prtstd/d3d8/prtstdplatform.h----*/
#endif /* RPPRTSTD_H */