⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 cterrain.cpp

📁 骨骼动画 此程序演示了如何在你的游戏中使用骨骼动画技术。
💻 CPP
📖 第 1 页 / 共 2 页
字号:
#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 + -