📄 cterrain.cpp
字号:
#include "CTerrain.h"
#include <fstream>
CTerrain::CTerrain():
m_pDevice(NULL),
m_pTerrainVB(NULL),
m_pTerrainIB(NULL),
m_pTerrainTextures(NULL),
m_pHeightMap(NULL),
m_pDetailTexture(NULL),
m_HeightBuffer(NULL)
{
}
CTerrain::~CTerrain()
{
SAFE_RELEASE(m_pTerrainVB);
SAFE_RELEASE(m_pTerrainIB);
SAFE_RELEASE(m_pTerrainTextures);
SAFE_RELEASE(m_pHeightMap);
SAFE_RELEASE(m_pDetailTexture);
SAFE_DELETE_ARRAY(m_HeightBuffer);
}
bool CTerrain::Init(LPDIRECT3DDEVICE9 pDevice, float LX, float LZ,
int NX, int NZ, float fMaxHeight,
LPSTR pHeightMapName, UINT uiHeightmapLevel,
LPSTR pTexName, LPSTR pDetailTexture, UINT uiDetailLevel)
{
m_nNumVertsAlongX = NX; // x轴有多少个顶点
m_nNumVertsAlongZ = NZ; // z轴有多少个顶点
m_fMeshLengthAlongX = LX; // x方向上面的长度
m_fMeshLengthAlongZ = LZ; // z方向上面的长度
m_fMaxHeight = fMaxHeight; /// 地形最大高度
m_fTileLengthX = m_fMeshLengthAlongX/(m_nNumVertsAlongX-1);/// 每个地形块的x长度(x方向上两个顶点间的距离)
m_fTileLengthZ = m_fMeshLengthAlongZ/(m_nNumVertsAlongZ-1);/// 每个地形块的z长度(x方向上两个顶点间的距离)
m_uiNumXTile = m_nNumVertsAlongX - 1;/// x方向上地形块数目
m_uiNumZTile = m_nNumVertsAlongZ - 1;/// z方向上地形块数目
m_uiNumTiles =m_uiNumXTile*m_uiNumZTile ; /// 地形块总数
m_uiNumVertices = m_nNumVertsAlongX*m_nNumVertsAlongZ; /// 顶点数目
m_uiNumIndices = m_uiNumTiles*6; /// 索引数目
m_pDevice = pDevice;
m_uiHeightmapLevel = uiHeightmapLevel;
m_uiDetailLevel = uiDetailLevel;
m_fTempBase = 1.f / 255.f * m_fMaxHeight;
if ( FAILED( D3DXCreateTextureFromFile( m_pDevice, pTexName, &m_pTerrainTextures ) ) )
{
return false;
}
if ( FAILED( D3DXCreateTextureFromFile( m_pDevice, pHeightMapName, &m_pHeightMap ) ) )
{
return false;
}
if ( FAILED( D3DXCreateTextureFromFile( m_pDevice, pDetailTexture, &m_pDetailTexture ) ) )
{
return false;
}
m_pHeightMap->GetLevelDesc(m_uiHeightmapLevel, &m_HeightMapDesc);
m_HeightBuffer = new BYTE[m_HeightMapDesc.Width*m_HeightMapDesc.Height];
D3DLOCKED_RECT rect;
m_pHeightMap->LockRect( uiHeightmapLevel, &rect, NULL, 0 );
memcpy( m_HeightBuffer, rect.pBits, m_HeightMapDesc.Width*m_HeightMapDesc.Height );
m_pHeightMap->UnlockRect(uiHeightmapLevel);
if( !computeVertices() )
{
::MessageBox(0, "computeVertices - FAILED", 0, 0);
::PostQuitMessage(0);
return false;
}
// compute the indices
if( !computeIndices() )
{
::MessageBox(0, "computeIndices - FAILED", 0, 0);
::PostQuitMessage(0);
return false;
}
ZeroMemory(&m_TerrainMaterial , sizeof(D3DMATERIAL9));
m_TerrainMaterial.Diffuse.r = 1.f;
m_TerrainMaterial.Diffuse.g= 1.f;
m_TerrainMaterial.Diffuse.b= 1.f;
m_TerrainMaterial.Ambient.r= 1.f;
m_TerrainMaterial.Ambient.g= 1.f;
m_TerrainMaterial.Ambient.b= 1.f;
return true;
}
bool CTerrain::Init(LPDIRECT3DDEVICE9 pDevice, float LX, float fMaxHeight,
LPSTR pHeightMapName, UINT uiHeightmapLevel,
LPSTR pTexName, LPSTR pDetailTexture, UINT uiDetailLevel)
{
m_pDevice = pDevice;
m_uiHeightmapLevel = uiHeightmapLevel;
m_uiDetailLevel = uiDetailLevel;
SAFE_RELEASE(m_pTerrainVB);
SAFE_RELEASE(m_pTerrainIB);
SAFE_RELEASE(m_pTerrainTextures);
SAFE_RELEASE(m_pHeightMap);
SAFE_RELEASE(m_pDetailTexture);
SAFE_DELETE_ARRAY(m_HeightBuffer);
if ( FAILED( D3DXCreateTextureFromFile( m_pDevice, pTexName, &m_pTerrainTextures ) ) )
{
return false;
}
if ( FAILED( D3DXCreateTextureFromFile( m_pDevice, pHeightMapName, &m_pHeightMap ) ) )
{
return false;
}
if ( FAILED( D3DXCreateTextureFromFile( m_pDevice, pDetailTexture, &m_pDetailTexture ) ) )
{
return false;
}
m_pHeightMap->GetLevelDesc(m_uiHeightmapLevel, &m_HeightMapDesc);
m_HeightBuffer = new BYTE[m_HeightMapDesc.Width*m_HeightMapDesc.Height];
D3DLOCKED_RECT rect;
m_pHeightMap->LockRect( uiHeightmapLevel, &rect, NULL, 0 );
memcpy( m_HeightBuffer, rect.pBits, m_HeightMapDesc.Width*m_HeightMapDesc.Height );
m_pHeightMap->UnlockRect(uiHeightmapLevel);
m_fWidth = LX;
m_uiNumXTile = m_HeightMapDesc.Width-1;
m_uiNumZTile = m_HeightMapDesc.Height-1;
m_nNumVertsAlongX = m_uiNumXTile+1; // x轴有多少个顶点
m_nNumVertsAlongZ = m_uiNumZTile+1; // z轴有多少个顶点
m_uiNumTiles = m_uiNumXTile * m_uiNumZTile;
m_uiNumVertices = m_nNumVertsAlongX*m_nNumVertsAlongZ;
m_uiNumIndices = m_uiNumTiles * 6;
m_fTileLength = m_fWidth / m_uiNumXTile;
m_fTileLengthX = m_fTileLength;
m_fTileLengthZ = m_fTileLength;
m_fMeshLengthAlongX = m_fWidth;
m_fMeshLengthAlongZ = m_uiNumZTile*m_fTileLength;
m_fMaxHeight = fMaxHeight; /// 地形最大高度
m_fTempBase = 1.f / 255.f * m_fMaxHeight;
if( !computeVertices() )
{
::MessageBox(0, "computeVertices - FAILED", 0, 0);
::PostQuitMessage(0);
return false;
}
// compute the indices
if( !computeIndices() )
{
::MessageBox(0, "computeIndices - FAILED", 0, 0);
::PostQuitMessage(0);
return false;
}
ZeroMemory(&m_TerrainMaterial , sizeof(D3DMATERIAL9));
m_TerrainMaterial.Diffuse.r = 1.f;
m_TerrainMaterial.Diffuse.g= 1.f;
m_TerrainMaterial.Diffuse.b= 1.f;
m_TerrainMaterial.Ambient.r= 1.f;
m_TerrainMaterial.Ambient.g= 1.f;
m_TerrainMaterial.Ambient.b= 1.f;
return true;
}
bool CTerrain::Init(LPDIRECT3DDEVICE9 pDevice,float LX, float LZ, int NX, int NZ, float fMaxHeight,
LPSTR pTexName, LPSTR pDetailTexture , UINT uiDetailLevel)
{
m_nNumVertsAlongX = NX; // x轴有多少个顶点
m_nNumVertsAlongZ = NZ; // z轴有多少个顶点
m_fMeshLengthAlongX = LX; // x方向上面的长度
m_fMeshLengthAlongZ = LZ; // z方向上面的长度
m_fMaxHeight = fMaxHeight; /// 地形最大高度
m_fTileLengthX = m_fMeshLengthAlongX/(m_nNumVertsAlongX-1);/// 每个地形块的x长度(x方向上两个顶点间的距离)
m_fTileLengthZ = m_fMeshLengthAlongZ/(m_nNumVertsAlongZ-1);/// 每个地形块的z长度(x方向上两个顶点间的距离)
m_uiNumXTile = m_nNumVertsAlongX - 1;/// x方向上地形块数目
m_uiNumZTile = m_nNumVertsAlongZ - 1;/// z方向上地形块数目
m_uiNumTiles =m_uiNumXTile*m_uiNumZTile ; /// 地形块总数
m_uiNumVertices = m_nNumVertsAlongX*m_nNumVertsAlongZ; /// 顶点数目
m_uiNumIndices = m_uiNumTiles*6; /// 索引数目
m_pDevice = pDevice;
m_uiDetailLevel = uiDetailLevel;
m_fTempBase = 1.f / 255.f * m_fMaxHeight;
if ( FAILED( D3DXCreateTextureFromFile( m_pDevice, pTexName, &m_pTerrainTextures ) ) )
{
return false;
}
if ( FAILED( D3DXCreateTextureFromFile( m_pDevice, pDetailTexture, &m_pDetailTexture ) ) )
{
return false;
}
if( !computeVertices(m_fMaxHeight) )
{
::MessageBox(0, "computeVertices - FAILED", 0, 0);
::PostQuitMessage(0);
return false;
}
// compute the indices
if( !computeIndices() )
{
::MessageBox(0, "computeIndices - FAILED", 0, 0);
::PostQuitMessage(0);
return false;
}
ZeroMemory(&m_TerrainMaterial , sizeof(D3DMATERIAL9));
m_TerrainMaterial.Diffuse.r = 1.f;
m_TerrainMaterial.Diffuse.g= 1.f;
m_TerrainMaterial.Diffuse.b= 1.f;
m_TerrainMaterial.Ambient.r= 1.f;
m_TerrainMaterial.Ambient.g= 1.f;
m_TerrainMaterial.Ambient.b= 1.f;
return true;
}
bool CTerrain::InitHeightMap(LPDIRECT3DDEVICE9 pDevice, float LX, float LZ,
int NX, int NZ, float fMaxHeight, string pHeightMapName,
LPSTR pTexName, LPSTR pDetailTexture, UINT uiDetailLevel)
{
m_nNumVertsAlongX = NX; // x轴有多少个顶点
m_nNumVertsAlongZ = NZ; // z轴有多少个顶点
m_fMeshLengthAlongX = LX; // x方向上面的长度
m_fMeshLengthAlongZ = LZ; // z方向上面的长度
m_fMaxHeight = fMaxHeight; /// 地形最大高度
m_fTileLengthX = m_fMeshLengthAlongX/(m_nNumVertsAlongX-1);/// 每个地形块的x长度(x方向上两个顶点间的距离)
m_fTileLengthZ = m_fMeshLengthAlongZ/(m_nNumVertsAlongZ-1);/// 每个地形块的z长度(x方向上两个顶点间的距离)
m_uiNumXTile = m_nNumVertsAlongX - 1;/// x方向上地形块数目
m_uiNumZTile = m_nNumVertsAlongZ - 1;/// z方向上地形块数目
m_uiNumTiles =m_uiNumXTile*m_uiNumZTile ; /// 地形块总数
m_uiNumVertices = m_nNumVertsAlongX*m_nNumVertsAlongZ; /// 顶点数目
m_uiNumIndices = m_uiNumTiles*6; /// 索引数目
m_pDevice = pDevice;
m_uiDetailLevel = uiDetailLevel;
m_fTempBase = 1.f / 255.f * m_fMaxHeight;
if ( FAILED( D3DXCreateTextureFromFile( m_pDevice, pTexName, &m_pTerrainTextures ) ) )
{
return false;
}
if ( FAILED( D3DXCreateTextureFromFile( m_pDevice, pDetailTexture, &m_pDetailTexture ) ) )
{
return false;
}
if( !readMap(pHeightMapName) )
{
::MessageBox(0, "readRawFile - FAILED", 0, 0);
::PostQuitMessage(0);
return false;
}
if( !computeVertices() )
{
::MessageBox(0, "computeVertices - FAILED", 0, 0);
::PostQuitMessage(0);
return false;
}
// compute the indices
if( !computeIndices() )
{
::MessageBox(0, "computeIndices - FAILED", 0, 0);
::PostQuitMessage(0);
return false;
}
ZeroMemory(&m_TerrainMaterial , sizeof(D3DMATERIAL9));
m_TerrainMaterial.Diffuse.r = 1.f;
m_TerrainMaterial.Diffuse.g= 1.f;
m_TerrainMaterial.Diffuse.b= 1.f;
m_TerrainMaterial.Ambient.r= 1.f;
m_TerrainMaterial.Ambient.g= 1.f;
m_TerrainMaterial.Ambient.b= 1.f;
return true;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -