Files
FC1/CryAnimation/CryCharParticleManager.h
romkazvo 34d6c5d489 123
2023-08-07 19:29:24 +08:00

123 lines
3.6 KiB
C++

/////////////////////////////////////////////////////////////////////////////////////////////////////
//
// Crytek Character Animation source code
//
// History:
// Jan 15 2003 :- Created by Sergiy Migdalskiy
//
// Notes:
// This class is used to isolate particle stuff from the ModelState
/////////////////////////////////////////////////////////////////////////////////////////////////////
#ifndef __CRY_ANIMATION_CRY_CHAR_PARTICLE_MANAGER_HDR__
#define __CRY_ANIMATION_CRY_CHAR_PARTICLE_MANAGER_HDR__
#include "I3DEngine.h"
#include "CryParticleSpawnInfo.h"
#include "GeomCommon.h"
// This class is used for spawning particles (misc. types simultaneously, if needed)
// from an animated character
class CryCharParticleManager
{
public:
CryCharParticleManager();
// adds a particle spawn task, returns a handle to be used to
int add (const ParticleParams& rParticleInfo, const CryParticleSpawnInfo& rSpawnInfo);
// deletes a particle spawn task by the handle
bool remove (int nHandle);
// returns true if there are no emitters; when there are no emitters, it's not necessary to call spawn()
bool empty() const;
// the spawn parameters
struct SpawnParams
{
// the pointer to the (internal indexation) vertices
const Vec3* pVertices;
// the pointer to the (internal indexation) normals;
// NOTE: this is optional and IS sometimes NULL.
const class Vec3dA16* pNormalsA16;
// the number of vertices (internal indexation) in pVertices array
unsigned numVertices;
// faces, in internal indexation
const GeomFace* pFaces;
// number of faces
unsigned numFaces;
// the model matrix of the character - transforms points to world
const Matrix44* pModelMatrix;
// the array of global matrices of bones
const Matrix44* pBoneGlobalMatrices;
// the number of bone matrices
unsigned numBoneMatrices;
void setVertices (const Vec3* _pVertices, unsigned _numVertices)
{
this->pVertices = _pVertices;
this->numVertices = _numVertices;
}
void setFaces (const GeomFace* _pFaces, unsigned _numFaces)
{
this->pFaces = _pFaces;
this->numFaces = _numFaces;
}
// retrieves the vertices of the given face into [0..2] and the normal into [3]
void getFaceVN (unsigned nFace, Vec3* pVerts)const
{
for (int v = 0; v< 3; ++v)
pVerts[v] = this->pVertices[this->pFaces[nFace][v]];
pVerts[3] = (pVerts[2]-pVerts[0])^(pVerts[1]-pVerts[0]);
}
};
// spawn the particles (using the external tangent info and mapping)
void spawn (const SpawnParams& params);
void validateThis();
void GetMemoryUsage (ICrySizer* pSizer);
protected:
struct Emitter
{
ParticleParams m_ParticleInfo;
CryParticleSpawnInfo m_SpawnInfo;
// the quantity accumulator, to enable < 1 particles per frame
// the number of particles accumulates here over time
float m_fParticleAccumulator;
// if false, this entry is reserved (doesn't emit any particles)
bool m_bActive;
// evaluates if a vertex with such base is valid for spawning a particle
bool isValid (const SPipTangents& rBase);
Emitter () :
m_fParticleAccumulator(0),
m_bActive (false)
{
}
// spawn the necessary number of particles
void spawn (const SpawnParams& params, float fTimeDelta);
// spawns only one particle with the params
void spawnSingleParticle (const SpawnParams& params);
// spawns one particle from the skin
void spawnFromSkin(const SpawnParams& params);
// spawns one particle from bone
void spawnFromBone(const SpawnParams& params);
};
std::vector<Emitter> m_arrEmitters;
unsigned m_numActive; // number of active emitters in m_arrEmitters
int m_nLastFrame;
};
#endif