client/EffectLib/SimpleLightInstance.cpp

139 lines
2.9 KiB
C++

#include "Stdafx.h"
#include "../eterLib/GrpLightManager.h"
#include "SimpleLightInstance.h"
CDynamicPool<CLightInstance> CLightInstance::ms_kPool;
void CLightInstance::DestroySystem()
{
ms_kPool.Destroy();
}
CLightInstance* CLightInstance::New()
{
return ms_kPool.Alloc();
}
void CLightInstance::Delete(CLightInstance* pkData)
{
pkData->Destroy();
ms_kPool.Free(pkData);
}
void CLightInstance::OnSetDataPointer(CEffectElementBase * pElement)
{
Destroy();
m_pData = ((CLightData*)pElement);
m_iLoopCount = m_pData->GetLoopCount();
D3DLIGHT8 Light;
m_pData->InitializeLight(Light);
CLightManager::Instance().RegisterLight(LIGHT_TYPE_DYNAMIC, &m_LightID, Light);
}
bool CLightInstance::OnUpdate(float fElapsedTime)
{
if (!isActive())
{
Destroy();
return false;
}
if (m_fLocalTime >= m_pData->GetDuration())
{
if (m_pData->isLoop() && --m_iLoopCount!=0)
{
if (m_iLoopCount<0)
m_iLoopCount = 0;
m_fLocalTime -= m_pData->GetDuration();
}
else
{
Destroy();
m_iLoopCount = 1;
return false;
}
/*
if (!m_pData->isLoop())
{
OnClear();
return false;
}
m_fLocalTime -= m_pData->GetDuration();
*/
}
CLight * pLight = CLightManager::Instance().GetLight(m_LightID);
if (pLight)
{
pLight->SetAmbientColor(m_pData->m_cAmbient.r, m_pData->m_cAmbient.g, m_pData->m_cAmbient.b, m_pData->m_cAmbient.a);
pLight->SetDiffuseColor(m_pData->m_cDiffuse.r, m_pData->m_cDiffuse.g, m_pData->m_cDiffuse.b, m_pData->m_cDiffuse.a);
/*if (m_pData->m_TimeEventTableRange.size()
&& m_fLocalTime>=m_pData->GetDuration()*m_pData->m_TimeEventTableRange[m_dwRangeIndex].m_fTime)
{
while(m_dwRangeIndex<m_pData->m_TimeEventTableRange.size()
&& m_fLocalTime>=m_pData->GetDuration()*m_pData->m_TimeEventTableRange[m_dwRangeIndex].m_fTime)
m_dwRangeIndex++;
float fLastTime;
float fLastRange=m_pData->m_TimeEventTableRange[m_pData->m_TimeEventTableRange.size()-1].m_Value;
if (m_dwRangeIndex == m_pData->m_TimeEventTableRange.size())
fLastTime = 1.0f;
else
{
fLastTime = m_pData->m_TimeEventTableRange[m_dwRangeIndex].m_fTime;
fLastRange = m_pData->m_TimeEventTableRange[m_dwRangeIndex].m_Value;
}
m_dwRangeIndex--;
pLight->BlendRange(fLastRange*m_pData->m_fMaxRange,
(fLastTime-m_pData->m_TimeEventTableRange[m_dwRangeIndex].m_fTime)*m_pData->GetDuration());
m_dwRangeIndex++;
}*/
float fRange;
m_pData->GetRange(m_fLocalTime, fRange);
pLight->SetRange(fRange);
D3DXVECTOR3 pos;
m_pData->GetPosition(m_fLocalTime,pos);
D3DXVec3TransformCoord(&pos,&pos,mc_pmatLocal);
pLight->SetPosition(pos.x,pos.y,pos.z);
}
return true;
}
void CLightInstance::OnRender()
{
//OnUpdate(0);
}
void CLightInstance::OnInitialize()
{
m_LightID = 0;
m_dwRangeIndex = 0;
}
void CLightInstance::OnDestroy()
{
if (m_LightID)
{
CLightManager::Instance().DeleteLight(m_LightID);
}
}
CLightInstance::CLightInstance()
{
Initialize();
}
CLightInstance::~CLightInstance()
{
Destroy();
}