1
0
forked from 0ad/0ad
0ad/source/graphics/ParticleEmitter.h
janwas 73683b6109 # SwEng
. the massive renaming undertaking: camelCase functions -> PascalCase.
. add some cppdoc.
. minor additional renaming improvements: e.g. GetIsClosed -> IsClosed
. in entity code, replace constructs like "pvec = new vector; return
pvec; use *pvec; delete pvec" with a simple stack variable passed as
output parameter (avoid unnecessary dynamic allocs)
. timer: simpler handling of raw ticks vs normal timer (less #if)

This was SVN commit r5017.
2007-05-02 12:07:08 +00:00

222 lines
7.7 KiB
C++

/////////////////////////////////////////////////////
// File Name: ParticleEmitter.h
// Date: 6/29/05
// Author: Will Dull
// Purpose: The base particle and emitter
// classes.
/////////////////////////////////////////////////////
#ifndef _PARTICLEEMITTER_H_
#define _PARTICLEEMITTER_H_
#include "maths/Vector3D.h"
class CTexture;
class CEmitter
{
static const int HALF_RAND = (RAND_MAX / 2);
public:
struct tColor
{
unsigned char r, g, b;
};
struct tParticle
{
// base stuff
CVector3D pos; // Current position 12
CVector3D dir; // Current direction with speed 12
float alpha; // Fade value 4
float alphaDelta; // Change of fade 4
tColor color; // Current color of particle 3
tColor deltaColor; // Change of color 3
short life; // How long it will last 2
// particle text stuff
CVector3D endPos; // For particle texture 12
bool inPos; // 1
tParticle* next; // pointer for link lists 4
tParticle()
{
next = 0;
}
};
//struct tParticleNode
//{
// tParticle* pParticle;
// tParticleNode* next;
//};
protected:
CTexture* texture; // Texture ID
bool isFinished; // tells the engine it's ready to be deleted
// Transformation Info
CVector3D pos; // XYZ Position
CVector3D finalPos; // Final position of the particles (IF IMPLOSION)
float yaw, yawVar; // Yaw and variation
float pitch, pitchVar; // Pitch and variation
float speed, speedVar; // Speed and variation
float updateSpeed; // Controls how fast emitter is updated.
float size; // size of the particles (if point sprites is not enabled)
// Particle
tParticle* heap; // Pointer to beginning of array
tParticle* openList; // linked list of unused particles
tParticle* usedList; // linked list of used particles
int blend_mode; // Method used to blend particles.
int max_particles; // Maximum particles emitter can put out
int particleCount; // Total emitted right now
int emitsPerFrame, emitVar; // Emits per frame and variation
int life, lifeVar; // Life count and variation (in Frames)
int emitterLife; // Life of the emitter
bool decrementLife; // Controls whether or not the particles life is decremented every update.
bool decrementAlpha; // Controls whether or not the particles alpha is decremented every update.
bool RenderParticles; // Controls the rendering of the particles.
tColor startColor, startColorVar; // Current color of particle
tColor endColor, endColorVar; // Current color of particle
// Physics
CVector3D force; // Forces that affect the particles
public:
CEmitter(const int MAX_PARTICLES = 4000, const int lifetime = -1, int textureID = 0);
virtual ~CEmitter(void);
// note: functions are virtual and overridable so as to suit the
// specific particle needs.
virtual bool Setup() { return false; }
virtual bool AddParticle();
virtual bool Update() { return false; }
virtual bool Render();
inline float RandomNum()
{
int rn;
rn = rand();
return ((float)(rn - HALF_RAND) / (float)HALF_RAND);
}
inline char RandomChar()
{
return (unsigned char)(rand() >> 24);
}
inline void RotationToDirection(float pitch, float yaw, CVector3D* direction)
{
direction->X = (float)(-sin(yaw)* cos(pitch));
direction->Y = (float)sin(pitch);
direction->Z = (float)(cos(pitch)* cos(yaw));
}
///////////////////////////////////////////////////////////////////
//
// Accessors
//
///////////////////////////////////////////////////////////////////
float GetPosX() { return pos.X; }
float GetPosY() { return pos.Y; }
float GetPosZ() { return pos.Z; }
CVector3D GetPosVec() { return pos; }
float GetFinalPosX() { return finalPos.X; }
float GetFinalPosY() { return finalPos.Y; }
float GetFinalPosZ() { return finalPos.Z; }
bool IsFinished(void) { return isFinished; }
int GetEmitterLife() { return emitterLife; }
int GetParticleCount() { return particleCount; }
float GetUpdateSpeed() { return updateSpeed; }
int GetMaxParticles(void) { return max_particles; }
tColor GetStartColor(void) { return startColor; }
tColor GetStartColorVar(void) { return startColorVar; }
tColor GetEndColor(void) { return endColor; }
tColor GetEndColorVar(void) { return endColorVar; }
int GetBlendMode(void) { return blend_mode; }
float GetSize(void) { return size; }
float GetYaw(void) { return yaw; }
float GetYawVar(void) { return yawVar; }
float GetPitch(void) { return pitch; }
float GetPitchVar(void) { return pitchVar; }
float GetSpeed(void) { return speed; }
float GetSpeedVar(void) { return speedVar; }
int GetEmitsPerFrame(void) { return emitsPerFrame; }
int GetEmitVar(void) { return emitVar; }
int GetLife(void) { return life; }
int GetLifeVar(void) { return lifeVar; }
float GetForceX(void) { return force.X; }
float GetForceY(void) { return force.Y; }
float GetForceZ(void) { return force.Z; }
///////////////////////////////////////////////////////////////////
//
// Mutators
//
///////////////////////////////////////////////////////////////////
void SetPosX(float posX) { pos.X = posX; }
void SetPosY(float posY) { pos.Y = posY; }
void SetPosZ(float posZ) { pos.Z = posZ; }
inline void SetPosVec(const CVector3D& newPos)
{
pos = newPos;
}
void SetFinalPosX(float finalposX) { finalPos.X = finalposX; }
void SetFinalPosY(float finalposY) { finalPos.Y = finalposY; }
void SetFinalPosZ(float finalposZ) { finalPos.Z = finalposZ; }
void SetTexture(CTexture* id) { texture = id; }
void SetIsFinished(bool finished) { isFinished = finished; }
void SetEmitterLife(int life) { emitterLife = life; }
void SetUpdateSpeed(float speed) { updateSpeed = speed; }
void SetLife(int newlife) { life = newlife; }
void SetLifeVar(int newlifevar) { lifeVar = newlifevar; }
void SetSpeed(float newspeed) { speed = newspeed; }
void SetSpeedVar(float newspeedvar) { speedVar = newspeedvar; }
void SetYaw(float newyaw) { yaw = newyaw; }
void SetYawVar(float newyawvar) { yawVar = newyawvar; }
void SetPitch(float newpitch) { pitch = newpitch; }
void SetPitchVar(float newpitchvar) { pitchVar = newpitchvar; }
void SetStartColor(tColor newColor) { startColor = newColor; }
void SetStartColorVar(tColor newColorVar) { startColorVar = newColorVar; }
void SetEndColor(tColor newColor) { endColor = newColor; }
void SetEndColorVar(tColor newColorVar) { endColorVar = newColorVar; }
void SetStartColorR(int newColorR) { startColor.r = newColorR; }
void SetStartColorG(int newColorG) { startColor.g = newColorG; }
void SetStartColorB(int newColorB) { startColor.b = newColorB; }
void SetStartColorVarR(int newColorVarR) { startColorVar.r = newColorVarR; }
void SetStartColorVarG(int newColorVarG) { startColorVar.g = newColorVarG; }
void SetStartColorVarB(int newColorVarB) { startColorVar.b = newColorVarB; }
void SetEndColorR(int newColorR) { endColor.r = newColorR; }
void SetEndColorG(int newColorG) { endColor.g = newColorG; }
void SetEndColorB(int newColorB) { endColor.b = newColorB; }
void SetEndColorVarR(int newColorVarR) { endColorVar.r = newColorVarR; }
void SetEndColorVarG(int newColorVarG) { endColorVar.g = newColorVarG; }
void SetEndColorVarB(int newColorVarB) { endColorVar.b = newColorVarB; }
inline void SetBlendMode(int blendmode)
{
if(blendmode >= 1 && blendmode <= 4)
blend_mode = blendmode;
else
blend_mode = 1;
}
void SetEmitsPerFrame(int emitsperframe) { emitsPerFrame = emitsperframe; }
void SetEmitVar(int emitvar) { emitVar = emitvar; }
void SetForceX(float forceX) { force.X = forceX; }
void SetForceY(float forceY) { force.Y = forceY; }
void SetForceZ(float forceZ) { force.Z = forceZ; }
void SetSize(float newSize) { size = newSize; }
void SetRenderParticles(bool render) { RenderParticles = render; }
};
#endif