164 lines
3.4 KiB
C++
164 lines
3.4 KiB
C++
#include "StdAfx.h"
|
|
#include "SimpleLightData.h"
|
|
|
|
CDynamicPool<CLightData> CLightData::ms_kPool;
|
|
|
|
void CLightData::DestroySystem()
|
|
{
|
|
ms_kPool.Destroy();
|
|
}
|
|
|
|
CLightData* CLightData::New()
|
|
{
|
|
return ms_kPool.Alloc();
|
|
}
|
|
|
|
void CLightData::Delete(CLightData* pkData)
|
|
{
|
|
pkData->Clear();
|
|
ms_kPool.Free(pkData);
|
|
}
|
|
|
|
|
|
|
|
void CLightData::OnClear()
|
|
{
|
|
m_fMaxRange = 300.0f;
|
|
|
|
m_TimeEventTableRange.clear();
|
|
|
|
m_cAmbient.r = 0.5f;
|
|
m_cAmbient.g = 0.5f;
|
|
m_cAmbient.b = 0.5f;
|
|
m_cAmbient.a = 1.0f;
|
|
m_cDiffuse.r = 0.0f;
|
|
m_cDiffuse.g = 0.0f;
|
|
m_cDiffuse.b = 0.0f;
|
|
m_cDiffuse.a = 1.0f;
|
|
|
|
m_fDuration = 1.0f;
|
|
|
|
m_fAttenuation0 = 0.0f;
|
|
m_fAttenuation1 = 0.1f;
|
|
m_fAttenuation2 = 0.0f;
|
|
|
|
m_bLoopFlag = false;
|
|
m_iLoopCount = 0;
|
|
}
|
|
void CLightData::GetRange(float fTime, float& rRange)
|
|
{
|
|
if (m_TimeEventTableRange.empty())
|
|
{
|
|
rRange = 1.0f * m_fMaxRange;
|
|
if (rRange<0.0f)
|
|
rRange = 0.0f;
|
|
return;
|
|
}
|
|
|
|
GetTimeEventBlendValue(fTime, m_TimeEventTableRange, &rRange);
|
|
rRange *= m_fMaxRange;
|
|
if (rRange<0.0f)
|
|
rRange = 0.0f;
|
|
return;
|
|
/*
|
|
float vecLastRange = m_TimeEventTableRange[0].m_Value;
|
|
|
|
for (DWORD dwIndex = 0; dwIndex < m_TimeEventTableRange.size(); ++dwIndex)
|
|
{
|
|
if(fTime < m_TimeEventTableRange[dwIndex].m_fTime)
|
|
{
|
|
break;
|
|
}
|
|
}
|
|
|
|
if (dwIndex >= m_TimeEventTableRange.size())
|
|
{
|
|
rRange = m_TimeEventTableRange[m_TimeEventTableRange.size()-1].m_Value * m_fMaxRange;
|
|
if (rRange<0.0f)
|
|
rRange = 0.0f;
|
|
return;
|
|
}
|
|
|
|
TTimeEventTypeFloat & rEffectRange = m_TimeEventTableRange[dwIndex];
|
|
TTimeEventTypeFloat & rPrevEffectRange = m_TimeEventTableRange[dwIndex-1];
|
|
|
|
float Head = fabs(rEffectRange.m_fTime - fTime) / fabs(rEffectRange.m_fTime - rPrevEffectRange.m_fTime);
|
|
float Tail = 1.0f - fabs(rEffectRange.m_fTime - fTime) / fabs(rEffectRange.m_fTime - rPrevEffectRange.m_fTime);
|
|
rRange = ((rPrevEffectRange.m_Value*Head) + (rEffectRange.m_Value*Tail) )*m_fMaxRange;
|
|
if (rRange<0.0f)
|
|
rRange = 0.0f;
|
|
*/
|
|
}
|
|
|
|
bool CLightData::OnIsData()
|
|
{
|
|
return true;
|
|
}
|
|
|
|
BOOL CLightData::OnLoadScript(CTextFileLoader & rTextFileLoader)
|
|
{
|
|
if (!rTextFileLoader.GetTokenFloat("duration",&m_fDuration))
|
|
m_fDuration = 1.0f;
|
|
|
|
if (!rTextFileLoader.GetTokenBoolean("loopflag",&m_bLoopFlag))
|
|
m_bLoopFlag = false;
|
|
|
|
if (!rTextFileLoader.GetTokenInteger("loopcount",&m_iLoopCount))
|
|
m_iLoopCount = 0;
|
|
|
|
if (!rTextFileLoader.GetTokenColor("ambientcolor",&m_cAmbient))
|
|
return FALSE;
|
|
|
|
if (!rTextFileLoader.GetTokenColor("diffusecolor",&m_cDiffuse))
|
|
return FALSE;
|
|
|
|
if (!rTextFileLoader.GetTokenFloat("maxrange",&m_fMaxRange))
|
|
return FALSE;
|
|
|
|
if (!rTextFileLoader.GetTokenFloat("attenuation0",&m_fAttenuation0))
|
|
return FALSE;
|
|
|
|
if (!rTextFileLoader.GetTokenFloat("attenuation1",&m_fAttenuation1))
|
|
return FALSE;
|
|
|
|
if (!rTextFileLoader.GetTokenFloat("attenuation2",&m_fAttenuation2))
|
|
return FALSE;
|
|
|
|
if (!GetTokenTimeEventFloat(rTextFileLoader,"timeeventrange",&m_TimeEventTableRange))
|
|
{
|
|
m_TimeEventTableRange.clear();
|
|
}
|
|
|
|
return true;
|
|
}
|
|
|
|
CLightData::CLightData()
|
|
{
|
|
Clear();
|
|
}
|
|
|
|
CLightData::~CLightData()
|
|
{
|
|
}
|
|
|
|
float CLightData::GetDuration()
|
|
{
|
|
return m_fDuration;
|
|
}
|
|
void CLightData::InitializeLight(D3DLIGHT8& light)
|
|
{
|
|
light.Type = D3DLIGHT_POINT;
|
|
|
|
light.Ambient = m_cAmbient;
|
|
light.Diffuse = m_cDiffuse;
|
|
light.Attenuation0 = m_fAttenuation0;
|
|
light.Attenuation1 = m_fAttenuation1;
|
|
light.Attenuation2 = m_fAttenuation2;
|
|
|
|
|
|
D3DXVECTOR3 position;
|
|
GetPosition( 0.0f, position);
|
|
light.Position = position;
|
|
|
|
GetRange(0.0f, light.Range);
|
|
} |