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

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

?? landscape.cpp.svn-base

?? 自己做的小游戲
?? SVN-BASE
字號:
#include "LandScape.h"
#include <windows.h>
#include <GL/gl.h>
#include "gamedata.h"
unsigned char *LandScape::m_HeightMap;
int LandScape::m_MapSize;
LandScape::LandScape(void)
{
}

LandScape::~LandScape(void)
{
//	if(m_HeightMap) delete m_HeightMap;
//	if(m_TriPool)	delete m_TriPool;
//	if(m_Patches)	delete m_Patches;
}

// ---------------------------------------------------------------------
// Points p1, p2, & p3 specified in counter clock-wise order
//
void calcNormal(float v[3][3], float out[3])
{
	float v1[3],v2[3];
	static const int x = 0;
	static const int y = 1;
	static const int z = 2;

	// Calculate two vectors from the three points
	v1[x] = v[0][x] - v[1][x];
	v1[y] = v[0][y] - v[1][y];
	v1[z] = v[0][z] - v[1][z];

	v2[x] = v[1][x] - v[2][x];
	v2[y] = v[1][y] - v[2][y];
	v2[z] = v[1][z] - v[2][z];

	// Take the cross product of the two vectors to get
	// the normal vector which will be stored in out
	out[x] = v1[y]*v2[z] - v1[z]*v2[y];
	out[y] = v1[z]*v2[x] - v1[x]*v2[z];
	out[z] = v1[x]*v2[y] - v1[y]*v2[x];
}

void LandScape::ComputeNormal(int x,int y, Vertex *out)
{
	if(x<=0 || x>=m_MapSize || y<=0 ||y >=m_MapSize) return;
	float z[5];
	z[0] = m_HeightMap[x+y*m_MapSize];
	z[1] = m_HeightMap[x-1+y*m_MapSize];
	z[2] = m_HeightMap[x+(y+1)*m_MapSize];
	z[3] = m_HeightMap[x+1+y*m_MapSize];
	z[4] = m_HeightMap[x+(y-1)*m_MapSize];

	float v[4][3][3] = {
		{{x,y,z[0]},{x-1,y,z[1]},{x,y+1,z[2]}},
		{{x,y,z[0]},{x,y+1,z[2]},{x+1,y,z[3]}},
		{{x,y,z[0]},{x+1,y,z[3]},{x,y-1,z[4]}},
		{{x,y,z[0]},{x,y-1,z[4]},{x-1,y,z[1]}}};

	float vector[4][3];
	for(int i=0;i<4;++i)
		calcNormal(v[i], vector[i]);

	out->x = vector[0][0]+vector[1][0]+vector[2][0]+vector[3][0];
	out->y = vector[0][1]+vector[1][1]+vector[2][1]+vector[3][1];
	out->z = vector[0][2]+vector[1][2]+vector[2][2]+vector[3][2];
}

//***********************
//Initialize all Patches
//
void LandScape::Init(unsigned char *hMap,int mapSize )
{
	Patch *patch;
	int X,Y;
	
	// Initialize all terrain data
	m_TriPool				= new TriPool(SIZE_TRIPOOL);
	m_HeightMap				= hMap;
	m_MapSize				= mapSize;
	m_Vectors				= (Vertex*)malloc(sizeof(Vertex)*m_MapSize*m_MapSize);
	
	m_Patches = new Patch[NUM_PATCHES_PER_SIDE*NUM_PATCHES_PER_SIDE];

	// Initialize all terrain patches
	for(X=0;X<NUM_PATCHES_PER_SIDE;++X)
		for(Y=0;Y<NUM_PATCHES_PER_SIDE;++Y)
		{
			patch = &m_Patches[NUM_PATCHES_PER_SIDE*X+Y];
			patch->Init(Y*PATCH_SIZE,X*PATCH_SIZE,Y*PATCH_SIZE,X*PATCH_SIZE,m_HeightMap,mapSize,m_Vectors,m_TriPool);
			patch->ComputeVariance();
		}

//	for(X=0;X<m_MapSize;++X)
//		for(Y=0;Y<m_MapSize;++Y)
//			ComputeNormal(X,Y, &m_Vectors[X+m_MapSize*Y]);
}

//************************
// reset all Patches ,recompute Variance
//
void LandScape::Reset()
{
	//
	// Perform simple visibility culling on entire patches.
	//   - Define a triangle set back from the camera by one patch size, following
	//     the angle of the frustum.
	//   - A patch is visible if it's center point is included in the angle: Left,Eye,Right
	//   - This visibility test is only accurate if the camera cannot look up or down significantly.
	//
/*	const float PI_DIV_180 = M_PI / 180.0f;
	const float FOV_DIV_2 = gFovX/2;

	int eyeX = (int)(gViewPosition[0] - PATCH_SIZE * sinf( gClipAngle * PI_DIV_180 ));
	int eyeY = (int)(gViewPosition[2] + PATCH_SIZE * cosf( gClipAngle * PI_DIV_180 ));

	int leftX  = (int)(eyeX + 100.0f * sinf( (gClipAngle-FOV_DIV_2) * PI_DIV_180 ));
	int leftY  = (int)(eyeY - 100.0f * cosf( (gClipAngle-FOV_DIV_2) * PI_DIV_180 ));

	int rightX = (int)(eyeX + 100.0f * sinf( (gClipAngle+FOV_DIV_2) * PI_DIV_180 ));
	int rightY = (int)(eyeY - 100.0f * cosf( (gClipAngle+FOV_DIV_2) * PI_DIV_180 ));
*/
	int X, Y;
	Patch *patch;

	// Set the next free triangle pointer back to the beginning
	m_TriPool->SetNextTriNode(0);

	// Go through the patches performing resets, compute variances, and linking.
	for ( Y=0; Y < NUM_PATCHES_PER_SIDE; Y++ )
		for ( X=0; X < NUM_PATCHES_PER_SIDE; X++)
		{
			patch = &(m_Patches[Y*NUM_PATCHES_PER_SIDE+X]);
			
			// Reset the patch
			patch->Reset();
			patch->SetVisibility(  );
			
			// Check to see if this patch has been deformed since last frame.
			// If so, recompute the varience tree for it.
			if ( patch->isDirty() )
				patch->ComputeVariance();

			if ( patch->isVisibile() )
			{
				// Link all the patches together.
				if ( X > 0 )
					patch->GetBaseLeft()->LeftNeighbor = m_Patches[Y*NUM_PATCHES_PER_SIDE+X-1].GetBaseRight();
				else
					patch->GetBaseLeft()->LeftNeighbor = NULL;		// Link to bordering Landscape here..

				if ( X < (NUM_PATCHES_PER_SIDE-1) )
					patch->GetBaseRight()->LeftNeighbor = m_Patches[Y*NUM_PATCHES_PER_SIDE+X+1].GetBaseLeft();
				else
					patch->GetBaseRight()->LeftNeighbor = NULL;		// Link to bordering Landscape here..

				if ( Y > 0 )
					patch->GetBaseLeft()->RightNeighbor = m_Patches[(Y-1)*NUM_PATCHES_PER_SIDE+X].GetBaseRight();
				else
					patch->GetBaseLeft()->RightNeighbor = NULL;		// Link to bordering Landscape here..

				if ( Y < (NUM_PATCHES_PER_SIDE-1) )
					patch->GetBaseRight()->RightNeighbor = m_Patches[(Y+1)*NUM_PATCHES_PER_SIDE+X].GetBaseLeft();
				else
					patch->GetBaseRight()->RightNeighbor = NULL;	// Link to bordering Landscape here..
			}
		}
}

// ---------------------------------------------------------------------
// Create an approximate mesh of the landscape.
//
void LandScape::Tessellate()
{
	// Perform Tessellation
	Patch *patch = &(m_Patches[0]);
	for (int i=0; i < NUM_PATCHES_PER_SIDE*NUM_PATCHES_PER_SIDE; i++, patch++ )
	{
		if (patch->isVisibile())
			patch->Tessellate( );
	}
}

// ---------------------------------------------------------------------
// Render each patch of the landscape & adjust the frame variance.
//
int LandScape::Render()
{
	//Number of Triangles
	int NumTrisRendered = 0;
	int nCount;
	Patch *patch = &(m_Patches[0]);

	// Store old matrix
	glPushMatrix();

	// Scale the terrain by the terrain scale specified at compile time.
	glScalef( TERRAIN_MULTIPL, MULT_SCALE, TERRAIN_MULTIPL );

	glColor3f(1,1,1);

	for (nCount=0; nCount < NUM_PATCHES_PER_SIDE*NUM_PATCHES_PER_SIDE; nCount++, patch++ )
	{
		if (patch->isVisibile())
			NumTrisRendered += patch->Render();
	}

	// Restore the matrix
	glPopMatrix();

	return NumTrisRendered;
}

// 計算任意點的高度y:
//
// 假設(shè)三角形三個頂點為:A(x1,y1,z1),B(x2,y2,z2),C(x3,y3,z3)
// 則有2變量 u,v 使得三角形上任意點的坐標(x,y,z)滿足:
//
// x = ( 1 - u - v )*x1 +u*x2 +v*x3; (1)
//
// 對于y,z亦如此
//
// 應(yīng)此可以根據(jù)三角形上點D的x,z坐標計算出u,v變量的值,
// 然后用y,y1,y2,y3代入公式(1)計算出D點的y值
//
float LandScape::GetY(float xp,float zp)
{
	float x = xp/TERRAIN_MULTIPL;
	float z = zp/TERRAIN_MULTIPL;

	//如果超出地圖范圍,返回0
	if(x<0 || x>m_MapSize*TERRAIN_MULTIPL || z<0 || z>m_MapSize*TERRAIN_MULTIPL)
		return 0;

	//(x,z)點所在三角形的3個頂點坐標
	float x1,x2,x3,y1,y2,y3,z1,z2,z3;
	//(x,z)點所在方格的左下頂點x,z坐標
	int intx,intz;
	//u,v變量
	float u,v;
	//(x,z)點對應(yīng)高度y
	float y;

	intx = (int)x;
	intz = (int)z;
	
	//計算點所在三角形3頂點坐標
	x1 = intx+1;
	z1 = intz;
	y1 = m_HeightMap[(int)(x1+z1*m_MapSize)];
	x2 = intx;
	z2 = intz+1;
	y2 = m_HeightMap[int(x2+z2*m_MapSize)];
	if( x-intx + z-intz >1 )
	{
		x3 = intx+1;
		z3 = intz+1;
	}
	else
	{
		x3 = intx;
		z3 = intz;
	}
	y3 = m_HeightMap[(int)(x3+z3*m_MapSize)];

	//根據(jù)三角形三頂點坐標和點的x,z坐標計算u,v變量的值
	v = (z1*(x-x2)+z2*(x1-x)+z*(x2-x1))/(x1*z2-x1*z3-x2*z1+x2*z3+x3*z1-x3*z2);
	u = (x-x1+v*(x1-x3))/(x2-x1);
	
	//計算點的y值
	y = (1-u-v)*y1+u*y2+v*y3;

	return y;
}

?? 快捷鍵說明

復(fù)制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
午夜亚洲福利老司机| 欧美精选在线播放| 91精品一区二区三区久久久久久 | 国产福利一区在线| 在线一区二区三区做爰视频网站| 日韩欧美精品在线| 亚洲精品成a人| 国产精品亚洲人在线观看| 69久久夜色精品国产69蝌蚪网| 国产欧美日韩久久| 麻豆精品视频在线观看免费| 91麻豆高清视频| 中文字幕乱码日本亚洲一区二区 | 亚洲欧美日韩国产一区二区三区| 精品影视av免费| 色伊人久久综合中文字幕| 久久精品无码一区二区三区| 午夜精品一区二区三区电影天堂 | 国产一区91精品张津瑜| 欧美日韩中文国产| 亚洲精品自拍动漫在线| 国产精品一区二区在线观看不卡| 88在线观看91蜜桃国自产| 夜色激情一区二区| 色婷婷综合在线| 亚洲精品一卡二卡| 91色乱码一区二区三区| 中文字幕亚洲欧美在线不卡| 国产二区国产一区在线观看| 日韩欧美国产小视频| 蜜桃精品视频在线观看| 日韩三级免费观看| 日韩av一二三| 一本大道久久a久久综合| 1区2区3区欧美| 99视频精品免费视频| 国产精品家庭影院| 99久久99久久精品国产片果冻 | 制服丝袜中文字幕一区| 亚洲高清免费在线| 欧美日韩国产区一| 免费久久精品视频| 久久久亚洲午夜电影| 国产黑丝在线一区二区三区| 欧美国产日韩在线观看| 99精品久久免费看蜜臀剧情介绍| 亚洲欧美日韩在线不卡| 欧美日精品一区视频| 爽好久久久欧美精品| 日韩三级.com| 国产精品一区二区果冻传媒| 国产欧美一区二区精品婷婷| 成人性生交大片免费| 亚洲人成伊人成综合网小说| 欧洲一区在线电影| 免费高清在线一区| 欧美国产精品v| 欧美主播一区二区三区| 天天综合天天做天天综合| 欧美va亚洲va| 99精品热视频| 午夜精品久久久久久久久| 26uuu亚洲综合色欧美 | 精品综合免费视频观看| 国产精品毛片久久久久久| 欧美日韩中文国产| 国产麻豆精品久久一二三| 亚洲图片欧美激情| 日韩三级免费观看| 99久久婷婷国产综合精品电影 | 国产美女久久久久| 一区二区三区不卡在线观看| 日韩欧美精品在线视频| av午夜一区麻豆| 日韩va欧美va亚洲va久久| 国产精品久久久久久久久久免费看 | 久久久久久9999| 欧美午夜在线一二页| 国产一区二区成人久久免费影院| 亚洲免费观看在线视频| 日韩一区二区免费在线观看| 成人教育av在线| 精品一区免费av| 亚洲一区二区精品视频| 欧美激情一区二区在线| 欧美一区二区三区四区在线观看| 99精品桃花视频在线观看| 激情欧美一区二区| 亚洲国产日韩av| 国产精品久久久久婷婷二区次| 91精品欧美福利在线观看| aaa欧美大片| 国产精品一区二区不卡| 首页国产丝袜综合| 亚洲激情成人在线| 亚洲欧洲国产日本综合| 久久无码av三级| 6080日韩午夜伦伦午夜伦| 91麻豆蜜桃一区二区三区| 国产精品99久久久久久久vr| 午夜国产精品一区| 亚洲精品中文字幕在线观看| 国产精品卡一卡二卡三| 久久精品夜色噜噜亚洲a∨| 欧美一级二级三级蜜桃| 欧美日韩国产一区| 精品1区2区3区| 欧美主播一区二区三区美女| 91在线播放网址| 99久久精品免费| 99re免费视频精品全部| 成人美女视频在线观看| 国产精品正在播放| 韩国午夜理伦三级不卡影院| 美女视频网站黄色亚洲| 日韩黄色免费电影| 免费美女久久99| 久久99精品久久久| 激情亚洲综合在线| 久久99精品国产.久久久久久 | 欧美福利电影网| 欧美剧在线免费观看网站| 欧美日韩精品免费观看视频| 在线免费视频一区二区| 欧美日韩免费观看一区三区| 欧美人牲a欧美精品| 欧美一区二区久久久| 欧美一区二区三区视频在线 | 日韩激情在线观看| 久久国产精品第一页| 国产一区二区免费看| 国产99久久久久久免费看农村| 成人美女在线视频| 91久久国产综合久久| 欧美日韩国产大片| 精品国产乱码久久久久久闺蜜| 久久亚洲综合色| 国产精品电影一区二区三区| 一区二区三区四区中文字幕| 午夜欧美电影在线观看| 麻豆精品一二三| 国产激情一区二区三区桃花岛亚洲| av一二三不卡影片| 欧美日韩你懂得| 久久久久久久久久美女| 亚洲色图制服诱惑| 日韩综合小视频| 精品一区二区三区免费播放| 成人av在线影院| 91麻豆精品国产无毒不卡在线观看| 久久综合五月天婷婷伊人| 亚洲欧美福利一区二区| 日本午夜精品一区二区三区电影| 国产精品 欧美精品| 欧洲激情一区二区| 精品乱人伦小说| 亚洲激情男女视频| 国产一区二区三区日韩| 日韩精品一区二区三区四区| 国产亚洲精品超碰| 午夜视频一区在线观看| 国产成人精品亚洲777人妖| 欧美日韩一区 二区 三区 久久精品 | 国产欧美一区二区三区在线看蜜臀 | 久久奇米777| 亚洲成人福利片| 不卡高清视频专区| 欧美一区二区成人6969| 亚洲日本在线天堂| 狠狠色丁香久久婷婷综| 欧美日韩另类国产亚洲欧美一级| 久久久久久久综合日本| 青青草视频一区| 91污在线观看| 国产日韩欧美一区二区三区综合| 亚洲国产美女搞黄色| 成人短视频下载| 久久亚洲二区三区| 免费的成人av| 欧美日韩大陆在线| 亚洲视频一区在线| av一区二区不卡| 国产精品私人自拍| 国产精品一卡二卡| 欧美成人一区二区| 美女精品一区二区| 337p亚洲精品色噜噜狠狠| 亚洲成人在线免费| 在线观看视频一区二区| 亚洲免费在线视频一区 二区| 福利一区二区在线| 久久久久久夜精品精品免费| 色猫猫国产区一区二在线视频| 久久久久久久久岛国免费| 免费看欧美女人艹b| 日韩视频免费观看高清完整版在线观看| 亚洲国产成人av网| 欧美日韩一区二区三区在线| 亚洲伊人伊色伊影伊综合网| 欧美亚洲综合网|