topical media & game development
graphic-directx-game-22-ProjTex-Sky.cpp / cpp
//=============================================================================
// Sky.cpp by Frank Luna (C) 2004 All Rights Reserved.
//=============================================================================
include <Sky.h>
include <Camera.h>
include <d3dUtil.h>
Sky::Sky(const std::string& envmapFilename, float skyRadius)
: mRadius(skyRadius)
{
HR(D3DXCreateSphere(gd3dDevice, skyRadius, 30, 30, &mSphere, 0));
HR(D3DXCreateCubeTextureFromFile(gd3dDevice, envmapFilename.c_str(), &mEnvMap));
ID3DXBuffer* errors = 0;
HR(D3DXCreateEffectFromFile(gd3dDevice, "sky.fx", 0, 0, 0,
0, &mFX, &errors));
if( errors )
MessageBox(0, (char*)errors->GetBufferPointer(), 0, 0);
mhTech = mFX->GetTechniqueByName("SkyTech");
mhWVP = mFX->GetParameterByName(0, "gWVP");
mhEnvMap = mFX->GetParameterByName(0, "gEnvMap");
// Set effect parameters that do not vary.
HR(mFX->SetTechnique(mhTech));
HR(mFX->SetTexture(mhEnvMap, mEnvMap));
}
Sky::~Sky()
{
ReleaseCOM(mSphere);
ReleaseCOM(mEnvMap);
ReleaseCOM(mFX);
}
DWORD Sky::getNumTriangles()
{
return mSphere->GetNumFaces();
}
DWORD Sky::getNumVertices()
{
return mSphere->GetNumVertices();
}
IDirect3DCubeTexture9* Sky::getEnvMap()
{
return mEnvMap;
}
float Sky::getRadius()
{
return mRadius;
}
void Sky::onLostDevice()
{
HR(mFX->OnLostDevice());
}
void Sky::onResetDevice()
{
HR(mFX->OnResetDevice());
}
void Sky::draw()
{
// Sky always centered about camera's position.
D3DXMATRIX W;
D3DXVECTOR3 p = gCamera->pos();
D3DXMatrixTranslation(&W, p.x, p.y, p.z);
HR(mFX->SetMatrix(mhWVP, &(W*gCamera->viewProj())));
UINT numPasses = 0;
HR(mFX->Begin(&numPasses, 0));
HR(mFX->BeginPass(0));
HR(mSphere->DrawSubset(0));
HR(mFX->EndPass());
HR(mFX->End());
}
(C) Æliens
20/2/2008
You may not copy or print any of this material without explicit permission of the author or the publisher.
In case of other copyright issues, contact the author.