/
Sky.cpp
77 lines (64 loc) · 1.54 KB
/
Sky.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
#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->getPosition();
D3DXMatrixTranslation(&W, p.x, p.y, p.z);
HR(mFX->SetMatrix(mhWVP, &(W*gCamera->getViewMatrix()*gCamera->getProjectionMatrix())));
UINT numPasses = 0;
HR(mFX->Begin(&numPasses, 0));
HR(mFX->BeginPass(0));
HR(mSphere->DrawSubset(0));
HR(mFX->EndPass());
HR(mFX->End());
}