86 lines
2.4 KiB
C++
86 lines
2.4 KiB
C++
#pragma once
|
|
|
|
#include "EffectElementBaseInstance.h"
|
|
#include "ParticleInstance.h"
|
|
#include "ParticleProperty.h"
|
|
|
|
#include "../eterlib/GrpScreen.h"
|
|
#include "../eterlib/StateManager.h"
|
|
#include "../eterLib/GrpImageInstance.h"
|
|
#include "EmitterProperty.h"
|
|
|
|
class CParticleSystemInstance : public CEffectElementBaseInstance
|
|
{
|
|
public:
|
|
static void DestroySystem();
|
|
|
|
static CParticleSystemInstance* New();
|
|
static void Delete(CParticleSystemInstance* pkData);
|
|
|
|
static CDynamicPool<CParticleSystemInstance> ms_kPool;
|
|
|
|
public:
|
|
template <typename T>
|
|
inline void ForEachParticleRendering(T & FunObj)
|
|
{
|
|
DWORD dwFrameIndex;
|
|
for(dwFrameIndex=0; dwFrameIndex<m_kVct_pkImgInst.size(); dwFrameIndex++)
|
|
{
|
|
STATEMANAGER.SetTexture(0, m_kVct_pkImgInst[dwFrameIndex]->GetTextureReference().GetD3DTexture());
|
|
TParticleInstanceList::iterator itor = m_ParticleInstanceListVector[dwFrameIndex].begin();
|
|
for (; itor != m_ParticleInstanceListVector[dwFrameIndex].end(); ++itor)
|
|
{
|
|
if (!InFrustum(*itor))
|
|
return;
|
|
FunObj(*itor);
|
|
}
|
|
}
|
|
}
|
|
|
|
CParticleSystemInstance();
|
|
virtual ~CParticleSystemInstance();
|
|
|
|
void OnSetDataPointer(CEffectElementBase * pElement);
|
|
|
|
void CreateParticles(float fElapsedTime);
|
|
|
|
inline bool InFrustum(CParticleInstance * pInstance)
|
|
{
|
|
if (m_pParticleProperty->m_bAttachFlag)
|
|
return CScreen::GetFrustum().ViewVolumeTest(Vector3d(
|
|
pInstance->m_v3Position.x + mc_pmatLocal->_41,
|
|
pInstance->m_v3Position.y + mc_pmatLocal->_42,
|
|
pInstance->m_v3Position.z + mc_pmatLocal->_43
|
|
),pInstance->GetRadiusApproximation())!=VS_OUTSIDE;
|
|
else
|
|
return CScreen::GetFrustum().ViewVolumeTest(Vector3d(pInstance->m_v3Position.x,pInstance->m_v3Position.y,pInstance->m_v3Position.z),pInstance->GetRadiusApproximation())!=VS_OUTSIDE;
|
|
}
|
|
|
|
DWORD GetEmissionCount();
|
|
|
|
protected:
|
|
void OnInitialize();
|
|
void OnDestroy();
|
|
|
|
bool OnUpdate(float fElapsedTime);
|
|
void OnRender();
|
|
|
|
protected:
|
|
float m_fEmissionResidue;
|
|
|
|
DWORD m_dwCurrentEmissionCount;
|
|
int m_iLoopCount;
|
|
|
|
typedef std::list<CParticleInstance*> TParticleInstanceList;
|
|
typedef std::vector<TParticleInstanceList> TParticleInstanceListVector;
|
|
TParticleInstanceListVector m_ParticleInstanceListVector;
|
|
|
|
typedef std::vector<CGraphicImageInstance*> TImageInstanceVector;
|
|
TImageInstanceVector m_kVct_pkImgInst;
|
|
|
|
CParticleSystemData * m_pData;
|
|
|
|
CParticleProperty * m_pParticleProperty;
|
|
CEmitterProperty * m_pEmitterProperty;
|
|
};
|