306 lines
11 KiB
C++
306 lines
11 KiB
C++
|
#include "StdAfx.h"
|
||
|
#include "MapUtil.h"
|
||
|
|
||
|
void Environment_Init(SEnvironmentData& envData)
|
||
|
{
|
||
|
for (int i = 0; i < ENV_DIRLIGHT_NUM; ++i)
|
||
|
{
|
||
|
envData.bDirLightsEnable[i] = false;
|
||
|
envData.DirLights[i].Type = D3DLIGHT_DIRECTIONAL;
|
||
|
envData.DirLights[i].Direction = D3DXVECTOR3(0.5f, 0.5f, -0.5f);
|
||
|
envData.DirLights[i].Position = D3DXVECTOR3(0.0f, 0.0f, 0.0f);
|
||
|
envData.DirLights[i].Specular = D3DXCOLOR(1.0f, 1.0f, 1.0f, 1.0f);
|
||
|
envData.DirLights[i].Diffuse = D3DXCOLOR(1.0f, 1.0f, 1.0f, 1.0f);
|
||
|
envData.DirLights[i].Ambient = D3DXCOLOR(0.5f, 0.5f, 0.5f, 1.0f);
|
||
|
envData.DirLights[i].Range = 0.0f; // Used by Point Light & Spot Light
|
||
|
envData.DirLights[i].Falloff = 1.0f; // Used by Spot Light
|
||
|
envData.DirLights[i].Theta = 0.0f; // Used by Spot Light
|
||
|
envData.DirLights[i].Phi = 0.0f; // Used by Spot Light
|
||
|
envData.DirLights[i].Attenuation0 = 0.0f;
|
||
|
envData.DirLights[i].Attenuation1 = 1.0f;
|
||
|
envData.DirLights[i].Attenuation2 = 0.0f;
|
||
|
}
|
||
|
|
||
|
envData.Material.Diffuse = D3DXCOLOR(0.8f, 0.8f, 0.8f, 1.0f);
|
||
|
envData.Material.Ambient = D3DXCOLOR(0.8f, 0.8f, 0.8f, 1.0f);
|
||
|
envData.Material.Emissive = D3DXCOLOR(0.8f, 0.8f, 0.8f, 1.0f);
|
||
|
envData.Material.Specular = D3DXCOLOR(0.0f, 0.0f, 0.0f, 1.0f);
|
||
|
envData.Material.Power = 0.0f;
|
||
|
|
||
|
envData.bFogEnable = FALSE;
|
||
|
envData.bDensityFog = FALSE;
|
||
|
envData.m_fFogNearDistance = 25600.0f * 0.5f;
|
||
|
envData.m_fFogFarDistance = 25600.0f * 0.7f;
|
||
|
envData.FogColor = D3DXCOLOR(0.5f, 0.5f, 0.5f, 1.0f);
|
||
|
|
||
|
envData.bFilteringEnable = FALSE;
|
||
|
envData.FilteringColor = D3DXCOLOR(0.3f, 0.1f, 0.1f, 0.0f);
|
||
|
envData.byFilteringAlphaSrc = D3DBLEND_ONE;
|
||
|
envData.byFilteringAlphaDest = D3DBLEND_ONE;
|
||
|
|
||
|
envData.fWindStrength = 0.2f;
|
||
|
envData.fWindRandom = 0.0f;
|
||
|
|
||
|
envData.v3SkyBoxScale = D3DXVECTOR3(3500.0f, 3500.0f, 3500.0f);
|
||
|
envData.bySkyBoxGradientLevelUpper = 0;
|
||
|
envData.bySkyBoxGradientLevelLower = 0;
|
||
|
envData.bSkyBoxTextureRenderMode = FALSE;
|
||
|
|
||
|
envData.v2CloudScale = D3DXVECTOR2(200000.0f, 200000.0f);
|
||
|
envData.fCloudHeight = 30000.0f;
|
||
|
envData.v2CloudTextureScale = D3DXVECTOR2(4.0f, 4.0f);
|
||
|
envData.v2CloudSpeed = D3DXVECTOR2(0.001f, 0.001f);
|
||
|
envData.strCloudTextureFileName = "";
|
||
|
envData.CloudGradientColor.m_FirstColor = .0f;
|
||
|
envData.CloudGradientColor.m_SecondColor = .0f;
|
||
|
|
||
|
envData.SkyBoxGradientColorVector.clear();
|
||
|
|
||
|
envData.bLensFlareEnable = FALSE;
|
||
|
envData.LensFlareBrightnessColor = D3DXCOLOR(1.0f, 1.0f, 1.0f, 1.0f);
|
||
|
envData.fLensFlareMaxBrightness = 1.0f;
|
||
|
|
||
|
envData.bMainFlareEnable = FALSE;
|
||
|
envData.strMainFlareTextureFileName = "";
|
||
|
envData.fMainFlareSize = 0.2f;
|
||
|
|
||
|
envData.bReserve = FALSE;
|
||
|
}
|
||
|
|
||
|
bool Environment_Load(SEnvironmentData& envData, const char* envFileName)
|
||
|
{
|
||
|
CTextFileLoader textLoader;
|
||
|
|
||
|
if (!textLoader.Load(envFileName))
|
||
|
return false;
|
||
|
|
||
|
textLoader.SetTop();
|
||
|
|
||
|
textLoader.GetTokenBoolean("reserved", &envData.bReserve);
|
||
|
|
||
|
if (textLoader.SetChildNode("directionallight"))
|
||
|
{
|
||
|
D3DVECTOR v3Dir;
|
||
|
textLoader.GetTokenDirection("direction", &v3Dir);
|
||
|
|
||
|
if (textLoader.SetChildNode("background"))
|
||
|
{
|
||
|
envData.DirLights[ENV_DIRLIGHT_BACKGROUND].Direction = v3Dir;
|
||
|
textLoader.GetTokenBoolean("enable", &envData.bDirLightsEnable[ENV_DIRLIGHT_BACKGROUND]);
|
||
|
textLoader.GetTokenColor("diffuse", &envData.DirLights[ENV_DIRLIGHT_BACKGROUND].Diffuse);
|
||
|
textLoader.GetTokenColor("ambient", &envData.DirLights[ENV_DIRLIGHT_BACKGROUND].Ambient);
|
||
|
textLoader.SetParentNode();
|
||
|
}
|
||
|
|
||
|
if (textLoader.SetChildNode("character"))
|
||
|
{
|
||
|
envData.DirLights[ENV_DIRLIGHT_CHARACTER].Direction = v3Dir;
|
||
|
textLoader.GetTokenBoolean("enable", &envData.bDirLightsEnable[ENV_DIRLIGHT_CHARACTER]);
|
||
|
textLoader.GetTokenColor("diffuse", &envData.DirLights[ENV_DIRLIGHT_CHARACTER].Diffuse);
|
||
|
textLoader.GetTokenColor("ambient", &envData.DirLights[ENV_DIRLIGHT_CHARACTER].Ambient);
|
||
|
textLoader.SetParentNode();
|
||
|
}
|
||
|
|
||
|
textLoader.SetParentNode();
|
||
|
}
|
||
|
|
||
|
if (textLoader.SetChildNode("material"))
|
||
|
{
|
||
|
textLoader.GetTokenColor("diffuse", &envData.Material.Diffuse);
|
||
|
textLoader.GetTokenColor("ambient", &envData.Material.Ambient);
|
||
|
textLoader.GetTokenColor("emissive", &envData.Material.Emissive);
|
||
|
textLoader.SetParentNode();
|
||
|
}
|
||
|
|
||
|
if (textLoader.SetChildNode("fog"))
|
||
|
{
|
||
|
textLoader.GetTokenBoolean("enable", &envData.bFogEnable);
|
||
|
textLoader.GetTokenBoolean("isdensity", &envData.bDensityFog);
|
||
|
textLoader.GetTokenFloat("neardistance", &envData.m_fFogNearDistance);
|
||
|
textLoader.GetTokenFloat("fardistance", &envData.m_fFogFarDistance);
|
||
|
textLoader.GetTokenColor("color", &envData.FogColor);
|
||
|
textLoader.SetParentNode();
|
||
|
}
|
||
|
|
||
|
if (textLoader.SetChildNode("filter"))
|
||
|
{
|
||
|
textLoader.GetTokenBoolean("enable", (BOOL *) &envData.bFilteringEnable);
|
||
|
textLoader.GetTokenColor("color", &envData.FilteringColor);
|
||
|
textLoader.GetTokenByte("alphasrc", &envData.byFilteringAlphaSrc);
|
||
|
textLoader.GetTokenByte("alphadest", &envData.byFilteringAlphaDest);
|
||
|
textLoader.SetParentNode();
|
||
|
}
|
||
|
|
||
|
if (textLoader.SetChildNode("skybox"))
|
||
|
{
|
||
|
textLoader.GetTokenBoolean("btexturerendermode", (BOOL *) &envData.bSkyBoxTextureRenderMode);
|
||
|
textLoader.GetTokenVector3("scale", &envData.v3SkyBoxScale);
|
||
|
textLoader.GetTokenByte("gradientlevelupper", &envData.bySkyBoxGradientLevelUpper);
|
||
|
textLoader.GetTokenByte("gradientlevellower", &envData.bySkyBoxGradientLevelLower);
|
||
|
|
||
|
textLoader.GetTokenString("frontfacefilename", &envData.strSkyBoxFaceFileName[0]);
|
||
|
textLoader.GetTokenString("backfacefilename", &envData.strSkyBoxFaceFileName[1]);
|
||
|
textLoader.GetTokenString("leftfacefilename", &envData.strSkyBoxFaceFileName[2]);
|
||
|
textLoader.GetTokenString("rightfacefilename", &envData.strSkyBoxFaceFileName[3]);
|
||
|
textLoader.GetTokenString("topfacefilename", &envData.strSkyBoxFaceFileName[4]);
|
||
|
textLoader.GetTokenString("bottomfacefilename", &envData.strSkyBoxFaceFileName[5]);
|
||
|
|
||
|
|
||
|
textLoader.GetTokenVector2("cloudscale", &envData.v2CloudScale);
|
||
|
textLoader.GetTokenFloat("cloudheight", &envData.fCloudHeight);
|
||
|
textLoader.GetTokenVector2("cloudtexturescale", &envData.v2CloudTextureScale);
|
||
|
textLoader.GetTokenVector2("cloudspeed", &envData.v2CloudSpeed);
|
||
|
textLoader.GetTokenString("cloudtexturefilename", &envData.strCloudTextureFileName);
|
||
|
|
||
|
CTokenVector * pTokenVectorCloudColor;
|
||
|
if(textLoader.GetTokenVector("cloudcolor", &pTokenVectorCloudColor))
|
||
|
if ( 0 == pTokenVectorCloudColor->size()%8)
|
||
|
{
|
||
|
envData.CloudGradientColor.m_FirstColor.r = atof(pTokenVectorCloudColor->at(0).c_str());
|
||
|
envData.CloudGradientColor.m_FirstColor.g = atof(pTokenVectorCloudColor->at(1).c_str());
|
||
|
envData.CloudGradientColor.m_FirstColor.b = atof(pTokenVectorCloudColor->at(2).c_str());
|
||
|
envData.CloudGradientColor.m_FirstColor.a = atof(pTokenVectorCloudColor->at(3).c_str());
|
||
|
|
||
|
envData.CloudGradientColor.m_SecondColor.r = atof(pTokenVectorCloudColor->at(4).c_str());
|
||
|
envData.CloudGradientColor.m_SecondColor.g = atof(pTokenVectorCloudColor->at(5).c_str());
|
||
|
envData.CloudGradientColor.m_SecondColor.b = atof(pTokenVectorCloudColor->at(6).c_str());
|
||
|
envData.CloudGradientColor.m_SecondColor.a = atof(pTokenVectorCloudColor->at(7).c_str());
|
||
|
}
|
||
|
|
||
|
BYTE byGradientCount = envData.bySkyBoxGradientLevelUpper+envData.bySkyBoxGradientLevelLower;
|
||
|
CTokenVector * pTokenVector;
|
||
|
if (textLoader.GetTokenVector("gradient", &pTokenVector))
|
||
|
if (0 == pTokenVector->size()%8)
|
||
|
if (byGradientCount == pTokenVector->size()/8)
|
||
|
{
|
||
|
envData.SkyBoxGradientColorVector.clear();
|
||
|
envData.SkyBoxGradientColorVector.resize(byGradientCount);
|
||
|
for (DWORD i = 0; i < byGradientCount; ++i)
|
||
|
{
|
||
|
envData.SkyBoxGradientColorVector[i].m_FirstColor.r = atof(pTokenVector->at(i*8+0).c_str());
|
||
|
envData.SkyBoxGradientColorVector[i].m_FirstColor.g = atof(pTokenVector->at(i*8+1).c_str());
|
||
|
envData.SkyBoxGradientColorVector[i].m_FirstColor.b = atof(pTokenVector->at(i*8+2).c_str());
|
||
|
envData.SkyBoxGradientColorVector[i].m_FirstColor.a = atof(pTokenVector->at(i*8+3).c_str());
|
||
|
|
||
|
envData.SkyBoxGradientColorVector[i].m_SecondColor.r = atof(pTokenVector->at(i*8+4).c_str());
|
||
|
envData.SkyBoxGradientColorVector[i].m_SecondColor.g = atof(pTokenVector->at(i*8+5).c_str());
|
||
|
envData.SkyBoxGradientColorVector[i].m_SecondColor.b = atof(pTokenVector->at(i*8+6).c_str());
|
||
|
envData.SkyBoxGradientColorVector[i].m_SecondColor.a = atof(pTokenVector->at(i*8+7).c_str());
|
||
|
}
|
||
|
}
|
||
|
|
||
|
textLoader.SetParentNode();
|
||
|
}
|
||
|
|
||
|
if (textLoader.SetChildNode("lensflare"))
|
||
|
{
|
||
|
textLoader.GetTokenBoolean("enable", &envData.bLensFlareEnable);
|
||
|
textLoader.GetTokenColor("brightnesscolor", &envData.LensFlareBrightnessColor);
|
||
|
textLoader.GetTokenFloat("maxbrightness", &envData.fLensFlareMaxBrightness);
|
||
|
textLoader.GetTokenBoolean("mainflareenable", &envData.bMainFlareEnable);
|
||
|
textLoader.GetTokenString("mainflaretexturefilename", &envData.strMainFlareTextureFileName);
|
||
|
textLoader.GetTokenFloat("mainflaresize", &envData.fMainFlareSize);
|
||
|
|
||
|
textLoader.SetParentNode();
|
||
|
}
|
||
|
return true;
|
||
|
}
|
||
|
|
||
|
void GetInterpolatedPosition(float curPositionRate, TPixelPosition * PixelPosition)
|
||
|
{
|
||
|
}
|
||
|
|
||
|
float GetLinearInterpolation(float begin, float end, float curRate)
|
||
|
{
|
||
|
return (end - begin) * curRate + begin;
|
||
|
}
|
||
|
|
||
|
void PixelPositionToAttributeCellPosition(TPixelPosition PixelPosition, TCellPosition * pAttrCellPosition)
|
||
|
{
|
||
|
pAttrCellPosition->x = PixelPosition.x / c_Section_xAttributeCellSize;
|
||
|
pAttrCellPosition->y = PixelPosition.y / c_Section_yAttributeCellSize;
|
||
|
}
|
||
|
|
||
|
void AttributeCellPositionToPixelPosition(TCellPosition AttrCellPosition, TPixelPosition * pPixelPosition)
|
||
|
{
|
||
|
pPixelPosition->x = AttrCellPosition.x * c_Section_xAttributeCellSize;
|
||
|
pPixelPosition->y = AttrCellPosition.y * c_Section_yAttributeCellSize;
|
||
|
}
|
||
|
|
||
|
float GetPixelPositionDistance(const TPixelPosition & c_rsrcPosition, const TPixelPosition & c_rdstPosition)
|
||
|
{
|
||
|
int idx = c_rsrcPosition.x - c_rdstPosition.x;
|
||
|
int idy = c_rsrcPosition.y - c_rdstPosition.y;
|
||
|
|
||
|
return sqrtf(float(idx*idx + idy*idy));
|
||
|
}
|
||
|
|
||
|
///////////////////////////////////////////////////////////////////////////////////////////////////
|
||
|
CEaseOutInterpolation::CEaseOutInterpolation()
|
||
|
{
|
||
|
Initialize();
|
||
|
}
|
||
|
|
||
|
CEaseOutInterpolation::~CEaseOutInterpolation()
|
||
|
{
|
||
|
}
|
||
|
|
||
|
void CEaseOutInterpolation::Initialize()
|
||
|
{
|
||
|
m_fRemainingTime = 0.0f;
|
||
|
m_fValue = 0.0f;
|
||
|
m_fSpeed = 0.0f;
|
||
|
m_fAcceleration = 0.0f;
|
||
|
m_fStartValue = 0.0f;
|
||
|
m_fLastValue = 0.0f;
|
||
|
}
|
||
|
|
||
|
|
||
|
BOOL CEaseOutInterpolation::Setup(float fStart, float fEnd, float fTime)
|
||
|
{
|
||
|
//for safety
|
||
|
if( fabs(fTime) < FLT_EPSILON )
|
||
|
{
|
||
|
fTime = 0.01f;
|
||
|
}
|
||
|
|
||
|
m_fValue = fStart;
|
||
|
m_fStartValue = fStart;
|
||
|
m_fLastValue = fStart;
|
||
|
|
||
|
m_fSpeed = (2.0f * (fEnd - fStart)) / fTime;
|
||
|
m_fAcceleration = 2.0f * (fEnd - fStart) / (fTime * fTime) - 2.0f * m_fSpeed / fTime;
|
||
|
m_fRemainingTime = fTime;
|
||
|
|
||
|
return TRUE;
|
||
|
}
|
||
|
|
||
|
void CEaseOutInterpolation::Interpolate(float fElapsedTime)
|
||
|
{
|
||
|
m_fLastValue = m_fValue;
|
||
|
|
||
|
m_fRemainingTime -= fElapsedTime;
|
||
|
m_fSpeed += m_fAcceleration * fElapsedTime;
|
||
|
m_fValue += m_fSpeed * fElapsedTime;
|
||
|
|
||
|
if (!isPlaying())
|
||
|
{
|
||
|
m_fValue = 0.0f;
|
||
|
m_fLastValue = 0.0f;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
BOOL CEaseOutInterpolation::isPlaying()
|
||
|
{
|
||
|
return m_fRemainingTime > 0.0f;
|
||
|
}
|
||
|
|
||
|
float CEaseOutInterpolation::GetValue()
|
||
|
{
|
||
|
return m_fValue;
|
||
|
}
|
||
|
|
||
|
float CEaseOutInterpolation::GetChangingValue()
|
||
|
{
|
||
|
return m_fValue - m_fLastValue;
|
||
|
}
|