289 lines
8.1 KiB
C++
289 lines
8.1 KiB
C++
#include "StdAfx.h"
|
|
#include "EffectInstance.h"
|
|
#include "ParticleSystemInstance.h"
|
|
#include "SimpleLightInstance.h"
|
|
|
|
#include "../eterBase/Stl.h"
|
|
#include "../eterLib/StateManager.h"
|
|
#include "../MilesLib/SoundManager.h"
|
|
|
|
CDynamicPool<CEffectInstance> CEffectInstance::ms_kPool;
|
|
int CEffectInstance::ms_iRenderingEffectCount = 0;
|
|
|
|
bool CEffectInstance::LessRenderOrder(CEffectInstance* pkEftInst)
|
|
{
|
|
return (m_pkEftData<pkEftInst->m_pkEftData);
|
|
}
|
|
|
|
void CEffectInstance::ResetRenderingEffectCount()
|
|
{
|
|
ms_iRenderingEffectCount = 0;
|
|
}
|
|
|
|
int CEffectInstance::GetRenderingEffectCount()
|
|
{
|
|
return ms_iRenderingEffectCount;
|
|
}
|
|
|
|
CEffectInstance* CEffectInstance::New()
|
|
{
|
|
CEffectInstance* pkEftInst=ms_kPool.Alloc();
|
|
return pkEftInst;
|
|
}
|
|
|
|
void CEffectInstance::Delete(CEffectInstance* pkEftInst)
|
|
{
|
|
pkEftInst->Clear();
|
|
ms_kPool.Free(pkEftInst);
|
|
}
|
|
|
|
void CEffectInstance::DestroySystem()
|
|
{
|
|
ms_kPool.Destroy();
|
|
|
|
CParticleSystemInstance::DestroySystem();
|
|
CEffectMeshInstance::DestroySystem();
|
|
CLightInstance::DestroySystem();
|
|
}
|
|
|
|
void CEffectInstance::UpdateSound()
|
|
{
|
|
if (m_pSoundInstanceVector)
|
|
{
|
|
CSoundManager& rkSndMgr=CSoundManager::Instance();
|
|
rkSndMgr.UpdateSoundInstance(m_matGlobal._41, m_matGlobal._42, m_matGlobal._43, m_dwFrame, m_pSoundInstanceVector);
|
|
// NOTE : 매트릭스에서 위치를 직접 얻어온다 - [levites]
|
|
}
|
|
++m_dwFrame;
|
|
}
|
|
|
|
struct FEffectUpdator
|
|
{
|
|
BOOL isAlive;
|
|
float fElapsedTime;
|
|
FEffectUpdator(float fElapsedTime)
|
|
: isAlive(FALSE), fElapsedTime(fElapsedTime)
|
|
{
|
|
}
|
|
void operator () (CEffectElementBaseInstance * pInstance)
|
|
{
|
|
if (pInstance->Update(fElapsedTime))
|
|
isAlive = TRUE;
|
|
}
|
|
};
|
|
|
|
void CEffectInstance::OnUpdate()
|
|
{
|
|
Transform();
|
|
|
|
#ifdef WORLD_EDITOR
|
|
FEffectUpdator f(CTimer::Instance().GetElapsedSecond());
|
|
#else
|
|
FEffectUpdator f(CTimer::Instance().GetCurrentSecond()-m_fLastTime);
|
|
#endif
|
|
f = std::for_each(m_ParticleInstanceVector.begin(), m_ParticleInstanceVector.end(),f);
|
|
f = std::for_each(m_MeshInstanceVector.begin(), m_MeshInstanceVector.end(),f);
|
|
f = std::for_each(m_LightInstanceVector.begin(), m_LightInstanceVector.end(),f);
|
|
m_isAlive = f.isAlive;
|
|
|
|
m_fLastTime = CTimer::Instance().GetCurrentSecond();
|
|
}
|
|
|
|
void CEffectInstance::OnRender()
|
|
{
|
|
STATEMANAGER.SaveTextureStageState(0, D3DTSS_MINFILTER, D3DTEXF_NONE);
|
|
STATEMANAGER.SaveTextureStageState(0, D3DTSS_MAGFILTER, D3DTEXF_NONE);
|
|
STATEMANAGER.SaveRenderState(D3DRS_ALPHABLENDENABLE, TRUE);
|
|
STATEMANAGER.SaveRenderState(D3DRS_SRCBLEND, D3DBLEND_SRCALPHA);
|
|
STATEMANAGER.SaveRenderState(D3DRS_DESTBLEND, D3DBLEND_INVSRCALPHA);
|
|
STATEMANAGER.SaveRenderState(D3DRS_ALPHATESTENABLE, FALSE);
|
|
STATEMANAGER.SaveRenderState(D3DRS_CULLMODE, D3DCULL_NONE);
|
|
STATEMANAGER.SaveRenderState(D3DRS_ZWRITEENABLE, FALSE);
|
|
/////
|
|
|
|
STATEMANAGER.SetTextureStageState(0, D3DTSS_COLORARG1, D3DTA_TFACTOR);
|
|
STATEMANAGER.SetTextureStageState(0, D3DTSS_COLORARG2, D3DTA_TEXTURE);
|
|
STATEMANAGER.SetTextureStageState(0, D3DTSS_COLOROP, D3DTOP_MODULATE);
|
|
STATEMANAGER.SetTextureStageState(0, D3DTSS_ALPHAARG1, D3DTA_TFACTOR);
|
|
STATEMANAGER.SetTextureStageState(0, D3DTSS_ALPHAARG2, D3DTA_TEXTURE);
|
|
STATEMANAGER.SetTextureStageState(0, D3DTSS_ALPHAOP, D3DTOP_MODULATE);
|
|
STATEMANAGER.SetVertexShader(D3DFVF_XYZ|D3DFVF_TEX1);
|
|
std::for_each(m_ParticleInstanceVector.begin(),m_ParticleInstanceVector.end(),std::void_mem_fun(&CEffectElementBaseInstance::Render));
|
|
std::for_each(m_MeshInstanceVector.begin(),m_MeshInstanceVector.end(),std::void_mem_fun(&CEffectElementBaseInstance::Render));
|
|
|
|
/////
|
|
STATEMANAGER.RestoreTextureStageState(0, D3DTSS_MINFILTER);
|
|
STATEMANAGER.RestoreTextureStageState(0, D3DTSS_MAGFILTER);
|
|
STATEMANAGER.RestoreRenderState(D3DRS_ALPHABLENDENABLE);
|
|
STATEMANAGER.RestoreRenderState(D3DRS_SRCBLEND);
|
|
STATEMANAGER.RestoreRenderState(D3DRS_DESTBLEND);
|
|
STATEMANAGER.RestoreRenderState(D3DRS_ALPHATESTENABLE);
|
|
STATEMANAGER.RestoreRenderState(D3DRS_CULLMODE);
|
|
STATEMANAGER.RestoreRenderState(D3DRS_ZWRITEENABLE);
|
|
|
|
++ms_iRenderingEffectCount;
|
|
}
|
|
|
|
void CEffectInstance::SetGlobalMatrix(const D3DXMATRIX & c_rmatGlobal)
|
|
{
|
|
m_matGlobal = c_rmatGlobal;
|
|
}
|
|
|
|
BOOL CEffectInstance::isAlive()
|
|
{
|
|
return m_isAlive;
|
|
}
|
|
|
|
void CEffectInstance::SetActive()
|
|
{
|
|
std::for_each(
|
|
m_ParticleInstanceVector.begin(),
|
|
m_ParticleInstanceVector.end(),
|
|
std::void_mem_fun(&CEffectElementBaseInstance::SetActive));
|
|
std::for_each(
|
|
m_MeshInstanceVector.begin(),
|
|
m_MeshInstanceVector.end(),
|
|
std::void_mem_fun(&CEffectElementBaseInstance::SetActive));
|
|
std::for_each(
|
|
m_LightInstanceVector.begin(),
|
|
m_LightInstanceVector.end(),
|
|
std::void_mem_fun(&CEffectElementBaseInstance::SetActive));
|
|
}
|
|
|
|
void CEffectInstance::SetDeactive()
|
|
{
|
|
std::for_each(
|
|
m_ParticleInstanceVector.begin(),
|
|
m_ParticleInstanceVector.end(),
|
|
std::void_mem_fun(&CEffectElementBaseInstance::SetDeactive));
|
|
std::for_each(
|
|
m_MeshInstanceVector.begin(),
|
|
m_MeshInstanceVector.end(),
|
|
std::void_mem_fun(&CEffectElementBaseInstance::SetDeactive));
|
|
std::for_each(
|
|
m_LightInstanceVector.begin(),
|
|
m_LightInstanceVector.end(),
|
|
std::void_mem_fun(&CEffectElementBaseInstance::SetDeactive));
|
|
}
|
|
|
|
void CEffectInstance::__SetParticleData(CParticleSystemData * pData)
|
|
{
|
|
CParticleSystemInstance * pInstance = CParticleSystemInstance::New();
|
|
pInstance->SetDataPointer(pData);
|
|
pInstance->SetLocalMatrixPointer(&m_matGlobal);
|
|
|
|
m_ParticleInstanceVector.push_back(pInstance);
|
|
}
|
|
void CEffectInstance::__SetMeshData(CEffectMeshScript * pMesh)
|
|
{
|
|
CEffectMeshInstance * pMeshInstance = CEffectMeshInstance::New();
|
|
pMeshInstance->SetDataPointer(pMesh);
|
|
pMeshInstance->SetLocalMatrixPointer(&m_matGlobal);
|
|
|
|
m_MeshInstanceVector.push_back(pMeshInstance);
|
|
}
|
|
|
|
void CEffectInstance::__SetLightData(CLightData* pData)
|
|
{
|
|
CLightInstance * pInstance = CLightInstance::New();
|
|
pInstance->SetDataPointer(pData);
|
|
pInstance->SetLocalMatrixPointer(&m_matGlobal);
|
|
|
|
m_LightInstanceVector.push_back(pInstance);
|
|
}
|
|
|
|
void CEffectInstance::SetEffectDataPointer(CEffectData * pEffectData)
|
|
{
|
|
m_isAlive=true;
|
|
|
|
m_pkEftData=pEffectData;
|
|
|
|
m_fLastTime = CTimer::Instance().GetCurrentSecond();
|
|
m_fBoundingSphereRadius = pEffectData->GetBoundingSphereRadius();
|
|
m_v3BoundingSpherePosition = pEffectData->GetBoundingSpherePosition();
|
|
|
|
if (m_fBoundingSphereRadius > 0.0f)
|
|
CGraphicObjectInstance::RegisterBoundingSphere();
|
|
|
|
DWORD i;
|
|
|
|
for (i = 0; i < pEffectData->GetParticleCount(); ++i)
|
|
{
|
|
CParticleSystemData * pParticle = pEffectData->GetParticlePointer(i);
|
|
|
|
__SetParticleData(pParticle);
|
|
}
|
|
|
|
for (i = 0; i < pEffectData->GetMeshCount(); ++i)
|
|
{
|
|
CEffectMeshScript * pMesh = pEffectData->GetMeshPointer(i);
|
|
|
|
__SetMeshData(pMesh);
|
|
}
|
|
|
|
for (i = 0; i < pEffectData->GetLightCount(); ++i)
|
|
{
|
|
CLightData * pLight = pEffectData->GetLightPointer(i);
|
|
|
|
__SetLightData(pLight);
|
|
}
|
|
|
|
m_pSoundInstanceVector = pEffectData->GetSoundInstanceVector();
|
|
}
|
|
|
|
bool CEffectInstance::GetBoundingSphere(D3DXVECTOR3 & v3Center, float & fRadius)
|
|
{
|
|
v3Center.x = m_matGlobal._41 + m_v3BoundingSpherePosition.x;
|
|
v3Center.y = m_matGlobal._42 + m_v3BoundingSpherePosition.y;
|
|
v3Center.z = m_matGlobal._43 + m_v3BoundingSpherePosition.z;
|
|
fRadius = m_fBoundingSphereRadius;
|
|
return true;
|
|
}
|
|
|
|
void CEffectInstance::Clear()
|
|
{
|
|
if (!m_ParticleInstanceVector.empty())
|
|
{
|
|
std::for_each(m_ParticleInstanceVector.begin(), m_ParticleInstanceVector.end(), CParticleSystemInstance::Delete);
|
|
m_ParticleInstanceVector.clear();
|
|
}
|
|
|
|
if (!m_MeshInstanceVector.empty())
|
|
{
|
|
std::for_each(m_MeshInstanceVector.begin(), m_MeshInstanceVector.end(), CEffectMeshInstance::Delete);
|
|
m_MeshInstanceVector.clear();
|
|
}
|
|
|
|
if (!m_LightInstanceVector.empty())
|
|
{
|
|
std::for_each(m_LightInstanceVector.begin(), m_LightInstanceVector.end(), CLightInstance::Delete);
|
|
m_LightInstanceVector.clear();
|
|
}
|
|
|
|
__Initialize();
|
|
}
|
|
|
|
void CEffectInstance::__Initialize()
|
|
{
|
|
m_isAlive = FALSE;
|
|
m_dwFrame = 0;
|
|
m_pSoundInstanceVector = NULL;
|
|
m_fBoundingSphereRadius = 0.0f;
|
|
m_v3BoundingSpherePosition.x = m_v3BoundingSpherePosition.y = m_v3BoundingSpherePosition.z = 0.0f;
|
|
|
|
m_pkEftData=NULL;
|
|
|
|
D3DXMatrixIdentity(&m_matGlobal);
|
|
}
|
|
|
|
CEffectInstance::CEffectInstance()
|
|
{
|
|
__Initialize();
|
|
}
|
|
CEffectInstance::~CEffectInstance()
|
|
{
|
|
assert(m_ParticleInstanceVector.empty());
|
|
assert(m_MeshInstanceVector.empty());
|
|
assert(m_LightInstanceVector.empty());
|
|
}
|