#include "..\..\GameEngine\GameEngine_Common.h"
#include "LODTerrain.h"
#include "Frustum.h"
#include "Camera.h"
CLODTerrain::CLODTerrain(LPDIRECT3DDEVICE9 pd3dDevice,bool bUseHeightFile){
m_pd3dDevice=pd3dDevice;
m_pFrustum=new CFrustum();
m_iTerrainSize=1024;
m_pbQuadMat=new bool[(m_iTerrainSize+1)*(m_iTerrainSize+1)];
m_fHeightScale=1.0f;
m_pucHeightData=new unsigned char[(m_iTerrainSize+1)*(m_iTerrainSize+1)];
m_fResolution=5.0f;
m_fHeightDetail=8.0f;
m_iTexMapRepeatNum=10;
m_bUseHeightFile=bUseHeightFile;
}
CLODTerrain::~CLODTerrain(){
delete[] m_pbQuadMat;
delete[] m_pucHeightData;
if(m_pVertexBuffer!=NULL){
m_pVertexBuffer->Release();
m_pVertexBuffer=NULL;
}
if(m_pTexture!=NULL){
m_pTexture->Release();
m_pTexture=NULL;
}
}
bool CLODTerrain::InitTerrain(TCHAR* szHeightFile,TCHAR* szTextureFile){
if(m_bUseHeightFile){
if(!InitTerrainByFile(szHeightFile,szTextureFile)){
return false;
}
}
else{
if(!InitTerrainByFun(szTextureFile)){
return false;
}
}
return true;
}
bool CLODTerrain::InitTerrainByFun(char* szTextureFile){
if(!InitQuadMat())
return false;
if(!InitVertexBuf())
return false;
if(FAILED(D3DXCreateTextureFromFile(m_pd3dDevice,szTextureFile,&m_pTexture)))
return false;
return true;
}
bool CLODTerrain::InitTerrainByFile(TCHAR* szHeightFile,TCHAR* szTextureFile){
m_bUseHeightFile=true;
if(!InitQuadMat())
return false;
if(!InitVertexBuf())
return false;
if(!LoadHeightData(szHeightFile))
return false;
if(FAILED(D3DXCreateTextureFromFile(m_pd3dDevice,szTextureFile,&m_pTexture)))
return false;
return true;
}
bool CLODTerrain::InitQuadMat(){
if(!m_pbQuadMat){
MessageBox(NULL,"创建地形标志数组内存不足","提示",0);
return false;
}
for(int x=0;x<=m_iTerrainSize;x++){
for(int z=0;z<=m_iTerrainSize;z++){
SetQuadMatData(x,z,false);
}
}
return true;
}
bool CLODTerrain::InitVertexBuf(){
if(FAILED(m_pd3dDevice->CreateVertexBuffer(10*sizeof(CUSTOMVERTEX),0,CUSTOMVERTEX_FVF,
D3DPOOL_MANAGED,&m_pVertexBuffer,NULL))){
MessageBox(NULL,"创建顶点缓冲区失败","提示",0);
return false;
}
return true;
}
bool CLODTerrain::LoadHeightData(TCHAR* szFileName){
FILE* pFile;
pFile=fopen(szFileName,"rb");
if(!pFile){
return false;
}
if(!m_pucHeightData){
MessageBox(NULL,"创建地形数据内存不足","提示",0);
}
fread(m_pucHeightData,1,(m_iTerrainSize+1)*(m_iTerrainSize+1),pFile);
fclose(pFile);
return true;
}
float CLODTerrain::GenerateHeightData(float x,float z){
return 8*sinf(x)*cosf(z/10)+1.0f;
}
bool CLODTerrain::GetQuadMatData(int x,int z){
return m_pbQuadMat[m_iTerrainSize*z+x];
}
void CLODTerrain::SetQuadMatData(int x,int z,bool b){
if(x>=0 && x<=m_iTerrainSize && z>=0 && z<=m_iTerrainSize){
m_pbQuadMat[m_iTerrainSize*z+x]=b;
}
}
void CLODTerrain::TrimNodeSplit(int iX,int iZ,int iNodeLength){ //去除不合法的分割
int iChildNodeOffset=iNodeLength/4;
int iChildNodeLength=iNodeLength/2;
if(iNodeLength>=4 && GetQuadMatData(iX,iZ)==true){
if((iX+iNodeLength)<=m_iTerrainSize && GetQuadMatData(iX+iNodeLength,iZ)==false){
SetChildNodeFalse(iX+iChildNodeOffset,iZ+iChildNodeOffset,iChildNodeLength);
SetChildNodeFalse(iX+iChildNodeOffset,iZ-iChildNodeOffset,iChildNodeLength);
}
if((iZ-iNodeLength)>=0 && GetQuadMatData(iX,iZ-iNodeLength)==false){
SetChildNodeFalse(iX-iChildNodeOffset,iZ-iChildNodeOffset,iChildNodeLength);
SetChildNodeFalse(iX+iChildNodeOffset,iZ-iChildNodeOffset,iChildNodeLength);
}
if((iX-iNodeLength)>=0 && GetQuadMatData(iX-iNodeLength,iZ)==false){
SetChildNodeFalse(iX-iChildNodeOffset,iZ+iChildNodeOffset,iChildNodeLength);
SetChildNodeFalse(iX-iChildNodeOffset,iZ-iChildNodeOffset,iChildNodeLength);
}
if((iZ+iNodeLength)<=m_iTerrainSize && GetQuadMatData(iX,iZ+iNodeLength)==false){
SetChildNodeFalse(iX-iChildNodeOffset,iZ+iChildNodeOffset,iChildNodeLength);
SetChildNodeFalse(iX+iChildNodeOffset,iZ+iChildNodeOffset,iChildNodeLength);
}
TrimNodeSplit(iX+iChildNodeOffset,iZ+iChildNodeOffset,iChildNodeLength);
TrimNodeSplit(iX+iChildNodeOffset,iZ-iChildNodeOffset,iChildNodeLength);
TrimNodeSplit(iX-iChildNodeOffset,iZ+iChildNodeOffset,iChildNodeLength);
TrimNodeSplit(iX-iChildNodeOffset,iZ-iChildNodeOffset,iChildNodeLength);
}
else if(GetQuadMatData(iX,iZ)==false){
SetChildNodeFalse(iX,iZ,iNodeLength);
}
}
void CLODTerrain::SetChildNodeFalse(int iX,int iZ,int iNodeLength){
int iChildNodeOffset=iNodeLength/4;
int iChildNodeLength=iNodeLength/2;
SetQuadMatData(iX,iZ,false);
if(iNodeLength>=4){
SetChildNodeFalse(iX+iChildNodeOffset,iZ+iChildNodeOffset,iChildNodeLength);
SetChildNodeFalse(iX+iChildNodeOffset,iZ-iChildNodeOffset,iChildNodeLength);
SetChildNodeFalse(iX-iChildNodeOffset,iZ-iChildNodeOffset,iChildNodeLength);
SetChildNodeFalse(iX-iChildNodeOffset,iZ+iChildNodeOffset,iChildNodeLength);
}
}
void CLODTerrain::UpdateTerrain(CCamera* pCamera){
SplitNode(m_iTerrainSize/2.0f,m_iTerrainSize/2.0f,m_iTerrainSize,pCamera);
TrimNodeSplit(m_iTerrainSize/2,m_iTerrainSize/2,m_iTerrainSize);
}
void CLODTerrain::Render(){
m_pd3dDevice->Clear(0,NULL,D3DCLEAR_TARGET|D3DCLEAR_ZBUFFER,D3DCOLOR_XRGB(0,0,0),1.0f,0);
m_pd3dDevice->SetRenderState(D3DRS_LIGHTING,false);
// m_pd3dDevice->SetSamplerState(0,D3DSAMP_MINFILTER,D3DTEXF_LINEAR);
// m_pd3dDevice->SetSamplerState(0,D3DSAMP_MAGFILTER,D3DTEXF_LINEAR);
m_pd3dDevice->SetFVF(CUSTOMVERTEX_FVF);
// m_pd3dDevice->SetTexture(0,m_pTexture);
m_pd3dDevice->BeginScene();
RenderNode(m_iTerrainSize/2.0f,m_iTerrainSize/2.0f,m_iTerrainSize);
m_pd3dDevice->EndScene();
m_pd3dDevice->Present(NULL,NULL,NULL,NULL);
}
void CLODTerrain::SplitNode(float x,float z,int iNodeLength,CCamera* pCamera){
int iX=(int)x;
int iZ=(int)z;
float y;
if(!m_bUseHeightFile)
y=m_pucHeightData[iZ*m_iTerrainSize+iX]*m_fHeightScale; //该点的高度
else
y=GenerateHeightData(x,z)*m_fHeightScale;
float fCameraDistance;
float fRule;
bool bSplit;
int iChildNodeLength;
float fChildNodeOffset;
//节点不在视截体内,设置标志后返回
m_pFrustum->GetFrustum(m_pd3dDevice,0.0f);
if(m_pFrustum->CheckCube(x,y,z,(float)iNodeLength))
m_pbQuadMat[m_iTerrainSize*iZ+iX]=true;
else{
m_pbQuadMat[m_iTerrainSize*iZ+iX]=false;
return;
}
//距离检测
D3DXVECTOR3* pCameraPos=NULL;
pCameraPos=pCamera->GetCameraPos();
fCameraDistance=(float)(fabs(pCameraPos->x-x)+
fabs(pCameraPos->y-y)+
fabs(pCameraPos->z-z));
//变形幅度估值
if(m_bUseHeightFile==true){
int iVertexOffset=iNodeLength>>1;
int iChildNodeLength=iVertexOffset>>1;
float fArrayHeightEva[9];
fArrayHeightEva[0]=m_pucHeightData[m_iTerrainSize*iZ+iX]*m_fHeightScale;
fArrayHeightEva[1]=m_pucHeightData[m_iTerrainSize*iZ+(iX+iVertexOffset)]*m_fHeightScale;
fArrayHeightEva[2]=m_pucHeightData[m_iTerrainSize*(iZ-iVertexOffset)+iX]*m_fHeightScale;
fArrayHeightEva[3]=m_pucHeightData[m_iTerrainSize*iZ+(iX-iVertexOffset)]*m_fHeightScale;
fArrayHeightEva[4]=m_pucHeightData[m_iTerrainSize*(iZ+iVertexOffset)+iX]*m_fHeightScale;
fArrayHeightEva[5]=m_pucHeightData[m_iTerrainSize*(iZ+iChildNodeLength)+(iX+iChildNodeLength)]*m_fHeightScale;
fArrayHeightEva[6]=m_pucHeightData[m_iTerrainSize*(iZ-iChildNodeLength)+(iX+iChildNodeLength)]*m_fHeightScale;
fArrayHeightEva[7]=m_pucHeightData[m_iTerrainSize*(iZ-iChildNodeLength)+(iX-iChildNodeLength)]*m_fHeightScale;
fArrayHeightEva[8]=m_pucHeightData[m_iTerrainSize*(iZ+iChildNodeLength)+(iX-iChildNodeLength)]*m_fHeightScale;
float fMaxHeight=fArrayHeightEva[0];
float fMinHeight=fArrayHeightEva[0];
for(int i=1;i<9;i++){
if(fArrayHeightEva[i]>fMaxHeight)
fMaxHeight=fArrayHeightEva[i];
if(fArrayHeightEva[i]<fMinHeight)
fMinHeight=fArrayHeightEva[i];
}
float fHeightDiff=fMaxHeight-fMinH
没有合适的资源?快使用搜索试试~ 我知道了~
Visual C++ DirectX9 3D游戏开发导引 源代码
共1011个文件
obj:180个
pdb:105个
cpp:91个
5星 · 超过95%的资源 需积分: 9 302 下载量 170 浏览量
2008-07-11
14:59:55
上传
评论 3
收藏 23.84MB 7Z 举报
温馨提示
《Visual C++/DirectX9 3D游戏开发导引》一书所有的源代码
资源推荐
资源详情
资源评论
收起资源包目录
Visual C++ DirectX9 3D游戏开发导引 源代码 (1011个子文件)
Game.aps 17KB
wall.bmp 402KB
chess.bmp 275KB
chess.bmp 275KB
Tiny_skin.bmp 192KB
Tiny_skin.bmp 192KB
tiger.bmp 65KB
floor.bmp 48KB
floor.bmp 48KB
floor.bmp 48KB
grass.bmp 48KB
gun.bmp 47KB
gun.bmp 47KB
gunmask.bmp 47KB
ground.bmp 42KB
sphere.bmp 42KB
left.bmp 42KB
front.bmp 42KB
floor.bmp 32KB
sky.bmp 32KB
floor.bmp 32KB
floor.bmp 32KB
particle.bmp 28KB
particleAlpha.bmp 28KB
LODTerrain.cpp 42KB
LODTerrain.cpp 41KB
SkinMesh.cpp 17KB
main.cpp 16KB
GameEngine_SceneManager.cpp 11KB
main.cpp 10KB
TextureCone.cpp 9KB
main.cpp 9KB
AlphaBlend.cpp 9KB
main.cpp 9KB
GameEngine_Input.cpp 8KB
GameEngine_Input.cpp 8KB
main.cpp 8KB
main.cpp 8KB
main.cpp 8KB
main.cpp 7KB
Cube.cpp 6KB
LightMaterial.cpp 6KB
main.cpp 6KB
main.cpp 6KB
GameEngine_Particle.cpp 6KB
GameEngine_Sound.cpp 6KB
TransparentBlend.cpp 6KB
BasicXFile.cpp 5KB
Frustum.cpp 5KB
Frustum.cpp 5KB
TextureAddress.cpp 5KB
Shoot.cpp 4KB
HandleJoystick.cpp 4KB
HandleMouse.cpp 4KB
main.cpp 4KB
GameEngine_EnergyBar.cpp 3KB
main.cpp 3KB
Triangle.cpp 3KB
SampleWindow.cpp 3KB
GameEngine_Camera.cpp 3KB
main.cpp 3KB
main.cpp 3KB
main.cpp 3KB
main.cpp 3KB
GameEngine_Font.cpp 3KB
Camera.cpp 3KB
main.cpp 2KB
Camera.cpp 2KB
GameEngine_light.cpp 2KB
main.cpp 2KB
main.cpp 2KB
HandleKey.cpp 2KB
main.cpp 2KB
main.cpp 2KB
main.cpp 2KB
GameEngine_VertexBuffer.cpp 2KB
main.cpp 2KB
GameEngine_Material.cpp 2KB
main.cpp 2KB
GameEngine_App.cpp 2KB
SimpleMap.cpp 2KB
GameEngine_App.cpp 1KB
main.cpp 1KB
main.cpp 1KB
GameEngine_Timer.cpp 1KB
GameEngine_Texture.cpp 1KB
main.cpp 948B
main.cpp 922B
main.cpp 893B
main.cpp 854B
main.cpp 799B
main.cpp 764B
main.cpp 742B
main.cpp 596B
main.cpp 531B
main.cpp 515B
main.cpp 471B
main.cpp 452B
main.cpp 452B
main.cpp 445B
共 1011 条
- 1
- 2
- 3
- 4
- 5
- 6
- 11
zxkid
- 粉丝: 324
- 资源: 227
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功
- 1
- 2
- 3
- 4
前往页