211 lines
4.9 KiB
C++
211 lines
4.9 KiB
C++
|
|
#ifndef __CREPARTICLESPRAY_H__
|
|
#define __CREPARTICLESPRAY_H__
|
|
|
|
//=============================================================
|
|
|
|
struct SParticle
|
|
{
|
|
SParticle *prev,*next; // LINK
|
|
Vec3d pos; // CURRENT POSITION
|
|
Vec3d prevPos[8]; // PREVIOUS POSITION
|
|
Vec3d realPos; // CURRENT RENDER POSITION
|
|
Vec3d dir; // CURRENT DIRECTION WITH SPEED
|
|
Vec3d moveDir; // CURRENT CHANGE DIRECTION
|
|
int life; // HOW LONG IT WILL LAST
|
|
int startLife;
|
|
|
|
CFColor color; // CURRENT COLOR OF PARTICLE
|
|
CFColor prevColor; // LAST COLOR OF PARTICLE
|
|
CFColor deltaColor; // CHANGE OF COLOR
|
|
|
|
bool bSpark;
|
|
|
|
float curSize;
|
|
float deltaSize;
|
|
};
|
|
|
|
//================================================
|
|
|
|
#define MAX_PART_MOVE_STAGES 4
|
|
|
|
enum EMoveType
|
|
{
|
|
eMTWave,
|
|
eMTWhirl,
|
|
eMTSqueeze,
|
|
};
|
|
|
|
struct SPartMoveStage
|
|
{
|
|
EMoveType eMoveType;
|
|
SWaveForm WaveMove;
|
|
};
|
|
|
|
//================================================
|
|
|
|
enum EParticleType
|
|
{
|
|
ePTPoint,
|
|
ePTLine,
|
|
ePTPolySegs,
|
|
ePTPoly,
|
|
ePTBeam,
|
|
};
|
|
|
|
enum EParticleCollision
|
|
{
|
|
ePCollision_None,
|
|
ePCollision_True,
|
|
ePCollision_Plane
|
|
};
|
|
|
|
struct SParticleInfo
|
|
{
|
|
// TRANSFORMATION INFO
|
|
float yaw, yawVar; // YAW AND VARIATION
|
|
float pitch, pitchVar; // PITCH AND VARIATION
|
|
float speed,speedVar;
|
|
|
|
int life, lifeVar; // LIFE COUNT AND VARIATION
|
|
CFColor startColor, startColorVar; // CURRENT COLOR OF PARTICLE
|
|
CFColor endColor, endColorVar; // CURRENT COLOR OF PARTICLE
|
|
|
|
// Physics
|
|
Vec3d force;
|
|
|
|
EParticleType ePT;
|
|
int Flags;
|
|
|
|
// Move info
|
|
SPartMoveStage mMoves[MAX_PART_MOVE_STAGES];
|
|
int mNumMoves;
|
|
|
|
Vec3d moveDir;
|
|
Vec3d moveDirVar;
|
|
|
|
// Geometry info
|
|
float startSize, startSizeVar;
|
|
float endSize, endSizeVar;
|
|
|
|
float segmOffs;
|
|
int segmMax;
|
|
|
|
int StackSize;
|
|
float Squeeze;
|
|
};
|
|
|
|
struct SEmitter
|
|
{
|
|
SParticleInfo pi;
|
|
|
|
Vec3d startPos; // XYZ POSITION
|
|
Vec3d startPosVar; // XYZ POSITION VARIATION
|
|
|
|
// Particle
|
|
SParticle *particle; // NULL TERMINATED LINKED LIST
|
|
int totalParticles[2]; // TOTAL EMITTED AT ANY TIME
|
|
int particleCount[2]; // TOTAL EMITTED RIGHT NOW
|
|
int emitsPerFrame, emitVar; // EMITS PER FRAME AND VARIATION
|
|
|
|
EParticleCollision eCollisionType;
|
|
Vec3d PlaneAxis;
|
|
Vec3d PlaneOffs;
|
|
|
|
SParticleInfo Spark;
|
|
int NumSparks;
|
|
|
|
float Life;
|
|
};
|
|
|
|
///////////////////////////////////////////////////////////////////////////////
|
|
|
|
/// Particle Definitions //////////////////////////////////////////////////////
|
|
#define MAX_PARTICLES 4096 // MAXIMUM NUMBER OF PARTICLES
|
|
///////////////////////////////////////////////////////////////////////////////
|
|
|
|
#define FP_ANTIALIAS 0x1
|
|
|
|
struct SParticleStat
|
|
{
|
|
int NumSprays;
|
|
int NumRendSprays;
|
|
int NumParticles;
|
|
int NumVerts;
|
|
int NumIndices;
|
|
};
|
|
|
|
class CREParticleSpray : public CRendElement
|
|
{
|
|
public:
|
|
SEmitter mEmitter;
|
|
SParticle *mParticlePool[2];
|
|
SParticle *mParticlePntr[2];
|
|
int mFrame;
|
|
|
|
private:
|
|
/// Support Function Definitions //////////////////////////////////////////////
|
|
bool mfInitParticleSystem();
|
|
bool mfSetDefaultEmitter(SEmitter *emitter);
|
|
bool mfInitEmitter(SEmitter *emitter);
|
|
|
|
bool mfAddParticle(SEmitter *emitter, SParticleInfo *pi);
|
|
bool mfUpdateParticle(SParticle *particle,SEmitter *emitter);
|
|
void mfEmitSparks(SParticle *p, SEmitter *em);
|
|
|
|
bool mfUpdateEmitter(SEmitter *emitter); // DRAW THE SYSTEM FOR A FRAME
|
|
SEmitter *mfGetEmitter(void) { return &mEmitter; }
|
|
|
|
// Parsing
|
|
void mfCompileParticleInfo(SShader *ef, SParticleInfo *pi, char *scr);
|
|
void mfCompileCollision(SShader *ef, SEmitter *em, char *scr, char *Collision);
|
|
bool mfCompileMove(SShader *ef, SPartMoveStage *pm, SParticleInfo *pi, char *scr);
|
|
bool mfCompileMoveTypeSqueeze(SShader *ef, SPartMoveStage *pm, char *scr);
|
|
bool mfCompileMoveTypeWhirl(SShader *ef, SPartMoveStage *pm, char *scr);
|
|
bool mfCompileMoveTypeWave(SShader *ef, SPartMoveStage *pm, char *scr);
|
|
|
|
public:
|
|
CREParticleSpray()
|
|
{
|
|
mfSetType(eDATA_ParticleSpray);
|
|
mfUpdateFlags(FCEF_TRANSFORM | FCEF_NEEDFILLBUF);
|
|
mfInitEmitter(&mEmitter);
|
|
}
|
|
virtual ~CREParticleSpray();
|
|
//CREParticleSpray(CREParticleSpray *Orig);
|
|
CREParticleSpray& operator = (const CREParticleSpray& src);
|
|
|
|
// CRendElement interface
|
|
virtual void mfPrepare();
|
|
virtual bool mfCull(CCObject *obj);
|
|
|
|
virtual CRendElement *mfCopyConstruct(void)
|
|
{
|
|
//CREParticleSpray *ps = new CREParticleSpray;
|
|
//*ps = this;
|
|
return this;
|
|
}
|
|
|
|
virtual bool mfIsValidTime(SShader *ef, CCObject *obj, float curtime);
|
|
virtual bool mfCompile(SShader *ef, char *scr);
|
|
|
|
static SParticleStat mRS;
|
|
static void mfPrintStat();
|
|
|
|
#ifdef DEBUGALLOC
|
|
#undef new
|
|
#endif
|
|
void* operator new( size_t Size )
|
|
{
|
|
void *ptr = malloc(Size);
|
|
memset(ptr, 0, Size);
|
|
return ptr;
|
|
}
|
|
#ifdef DEBUGALLOC
|
|
#define new DEBUG_CLIENTBLOCK
|
|
#endif
|
|
};
|
|
|
|
|
|
#endif // __RENDELEMENT_H__
|