forked from metin2/client
928 lines
32 KiB
C++
928 lines
32 KiB
C++
|
#include "stdafx.h"
|
|||
|
#include "SkyBox.h"
|
|||
|
#include "Camera.h"
|
|||
|
#include "StateManager.h"
|
|||
|
#include "ResourceManager.h"
|
|||
|
|
|||
|
#include "../eterBase/Timer.h"
|
|||
|
|
|||
|
//////////////////////////////////////////////////////////////////////////
|
|||
|
// CSkyObjectQuad
|
|||
|
//////////////////////////////////////////////////////////////////////////
|
|||
|
|
|||
|
CSkyObjectQuad::CSkyObjectQuad()
|
|||
|
{
|
|||
|
// Index buffer
|
|||
|
m_Indices[0] = 0;
|
|||
|
m_Indices[1] = 2;
|
|||
|
m_Indices[2] = 1;
|
|||
|
m_Indices[3] = 3;
|
|||
|
|
|||
|
for (unsigned char uci = 0; uci < 4; ++uci)
|
|||
|
{
|
|||
|
memset(&m_Vertex[uci], 0, sizeof(TPDTVertex));
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
CSkyObjectQuad::~CSkyObjectQuad()
|
|||
|
{
|
|||
|
}
|
|||
|
|
|||
|
void CSkyObjectQuad::Clear(const unsigned char & c_rucNumVertex,
|
|||
|
const float & c_rfRed,
|
|||
|
const float & c_rfGreen,
|
|||
|
const float & c_rfBlue,
|
|||
|
const float & c_rfAlpha)
|
|||
|
{
|
|||
|
if (c_rucNumVertex > 3)
|
|||
|
return;
|
|||
|
m_Helper[c_rucNumVertex].Clear(c_rfRed, c_rfGreen, c_rfBlue, c_rfAlpha);
|
|||
|
}
|
|||
|
|
|||
|
void CSkyObjectQuad::SetSrcColor(const unsigned char & c_rucNumVertex,
|
|||
|
const float & c_rfRed,
|
|||
|
const float & c_rfGreen,
|
|||
|
const float & c_rfBlue,
|
|||
|
const float & c_rfAlpha)
|
|||
|
{
|
|||
|
if (c_rucNumVertex > 3)
|
|||
|
return;
|
|||
|
m_Helper[c_rucNumVertex].SetSrcColor(c_rfRed, c_rfGreen, c_rfBlue, c_rfAlpha);
|
|||
|
}
|
|||
|
|
|||
|
void CSkyObjectQuad::SetTransition(const unsigned char & c_rucNumVertex,
|
|||
|
const float & c_rfRed,
|
|||
|
const float & c_rfGreen,
|
|||
|
const float & c_rfBlue,
|
|||
|
const float & c_rfAlpha,
|
|||
|
DWORD dwDuration)
|
|||
|
{
|
|||
|
if (c_rucNumVertex > 3)
|
|||
|
return;
|
|||
|
m_Helper[c_rucNumVertex].SetTransition(c_rfRed, c_rfGreen, c_rfBlue, c_rfAlpha, dwDuration);
|
|||
|
}
|
|||
|
|
|||
|
void CSkyObjectQuad::SetVertex(const unsigned char & c_rucNumVertex, const TPDTVertex & c_rPDTVertex)
|
|||
|
{
|
|||
|
if (c_rucNumVertex > 3)
|
|||
|
return;
|
|||
|
memcpy (&m_Vertex[m_Indices[c_rucNumVertex]], &c_rPDTVertex, sizeof(TPDTVertex));
|
|||
|
}
|
|||
|
|
|||
|
void CSkyObjectQuad::StartTransition()
|
|||
|
{
|
|||
|
for (unsigned char uci = 0; uci < 4; ++uci)
|
|||
|
{
|
|||
|
m_Helper[uci].StartTransition();
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
bool CSkyObjectQuad::Update()
|
|||
|
{
|
|||
|
bool bResult = false;
|
|||
|
for (unsigned char uci = 0; uci < 4; ++uci)
|
|||
|
{
|
|||
|
bResult = m_Helper[uci].Update() || bResult;
|
|||
|
m_Vertex[m_Indices[uci]].diffuse = m_Helper[uci].GetCurColor();
|
|||
|
}
|
|||
|
return bResult;
|
|||
|
}
|
|||
|
|
|||
|
void CSkyObjectQuad::Render()
|
|||
|
{
|
|||
|
if (CGraphicBase::SetPDTStream(m_Vertex, 4))
|
|||
|
STATEMANAGER.DrawPrimitive(D3DPT_TRIANGLESTRIP, 0, 2);
|
|||
|
//STATEMANAGER.DrawIndexedPrimitiveUP(D3DPT_TRIANGLESTRIP, 0, 4, 2, m_Indices, D3DFMT_INDEX16, &m_Vertex, sizeof(TPDTVertex));
|
|||
|
}
|
|||
|
|
|||
|
//////////////////////////////////////////////////////////////////////////
|
|||
|
// CSkyObject
|
|||
|
/////////////////////////////////////////////////////////////////////////
|
|||
|
CSkyObject::CSkyObject() :
|
|||
|
m_v3Position(0.0f, 0.0f, 0.0f),
|
|||
|
m_fScaleX(1.0f),
|
|||
|
m_fScaleY(1.0f),
|
|||
|
m_fScaleZ(1.0f)
|
|||
|
{
|
|||
|
D3DXMatrixIdentity(&m_matWorld);
|
|||
|
D3DXMatrixIdentity(&m_matTranslation);
|
|||
|
D3DXMatrixIdentity(&m_matTextureCloud);
|
|||
|
|
|||
|
m_dwlastTime = CTimer::Instance().GetCurrentMillisecond();
|
|||
|
|
|||
|
m_fCloudPositionU = 0.0f;
|
|||
|
m_fCloudPositionV = 0.0f;
|
|||
|
|
|||
|
m_bTransitionStarted = false;
|
|||
|
m_bSkyMatrixUpdated = false;
|
|||
|
}
|
|||
|
|
|||
|
CSkyObject::~CSkyObject()
|
|||
|
{
|
|||
|
Destroy();
|
|||
|
}
|
|||
|
|
|||
|
void CSkyObject::Destroy()
|
|||
|
{
|
|||
|
}
|
|||
|
|
|||
|
void CSkyObject::Update()
|
|||
|
{
|
|||
|
D3DXVECTOR3 v3Eye = CCameraManager::Instance().GetCurrentCamera()->GetEye();
|
|||
|
|
|||
|
if (m_v3Position == v3Eye)
|
|||
|
if (m_bSkyMatrixUpdated == false)
|
|||
|
return;
|
|||
|
|
|||
|
m_v3Position = v3Eye;
|
|||
|
|
|||
|
m_matWorld._41 = m_v3Position.x;
|
|||
|
m_matWorld._42 = m_v3Position.y;
|
|||
|
m_matWorld._43 = m_v3Position.z;
|
|||
|
|
|||
|
m_matWorldCloud._41 = m_v3Position.x;
|
|||
|
m_matWorldCloud._42 = m_v3Position.y;
|
|||
|
m_matWorldCloud._43 = m_v3Position.z + m_fCloudHeight;
|
|||
|
|
|||
|
if (m_bSkyMatrixUpdated)
|
|||
|
m_bSkyMatrixUpdated = false;
|
|||
|
}
|
|||
|
|
|||
|
void CSkyObject::Render()
|
|||
|
{
|
|||
|
}
|
|||
|
|
|||
|
CGraphicImageInstance * CSkyObject::GenerateTexture(const char * szfilename)
|
|||
|
{
|
|||
|
assert(szfilename != NULL);
|
|||
|
|
|||
|
if (strlen(szfilename) <= 0)
|
|||
|
assert(false);
|
|||
|
|
|||
|
CResource * pResource = CResourceManager::Instance().GetResourcePointer(szfilename);
|
|||
|
|
|||
|
if (!pResource->IsType(CGraphicImage::Type()))
|
|||
|
{
|
|||
|
assert(false);
|
|||
|
return NULL;
|
|||
|
}
|
|||
|
|
|||
|
CGraphicImageInstance * pImageInstance = CGraphicImageInstance::New();
|
|||
|
pImageInstance->SetImagePointer(static_cast<CGraphicImage *>(pResource));
|
|||
|
return (pImageInstance);
|
|||
|
}
|
|||
|
|
|||
|
void CSkyObject::DeleteTexture(CGraphicImageInstance * pImageInstance)
|
|||
|
{
|
|||
|
if (pImageInstance)
|
|||
|
CGraphicImageInstance::Delete(pImageInstance);
|
|||
|
}
|
|||
|
|
|||
|
void CSkyObject::StartTransition()
|
|||
|
{
|
|||
|
}
|
|||
|
|
|||
|
//////////////////////////////////////////////////////////////////////////
|
|||
|
// CSkyObject::TSkyObjectFace
|
|||
|
//////////////////////////////////////////////////////////////////////////
|
|||
|
|
|||
|
void CSkyObject::TSkyObjectFace::StartTransition()
|
|||
|
{
|
|||
|
for (unsigned char uci = 0; uci < m_SkyObjectQuadVector.size(); ++uci)
|
|||
|
{
|
|||
|
m_SkyObjectQuadVector[uci].StartTransition();
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
bool CSkyObject::TSkyObjectFace::Update()
|
|||
|
{
|
|||
|
bool bResult = false;
|
|||
|
for (DWORD dwi = 0; dwi < m_SkyObjectQuadVector.size(); ++dwi)
|
|||
|
bResult = m_SkyObjectQuadVector[dwi].Update() || bResult;
|
|||
|
return bResult;
|
|||
|
}
|
|||
|
|
|||
|
void CSkyObject::TSkyObjectFace::Render()
|
|||
|
{
|
|||
|
for (unsigned char uci = 0; uci < m_SkyObjectQuadVector.size(); ++uci)
|
|||
|
{
|
|||
|
m_SkyObjectQuadVector[uci].Render();
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
//////////////////////////////////////////////////////////////////////////
|
|||
|
// CSkyBox
|
|||
|
//////////////////////////////////////////////////////////////////////////
|
|||
|
|
|||
|
CSkyBox::CSkyBox()
|
|||
|
{
|
|||
|
m_ucVirticalGradientLevelUpper = 0;
|
|||
|
m_ucVirticalGradientLevelLower = 0;
|
|||
|
}
|
|||
|
|
|||
|
CSkyBox::~CSkyBox()
|
|||
|
{
|
|||
|
Destroy();
|
|||
|
}
|
|||
|
|
|||
|
void CSkyBox::Destroy()
|
|||
|
{
|
|||
|
Unload();
|
|||
|
}
|
|||
|
|
|||
|
void CSkyBox::SetSkyBoxScale(const D3DXVECTOR3 & c_rv3Scale)
|
|||
|
{
|
|||
|
m_fScaleX = c_rv3Scale.x;
|
|||
|
m_fScaleY = c_rv3Scale.y;
|
|||
|
m_fScaleZ = c_rv3Scale.z;
|
|||
|
|
|||
|
m_bSkyMatrixUpdated = true;
|
|||
|
D3DXMatrixScaling(&m_matWorld, m_fScaleX, m_fScaleY, m_fScaleZ);
|
|||
|
}
|
|||
|
|
|||
|
void CSkyBox::SetGradientLevel(BYTE byUpper, BYTE byLower)
|
|||
|
{
|
|||
|
m_ucVirticalGradientLevelUpper = byUpper;
|
|||
|
m_ucVirticalGradientLevelLower = byLower;
|
|||
|
}
|
|||
|
|
|||
|
void CSkyBox::SetFaceTexture( const char* c_szFileName, int iFaceIndex )
|
|||
|
{
|
|||
|
if( iFaceIndex < 0 || iFaceIndex > 5 )
|
|||
|
return;
|
|||
|
|
|||
|
TGraphicImageInstanceMap::iterator itor = m_GraphicImageInstanceMap.find(c_szFileName);
|
|||
|
if (m_GraphicImageInstanceMap.end() != itor)
|
|||
|
return;
|
|||
|
|
|||
|
m_Faces[iFaceIndex].m_strFaceTextureFileName = c_szFileName;
|
|||
|
|
|||
|
CGraphicImageInstance * pGraphicImageInstance = GenerateTexture(c_szFileName);
|
|||
|
m_GraphicImageInstanceMap.insert(TGraphicImageInstanceMap::value_type(c_szFileName, pGraphicImageInstance));
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
void CSkyBox::SetCloudTexture(const char * c_szFileName)
|
|||
|
{
|
|||
|
TGraphicImageInstanceMap::iterator itor = m_GraphicImageInstanceMap.find(c_szFileName);
|
|||
|
if (m_GraphicImageInstanceMap.end() != itor)
|
|||
|
return;
|
|||
|
|
|||
|
m_FaceCloud.m_strfacename = c_szFileName;
|
|||
|
CGraphicImageInstance * pGraphicImageInstance = GenerateTexture(c_szFileName);
|
|||
|
m_GraphicImageInstanceMap.insert(TGraphicImageInstanceMap::value_type(m_FaceCloud.m_strfacename, pGraphicImageInstance));
|
|||
|
|
|||
|
// <20>̰<EFBFBD> <20>Ⱦ<EFBFBD><C8BE>°<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>? [cronan]
|
|||
|
// CGraphicImage * pImage = (CGraphicImage *) CResourceManager::Instance().GetResourcePointer("D:\\Ymir Work\\special/cloudalpha.tga");
|
|||
|
// m_CloudAlphaImageInstance.SetImagePointer(pImage);
|
|||
|
}
|
|||
|
|
|||
|
void CSkyBox::SetCloudScale(const D3DXVECTOR2 & c_rv2CloudScale)
|
|||
|
{
|
|||
|
m_fCloudScaleX = c_rv2CloudScale.x;
|
|||
|
m_fCloudScaleY = c_rv2CloudScale.y;
|
|||
|
|
|||
|
D3DXMatrixScaling(&m_matWorldCloud, m_fCloudScaleX, m_fCloudScaleY, 1.0f);
|
|||
|
}
|
|||
|
|
|||
|
void CSkyBox::SetCloudHeight(float fHeight)
|
|||
|
{
|
|||
|
m_fCloudHeight = fHeight;
|
|||
|
}
|
|||
|
|
|||
|
void CSkyBox::SetCloudTextureScale(const D3DXVECTOR2 & c_rv2CloudTextureScale)
|
|||
|
{
|
|||
|
m_fCloudTextureScaleX = c_rv2CloudTextureScale.x;
|
|||
|
m_fCloudTextureScaleY = c_rv2CloudTextureScale.y;
|
|||
|
|
|||
|
m_matTextureCloud._11 = m_fCloudTextureScaleX;
|
|||
|
m_matTextureCloud._22 = m_fCloudTextureScaleY;
|
|||
|
}
|
|||
|
|
|||
|
void CSkyBox::SetCloudScrollSpeed(const D3DXVECTOR2 & c_rv2CloudScrollSpeed)
|
|||
|
{
|
|||
|
m_fCloudScrollSpeedU = c_rv2CloudScrollSpeed.x;
|
|||
|
m_fCloudScrollSpeedV = c_rv2CloudScrollSpeed.y;
|
|||
|
}
|
|||
|
|
|||
|
void CSkyBox::Unload()
|
|||
|
{
|
|||
|
TGraphicImageInstanceMap::iterator itor = m_GraphicImageInstanceMap.begin();
|
|||
|
|
|||
|
while (itor != m_GraphicImageInstanceMap.end())
|
|||
|
{
|
|||
|
DeleteTexture(itor->second);
|
|||
|
++itor;
|
|||
|
}
|
|||
|
|
|||
|
m_GraphicImageInstanceMap.clear();
|
|||
|
}
|
|||
|
|
|||
|
void CSkyBox::SetSkyObjectQuadVertical(TSkyObjectQuadVector * pSkyObjectQuadVector, const D3DXVECTOR2 * c_pv2QuadPoints)
|
|||
|
{
|
|||
|
TPDTVertex aPDTVertex;
|
|||
|
|
|||
|
DWORD dwIndex = 0;
|
|||
|
|
|||
|
pSkyObjectQuadVector->clear();
|
|||
|
pSkyObjectQuadVector->resize(m_ucVirticalGradientLevelUpper + m_ucVirticalGradientLevelLower);
|
|||
|
|
|||
|
unsigned char ucY;
|
|||
|
for (ucY = 0; ucY < m_ucVirticalGradientLevelUpper; ++ucY)
|
|||
|
{
|
|||
|
CSkyObjectQuad & rSkyObjectQuad = pSkyObjectQuadVector->at(dwIndex++);
|
|||
|
|
|||
|
aPDTVertex.position.x = c_pv2QuadPoints[0].x;
|
|||
|
aPDTVertex.position.y = c_pv2QuadPoints[0].y;
|
|||
|
aPDTVertex.position.z = 1.0f - (float)(ucY + 1)/ (float)(m_ucVirticalGradientLevelUpper);
|
|||
|
aPDTVertex.texCoord.x = 0.0f;
|
|||
|
aPDTVertex.texCoord.y = (float)(ucY + 1)/ (float)(m_ucVirticalGradientLevelUpper) * 0.5f;
|
|||
|
rSkyObjectQuad.SetVertex(0 , aPDTVertex);
|
|||
|
aPDTVertex.position.x = c_pv2QuadPoints[0].x;
|
|||
|
aPDTVertex.position.y = c_pv2QuadPoints[0].y;
|
|||
|
aPDTVertex.position.z = 1.0f - (float)(ucY) / (float)(m_ucVirticalGradientLevelUpper);
|
|||
|
aPDTVertex.texCoord.x = 0.0f;
|
|||
|
aPDTVertex.texCoord.y = (float)(ucY)/ (float)(m_ucVirticalGradientLevelUpper) * 0.5f;
|
|||
|
rSkyObjectQuad.SetVertex(1, aPDTVertex);
|
|||
|
aPDTVertex.position.x = c_pv2QuadPoints[1].x;
|
|||
|
aPDTVertex.position.y = c_pv2QuadPoints[1].y;
|
|||
|
aPDTVertex.position.z = 1.0f - (float)(ucY + 1) / (float)(m_ucVirticalGradientLevelUpper);
|
|||
|
aPDTVertex.texCoord.x = 1.0f;
|
|||
|
aPDTVertex.texCoord.y = (float)(ucY + 1)/ (float)(m_ucVirticalGradientLevelUpper) * 0.5f;
|
|||
|
rSkyObjectQuad.SetVertex(2, aPDTVertex);
|
|||
|
aPDTVertex.position.x = c_pv2QuadPoints[1].x;
|
|||
|
aPDTVertex.position.y = c_pv2QuadPoints[1].y;
|
|||
|
aPDTVertex.position.z = 1.0f - (float)(ucY) / (float)(m_ucVirticalGradientLevelUpper);
|
|||
|
aPDTVertex.texCoord.x = 1.0f;
|
|||
|
aPDTVertex.texCoord.y = (float)(ucY)/ (float)(m_ucVirticalGradientLevelUpper) * 0.5f;
|
|||
|
rSkyObjectQuad.SetVertex(3, aPDTVertex);
|
|||
|
}
|
|||
|
for (ucY = 0; ucY < m_ucVirticalGradientLevelLower; ++ucY)
|
|||
|
{
|
|||
|
CSkyObjectQuad & rSkyObjectQuad = pSkyObjectQuadVector->at(dwIndex++);
|
|||
|
|
|||
|
aPDTVertex.position.x = c_pv2QuadPoints[0].x;
|
|||
|
aPDTVertex.position.y = c_pv2QuadPoints[0].y;
|
|||
|
aPDTVertex.position.z = -(float)(ucY + 1)/ (float)(m_ucVirticalGradientLevelLower);
|
|||
|
aPDTVertex.texCoord.x = 0.0f;
|
|||
|
aPDTVertex.texCoord.y = 0.5f + (float)(ucY + 1)/ (float)(m_ucVirticalGradientLevelUpper) * 0.5f;
|
|||
|
rSkyObjectQuad.SetVertex(0, aPDTVertex);
|
|||
|
aPDTVertex.position.x = c_pv2QuadPoints[0].x;
|
|||
|
aPDTVertex.position.y = c_pv2QuadPoints[0].y;
|
|||
|
aPDTVertex.position.z = -(float)(ucY) / (float)(m_ucVirticalGradientLevelLower);
|
|||
|
aPDTVertex.texCoord.x = 0.0f;
|
|||
|
aPDTVertex.texCoord.y = 0.5f + (float)(ucY)/ (float)(m_ucVirticalGradientLevelUpper) * 0.5f;
|
|||
|
rSkyObjectQuad.SetVertex(1, aPDTVertex);
|
|||
|
aPDTVertex.position.x = c_pv2QuadPoints[1].x;
|
|||
|
aPDTVertex.position.y = c_pv2QuadPoints[1].y;
|
|||
|
aPDTVertex.position.z = -(float)(ucY + 1) / (float)(m_ucVirticalGradientLevelLower);
|
|||
|
aPDTVertex.texCoord.x = 1.0f;
|
|||
|
aPDTVertex.texCoord.y = 0.5f + (float)(ucY + 1)/ (float)(m_ucVirticalGradientLevelUpper) * 0.5f;
|
|||
|
rSkyObjectQuad.SetVertex(2, aPDTVertex);
|
|||
|
aPDTVertex.position.x = c_pv2QuadPoints[1].x;
|
|||
|
aPDTVertex.position.y = c_pv2QuadPoints[1].y;
|
|||
|
aPDTVertex.position.z = -(float)(ucY) / (float)(m_ucVirticalGradientLevelLower);
|
|||
|
aPDTVertex.texCoord.x = 1.0f;
|
|||
|
aPDTVertex.texCoord.y = 0.5f + (float)(ucY)/ (float)(m_ucVirticalGradientLevelUpper) * 0.5f;
|
|||
|
rSkyObjectQuad.SetVertex(3, aPDTVertex);
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
//void CSkyBox::UpdateSkyFaceQuadTransform(D3DXVECTOR3 * c_pv3QuadPoints)
|
|||
|
//{
|
|||
|
// for( int i = 0; i < 4; ++i )
|
|||
|
// {
|
|||
|
// c_pv3QuadPoints[i].x *= m_fScaleX;
|
|||
|
// c_pv3QuadPoints[i].y *= m_fScaleY;
|
|||
|
// c_pv3QuadPoints[i].z *= m_fScaleZ;
|
|||
|
//
|
|||
|
// c_pv3QuadPoints[i] += m_v3Position;
|
|||
|
// }
|
|||
|
//}
|
|||
|
|
|||
|
void CSkyBox::SetSkyObjectQuadHorizon(TSkyObjectQuadVector * pSkyObjectQuadVector, const D3DXVECTOR3 * c_pv3QuadPoints)
|
|||
|
{
|
|||
|
pSkyObjectQuadVector->clear();
|
|||
|
pSkyObjectQuadVector->resize(1);
|
|||
|
CSkyObjectQuad & rSkyObjectQuad = pSkyObjectQuadVector->at(0);
|
|||
|
|
|||
|
TPDTVertex aPDTVertex;
|
|||
|
aPDTVertex.position = c_pv3QuadPoints[0];
|
|||
|
aPDTVertex.texCoord.x = 0.0f;
|
|||
|
aPDTVertex.texCoord.y = 1.0f;
|
|||
|
rSkyObjectQuad.SetVertex(0, aPDTVertex);
|
|||
|
|
|||
|
aPDTVertex.position = c_pv3QuadPoints[1];
|
|||
|
aPDTVertex.texCoord.x = 0.0f;
|
|||
|
aPDTVertex.texCoord.y = 0.0f;
|
|||
|
rSkyObjectQuad.SetVertex(1, aPDTVertex);
|
|||
|
|
|||
|
aPDTVertex.position = c_pv3QuadPoints[2];
|
|||
|
aPDTVertex.texCoord.x = 1.0f;
|
|||
|
aPDTVertex.texCoord.y = 1.0f;
|
|||
|
rSkyObjectQuad.SetVertex(2, aPDTVertex);
|
|||
|
|
|||
|
aPDTVertex.position = c_pv3QuadPoints[3];
|
|||
|
aPDTVertex.texCoord.x = 1.0f;
|
|||
|
aPDTVertex.texCoord.y = 0.0f;
|
|||
|
rSkyObjectQuad.SetVertex(3, aPDTVertex);
|
|||
|
}
|
|||
|
|
|||
|
void CSkyBox::Refresh()
|
|||
|
{
|
|||
|
D3DXVECTOR3 v3QuadPoints[4];
|
|||
|
|
|||
|
if( m_ucRenderMode == CSkyObject::SKY_RENDER_MODE_DEFAULT || m_ucRenderMode == CSkyObject::SKY_RENDER_MODE_DIFFUSE )
|
|||
|
{
|
|||
|
if (m_ucVirticalGradientLevelUpper + m_ucVirticalGradientLevelLower <= 0)
|
|||
|
return;
|
|||
|
|
|||
|
D3DXVECTOR2 v2QuadPoints[2];
|
|||
|
|
|||
|
//// Face 0: FRONT
|
|||
|
v2QuadPoints[0] = D3DXVECTOR2(1.0f, -1.0f);
|
|||
|
v2QuadPoints[1] = D3DXVECTOR2(-1.0f, -1.0f);
|
|||
|
SetSkyObjectQuadVertical(&m_Faces[0].m_SkyObjectQuadVector, v2QuadPoints);
|
|||
|
m_Faces[0].m_strfacename = "front";
|
|||
|
|
|||
|
//// Face 1: BACK
|
|||
|
v2QuadPoints[0] = D3DXVECTOR2(-1.0f, 1.0f);
|
|||
|
v2QuadPoints[1] = D3DXVECTOR2(1.0f, 1.0f);
|
|||
|
SetSkyObjectQuadVertical(&m_Faces[1].m_SkyObjectQuadVector, v2QuadPoints);
|
|||
|
m_Faces[1].m_strfacename = "back";
|
|||
|
|
|||
|
//// Face 2: LEFT
|
|||
|
v2QuadPoints[0] = D3DXVECTOR2(-1.0f, -1.0f);
|
|||
|
v2QuadPoints[1] = D3DXVECTOR2(-1.0f, 1.0f);
|
|||
|
SetSkyObjectQuadVertical(&m_Faces[2].m_SkyObjectQuadVector, v2QuadPoints);
|
|||
|
m_Faces[2].m_strfacename = "left";
|
|||
|
|
|||
|
//// Face 3: RIGHT
|
|||
|
v2QuadPoints[0] = D3DXVECTOR2(1.0f, 1.0f);
|
|||
|
v2QuadPoints[1] = D3DXVECTOR2(1.0f, -1.0f);
|
|||
|
SetSkyObjectQuadVertical(&m_Faces[3].m_SkyObjectQuadVector, v2QuadPoints);
|
|||
|
m_Faces[3].m_strfacename = "right";
|
|||
|
|
|||
|
//// Face 4: TOP
|
|||
|
v3QuadPoints[0] = D3DXVECTOR3(1.0f, 1.0f, 1.0f);
|
|||
|
v3QuadPoints[1] = D3DXVECTOR3(-1.0f, 1.0f, 1.0f);
|
|||
|
v3QuadPoints[2] = D3DXVECTOR3(1.0f, -1.0f, 1.0f);
|
|||
|
v3QuadPoints[3] = D3DXVECTOR3(-1.0f, -1.0f, 1.0f);
|
|||
|
SetSkyObjectQuadHorizon(&m_Faces[4].m_SkyObjectQuadVector, v3QuadPoints);
|
|||
|
m_Faces[4].m_strfacename = "top";
|
|||
|
|
|||
|
//// Face 5: BOTTOM
|
|||
|
v3QuadPoints[0] = D3DXVECTOR3(-1.0f, 1.0f, -1.0f);
|
|||
|
v3QuadPoints[1] = D3DXVECTOR3(1.0f, 1.0f, -1.0f);
|
|||
|
v3QuadPoints[2] = D3DXVECTOR3(-1.0f, -1.0f, -1.0f);
|
|||
|
v3QuadPoints[3] = D3DXVECTOR3(1.0f, -1.0f, -1.0f);
|
|||
|
SetSkyObjectQuadHorizon(&m_Faces[5].m_SkyObjectQuadVector, v3QuadPoints);
|
|||
|
m_Faces[5].m_strfacename = "bottom";
|
|||
|
|
|||
|
}
|
|||
|
else if( m_ucRenderMode == CSkyObject::SKY_RENDER_MODE_TEXTURE )
|
|||
|
{
|
|||
|
// Face 0: FRONT
|
|||
|
v3QuadPoints[0] = D3DXVECTOR3(1.0f, -1.0f, -1.0f);
|
|||
|
v3QuadPoints[1] = D3DXVECTOR3(1.0f, -1.0f, 1.0f);
|
|||
|
v3QuadPoints[2] = D3DXVECTOR3(-1.0f, -1.0f, -1.0f);
|
|||
|
v3QuadPoints[3] = D3DXVECTOR3(-1.0f, -1.0f, 1.0f);
|
|||
|
|
|||
|
//UpdateSkyFaceQuadTransform(v3QuadPoints);
|
|||
|
|
|||
|
SetSkyObjectQuadHorizon(&m_Faces[0].m_SkyObjectQuadVector, v3QuadPoints);
|
|||
|
m_Faces[0].m_strfacename = "front";
|
|||
|
|
|||
|
//// Face 1: BACK
|
|||
|
v3QuadPoints[0] = D3DXVECTOR3(-1.0f, 1.0f, -1.0f);
|
|||
|
v3QuadPoints[1] = D3DXVECTOR3(-1.0f, 1.0f, 1.0f);
|
|||
|
v3QuadPoints[2] = D3DXVECTOR3(1.0f, 1.0f, -1.0f);
|
|||
|
v3QuadPoints[3] = D3DXVECTOR3(1.0f, 1.0f, 1.0f);
|
|||
|
|
|||
|
//UpdateSkyFaceQuadTransform(v3QuadPoints);
|
|||
|
|
|||
|
SetSkyObjectQuadHorizon(&m_Faces[1].m_SkyObjectQuadVector, v3QuadPoints);
|
|||
|
m_Faces[1].m_strfacename = "back";
|
|||
|
|
|||
|
// Face 2: LEFT
|
|||
|
v3QuadPoints[0] = D3DXVECTOR3(1.0f, 1.0f, -1.0f);
|
|||
|
v3QuadPoints[1] = D3DXVECTOR3(1.0f, 1.0f, 1.0f);
|
|||
|
v3QuadPoints[2] = D3DXVECTOR3(1.0f, -1.0f, -1.0f);
|
|||
|
v3QuadPoints[3] = D3DXVECTOR3(1.0f, -1.0f, 1.0f);
|
|||
|
|
|||
|
//UpdateSkyFaceQuadTransform(v3QuadPoints);
|
|||
|
|
|||
|
SetSkyObjectQuadHorizon(&m_Faces[2].m_SkyObjectQuadVector, v3QuadPoints);
|
|||
|
m_Faces[2].m_strfacename = "left";
|
|||
|
|
|||
|
// Face 3: RIGHT
|
|||
|
v3QuadPoints[0] = D3DXVECTOR3(-1.0f, -1.0f, -1.0f);
|
|||
|
v3QuadPoints[1] = D3DXVECTOR3(-1.0f, -1.0f, 1.0f);
|
|||
|
v3QuadPoints[2] = D3DXVECTOR3(-1.0f, 1.0f, -1.0f);
|
|||
|
v3QuadPoints[3] = D3DXVECTOR3(-1.0f, 1.0f, 1.0f);
|
|||
|
|
|||
|
//UpdateSkyFaceQuadTransform(v3QuadPoints);
|
|||
|
|
|||
|
SetSkyObjectQuadHorizon(&m_Faces[3].m_SkyObjectQuadVector, v3QuadPoints);
|
|||
|
m_Faces[3].m_strfacename = "right";
|
|||
|
|
|||
|
// Face 4: TOP
|
|||
|
v3QuadPoints[0] = D3DXVECTOR3(1.0f, -1.0f, 1.0f);
|
|||
|
v3QuadPoints[1] = D3DXVECTOR3(1.0f, 1.0f, 1.0f);
|
|||
|
v3QuadPoints[2] = D3DXVECTOR3(-1.0f, -1.0f, 1.0f);
|
|||
|
v3QuadPoints[3] = D3DXVECTOR3(-1.0f, 1.0f, 1.0f);
|
|||
|
|
|||
|
//UpdateSkyFaceQuadTransform(v3QuadPoints);
|
|||
|
|
|||
|
SetSkyObjectQuadHorizon(&m_Faces[4].m_SkyObjectQuadVector, v3QuadPoints);
|
|||
|
m_Faces[4].m_strfacename = "top";
|
|||
|
|
|||
|
////// Face 5: BOTTOM
|
|||
|
v3QuadPoints[0] = D3DXVECTOR3(1.0f, -1.0f, -1.0f);
|
|||
|
v3QuadPoints[1] = D3DXVECTOR3(1.0f, 1.0f, -1.0f);
|
|||
|
v3QuadPoints[2] = D3DXVECTOR3(-1.0f, -1.0f, -1.0f);
|
|||
|
v3QuadPoints[3] = D3DXVECTOR3(-1.0f, 1.0f, -1.0f);
|
|||
|
|
|||
|
//UpdateSkyFaceQuadTransform(v3QuadPoints);
|
|||
|
|
|||
|
SetSkyObjectQuadHorizon(&m_Faces[5].m_SkyObjectQuadVector, v3QuadPoints);
|
|||
|
m_Faces[5].m_strfacename = "bottom";
|
|||
|
}
|
|||
|
|
|||
|
//// Clouds..
|
|||
|
v3QuadPoints[0] = D3DXVECTOR3(1.0f, 1.0f, 0.0f);
|
|||
|
v3QuadPoints[1] = D3DXVECTOR3(-1.0f, 1.0f, 0.0f);
|
|||
|
v3QuadPoints[2] = D3DXVECTOR3(1.0f, -1.0f, 0.0f);
|
|||
|
v3QuadPoints[3] = D3DXVECTOR3(-1.0f, -1.0f, 0.0f);
|
|||
|
SetSkyObjectQuadHorizon(&m_FaceCloud.m_SkyObjectQuadVector, v3QuadPoints);
|
|||
|
}
|
|||
|
|
|||
|
void CSkyBox::SetCloudColor(const TGradientColor & c_rColor, const TGradientColor & c_rNextColor, const DWORD & dwTransitionTime)
|
|||
|
{
|
|||
|
TSkyObjectFace & aFaceCloud = m_FaceCloud;
|
|||
|
for (DWORD dwk = 0; dwk < aFaceCloud.m_SkyObjectQuadVector.size(); ++dwk)
|
|||
|
{
|
|||
|
CSkyObjectQuad & aSkyObjectQuad = aFaceCloud.m_SkyObjectQuadVector[dwk];
|
|||
|
|
|||
|
aSkyObjectQuad.SetSrcColor(0,
|
|||
|
c_rColor.m_FirstColor.r,
|
|||
|
c_rColor.m_FirstColor.g,
|
|||
|
c_rColor.m_FirstColor.b,
|
|||
|
c_rColor.m_FirstColor.a);
|
|||
|
aSkyObjectQuad.SetTransition(0,
|
|||
|
c_rNextColor.m_FirstColor.r,
|
|||
|
c_rNextColor.m_FirstColor.g,
|
|||
|
c_rNextColor.m_FirstColor.b,
|
|||
|
c_rNextColor.m_FirstColor.a,
|
|||
|
dwTransitionTime);
|
|||
|
aSkyObjectQuad.SetSrcColor(1,
|
|||
|
c_rColor.m_FirstColor.r,
|
|||
|
c_rColor.m_FirstColor.g,
|
|||
|
c_rColor.m_FirstColor.b,
|
|||
|
c_rColor.m_FirstColor.a);
|
|||
|
aSkyObjectQuad.SetTransition(1,
|
|||
|
c_rNextColor.m_FirstColor.r,
|
|||
|
c_rNextColor.m_FirstColor.g,
|
|||
|
c_rNextColor.m_FirstColor.b,
|
|||
|
c_rNextColor.m_FirstColor.a,
|
|||
|
dwTransitionTime);
|
|||
|
aSkyObjectQuad.SetSrcColor(2,
|
|||
|
c_rColor.m_FirstColor.r,
|
|||
|
c_rColor.m_FirstColor.g,
|
|||
|
c_rColor.m_FirstColor.b,
|
|||
|
c_rColor.m_FirstColor.a);
|
|||
|
aSkyObjectQuad.SetTransition(2,
|
|||
|
c_rNextColor.m_FirstColor.r,
|
|||
|
c_rNextColor.m_FirstColor.g,
|
|||
|
c_rNextColor.m_FirstColor.b,
|
|||
|
c_rNextColor.m_FirstColor.a,
|
|||
|
dwTransitionTime);
|
|||
|
aSkyObjectQuad.SetSrcColor(3,
|
|||
|
c_rColor.m_FirstColor.r,
|
|||
|
c_rColor.m_FirstColor.g,
|
|||
|
c_rColor.m_FirstColor.b,
|
|||
|
c_rColor.m_FirstColor.a);
|
|||
|
aSkyObjectQuad.SetTransition(3,
|
|||
|
c_rNextColor.m_FirstColor.r,
|
|||
|
c_rNextColor.m_FirstColor.g,
|
|||
|
c_rNextColor.m_FirstColor.b,
|
|||
|
c_rNextColor.m_FirstColor.a,
|
|||
|
dwTransitionTime);
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
void CSkyBox::SetSkyColor(const TVectorGradientColor & c_rColorVector, const TVectorGradientColor & c_rNextColorVector, long lTransitionTime)
|
|||
|
{
|
|||
|
unsigned long ulVectorGradientColornum = 0;
|
|||
|
unsigned long uck;
|
|||
|
for (unsigned char ucj = 0; ucj < 4; ++ucj)
|
|||
|
{
|
|||
|
TSkyObjectFace & aFace = m_Faces[ucj];
|
|||
|
ulVectorGradientColornum = 0;
|
|||
|
for (uck = 0; uck < aFace.m_SkyObjectQuadVector.size(); ++uck)
|
|||
|
{
|
|||
|
CSkyObjectQuad & aSkyObjectQuad = aFace.m_SkyObjectQuadVector[uck];
|
|||
|
|
|||
|
aSkyObjectQuad.SetSrcColor(0,
|
|||
|
c_rColorVector[ulVectorGradientColornum].m_SecondColor.r,
|
|||
|
c_rColorVector[ulVectorGradientColornum].m_SecondColor.g,
|
|||
|
c_rColorVector[ulVectorGradientColornum].m_SecondColor.b,
|
|||
|
c_rColorVector[ulVectorGradientColornum].m_SecondColor.a);
|
|||
|
aSkyObjectQuad.SetTransition(0,
|
|||
|
c_rNextColorVector[ulVectorGradientColornum].m_SecondColor.r,
|
|||
|
c_rNextColorVector[ulVectorGradientColornum].m_SecondColor.g,
|
|||
|
c_rNextColorVector[ulVectorGradientColornum].m_SecondColor.b,
|
|||
|
c_rNextColorVector[ulVectorGradientColornum].m_SecondColor.a,
|
|||
|
lTransitionTime);
|
|||
|
aSkyObjectQuad.SetSrcColor(1,
|
|||
|
c_rColorVector[ulVectorGradientColornum].m_FirstColor.r,
|
|||
|
c_rColorVector[ulVectorGradientColornum].m_FirstColor.g,
|
|||
|
c_rColorVector[ulVectorGradientColornum].m_FirstColor.b,
|
|||
|
c_rColorVector[ulVectorGradientColornum].m_FirstColor.a);
|
|||
|
aSkyObjectQuad.SetTransition(1,
|
|||
|
c_rNextColorVector[ulVectorGradientColornum].m_FirstColor.r,
|
|||
|
c_rNextColorVector[ulVectorGradientColornum].m_FirstColor.g,
|
|||
|
c_rNextColorVector[ulVectorGradientColornum].m_FirstColor.b,
|
|||
|
c_rNextColorVector[ulVectorGradientColornum].m_FirstColor.a,
|
|||
|
lTransitionTime);
|
|||
|
aSkyObjectQuad.SetSrcColor(2,
|
|||
|
c_rColorVector[ulVectorGradientColornum].m_SecondColor.r,
|
|||
|
c_rColorVector[ulVectorGradientColornum].m_SecondColor.g,
|
|||
|
c_rColorVector[ulVectorGradientColornum].m_SecondColor.b,
|
|||
|
c_rColorVector[ulVectorGradientColornum].m_SecondColor.a);
|
|||
|
aSkyObjectQuad.SetTransition(2,
|
|||
|
c_rNextColorVector[ulVectorGradientColornum].m_SecondColor.r,
|
|||
|
c_rNextColorVector[ulVectorGradientColornum].m_SecondColor.g,
|
|||
|
c_rNextColorVector[ulVectorGradientColornum].m_SecondColor.b,
|
|||
|
c_rNextColorVector[ulVectorGradientColornum].m_SecondColor.a,
|
|||
|
lTransitionTime);
|
|||
|
aSkyObjectQuad.SetSrcColor(3,
|
|||
|
c_rColorVector[ulVectorGradientColornum].m_FirstColor.r,
|
|||
|
c_rColorVector[ulVectorGradientColornum].m_FirstColor.g,
|
|||
|
c_rColorVector[ulVectorGradientColornum].m_FirstColor.b,
|
|||
|
c_rColorVector[ulVectorGradientColornum].m_FirstColor.a);
|
|||
|
aSkyObjectQuad.SetTransition(3,
|
|||
|
c_rNextColorVector[ulVectorGradientColornum].m_FirstColor.r,
|
|||
|
c_rNextColorVector[ulVectorGradientColornum].m_FirstColor.g,
|
|||
|
c_rNextColorVector[ulVectorGradientColornum].m_FirstColor.b,
|
|||
|
c_rNextColorVector[ulVectorGradientColornum].m_FirstColor.a,
|
|||
|
lTransitionTime);
|
|||
|
|
|||
|
ulVectorGradientColornum++;
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
/////
|
|||
|
|
|||
|
TSkyObjectFace & aFaceTop = m_Faces[4];
|
|||
|
ulVectorGradientColornum = 0;
|
|||
|
for (uck = 0; uck < aFaceTop.m_SkyObjectQuadVector.size(); ++uck)
|
|||
|
{
|
|||
|
CSkyObjectQuad & aSkyObjectQuad = aFaceTop.m_SkyObjectQuadVector[uck];
|
|||
|
|
|||
|
aSkyObjectQuad.SetSrcColor(0,
|
|||
|
c_rColorVector[ulVectorGradientColornum].m_FirstColor.r,
|
|||
|
c_rColorVector[ulVectorGradientColornum].m_FirstColor.g,
|
|||
|
c_rColorVector[ulVectorGradientColornum].m_FirstColor.b,
|
|||
|
c_rColorVector[ulVectorGradientColornum].m_FirstColor.a);
|
|||
|
aSkyObjectQuad.SetTransition(0,
|
|||
|
c_rNextColorVector[ulVectorGradientColornum].m_FirstColor.r,
|
|||
|
c_rNextColorVector[ulVectorGradientColornum].m_FirstColor.g,
|
|||
|
c_rNextColorVector[ulVectorGradientColornum].m_FirstColor.b,
|
|||
|
c_rNextColorVector[ulVectorGradientColornum].m_FirstColor.a,
|
|||
|
lTransitionTime);
|
|||
|
aSkyObjectQuad.SetSrcColor(1,
|
|||
|
c_rColorVector[ulVectorGradientColornum].m_FirstColor.r,
|
|||
|
c_rColorVector[ulVectorGradientColornum].m_FirstColor.g,
|
|||
|
c_rColorVector[ulVectorGradientColornum].m_FirstColor.b,
|
|||
|
c_rColorVector[ulVectorGradientColornum].m_FirstColor.a);
|
|||
|
aSkyObjectQuad.SetTransition(1,
|
|||
|
c_rNextColorVector[ulVectorGradientColornum].m_FirstColor.r,
|
|||
|
c_rNextColorVector[ulVectorGradientColornum].m_FirstColor.g,
|
|||
|
c_rNextColorVector[ulVectorGradientColornum].m_FirstColor.b,
|
|||
|
c_rNextColorVector[ulVectorGradientColornum].m_FirstColor.a,
|
|||
|
lTransitionTime);
|
|||
|
aSkyObjectQuad.SetSrcColor(2,
|
|||
|
c_rColorVector[ulVectorGradientColornum].m_FirstColor.r,
|
|||
|
c_rColorVector[ulVectorGradientColornum].m_FirstColor.g,
|
|||
|
c_rColorVector[ulVectorGradientColornum].m_FirstColor.b,
|
|||
|
c_rColorVector[ulVectorGradientColornum].m_FirstColor.a);
|
|||
|
aSkyObjectQuad.SetTransition(2,
|
|||
|
c_rNextColorVector[ulVectorGradientColornum].m_FirstColor.r,
|
|||
|
c_rNextColorVector[ulVectorGradientColornum].m_FirstColor.g,
|
|||
|
c_rNextColorVector[ulVectorGradientColornum].m_FirstColor.b,
|
|||
|
c_rNextColorVector[ulVectorGradientColornum].m_FirstColor.a,
|
|||
|
lTransitionTime);
|
|||
|
aSkyObjectQuad.SetSrcColor(3,
|
|||
|
c_rColorVector[ulVectorGradientColornum].m_FirstColor.r,
|
|||
|
c_rColorVector[ulVectorGradientColornum].m_FirstColor.g,
|
|||
|
c_rColorVector[ulVectorGradientColornum].m_FirstColor.b,
|
|||
|
c_rColorVector[ulVectorGradientColornum].m_FirstColor.a);
|
|||
|
aSkyObjectQuad.SetTransition(3,
|
|||
|
c_rNextColorVector[ulVectorGradientColornum].m_FirstColor.r,
|
|||
|
c_rNextColorVector[ulVectorGradientColornum].m_FirstColor.g,
|
|||
|
c_rNextColorVector[ulVectorGradientColornum].m_FirstColor.b,
|
|||
|
c_rNextColorVector[ulVectorGradientColornum].m_FirstColor.a,
|
|||
|
lTransitionTime);
|
|||
|
}
|
|||
|
TSkyObjectFace & aFaceBottom = m_Faces[5];
|
|||
|
ulVectorGradientColornum = c_rColorVector.size() - 1;
|
|||
|
for (uck = 0; uck < aFaceBottom.m_SkyObjectQuadVector.size(); ++uck)
|
|||
|
{
|
|||
|
CSkyObjectQuad & aSkyObjectQuad = aFaceBottom.m_SkyObjectQuadVector[uck];
|
|||
|
|
|||
|
aSkyObjectQuad.SetSrcColor(0,
|
|||
|
c_rColorVector[ulVectorGradientColornum].m_SecondColor.r,
|
|||
|
c_rColorVector[ulVectorGradientColornum].m_SecondColor.g,
|
|||
|
c_rColorVector[ulVectorGradientColornum].m_SecondColor.b,
|
|||
|
c_rColorVector[ulVectorGradientColornum].m_SecondColor.a);
|
|||
|
aSkyObjectQuad.SetTransition(0,
|
|||
|
c_rNextColorVector[ulVectorGradientColornum].m_SecondColor.r,
|
|||
|
c_rNextColorVector[ulVectorGradientColornum].m_SecondColor.g,
|
|||
|
c_rNextColorVector[ulVectorGradientColornum].m_SecondColor.b,
|
|||
|
c_rNextColorVector[ulVectorGradientColornum].m_SecondColor.a,
|
|||
|
lTransitionTime);
|
|||
|
aSkyObjectQuad.SetSrcColor(1,
|
|||
|
c_rColorVector[ulVectorGradientColornum].m_SecondColor.r,
|
|||
|
c_rColorVector[ulVectorGradientColornum].m_SecondColor.g,
|
|||
|
c_rColorVector[ulVectorGradientColornum].m_SecondColor.b,
|
|||
|
c_rColorVector[ulVectorGradientColornum].m_SecondColor.a);
|
|||
|
aSkyObjectQuad.SetTransition(1,
|
|||
|
c_rNextColorVector[ulVectorGradientColornum].m_SecondColor.r,
|
|||
|
c_rNextColorVector[ulVectorGradientColornum].m_SecondColor.g,
|
|||
|
c_rNextColorVector[ulVectorGradientColornum].m_SecondColor.b,
|
|||
|
c_rNextColorVector[ulVectorGradientColornum].m_SecondColor.a,
|
|||
|
lTransitionTime);
|
|||
|
aSkyObjectQuad.SetSrcColor(2,
|
|||
|
c_rColorVector[ulVectorGradientColornum].m_SecondColor.r,
|
|||
|
c_rColorVector[ulVectorGradientColornum].m_SecondColor.g,
|
|||
|
c_rColorVector[ulVectorGradientColornum].m_SecondColor.b,
|
|||
|
c_rColorVector[ulVectorGradientColornum].m_SecondColor.a);
|
|||
|
aSkyObjectQuad.SetTransition(2,
|
|||
|
c_rNextColorVector[ulVectorGradientColornum].m_SecondColor.r,
|
|||
|
c_rNextColorVector[ulVectorGradientColornum].m_SecondColor.g,
|
|||
|
c_rNextColorVector[ulVectorGradientColornum].m_SecondColor.b,
|
|||
|
c_rNextColorVector[ulVectorGradientColornum].m_SecondColor.a,
|
|||
|
lTransitionTime);
|
|||
|
aSkyObjectQuad.SetSrcColor(3,
|
|||
|
c_rColorVector[ulVectorGradientColornum].m_SecondColor.r,
|
|||
|
c_rColorVector[ulVectorGradientColornum].m_SecondColor.g,
|
|||
|
c_rColorVector[ulVectorGradientColornum].m_SecondColor.b,
|
|||
|
c_rColorVector[ulVectorGradientColornum].m_SecondColor.a);
|
|||
|
aSkyObjectQuad.SetTransition(3,
|
|||
|
c_rNextColorVector[ulVectorGradientColornum].m_SecondColor.r,
|
|||
|
c_rNextColorVector[ulVectorGradientColornum].m_SecondColor.g,
|
|||
|
c_rNextColorVector[ulVectorGradientColornum].m_SecondColor.b,
|
|||
|
c_rNextColorVector[ulVectorGradientColornum].m_SecondColor.a,
|
|||
|
lTransitionTime);
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
void CSkyBox::StartTransition()
|
|||
|
{
|
|||
|
m_bTransitionStarted = true;
|
|||
|
for (unsigned char ucj = 0; ucj < 6; ++ucj)
|
|||
|
m_Faces[ucj].StartTransition();
|
|||
|
m_FaceCloud.StartTransition();
|
|||
|
}
|
|||
|
|
|||
|
void CSkyBox::Update()
|
|||
|
{
|
|||
|
CSkyObject::Update();
|
|||
|
|
|||
|
if (!m_bTransitionStarted)
|
|||
|
return;
|
|||
|
|
|||
|
bool bResult = false;
|
|||
|
for (unsigned char uci = 0; uci < 6; ++uci)
|
|||
|
bResult = m_Faces[uci].Update() || bResult;
|
|||
|
bResult = m_FaceCloud.Update() || bResult;
|
|||
|
|
|||
|
m_bTransitionStarted = bResult;
|
|||
|
}
|
|||
|
|
|||
|
void CSkyBox::Render()
|
|||
|
{
|
|||
|
// 2004.01.25 myevan ó<><C3B3><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>Ĺ<EFBFBD><C4B9><EFBFBD><EFBFBD><EFBFBD> <20>ű<EFBFBD><C5B1><EFBFBD>, DepthTest ó<><C3B3>
|
|||
|
STATEMANAGER.SaveRenderState(D3DRS_ZENABLE, TRUE);
|
|||
|
STATEMANAGER.SaveRenderState(D3DRS_ZWRITEENABLE, FALSE);
|
|||
|
STATEMANAGER.SaveRenderState(D3DRS_LIGHTING, FALSE);
|
|||
|
STATEMANAGER.SaveRenderState(D3DRS_FOGENABLE, FALSE);
|
|||
|
STATEMANAGER.SaveRenderState(D3DRS_ALPHABLENDENABLE, FALSE);
|
|||
|
|
|||
|
STATEMANAGER.SaveTextureStageState(0, D3DTSS_COLOROP, D3DTOP_SELECTARG2);
|
|||
|
STATEMANAGER.SaveTextureStageState(0, D3DTSS_COLORARG1, D3DTA_TEXTURE);
|
|||
|
STATEMANAGER.SaveTextureStageState(0, D3DTSS_COLORARG2, D3DTA_DIFFUSE);
|
|||
|
|
|||
|
STATEMANAGER.SetTextureStageState(0, D3DTSS_ALPHAOP, D3DTOP_DISABLE);
|
|||
|
|
|||
|
STATEMANAGER.SetTexture(1, NULL);
|
|||
|
STATEMANAGER.SetTextureStageState(1, D3DTSS_COLOROP, D3DTOP_DISABLE);
|
|||
|
STATEMANAGER.SetTextureStageState(1, D3DTSS_ALPHAOP, D3DTOP_DISABLE);
|
|||
|
|
|||
|
STATEMANAGER.SetVertexShader(D3DFVF_XYZ|D3DFVF_DIFFUSE|D3DFVF_TEX1);
|
|||
|
|
|||
|
STATEMANAGER.SetTransform(D3DTS_WORLD, &m_matWorld);
|
|||
|
|
|||
|
//Render Face
|
|||
|
if( m_ucRenderMode == CSkyObject::SKY_RENDER_MODE_TEXTURE )
|
|||
|
{
|
|||
|
STATEMANAGER.SetTextureStageState(0, D3DTSS_COLOROP, D3DTOP_SELECTARG1);
|
|||
|
STATEMANAGER.SaveTextureStageState(0, D3DTSS_ADDRESSU, D3DTADDRESS_CLAMP);
|
|||
|
STATEMANAGER.SaveTextureStageState(0, D3DTSS_ADDRESSV, D3DTADDRESS_CLAMP);
|
|||
|
|
|||
|
for (unsigned int i = 0; i < 6; ++i)
|
|||
|
{
|
|||
|
CGraphicImageInstance * pFaceImageInstance = m_GraphicImageInstanceMap[m_Faces[i].m_strFaceTextureFileName];
|
|||
|
if (!pFaceImageInstance)
|
|||
|
break;
|
|||
|
|
|||
|
STATEMANAGER.SetTexture( 0, pFaceImageInstance->GetTextureReference().GetD3DTexture() );
|
|||
|
|
|||
|
m_Faces[i].Render();
|
|||
|
}
|
|||
|
|
|||
|
//STATEMANAGER.SetTexture( 0, NULL );
|
|||
|
|
|||
|
STATEMANAGER.RestoreTextureStageState(0, D3DTSS_ADDRESSU);
|
|||
|
STATEMANAGER.RestoreTextureStageState(0, D3DTSS_ADDRESSV);
|
|||
|
}
|
|||
|
else
|
|||
|
{
|
|||
|
for (unsigned int i = 0; i < 6; ++i)
|
|||
|
{
|
|||
|
m_Faces[i].Render();
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
STATEMANAGER.RestoreRenderState(D3DRS_LIGHTING);
|
|||
|
STATEMANAGER.RestoreRenderState(D3DRS_ZENABLE);
|
|||
|
STATEMANAGER.RestoreRenderState(D3DRS_ZWRITEENABLE);
|
|||
|
STATEMANAGER.RestoreRenderState(D3DRS_FOGENABLE);
|
|||
|
STATEMANAGER.RestoreRenderState(D3DRS_ALPHABLENDENABLE);
|
|||
|
|
|||
|
STATEMANAGER.RestoreTextureStageState(0, D3DTSS_COLOROP);
|
|||
|
STATEMANAGER.RestoreTextureStageState(0, D3DTSS_COLORARG1);
|
|||
|
STATEMANAGER.RestoreTextureStageState(0, D3DTSS_COLORARG2);
|
|||
|
}
|
|||
|
|
|||
|
void CSkyBox::RenderCloud()
|
|||
|
{
|
|||
|
CGraphicImageInstance * pCloudGraphicImageInstance = m_GraphicImageInstanceMap[m_FaceCloud.m_strfacename];
|
|||
|
if (!pCloudGraphicImageInstance)
|
|||
|
return;
|
|||
|
|
|||
|
// 2004.01.25 myevan ó<><C3B3><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>Ĺ<EFBFBD><C4B9><EFBFBD><EFBFBD><EFBFBD> <20>ű<EFBFBD><C5B1><EFBFBD>, DepthTest ó<><C3B3>
|
|||
|
STATEMANAGER.SaveRenderState(D3DRS_ZENABLE, TRUE);
|
|||
|
STATEMANAGER.SaveRenderState(D3DRS_ZWRITEENABLE, FALSE);
|
|||
|
STATEMANAGER.SaveRenderState(D3DRS_LIGHTING, FALSE);
|
|||
|
STATEMANAGER.SaveRenderState(D3DRS_FOGENABLE, FALSE);
|
|||
|
STATEMANAGER.SaveRenderState(D3DRS_ALPHABLENDENABLE, TRUE);
|
|||
|
STATEMANAGER.SaveRenderState(D3DRS_SRCBLEND, D3DBLEND_ONE);
|
|||
|
STATEMANAGER.SaveRenderState(D3DRS_DESTBLEND, D3DBLEND_INVSRCCOLOR);
|
|||
|
|
|||
|
STATEMANAGER.SaveTextureStageState(0, D3DTSS_TEXTURETRANSFORMFLAGS, D3DTTFF_COUNT2);
|
|||
|
|
|||
|
m_matTextureCloud._31 = m_fCloudPositionU;
|
|||
|
m_matTextureCloud._32 = m_fCloudPositionV;
|
|||
|
|
|||
|
DWORD dwCurTime = CTimer::Instance().GetCurrentMillisecond();
|
|||
|
|
|||
|
m_fCloudPositionU += m_fCloudScrollSpeedU * (float)( dwCurTime - m_dwlastTime ) * 0.001f;
|
|||
|
if (m_fCloudPositionU >= 1.0f)
|
|||
|
m_fCloudPositionU = 0.0f;
|
|||
|
|
|||
|
m_fCloudPositionV += m_fCloudScrollSpeedV * (float)( dwCurTime - m_dwlastTime ) * 0.001f;
|
|||
|
if (m_fCloudPositionV >= 1.0f)
|
|||
|
m_fCloudPositionV = 0.0f;
|
|||
|
|
|||
|
m_dwlastTime = dwCurTime;
|
|||
|
|
|||
|
STATEMANAGER.SaveTransform(D3DTS_TEXTURE0, &m_matTextureCloud);
|
|||
|
|
|||
|
STATEMANAGER.SetTextureStageState(0, D3DTSS_COLOROP, D3DTOP_MODULATEINVALPHA_ADDCOLOR);
|
|||
|
STATEMANAGER.SetTextureStageState(0, D3DTSS_COLORARG1, D3DTA_TEXTURE);
|
|||
|
STATEMANAGER.SetTextureStageState(0, D3DTSS_COLORARG2, D3DTA_DIFFUSE);
|
|||
|
STATEMANAGER.SetTextureStageState(0, D3DTSS_ALPHAOP, D3DTOP_SELECTARG1);
|
|||
|
STATEMANAGER.SetTextureStageState(0, D3DTSS_ALPHAARG1, D3DTA_TEXTURE);
|
|||
|
|
|||
|
D3DXMATRIX matProjCloud;
|
|||
|
D3DXMatrixPerspectiveFovRH(&matProjCloud, D3DX_PI * 0.25f, 1.33333f, 50.0f, 999999.0f);
|
|||
|
STATEMANAGER.SetTransform(D3DTS_WORLD, &m_matWorldCloud);
|
|||
|
STATEMANAGER.SaveTransform(D3DTS_PROJECTION, &matProjCloud);
|
|||
|
STATEMANAGER.SetTexture(0, pCloudGraphicImageInstance->GetTexturePointer()->GetD3DTexture());
|
|||
|
m_FaceCloud.Render();
|
|||
|
STATEMANAGER.RestoreTransform(D3DTS_PROJECTION);
|
|||
|
|
|||
|
STATEMANAGER.RestoreTransform(D3DTS_TEXTURE0);
|
|||
|
STATEMANAGER.RestoreTextureStageState(0, D3DTSS_TEXTURETRANSFORMFLAGS);
|
|||
|
|
|||
|
STATEMANAGER.RestoreRenderState(D3DRS_LIGHTING);
|
|||
|
STATEMANAGER.RestoreRenderState(D3DRS_ZENABLE);
|
|||
|
STATEMANAGER.RestoreRenderState(D3DRS_ZWRITEENABLE);
|
|||
|
STATEMANAGER.RestoreRenderState(D3DRS_FOGENABLE);
|
|||
|
STATEMANAGER.RestoreRenderState(D3DRS_ALPHABLENDENABLE);
|
|||
|
STATEMANAGER.RestoreRenderState(D3DRS_SRCBLEND);
|
|||
|
STATEMANAGER.RestoreRenderState(D3DRS_DESTBLEND);
|
|||
|
}
|