亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關(guān)于我們
? 蟲蟲下載站

?? terrain.cpp

?? 通過vc++編程實現(xiàn)3DS格式的模型載入
?? CPP
字號:
//========================================================
/**
*  @file      Terrain.cpp
*
*  項目描述: 3DS文件載入
*  文件描述:  地形類 
*  適用平臺: Windows98/2000/NT/XP
*  
*  作者:     WWBOSS
*  電子郵件:  wwboss123@gmail.com
*  創(chuàng)建日期: 2006-12-06	
*  修改日期: 2006-12-10
*
*/     
//========================================================

#include "Terrain.h"
#include "CBMPLoader.h"

/** 當前CTerrain指針 */
CTerrain* CTerrain::m_pTerrain = NULL;


/** 多重紋理函數(shù)指針 */
PFNGLMULTITEXCOORD2FARBPROC		glMultiTexCoord2fARB = NULL;
PFNGLACTIVETEXTUREARBPROC		glActiveTextureARB = NULL;

/** 構(gòu)造函數(shù) */
CTerrain::CTerrain():m_bDetail(true),m_DetailScale(128)
{
	/** 設(shè)置地形大小 */
	setSize(MAP_WIDTH,CELL_WIDTH);
	
	/** 為地形高程分配內(nèi)存,并初始化 */
	m_pHeightMap = new BYTE[m_nWidth * m_nWidth];
	for(int i=0; i<m_nWidth * m_nWidth; i++)
		m_pHeightMap[i] = 0;

	m_pTerrain = this;
		
}

/** 析構(gòu)函數(shù) */
CTerrain::~CTerrain()
{
	/** 刪除內(nèi)存和指針 */
	if(m_pHeightMap)
	{
		delete[] m_pHeightMap;
	    m_pHeightMap = 0;
	}
	
	/** 刪除紋理對象及其占用內(nèi)存 */	
	for(int i=0; i<2; i++)
	{
		m_texture[i].FreeImage();
	    glDeleteTextures(1,&m_texture[i].ID);
	}

	
}

/** 初始化霧效 */
void CTerrain::initFog()
{
	float fogColor[4] = { 0.8f,0.8f,0.8f,1.0f };
	
	glEnable(GL_FOG);

	glFogi(GL_FOG_MODE,GL_EXP);             /** 設(shè)置霧效的模式 */
	glFogfv(GL_FOG_COLOR,fogColor);         /** 指定霧的顏色 */ 
    glFogf(GL_FOG_DENSITY,0.001f);          /** 設(shè)置霧的濃度 */
	glFogf(GL_FOG_START,1.0);               /** 設(shè)置線性霧的開始位置 */
	glFogf(GL_FOG_END,1000.0);              /** 設(shè)置線性霧的結(jié)束位置 */
	glHint(GL_FOG_HINT,GL_DONT_CARE);       /** 規(guī)定霧化效果的質(zhì)量 */ 

}


/** 初始化地形 */
bool CTerrain::init()
{
	glActiveTextureARB		= (PFNGLACTIVETEXTUREARBPROC)		wglGetProcAddress("glActiveTextureARB");
	glMultiTexCoord2fARB	= (PFNGLMULTITEXCOORD2FARBPROC)		wglGetProcAddress("glMultiTexCoord2fARB");

	if(!glActiveTextureARB || !glMultiTexCoord2fARB)
	{
		//輸出錯誤信息
		MessageBox(NULL, "不支持多重紋理!", "錯誤", MB_OK);
		exit(0);
		//setDetail(false);
	}

	/** 載入高度文件 */
	loadRawFile("data/terrain.raw");

	/** 載入紋理 */
	loadTexture();

	/** 初始化霧效 */
    initFog();
	
	return true;
}

/** 設(shè)置地形大小 */
void CTerrain::setSize(unsigned  int width, unsigned  int cell)
{
	m_nWidth = width;
	m_nCellWidth = cell; 
}

/** 獲得高度圖中高度值 */
int CTerrain::getHeight(int x,int y)
{
	if(!m_pHeightMap)
		return 0;
	int xx = x % m_nWidth;
	int yy = y % m_nWidth;
    /** 返回當前高度 */
	return m_pHeightMap[(xx + yy * m_nWidth)];
}

/** 獲得地面高度 */
float CTerrain::getAveHeight(float x,float z)
{
	float CameraX, CameraZ;

	CameraX = x / m_nCellWidth;
	CameraZ = z / m_nCellWidth;

	/** 計算高程坐標(Col0, Row0),(Col1, Row1) */
	int col0 = int(CameraX);
	int row0 = int(CameraZ);
	unsigned int col1 = col0 + 1;
	unsigned int row1 = row0 + 1;

	/** 確保單元坐標不超過高程以外 */
	if (col1 > m_nWidth) col1 = 0;
	if (row1 > m_nWidth) row1 = 0;

	/** 獲取單元的四個角的高度 */
	float h00 = (float)(m_pHeightMap[col0*m_nCellWidth + row0*m_nCellWidth*m_nWidth]);
	float h01 = (float)(m_pHeightMap[col1*m_nCellWidth + row0*m_nCellWidth*m_nWidth]);
	float h11 = (float)(m_pHeightMap[col1*m_nCellWidth + row1*m_nCellWidth*m_nWidth]);
	float h10 = (float)(m_pHeightMap[col0*m_nCellWidth + row1*m_nCellWidth*m_nWidth]);

	/** 計算機攝像機相對于單元格的位置 */
	float tx = CameraX - int(CameraX);
	float ty = CameraZ - int(CameraZ);

	/** 進行雙線性插值得到地面高度 */
	float txty = tx * ty;

	float final_height	= h00 * (1.0f - ty - tx + txty)
						+ h01 * (tx - txty)
						+ h11 * txty
						+ h10 * (ty - txty);
	return final_height;
}

/** 載入高度圖 */
bool CTerrain::loadRawFile(const char* fileName)
{
	FILE *pFile = NULL;

	/** 打開文件 */
	pFile = fopen( fileName, "rb" );

	/** 錯誤檢查 */
	if ( pFile == NULL )	
	{
		/** 輸出錯誤信息,并返回false */
		MessageBox(NULL, "打開高度圖文件失敗!", "錯誤", MB_OK);
		exit(0);
	}

	/** 讀取高度圖文件 */
	fread( m_pHeightMap, 1, m_nWidth*m_nWidth, pFile );

	/** 獲取錯誤代碼 */
	int result = ferror( pFile );

	/** 檢查錯誤代碼 */
	if (result)
	{
		MessageBox(NULL, "無法獲取高度數(shù)據(jù)!", "錯誤", MB_OK);
		exit(0);
	}
    
	/** 關(guān)閉文件,成功返回 */
	fclose(pFile);
	return true;
}

/** 設(shè)置紋理坐標 */
void CTerrain::setTexCoord(float x,float z)
{
	
	float u =  (float)x / (float)m_nWidth;
	float v = -(float)z / (float)m_nWidth;
	
	///設(shè)置地面紋理的紋理坐標
	glMultiTexCoord2fARB(GL_TEXTURE0_ARB, u, v);

	///設(shè)置細節(jié)紋理的紋理坐標
	glMultiTexCoord2fARB(GL_TEXTURE1_ARB, u, v);
}


/** 載入地面紋理 */
bool CTerrain::loadTexture()
{
	char* fileName[] = {"data/terrain.bmp","data/detail.bmp"};	
	for(int i=0; i < 2; i++)
	{
		if(!m_texture[i].LoadBitmap(fileName[i]) )                    /**< 載入位圖文件 */
		{
			MessageBox(NULL,"裝載位圖文件失敗!","錯誤",MB_OK);       /**< 如果載入失敗則彈出對話框 */
			exit(0);
		}
		glGenTextures(1, &m_texture[i].ID);                            /**< 生成一個紋理對象名稱 */
		
			
		glBindTexture(GL_TEXTURE_2D, m_texture[i].ID);                 /**< 創(chuàng)建紋理對象 */
		
		/** 控制濾波 */
		glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);
		glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_NEAREST);
		glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
		glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_WRAP_S,GL_REPEAT);
		glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_WRAP_T,GL_REPEAT);
		
		/** 創(chuàng)建紋理 */
		gluBuild2DMipmaps(GL_TEXTURE_2D, GL_RGB, m_texture[i].imageWidth,
						m_texture[i].imageHeight, GL_RGB, GL_UNSIGNED_BYTE,
						m_texture[i].image);
	}
  	
	return true;

}

/** 渲染地形 */
void CTerrain::render()
{
		
	int X = 0, Y = 0;						
	float x, y, z;							
	bool bSwitchSides = false;

	/** 檢查高度圖是否有效 */
	if(!m_pHeightMap) 
		return;					

	/** 綁定紋理 */
	
	glActiveTextureARB(GL_TEXTURE0_ARB);
	glEnable(GL_TEXTURE_2D);
	glBindTexture(GL_TEXTURE_2D, m_texture[0].ID);
	
	/** 渲染細節(jié)紋理 */
	if(m_bDetail)
	{
		glActiveTextureARB(GL_TEXTURE1_ARB);
		glEnable(GL_TEXTURE_2D);

		glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_COMBINE_ARB);
		glTexEnvi(GL_TEXTURE_ENV, GL_RGB_SCALE_ARB, 2);

		glBindTexture(GL_TEXTURE_2D, m_texture[1].ID);
		
		/** 變換紋理矩陣 */
		glMatrixMode(GL_TEXTURE);
		    glLoadIdentity();
			glScalef((float)m_DetailScale, (float)m_DetailScale, 1);
		glMatrixMode(GL_MODELVIEW);
	}

	/** 繪制三角形帶 */
	glBegin( GL_TRIANGLE_STRIP );			

	/** 從行(X)開始循環(huán) */
	for ( X = 0; X <= m_nWidth; X += m_nCellWidth )
	{
		/** 檢查該列是否需要從相反順序繪制 */
		if(bSwitchSides)
		{	
			/** 繪制地形的一列 */
			for ( Y = m_nWidth; Y >= 0; Y -= m_nCellWidth )
			{
				/** 頂點(X, Y, Z) */		
				x = X;							
				y = getHeight( X, Y );	
				z = Y;							

				/** 指定紋理坐標,并發(fā)送頂點 */
				//setFogCoord(m_FogDepth, (float)y);
				setTexCoord( (float)x, (float)z );
				glVertex3f(x, y, z);		

				/** 頂點(X + m_nCellWidth, Y, Z) */		
				x = X + m_nCellWidth; 
				y = getHeight( X + m_nCellWidth, Y ); 
				z = Y;

				/** 指定紋理坐標,并發(fā)送頂點 */
				//setFogCoord(m_FogDepth, (float)y);
				setTexCoord( (float)x, (float)z );
				glVertex3f(x, y, z);			
			}
		}
		else
		{	
			/** 繪制地形的一列 */
			for ( Y = 0; Y <= m_nWidth; Y += m_nCellWidth )
			{
				/** 頂點(X + m_nCellWidth, Y, Z) */	
				x = X + m_nCellWidth; 
				y = getHeight( X + m_nCellWidth, Y ); 
				z = Y;

				/** 指定紋理坐標,并發(fā)送頂點 */
				//setFogCoord(m_FogDepth, (float)y);
				setTexCoord( (float)x, (float)z );
				glVertex3f(x, y, z);

				/** 頂點 (X, Y, Z) */		
				x = X;							
				y = getHeight( X, Y );	
				z = Y;							

				/** 指定紋理坐標,并發(fā)送頂點 */
				//setFogCoord(m_FogDepth, (float)y);
				setTexCoord( (float)x, (float)z );
				glVertex3f(x, y, z);		
			}
		}
			
		/** 變換開關(guān) */
		bSwitchSides = !bSwitchSides;
	}

	/** 繪制結(jié)束 */
	glEnd();

	///關(guān)閉紋理單元1
	glActiveTextureARB(GL_TEXTURE1_ARB);
    glDisable(GL_TEXTURE_2D);

	//關(guān)閉紋理單元0
	glActiveTextureARB(GL_TEXTURE0_ARB);		
    glDisable(GL_TEXTURE_2D);

}

?? 快捷鍵說明

復(fù)制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
蜜桃av一区二区在线观看| 亚洲精品中文在线| 久国产精品韩国三级视频| 日韩欧美专区在线| 久久精品国产一区二区三| 欧美一级理论片| 狠狠色狠狠色综合日日91app| 日韩情涩欧美日韩视频| 国产精品99久久久| 日韩伦理av电影| 欧美日韩三级一区二区| 久久精品国产一区二区三| 国产色婷婷亚洲99精品小说| 99精品久久久久久| 一区二区三区av电影| 91精品久久久久久久久99蜜臂| 蜜桃一区二区三区四区| 久久久精品tv| 欧美综合视频在线观看| 久久99精品国产麻豆婷婷| 国产精品美女久久久久aⅴ国产馆 国产精品美女久久久久av爽李琼 国产精品美女久久久久高潮 | 欧美羞羞免费网站| 日韩中文字幕91| 国产日韩欧美精品在线| 欧美综合色免费| 国产一区二区三区四区五区美女| 国产精品欧美久久久久无广告 | 欧美日本在线播放| 国产一区高清在线| 一区二区三区免费| 精品国产1区二区| 色噜噜狠狠一区二区三区果冻| 人妖欧美一区二区| 亚洲欧美国产毛片在线| 精品欧美一区二区三区精品久久| 99re成人在线| 国产在线视视频有精品| 亚洲精品高清在线| 久久综合给合久久狠狠狠97色69| 色婷婷综合久久久中文字幕| 国精产品一区一区三区mba桃花| 一区二区三区视频在线看| 欧美成人精品1314www| 在线亚洲精品福利网址导航| 国产激情一区二区三区四区| 天堂久久久久va久久久久| 中文字幕永久在线不卡| 久久综合资源网| 欧美丰满嫩嫩电影| 欧日韩精品视频| 成人精品视频一区二区三区| 另类中文字幕网| 亚洲成人av一区二区| 国产精品国产三级国产aⅴ中文| 欧美成人欧美edvon| 欧美丰满少妇xxxxx高潮对白| 99re这里只有精品视频首页| 国产一区二区在线视频| 日本不卡123| 石原莉奈在线亚洲三区| 亚洲一区日韩精品中文字幕| 成人免费一区二区三区视频| 国产日本一区二区| 亚洲精品在线观看视频| 日韩久久精品一区| 日韩一区二区麻豆国产| 欧美群妇大交群中文字幕| 欧美在线小视频| 一本到高清视频免费精品| 99这里都是精品| 99久精品国产| 97国产精品videossex| gogo大胆日本视频一区| eeuss鲁片一区二区三区在线看| 国产乱对白刺激视频不卡| 久久99精品久久只有精品| 日韩av不卡一区二区| 蜜臀av国产精品久久久久| 久久99精品久久久久婷婷| 国产真实乱子伦精品视频| 韩国毛片一区二区三区| 国产一区二区三区在线观看免费| 蜜臀精品久久久久久蜜臀| 久久精品国产99国产精品| 精品在线免费视频| 国产麻豆成人传媒免费观看| 韩国成人福利片在线播放| 国产一区二区三区久久久| 国产99久久久国产精品潘金网站| 成人精品高清在线| 色综合久久久久综合| 在线观看日产精品| 在线播放欧美女士性生活| 日韩精品中文字幕在线不卡尤物| 久久午夜老司机| 亚洲欧美一区二区不卡| 亚洲成人动漫av| 久久99深爱久久99精品| 粉嫩13p一区二区三区| 99综合电影在线视频| 欧美日韩在线免费视频| 精品伦理精品一区| 国产精品国产自产拍高清av王其| 伊人夜夜躁av伊人久久| 日本大胆欧美人术艺术动态| 国产精品自拍网站| 91久久精品一区二区三区| 日韩视频一区二区| 中文字幕成人av| 亚洲成人激情社区| 国产福利不卡视频| 在线亚洲人成电影网站色www| 69堂亚洲精品首页| 国产欧美一区二区精品忘忧草| 亚洲人被黑人高潮完整版| 麻豆精品蜜桃视频网站| 成人午夜视频网站| 91麻豆精品国产| 国产精品久久免费看| 日韩成人午夜电影| 成人激情图片网| 日韩欧美中文字幕一区| 亚洲欧美一区二区视频| 久久国产麻豆精品| 精品视频一区三区九区| 日本一区二区三区在线不卡| 日韩精品一二三四| 男女男精品网站| 色婷婷av一区二区三区之一色屋| 久久综合久久综合亚洲| 亚洲国产精品一区二区久久恐怖片| 久久66热偷产精品| 欧美日韩mp4| 亚洲精品少妇30p| 国产最新精品免费| 这里只有精品视频在线观看| 中文字幕一区视频| 国产激情一区二区三区四区| 欧美一区二区三区免费在线看| 亚洲色图都市小说| 国产河南妇女毛片精品久久久| 91精品国产综合久久精品app | 一本到高清视频免费精品| 久久精品亚洲精品国产欧美| 日本大胆欧美人术艺术动态| 欧美性色黄大片手机版| 亚洲视频在线一区观看| 国产91精品欧美| 久久久久亚洲综合| 国内一区二区视频| 91精品国产综合久久久久久久| 亚洲码国产岛国毛片在线| 风间由美一区二区av101| 精品少妇一区二区| 男人的天堂亚洲一区| 欧美高清激情brazzers| 亚洲午夜精品在线| 欧美性感一类影片在线播放| 亚洲欧美日韩一区二区三区在线观看| 国产a级毛片一区| 国产日韩精品一区二区三区在线| 精品一区免费av| 欧美岛国在线观看| 精品午夜久久福利影院| 日韩亚洲欧美一区| 久久99精品久久只有精品| 精品少妇一区二区三区在线视频| 美女视频网站久久| 欧美精品一区二区三区视频| 久久66热re国产| 久久欧美一区二区| 国产二区国产一区在线观看 | 中文字幕精品一区| 成人小视频免费观看| 国产精品麻豆网站| 色综合一区二区三区| 亚洲精品欧美二区三区中文字幕| 91丝袜呻吟高潮美腿白嫩在线观看| 亚洲天堂中文字幕| 欧美在线视频全部完| 五月天久久比比资源色| 日韩欧美中文字幕一区| 国产精品一区二区在线播放| 中文字幕欧美区| 日本道色综合久久| 日韩精品高清不卡| 久久一区二区三区国产精品| 懂色中文一区二区在线播放| 亚洲精品乱码久久久久久黑人| 欧美亚一区二区| 捆绑紧缚一区二区三区视频| 国产欧美一区二区精品久导航| 99re热这里只有精品免费视频| 亚洲靠逼com| 91精品在线观看入口| 国产乱人伦精品一区二区在线观看| 国产精品久久毛片av大全日韩| 欧美在线999| 国内外成人在线视频| 一区在线观看视频|