📄 skybox.cpp
字号:
#include "skybox.h"
//#include "Camera.h"
void BoxVertex::SetVertex( float fx, float fy, float fz, float ftu, float ftv )
{
x = fx;
y = fy;
z = fz;
tu = ftu;
tv = ftv;
}
CSkyBox::CSkyBox( void ) :
m_fDistance( 300.f ),
m_pBoxVB( NULL )
{
}
CSkyBox::~CSkyBox( void )
{
SAFE_RELEASE( m_pBoxVB );
for ( int i = 0; i < 6; ++i )
{
SAFE_RELEASE( m_pBoxTextures[i] );
}
}
void CSkyBox::Init( LPSTR pPrefix, LPDIRECT3DDEVICE9 pDevice )
{
m_pDevice = pDevice;
string TextureName;
for( int i = 0; i < 6; ++i )
{
TextureName = pPrefix;
switch(i)
{
case BP_FRONT:
TextureName += "FT";
break;
case BP_BACK:
TextureName += "BK";
break;
case BP_LEFT:
TextureName += "LT";
break;
case BP_RIGHT:
TextureName += "RT";
break;
case BP_UP:
TextureName += "UP";
break;
case BP_DOWN:
TextureName += "DN";
break;
}
TextureName += ".jpg";
D3DXCreateTextureFromFile( m_pDevice,
TextureName.c_str(), &m_pBoxTextures[i] );
}
// front
m_BoxVertices[0].SetVertex( -m_fDistance, m_fDistance,-m_fDistance, 0.0f,0.0f );
m_BoxVertices[1].SetVertex( m_fDistance, m_fDistance,-m_fDistance, 1.0f,0.0f );
m_BoxVertices[2].SetVertex( -m_fDistance,-m_fDistance,-m_fDistance, 0.0f,1.0f );
m_BoxVertices[3].SetVertex( m_fDistance,-m_fDistance,-m_fDistance, 1.0f,1.0f );
// back
m_BoxVertices[4].SetVertex( -m_fDistance, m_fDistance, m_fDistance, 1.0f,0.0f );
m_BoxVertices[5].SetVertex( -m_fDistance,-m_fDistance, m_fDistance, 1.0f,1.0f );
m_BoxVertices[6].SetVertex( m_fDistance, m_fDistance, m_fDistance, 0.0f,0.0f );
m_BoxVertices[7].SetVertex( m_fDistance,-m_fDistance, m_fDistance, 0.0f,1.0f );
// top
m_BoxVertices[8].SetVertex( -m_fDistance, m_fDistance, m_fDistance, 0.0f,0.0f );
m_BoxVertices[9].SetVertex( m_fDistance, m_fDistance, m_fDistance, 1.0f,0.0f );
m_BoxVertices[10].SetVertex( -m_fDistance, m_fDistance,-m_fDistance, 0.0f,1.0f );
m_BoxVertices[11].SetVertex( m_fDistance, m_fDistance,-m_fDistance, 1.0f,1.0f );
// bottom
m_BoxVertices[12].SetVertex( -m_fDistance,-m_fDistance, m_fDistance, 0.0f,1.0f );
m_BoxVertices[13].SetVertex( -m_fDistance,-m_fDistance,-m_fDistance, 0.0f,0.0f );
m_BoxVertices[14].SetVertex( m_fDistance,-m_fDistance, m_fDistance, 1.0f,1.0f );
m_BoxVertices[15].SetVertex( m_fDistance,-m_fDistance,-m_fDistance, 1.0f,0.0f );
// right
m_BoxVertices[16].SetVertex( m_fDistance, m_fDistance,-m_fDistance, 0.0f,0.0f );
m_BoxVertices[17].SetVertex( m_fDistance, m_fDistance, m_fDistance, 1.0f,0.0f );
m_BoxVertices[18].SetVertex( m_fDistance,-m_fDistance,-m_fDistance, 0.0f,1.0f );
m_BoxVertices[19].SetVertex( m_fDistance,-m_fDistance, m_fDistance, 1.0f,1.0f );
// left
m_BoxVertices[20].SetVertex( -m_fDistance, m_fDistance,-m_fDistance, 1.0f,0.0f );
m_BoxVertices[21].SetVertex( -m_fDistance,-m_fDistance,-m_fDistance, 1.0f,1.0f );
m_BoxVertices[22].SetVertex( -m_fDistance, m_fDistance, m_fDistance, 0.0f,0.0f );
m_BoxVertices[23].SetVertex( -m_fDistance,-m_fDistance, m_fDistance, 0.0f,1.0f );
m_pDevice->CreateVertexBuffer( 24* sizeof(BoxVertex), D3DUSAGE_WRITEONLY,
BoxVertex::FVF_Flags, D3DPOOL_DEFAULT, &m_pBoxVB, 0 );
void* pBuffer = NULL;
m_pBoxVB->Lock( 0, 24* sizeof(BoxVertex), &pBuffer, 0 );
memcpy( pBuffer, m_BoxVertices, 24* sizeof(BoxVertex) );
m_pBoxVB->Unlock();
}
void CSkyBox::Render(D3DXMATRIX matWorld1 )
{
m_matWorld = matWorld1;
m_pDevice->SetTransform( D3DTS_WORLD, &m_matWorld );
m_pDevice->SetRenderState( D3DRS_ALPHABLENDENABLE, FALSE );
m_pDevice->SetRenderState( D3DRS_CULLMODE, D3DCULL_NONE );
m_pDevice->SetRenderState( D3DRS_ZWRITEENABLE, FALSE );
m_pDevice->SetRenderState( D3DRS_FOGENABLE, FALSE );
m_pDevice->SetSamplerState( 0, D3DSAMP_ADDRESSU, D3DTADDRESS_CLAMP );
m_pDevice->SetSamplerState( 0, D3DSAMP_ADDRESSV, D3DTADDRESS_CLAMP );
m_pDevice->SetSamplerState( 0, D3DSAMP_MINFILTER, D3DTEXF_LINEAR );
m_pDevice->SetSamplerState( 0, D3DSAMP_MAGFILTER, D3DTEXF_LINEAR );
m_pDevice->SetStreamSource( 0, m_pBoxVB, 0, sizeof(BoxVertex) );
m_pDevice->SetFVF( BoxVertex::FVF_Flags );
for( int i = 0; i < 6; ++i )
{
m_pDevice->SetTexture( 0, m_pBoxTextures[i] );
m_pDevice->DrawPrimitive( D3DPT_TRIANGLESTRIP, i*4, 2 );
}
m_pDevice->SetRenderState( D3DRS_CULLMODE, D3DCULL_NONE );
m_pDevice->SetRenderState( D3DRS_ZWRITEENABLE, TRUE );
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -