520 lines
16 KiB
C++
520 lines
16 KiB
C++
|
#include "StdAfx.h"
|
|||
|
#include "../eterBase/Random.h"
|
|||
|
#include "../eterLib/StateManager.h"
|
|||
|
#include "ParticleSystemData.h"
|
|||
|
#include "ParticleSystemInstance.h"
|
|||
|
#include "ParticleInstance.h"
|
|||
|
|
|||
|
CDynamicPool<CParticleSystemInstance> CParticleSystemInstance::ms_kPool;
|
|||
|
|
|||
|
using namespace NEffectUpdateDecorator;
|
|||
|
|
|||
|
void CParticleSystemInstance::DestroySystem()
|
|||
|
{
|
|||
|
ms_kPool.Destroy();
|
|||
|
|
|||
|
CParticleInstance::DestroySystem();
|
|||
|
//CRayParticleInstance::DestroySystem();
|
|||
|
}
|
|||
|
|
|||
|
CParticleSystemInstance* CParticleSystemInstance::New()
|
|||
|
{
|
|||
|
return ms_kPool.Alloc();
|
|||
|
}
|
|||
|
|
|||
|
void CParticleSystemInstance::Delete(CParticleSystemInstance* pkPSInst)
|
|||
|
{
|
|||
|
pkPSInst->Destroy();
|
|||
|
ms_kPool.Free(pkPSInst);
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
|
|||
|
DWORD CParticleSystemInstance::GetEmissionCount()
|
|||
|
{
|
|||
|
return m_dwCurrentEmissionCount;
|
|||
|
}
|
|||
|
|
|||
|
void CParticleSystemInstance::CreateParticles(float fElapsedTime)
|
|||
|
{
|
|||
|
float fEmissionCount;
|
|||
|
m_pEmitterProperty->GetEmissionCountPerSecond(m_fLocalTime, &fEmissionCount);
|
|||
|
|
|||
|
float fCreatingValue = fEmissionCount * (fElapsedTime / 1.0f) + m_fEmissionResidue;
|
|||
|
int iCreatingCount = int(fCreatingValue);
|
|||
|
m_fEmissionResidue = fCreatingValue - iCreatingCount;
|
|||
|
|
|||
|
int icurEmissionCount = GetEmissionCount();
|
|||
|
int iMaxEmissionCount = int(m_pEmitterProperty->GetMaxEmissionCount());
|
|||
|
int iNextEmissionCount = int(icurEmissionCount + iCreatingCount);
|
|||
|
iCreatingCount -= max(0, iNextEmissionCount - iMaxEmissionCount);
|
|||
|
|
|||
|
float fLifeTime = 0.0f;
|
|||
|
float fEmittingSize = 0.0f;
|
|||
|
D3DXVECTOR3 _v3TimePosition;
|
|||
|
D3DXVECTOR3 _v3Velocity;
|
|||
|
float fVelocity = 0.0f;
|
|||
|
D3DXVECTOR2 v2HalfSize;
|
|||
|
float fLieRotation = 0;
|
|||
|
if (iCreatingCount)
|
|||
|
{
|
|||
|
m_pEmitterProperty->GetParticleLifeTime(m_fLocalTime, &fLifeTime);
|
|||
|
if (fLifeTime==0.0f)
|
|||
|
{
|
|||
|
return;
|
|||
|
}
|
|||
|
|
|||
|
m_pEmitterProperty->GetEmittingSize(m_fLocalTime, &fEmittingSize);
|
|||
|
|
|||
|
m_pData->GetPosition(m_fLocalTime, _v3TimePosition);
|
|||
|
|
|||
|
m_pEmitterProperty->GetEmittingDirectionX(m_fLocalTime, &_v3Velocity.x);
|
|||
|
m_pEmitterProperty->GetEmittingDirectionY(m_fLocalTime, &_v3Velocity.y);
|
|||
|
m_pEmitterProperty->GetEmittingDirectionZ(m_fLocalTime, &_v3Velocity.z);
|
|||
|
|
|||
|
m_pEmitterProperty->GetEmittingVelocity(m_fLocalTime, &fVelocity);
|
|||
|
|
|||
|
m_pEmitterProperty->GetParticleSizeX(m_fLocalTime, &v2HalfSize.x);
|
|||
|
m_pEmitterProperty->GetParticleSizeY(m_fLocalTime, &v2HalfSize.y);
|
|||
|
|
|||
|
if (BILLBOARD_TYPE_LIE == m_pParticleProperty->m_byBillboardType && mc_pmatLocal)
|
|||
|
{
|
|||
|
float fsx = mc_pmatLocal->_32;
|
|||
|
float fcx = sqrtf(1.0f - fsx * fsx);
|
|||
|
|
|||
|
if (fcx >= 0.00001f)
|
|||
|
fLieRotation = D3DXToDegree(atan2f(-mc_pmatLocal->_12, mc_pmatLocal->_22));
|
|||
|
}
|
|||
|
|
|||
|
}
|
|||
|
|
|||
|
CParticleInstance * pFirstInstance = 0;
|
|||
|
|
|||
|
for (int i = 0; i < iCreatingCount; ++i)
|
|||
|
{
|
|||
|
CParticleInstance * pInstance;
|
|||
|
|
|||
|
pInstance = CParticleInstance::New();
|
|||
|
pInstance->m_pParticleProperty = m_pParticleProperty;
|
|||
|
pInstance->m_pEmitterProperty = m_pEmitterProperty;
|
|||
|
|
|||
|
// LifeTime
|
|||
|
pInstance->m_fLifeTime = fLifeTime;
|
|||
|
pInstance->m_fLastLifeTime = fLifeTime;
|
|||
|
|
|||
|
// Position
|
|||
|
switch (m_pEmitterProperty->GetEmitterShape())
|
|||
|
{
|
|||
|
case CEmitterProperty::EMITTER_SHAPE_POINT:
|
|||
|
pInstance->m_v3Position.x = 0.0f;
|
|||
|
pInstance->m_v3Position.y = 0.0f;
|
|||
|
pInstance->m_v3Position.z = 0.0f;
|
|||
|
break;
|
|||
|
|
|||
|
case CEmitterProperty::EMITTER_SHAPE_ELLIPSE:
|
|||
|
pInstance->m_v3Position.x = frandom(-500.0f, 500.0f);
|
|||
|
pInstance->m_v3Position.y = frandom(-500.0f, 500.0f);
|
|||
|
pInstance->m_v3Position.z = 0.0f;
|
|||
|
D3DXVec3Normalize(&pInstance->m_v3Position, &pInstance->m_v3Position);
|
|||
|
|
|||
|
if (m_pEmitterProperty->isEmitFromEdge())
|
|||
|
{
|
|||
|
pInstance->m_v3Position *= (m_pEmitterProperty->m_fEmittingRadius + fEmittingSize);
|
|||
|
}
|
|||
|
else
|
|||
|
{
|
|||
|
pInstance->m_v3Position *= (frandom(0.0f, m_pEmitterProperty->m_fEmittingRadius) + fEmittingSize);
|
|||
|
}
|
|||
|
break;
|
|||
|
|
|||
|
case CEmitterProperty::EMITTER_SHAPE_SQUARE:
|
|||
|
pInstance->m_v3Position.x = (frandom(-m_pEmitterProperty->m_v3EmittingSize.x/2.0f, m_pEmitterProperty->m_v3EmittingSize.x/2.0f) + fEmittingSize);
|
|||
|
pInstance->m_v3Position.y = (frandom(-m_pEmitterProperty->m_v3EmittingSize.y/2.0f, m_pEmitterProperty->m_v3EmittingSize.y/2.0f) + fEmittingSize);
|
|||
|
pInstance->m_v3Position.z = (frandom(-m_pEmitterProperty->m_v3EmittingSize.z/2.0f, m_pEmitterProperty->m_v3EmittingSize.z/2.0f) + fEmittingSize);
|
|||
|
break;
|
|||
|
|
|||
|
case CEmitterProperty::EMITTER_SHAPE_SPHERE:
|
|||
|
pInstance->m_v3Position.x = frandom(-500.0f, 500.0f);
|
|||
|
pInstance->m_v3Position.y = frandom(-500.0f, 500.0f);
|
|||
|
pInstance->m_v3Position.z = frandom(-500.0f, 500.0f);
|
|||
|
D3DXVec3Normalize(&pInstance->m_v3Position, &pInstance->m_v3Position);
|
|||
|
|
|||
|
if (m_pEmitterProperty->isEmitFromEdge())
|
|||
|
{
|
|||
|
pInstance->m_v3Position *= (m_pEmitterProperty->m_fEmittingRadius + fEmittingSize);
|
|||
|
}
|
|||
|
else
|
|||
|
{
|
|||
|
pInstance->m_v3Position *= (frandom(0.0f, m_pEmitterProperty->m_fEmittingRadius) + fEmittingSize);
|
|||
|
}
|
|||
|
break;
|
|||
|
}
|
|||
|
|
|||
|
// Position
|
|||
|
D3DXVECTOR3 v3TimePosition=_v3TimePosition;
|
|||
|
|
|||
|
pInstance->m_v3Position += v3TimePosition;
|
|||
|
|
|||
|
if (mc_pmatLocal && !m_pParticleProperty->m_bAttachFlag)
|
|||
|
{
|
|||
|
D3DXVec3TransformCoord(&pInstance->m_v3Position,&pInstance->m_v3Position,mc_pmatLocal);
|
|||
|
D3DXVec3TransformCoord(&v3TimePosition, &v3TimePosition, mc_pmatLocal);
|
|||
|
}
|
|||
|
pInstance->m_v3StartPosition = v3TimePosition;
|
|||
|
// NOTE : Update<74><65> ȣ<><C8A3><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ʰ<EFBFBD> Rendering <20>DZ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> length<74><68> 0<><30> <20>Ǵ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ִ<EFBFBD>.
|
|||
|
// Velocity<74><79> <20><><EFBFBD><EFBFBD> <20><> <20><EFBFBD>ŭ <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ʱ<EFBFBD>ȭ <20><><EFBFBD>ֵ<EFBFBD><D6B5><EFBFBD> <20>ٲ<EFBFBD><D9B2><EFBFBD> - [levites]
|
|||
|
//pInstance->m_v3LastPosition = pInstance->m_v3Position;
|
|||
|
|
|||
|
// Direction & Velocity
|
|||
|
pInstance->m_v3Velocity.x = 0.0f;
|
|||
|
pInstance->m_v3Velocity.y = 0.0f;
|
|||
|
pInstance->m_v3Velocity.z = 0.0f;
|
|||
|
|
|||
|
if (CEmitterProperty::EMITTER_ADVANCED_TYPE_INNER == m_pEmitterProperty->GetEmitterAdvancedType())
|
|||
|
{
|
|||
|
D3DXVec3Normalize(&pInstance->m_v3Velocity, &(pInstance->m_v3Position-v3TimePosition));
|
|||
|
pInstance->m_v3Velocity *= -100.0f;
|
|||
|
}
|
|||
|
else if (CEmitterProperty::EMITTER_ADVANCED_TYPE_OUTER == m_pEmitterProperty->GetEmitterAdvancedType())
|
|||
|
{
|
|||
|
if (m_pEmitterProperty->GetEmitterShape() == CEmitterProperty::EMITTER_SHAPE_POINT)
|
|||
|
{
|
|||
|
pInstance->m_v3Velocity.x = frandom(-100.0f, 100.0f);
|
|||
|
pInstance->m_v3Velocity.y = frandom(-100.0f, 100.0f);
|
|||
|
pInstance->m_v3Velocity.z = frandom(-100.0f, 100.0f);
|
|||
|
}
|
|||
|
else
|
|||
|
{
|
|||
|
D3DXVec3Normalize(&pInstance->m_v3Velocity, &(pInstance->m_v3Position-v3TimePosition));
|
|||
|
pInstance->m_v3Velocity *= 100.0f;
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
D3DXVECTOR3 v3Velocity = _v3Velocity;
|
|||
|
if (mc_pmatLocal && !m_pParticleProperty->m_bAttachFlag)
|
|||
|
{
|
|||
|
D3DXVec3TransformNormal(&v3Velocity, &v3Velocity, mc_pmatLocal);
|
|||
|
}
|
|||
|
|
|||
|
pInstance->m_v3Velocity += v3Velocity;
|
|||
|
if (m_pEmitterProperty->m_v3EmittingDirection.x > 0.0f)
|
|||
|
pInstance->m_v3Velocity.x += frandom(-m_pEmitterProperty->m_v3EmittingDirection.x/2.0f, m_pEmitterProperty->m_v3EmittingDirection.x/2.0f) * 1000.0f;
|
|||
|
if (m_pEmitterProperty->m_v3EmittingDirection.y > 0.0f)
|
|||
|
pInstance->m_v3Velocity.y += frandom(-m_pEmitterProperty->m_v3EmittingDirection.y/2.0f, m_pEmitterProperty->m_v3EmittingDirection.y/2.0f) * 1000.0f;
|
|||
|
if (m_pEmitterProperty->m_v3EmittingDirection.z > 0.0f)
|
|||
|
pInstance->m_v3Velocity.z += frandom(-m_pEmitterProperty->m_v3EmittingDirection.z/2.0f, m_pEmitterProperty->m_v3EmittingDirection.z/2.0f) * 1000.0f;
|
|||
|
|
|||
|
pInstance->m_v3Velocity *= fVelocity;
|
|||
|
|
|||
|
// Size
|
|||
|
pInstance->m_v2HalfSize = v2HalfSize;
|
|||
|
|
|||
|
// Rotation
|
|||
|
pInstance->m_fRotation = m_pParticleProperty->m_wRotationRandomStartingBegin;
|
|||
|
pInstance->m_fRotation = frandom(m_pParticleProperty->m_wRotationRandomStartingBegin,m_pParticleProperty->m_wRotationRandomStartingEnd);
|
|||
|
// Rotation - Lie <20><> <20><><EFBFBD><EFBFBD> LocalMatrix <20><> Rotation <20><><EFBFBD><EFBFBD> Random <20><> <20><><EFBFBD><EFBFBD><EFBFBD>Ѵ<EFBFBD>.
|
|||
|
// <20>Ź<EFBFBD> <20><> <20>ʿ<EFBFBD><CABF><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>. <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>ȭ<EFBFBD><C8AD> <20>ʿ<EFBFBD>. - [levites]
|
|||
|
if (BILLBOARD_TYPE_LIE == m_pParticleProperty->m_byBillboardType && mc_pmatLocal)
|
|||
|
{
|
|||
|
pInstance->m_fRotation += fLieRotation;
|
|||
|
}
|
|||
|
|
|||
|
// Texture Animation
|
|||
|
pInstance->m_byFrameIndex = 0;
|
|||
|
pInstance->m_byTextureAnimationType = m_pParticleProperty->GetTextureAnimationType();
|
|||
|
|
|||
|
if (m_pParticleProperty->GetTextureAnimationFrameCount() > 1)
|
|||
|
{
|
|||
|
if (CParticleProperty::TEXTURE_ANIMATION_TYPE_RANDOM_DIRECTION == m_pParticleProperty->GetTextureAnimationType())
|
|||
|
{
|
|||
|
if (random() & 1)
|
|||
|
{
|
|||
|
pInstance->m_byFrameIndex = 0;
|
|||
|
pInstance->m_byTextureAnimationType = CParticleProperty::TEXTURE_ANIMATION_TYPE_CW;
|
|||
|
}
|
|||
|
else
|
|||
|
{
|
|||
|
pInstance->m_byFrameIndex = m_pParticleProperty->GetTextureAnimationFrameCount() - 1;
|
|||
|
pInstance->m_byTextureAnimationType = CParticleProperty::TEXTURE_ANIMATION_TYPE_CCW;
|
|||
|
}
|
|||
|
}
|
|||
|
if (m_pParticleProperty->m_bTexAniRandomStartFrameFlag)
|
|||
|
{
|
|||
|
pInstance->m_byFrameIndex = random_range(0,m_pParticleProperty->GetTextureAnimationFrameCount()-1);
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
// Simple Update
|
|||
|
{
|
|||
|
pInstance->m_v3LastPosition = pInstance->m_v3Position - (pInstance->m_v3Velocity * fElapsedTime);
|
|||
|
pInstance->m_v2Scale.x = m_pParticleProperty->m_TimeEventScaleX.front().m_Value;
|
|||
|
pInstance->m_v2Scale.y= m_pParticleProperty->m_TimeEventScaleY.front().m_Value;
|
|||
|
//pInstance->m_v2Scale = m_pParticleProperty->m_TimeEventScaleXY.front().m_Value;
|
|||
|
#ifdef WORLD_EDITOR
|
|||
|
pInstance->m_Color.r = m_pParticleProperty->m_TimeEventColorRed.front().m_Value;
|
|||
|
pInstance->m_Color.g = m_pParticleProperty->m_TimeEventColorGreen.front().m_Value;
|
|||
|
pInstance->m_Color.b = m_pParticleProperty->m_TimeEventColorBlue.front().m_Value;
|
|||
|
pInstance->m_Color.a = m_pParticleProperty->m_TimeEventAlpha.front().m_Value;
|
|||
|
#else
|
|||
|
pInstance->m_dcColor = m_pParticleProperty->m_TimeEventColor.front().m_Value;
|
|||
|
#endif
|
|||
|
}
|
|||
|
|
|||
|
if (!pFirstInstance)
|
|||
|
{
|
|||
|
m_pData->BuildDecorator(pInstance);
|
|||
|
pFirstInstance = pInstance;
|
|||
|
}
|
|||
|
else
|
|||
|
{
|
|||
|
pInstance->m_pDecorator = pFirstInstance->m_pDecorator->Clone(pFirstInstance,pInstance);
|
|||
|
}
|
|||
|
|
|||
|
m_ParticleInstanceListVector[pInstance->m_byFrameIndex].push_back(pInstance);
|
|||
|
m_dwCurrentEmissionCount++;
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
bool CParticleSystemInstance::OnUpdate(float fElapsedTime)
|
|||
|
{
|
|||
|
bool bMakeParticle = true;
|
|||
|
|
|||
|
/////
|
|||
|
|
|||
|
if (m_fLocalTime >= m_pEmitterProperty->GetCycleLength())
|
|||
|
{
|
|||
|
if (m_pEmitterProperty->isCycleLoop() && --m_iLoopCount!=0)
|
|||
|
{
|
|||
|
if (m_iLoopCount<0)
|
|||
|
m_iLoopCount = 0;
|
|||
|
m_fLocalTime = m_fLocalTime - m_pEmitterProperty->GetCycleLength();
|
|||
|
}
|
|||
|
else
|
|||
|
{
|
|||
|
bMakeParticle = false;
|
|||
|
m_iLoopCount=1;
|
|||
|
if (GetEmissionCount()==0)
|
|||
|
return false;
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
/////
|
|||
|
|
|||
|
int dwFrameIndex;
|
|||
|
int dwFrameCount = m_pParticleProperty->GetTextureAnimationFrameCount();
|
|||
|
|
|||
|
float fAngularVelocity;
|
|||
|
m_pEmitterProperty->GetEmittingAngularVelocity(m_fLocalTime,&fAngularVelocity);
|
|||
|
|
|||
|
if (fAngularVelocity && !m_pParticleProperty->m_bAttachFlag)
|
|||
|
{
|
|||
|
D3DXVec3TransformNormal(&m_pParticleProperty->m_v3ZAxis,&D3DXVECTOR3(0.0f,0.0f,1.0f),mc_pmatLocal);
|
|||
|
}
|
|||
|
|
|||
|
for (dwFrameIndex = 0; dwFrameIndex < dwFrameCount; dwFrameIndex++)
|
|||
|
{
|
|||
|
TParticleInstanceList::iterator itor = m_ParticleInstanceListVector[dwFrameIndex].begin();
|
|||
|
for (; itor != m_ParticleInstanceListVector[dwFrameIndex].end();)
|
|||
|
{
|
|||
|
CParticleInstance * pInstance = *itor;
|
|||
|
|
|||
|
if (!pInstance->Update(fElapsedTime,fAngularVelocity))
|
|||
|
{
|
|||
|
pInstance->DeleteThis();
|
|||
|
|
|||
|
itor = m_ParticleInstanceListVector[dwFrameIndex].erase(itor);
|
|||
|
m_dwCurrentEmissionCount--;
|
|||
|
}
|
|||
|
else
|
|||
|
{
|
|||
|
if (pInstance->m_byFrameIndex != dwFrameIndex)
|
|||
|
{
|
|||
|
m_ParticleInstanceListVector[dwFrameCount+pInstance->m_byFrameIndex].push_back(*itor);
|
|||
|
itor = m_ParticleInstanceListVector[dwFrameIndex].erase(itor);
|
|||
|
}
|
|||
|
else
|
|||
|
++itor;
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
if (isActive() && bMakeParticle)
|
|||
|
CreateParticles(fElapsedTime);
|
|||
|
|
|||
|
for (dwFrameIndex = 0; dwFrameIndex < dwFrameCount; ++dwFrameIndex)
|
|||
|
{
|
|||
|
m_ParticleInstanceListVector[dwFrameIndex].splice(m_ParticleInstanceListVector[dwFrameIndex].end(),m_ParticleInstanceListVector[dwFrameIndex+dwFrameCount]);
|
|||
|
m_ParticleInstanceListVector[dwFrameIndex+dwFrameCount].clear();
|
|||
|
}
|
|||
|
|
|||
|
return true;
|
|||
|
}
|
|||
|
|
|||
|
namespace NParticleRenderer
|
|||
|
{
|
|||
|
struct TwoSideRenderer
|
|||
|
{
|
|||
|
const D3DXMATRIX * pmat;
|
|||
|
TwoSideRenderer(const D3DXMATRIX * pmat=NULL)
|
|||
|
: pmat(pmat)
|
|||
|
{
|
|||
|
}
|
|||
|
|
|||
|
inline void operator () (CParticleInstance * pInstance)
|
|||
|
{
|
|||
|
pInstance->Transform(pmat,D3DXToRadian(-30.0f));
|
|||
|
STATEMANAGER.DrawPrimitiveUP(D3DPT_TRIANGLESTRIP, 2, pInstance->GetParticleMeshPointer(), sizeof(TPTVertex));
|
|||
|
|
|||
|
pInstance->Transform(pmat,D3DXToRadian(+30.0f));
|
|||
|
STATEMANAGER.DrawPrimitiveUP(D3DPT_TRIANGLESTRIP, 2, pInstance->GetParticleMeshPointer(), sizeof(TPTVertex));
|
|||
|
}
|
|||
|
};
|
|||
|
|
|||
|
struct ThreeSideRenderer
|
|||
|
{
|
|||
|
const D3DXMATRIX * pmat;
|
|||
|
ThreeSideRenderer(const D3DXMATRIX * pmat=NULL)
|
|||
|
: pmat(pmat)
|
|||
|
{
|
|||
|
}
|
|||
|
|
|||
|
inline void operator () (CParticleInstance * pInstance)
|
|||
|
{
|
|||
|
pInstance->Transform(pmat);
|
|||
|
STATEMANAGER.DrawPrimitiveUP(D3DPT_TRIANGLESTRIP, 2, pInstance->GetParticleMeshPointer(), sizeof(TPTVertex));
|
|||
|
pInstance->Transform(pmat,D3DXToRadian(-60.0f));
|
|||
|
STATEMANAGER.DrawPrimitiveUP(D3DPT_TRIANGLESTRIP, 2, pInstance->GetParticleMeshPointer(), sizeof(TPTVertex));
|
|||
|
pInstance->Transform(pmat,D3DXToRadian(+60.0f));
|
|||
|
STATEMANAGER.DrawPrimitiveUP(D3DPT_TRIANGLESTRIP, 2, pInstance->GetParticleMeshPointer(), sizeof(TPTVertex));
|
|||
|
}
|
|||
|
};
|
|||
|
|
|||
|
struct NormalRenderer
|
|||
|
{
|
|||
|
inline void operator () (CParticleInstance * pInstance)
|
|||
|
{
|
|||
|
pInstance->Transform();
|
|||
|
STATEMANAGER.DrawPrimitiveUP(D3DPT_TRIANGLESTRIP, 2, pInstance->GetParticleMeshPointer(), sizeof(TPTVertex));
|
|||
|
}
|
|||
|
};
|
|||
|
struct AttachRenderer
|
|||
|
{
|
|||
|
const D3DXMATRIX* pmat;
|
|||
|
AttachRenderer(const D3DXMATRIX * pmat)
|
|||
|
: pmat(pmat)
|
|||
|
{
|
|||
|
}
|
|||
|
|
|||
|
inline void operator () (CParticleInstance * pInstance)
|
|||
|
{
|
|||
|
pInstance->Transform(pmat);
|
|||
|
STATEMANAGER.DrawPrimitiveUP(D3DPT_TRIANGLESTRIP, 2, pInstance->GetParticleMeshPointer(), sizeof(TPTVertex));
|
|||
|
}
|
|||
|
};
|
|||
|
}
|
|||
|
|
|||
|
void CParticleSystemInstance::OnRender()
|
|||
|
{
|
|||
|
CScreen::Identity();
|
|||
|
STATEMANAGER.SetRenderState(D3DRS_SRCBLEND, m_pParticleProperty->m_bySrcBlendType);
|
|||
|
STATEMANAGER.SetRenderState(D3DRS_DESTBLEND, m_pParticleProperty->m_byDestBlendType);
|
|||
|
STATEMANAGER.SetTextureStageState(0,D3DTSS_COLOROP,m_pParticleProperty->m_byColorOperationType);
|
|||
|
if (m_pParticleProperty->m_byBillboardType < BILLBOARD_TYPE_2FACE)
|
|||
|
{
|
|||
|
if (!m_pParticleProperty->m_bAttachFlag)
|
|||
|
{
|
|||
|
ForEachParticleRendering(NParticleRenderer::NormalRenderer());
|
|||
|
}
|
|||
|
else
|
|||
|
{
|
|||
|
ForEachParticleRendering(NParticleRenderer::AttachRenderer(mc_pmatLocal));
|
|||
|
}
|
|||
|
}
|
|||
|
else if (m_pParticleProperty->m_byBillboardType == BILLBOARD_TYPE_2FACE)
|
|||
|
{
|
|||
|
if (!m_pParticleProperty->m_bAttachFlag)
|
|||
|
{
|
|||
|
ForEachParticleRendering(NParticleRenderer::TwoSideRenderer());
|
|||
|
}
|
|||
|
else
|
|||
|
{
|
|||
|
ForEachParticleRendering(NParticleRenderer::TwoSideRenderer(mc_pmatLocal));
|
|||
|
}
|
|||
|
}
|
|||
|
else if (m_pParticleProperty->m_byBillboardType == BILLBOARD_TYPE_3FACE)
|
|||
|
{
|
|||
|
if (!m_pParticleProperty->m_bAttachFlag)
|
|||
|
{
|
|||
|
ForEachParticleRendering(NParticleRenderer::ThreeSideRenderer());
|
|||
|
}
|
|||
|
else
|
|||
|
{
|
|||
|
ForEachParticleRendering(NParticleRenderer::ThreeSideRenderer(mc_pmatLocal));
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
void CParticleSystemInstance::OnSetDataPointer(CEffectElementBase * pElement)
|
|||
|
{
|
|||
|
m_pData = (CParticleSystemData *)pElement;
|
|||
|
|
|||
|
m_dwCurrentEmissionCount = 0;
|
|||
|
m_pParticleProperty = m_pData->GetParticlePropertyPointer();
|
|||
|
m_pEmitterProperty = m_pData->GetEmitterPropertyPointer();
|
|||
|
m_iLoopCount = m_pEmitterProperty->GetLoopCount();
|
|||
|
m_ParticleInstanceListVector.resize(m_pParticleProperty->GetTextureAnimationFrameCount()*2+2);
|
|||
|
|
|||
|
/////
|
|||
|
|
|||
|
assert(m_kVct_pkImgInst.empty());
|
|||
|
m_kVct_pkImgInst.reserve(m_pParticleProperty->m_ImageVector.size());
|
|||
|
for (DWORD i = 0; i < m_pParticleProperty->m_ImageVector.size(); ++i)
|
|||
|
{
|
|||
|
CGraphicImage * pImage = m_pParticleProperty->m_ImageVector[i];
|
|||
|
|
|||
|
CGraphicImageInstance* pkImgInstNew = CGraphicImageInstance::New();
|
|||
|
pkImgInstNew->SetImagePointer(pImage);
|
|||
|
m_kVct_pkImgInst.push_back(pkImgInstNew);
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
void CParticleSystemInstance::OnInitialize()
|
|||
|
{
|
|||
|
m_dwCurrentEmissionCount = 0;
|
|||
|
m_iLoopCount = 0;
|
|||
|
m_fEmissionResidue = 0.0f;
|
|||
|
}
|
|||
|
|
|||
|
void CParticleSystemInstance::OnDestroy()
|
|||
|
{
|
|||
|
// 2004. 3. 1. myevan. <20><>ƼŬ <20><><EFBFBD><EFBFBD> <20><>ƾ
|
|||
|
TParticleInstanceListVector::iterator i;
|
|||
|
for(i = m_ParticleInstanceListVector.begin(); i!=m_ParticleInstanceListVector.end(); ++i)
|
|||
|
{
|
|||
|
TParticleInstanceList& rkLst_kParticleInst=*i;
|
|||
|
|
|||
|
TParticleInstanceList::iterator j;
|
|||
|
for(j = rkLst_kParticleInst.begin(); j!=rkLst_kParticleInst.end(); ++j)
|
|||
|
{
|
|||
|
CParticleInstance* pkParticleInst=*j;
|
|||
|
pkParticleInst->DeleteThis();
|
|||
|
}
|
|||
|
|
|||
|
rkLst_kParticleInst.clear();
|
|||
|
}
|
|||
|
m_ParticleInstanceListVector.clear();
|
|||
|
|
|||
|
std::for_each(m_kVct_pkImgInst.begin(), m_kVct_pkImgInst.end(), CGraphicImageInstance::Delete);
|
|||
|
m_kVct_pkImgInst.clear();
|
|||
|
}
|
|||
|
|
|||
|
CParticleSystemInstance::CParticleSystemInstance()
|
|||
|
{
|
|||
|
Initialize();
|
|||
|
}
|
|||
|
|
|||
|
CParticleSystemInstance::~CParticleSystemInstance()
|
|||
|
{
|
|||
|
assert(m_ParticleInstanceListVector.empty());
|
|||
|
assert(m_kVct_pkImgInst.empty());
|
|||
|
}
|