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

📄 terrain.cpp

📁 3D游戏展示程序
💻 CPP
📖 第 1 页 / 共 3 页
字号:
		float(rz+4)*10, g_Hmap.m_pLightColor[index9], (bx+cx)*0.5f, (bz+cz)*0.5f);
	// add
	pV[point++] = HeightmapVertex(float(rx+2)*10, g_Hmap.m_HeightData.m_pData[index26], 
		float(rz+3)*10, g_Hmap.m_pLightColor[index26], ((bx+cx)*0.5f+0.5f)*0.5f, ((bz+cz)*0.5f+0.5f)*0.5f);

	pV[point++] = HeightmapVertex(float(rx+2)*10, g_Hmap.m_HeightData.m_pData[index6], 
		float(rz+2)*10, g_Hmap.m_pLightColor[index6], 0.5f, 0.5f);
	// add
	pV[point++] = HeightmapVertex(float(rx+1)*10, g_Hmap.m_HeightData.m_pData[index21], 
		float(rz+2)*10, g_Hmap.m_pLightColor[index21], ((ax+bx)*0.5f+0.5f)*0.5f, ((az+bz)*0.5f+0.5f)*0.5f);

	pV[point++] = HeightmapVertex(float(rx*10), g_Hmap.m_HeightData.m_pData[index5], 
		float(rz+2)*10, g_Hmap.m_pLightColor[index5], (ax+bx)*0.5f, (az+bz)*0.5f);

	g_pD3DDevice->DrawPrimitiveUP(D3DPT_TRIANGLEFAN, point - 2, pV, sizeof(HeightmapVertex));

	point = 0;
	pV[point++] = HeightmapVertex(float(rx+3)*10, g_Hmap.m_HeightData.m_pData[index10], 
		float(rz+1)*10, g_Hmap.m_pLightColor[index10], (dx+0.5f)*0.5f, (dz+0.5f)*0.5f);

	pV[point++] = HeightmapVertex(float(rx+2)*10, g_Hmap.m_HeightData.m_pData[index7], 
		float(rz*10), g_Hmap.m_pLightColor[index7], (ax+dx)*0.5f, (az+dz)*0.5f);
	// add
	pV[point++] = HeightmapVertex(float(rx+2)*10, g_Hmap.m_HeightData.m_pData[index22], 
		float(rz+1)*10, g_Hmap.m_pLightColor[index22], ((ax+dx)*0.5f+0.5f)*0.5f, ((az+dz)*0.5f+0.5f)*0.5f);

	pV[point++] = HeightmapVertex(float(rx+2)*10, g_Hmap.m_HeightData.m_pData[index6], 
		float(rz+2)*10, g_Hmap.m_pLightColor[index6], 0.5f, 0.5f);
	// add
	pV[point++] = HeightmapVertex(float(rx+3)*10, g_Hmap.m_HeightData.m_pData[index27], 
		float(rz+2)*10, g_Hmap.m_pLightColor[index27], ((cx+dx)*0.5f+0.5f)*0.5f, ((cz+dz)*0.5f+0.5f)*0.5f);

	pV[point++] = HeightmapVertex(float(rx+4)*10, g_Hmap.m_HeightData.m_pData[index11], 
		float(rz+2)*10, g_Hmap.m_pLightColor[index11], (cx+dx)*0.5f, (cz+dz)*0.5f);

	if(m_LODmap[z][x+1] == 1)
	{
		pV[point++] = HeightmapVertex(float(rx+4)*10, g_Hmap.m_HeightData.m_pData[index28], 
			float(rz+1)*10, g_Hmap.m_pLightColor[index28], ((cx+dx)*0.5f+dx)*0.5f, ((cz+dz)*0.5f+dz)*0.5f);
		m_numTriangles++;
	}

	pV[point++] = HeightmapVertex(float(rx+4)*10, g_Hmap.m_HeightData.m_pData[index2], 
		float(rz*10), g_Hmap.m_pLightColor[index2], dx, dz);

	if(m_LODmap[z-1][x] == 1)
	{
		pV[point++] = HeightmapVertex(float(rx+3)*10, g_Hmap.m_HeightData.m_pData[index29], 
			float(rz*10), g_Hmap.m_pLightColor[index29], ((ax+dx)*0.5f+dx)*0.5f, ((az+dz)*0.5f+dz)*0.5f);
		m_numTriangles++;
	}

	pV[point++] = HeightmapVertex(float(rx+2)*10, g_Hmap.m_HeightData.m_pData[index7], 
		float(rz*10), g_Hmap.m_pLightColor[index7], (ax+dx)*0.5f, (az+dz)*0.5f);

	g_pD3DDevice->DrawPrimitiveUP(D3DPT_TRIANGLEFAN, point - 2, pV, sizeof(HeightmapVertex));

	point = 0;
	pV[point++] = HeightmapVertex(float(rx+3)*10, g_Hmap.m_HeightData.m_pData[index12], 
		float(rz+3)*10, g_Hmap.m_pLightColor[index12], (cx+0.5f)*0.5f, (cz+0.5f)*0.5f);

	pV[point++] = HeightmapVertex(float(rx+2)*10, g_Hmap.m_HeightData.m_pData[index6], 
		float(rz+2)*10, g_Hmap.m_pLightColor[index6], 0.5f, 0.5f);
	// add
	pV[point++] = HeightmapVertex(float(rx+2)*10, g_Hmap.m_HeightData.m_pData[index26], 
		float(rz+3)*10, g_Hmap.m_pLightColor[index26], ((bx+cx)*0.5f+0.5f)*0.5f, ((bz+cz)*0.5f+0.5f)*0.5f);

	pV[point++] = HeightmapVertex(float(rx+2)*10, g_Hmap.m_HeightData.m_pData[index9], 
		float(rz+4)*10, g_Hmap.m_pLightColor[index9], (bx+cx)*0.5f, (bz+cz)*0.5f);

	if(m_LODmap[z+1][x] == 1)
	{
		pV[point++] = HeightmapVertex(float(rx+3)*10, g_Hmap.m_HeightData.m_pData[index30], 
			float(rz+4)*10, g_Hmap.m_pLightColor[index30], ((bx+cx)*0.5f+cx)*0.5f, ((bz+cz)*0.5f+cz)*0.5f);
		m_numTriangles++;
	}

	pV[point++] = HeightmapVertex(float(rx+4)*10, g_Hmap.m_HeightData.m_pData[index3], 
		float(rz+4)*10, g_Hmap.m_pLightColor[index3], cx, cz);

	if(m_LODmap[z][x+1] == 1)
	{
		pV[point++] = HeightmapVertex(float(rx+4)*10, g_Hmap.m_HeightData.m_pData[index31], 
			float(rz+3)*10, g_Hmap.m_pLightColor[index31], ((cx+dx)*0.5f+cx)*0.5f, ((cz+dz)*0.5f+cz)*0.5f);
		m_numTriangles++;
	}

	pV[point++] = HeightmapVertex(float(rx+4)*10, g_Hmap.m_HeightData.m_pData[index11], 
		float(rz+2)*10, g_Hmap.m_pLightColor[index11], (cx+dx)*0.5f, (cz+dz)*0.5f);
	// add
	pV[point++] = HeightmapVertex(float(rx+3)*10, g_Hmap.m_HeightData.m_pData[index27], 
		float(rz+2)*10, g_Hmap.m_pLightColor[index27], ((cx+dx)*0.5f+0.5f)*0.5f, ((cz+dz)*0.5f+0.5f)*0.5f);

	pV[point++] = HeightmapVertex(float(rx+2)*10, g_Hmap.m_HeightData.m_pData[index6], 
		float(rz+2)*10, g_Hmap.m_pLightColor[index6], 0.5f, 0.5f);

	g_pD3DDevice->DrawPrimitiveUP(D3DPT_TRIANGLEFAN, point - 2, pV, sizeof(HeightmapVertex));

	m_numTriangles += 24;
}

//----------------------------------------------------
// LOD2
//----------------------------------------------------
void CTerrain::DrawLevel_2(int x, int z)
{
	HeightmapVertex pV[10];
	int rx = (x-128)*4;
	int rz = (z-128)*4;
	int index0 = g_Hmap.GetHeightIndex(x, z);
	int index1 = g_Hmap.GetHeightIndex(x, z+1);
	int index2 = g_Hmap.GetHeightIndex(x+1, z);
	int index3 = g_Hmap.GetHeightIndex(x+1, z+1);
	if(index0==-1 || index1==-1 || index2==-1 || index3==-1)
	{
		return;
	}

	int index4 = g_Hmap.GetHeightIndexOffset(index0, -1, 1);
	int index5 = g_Hmap.GetHeightIndexOffset(index0, -2, 0);
	int index6 = g_Hmap.GetHeightIndexOffset(index0, -2, 2);
	int index7 = g_Hmap.GetHeightIndexOffset(index0, 0, 2);
	int index8 = g_Hmap.GetHeightIndexOffset(index0, -3, 1);
	int index9 = g_Hmap.GetHeightIndexOffset(index1, 0, 2);
	int index10 = g_Hmap.GetHeightIndexOffset(index0, -1, 3);
	int index11 = g_Hmap.GetHeightIndexOffset(index2, -2, 0);
	int index12 = g_Hmap.GetHeightIndexOffset(index0, -3, 3);

	float ax,az,bx,bz,cx,cz,dx,dz;
	switch(0)
	{
	case 0: ax=0.0f; az=0.0f; bx=0.0f; bz=1.0f; cx=1.0f; cz=1.0f; dx=1.0f; dz=0.0f;	break;
	case 1: ax=0.0f; az=1.0f; bx=1.0f; bz=1.0f; cx=1.0f; cz=0.0f; dx=0.0f; dz=0.0f;	break;
	case 2: ax=1.0f; az=1.0f; bx=1.0f; bz=0.0f; cx=0.0f; cz=0.0f; dx=0.0f; dz=1.0f;	break;
	case 3: ax=1.0f; az=0.0f; bx=0.0f; bz=0.0f; cx=0.0f; cz=1.0f; dx=1.0f; dz=1.0f;	break;
	default:ax=1.0f; az=0.0f; bx=0.0f; bz=0.0f; cx=0.0f; cz=1.0f; dx=1.0f; dz=1.0f;	break;  
	}
	int point = 0;
	pV[point++] = HeightmapVertex(float(rx+1)*10, g_Hmap.m_HeightData.m_pData[index4], 
		float(rz+1)*10, g_Hmap.m_pLightColor[index4], (ax+0.5f)*0.5f, (az+0.5f)*0.5f);

	pV[point++] = HeightmapVertex(float(rx*10), g_Hmap.m_HeightData.m_pData[index0], 
		float(rz*10), g_Hmap.m_pLightColor[index0], ax, az);

	pV[point++] = HeightmapVertex(float(rx*10), g_Hmap.m_HeightData.m_pData[index5], 
		float(rz+2)*10, g_Hmap.m_pLightColor[index5], (ax+bx)*0.5f, (az+bz)*0.5f);

	pV[point++] = HeightmapVertex(float(rx+2)*10, g_Hmap.m_HeightData.m_pData[index6], 
		float(rz+2)*10, g_Hmap.m_pLightColor[index6], 0.5f, 0.5f);

	pV[point++] = HeightmapVertex(float(rx+2)*10, g_Hmap.m_HeightData.m_pData[index7], 
		float(rz*10), g_Hmap.m_pLightColor[index7], (ax+dx)*0.5f, (az+dz)*0.5f);

	pV[point++] = HeightmapVertex(float(rx*10), g_Hmap.m_HeightData.m_pData[index0], 
		float(rz*10), g_Hmap.m_pLightColor[index0], ax, az);

	g_pD3DDevice->DrawPrimitiveUP(D3DPT_TRIANGLEFAN, point - 2, pV, sizeof(HeightmapVertex));

	point = 0;
	pV[point++] = HeightmapVertex(float(rx+1)*10, g_Hmap.m_HeightData.m_pData[index8], 
		float(rz+3)*10, g_Hmap.m_pLightColor[index8], (bx+0.5f)*0.5f, (bz+0.5f)*0.5f);

	pV[point++] = HeightmapVertex(float(rx*10), g_Hmap.m_HeightData.m_pData[index5], 
		float(rz+2)*10, g_Hmap.m_pLightColor[index5], (ax+bx)*0.5f, (az+bz)*0.5f);

	pV[point++] = HeightmapVertex(float(rx*10), g_Hmap.m_HeightData.m_pData[index1], 
		float(rz+4)*10, g_Hmap.m_pLightColor[index1], bx, bz);

	pV[point++] = HeightmapVertex(float(rx+2)*10, g_Hmap.m_HeightData.m_pData[index9], 
		float(rz+4)*10, g_Hmap.m_pLightColor[index9], (bx+cx)*0.5f, (bz+cz)*0.5f);

	pV[point++] = HeightmapVertex(float(rx+2)*10, g_Hmap.m_HeightData.m_pData[index6], 
		float(rz+2)*10, g_Hmap.m_pLightColor[index6], 0.5f, 0.5f);

	pV[point++] = HeightmapVertex(float(rx*10), g_Hmap.m_HeightData.m_pData[index5], 
		float(rz+2)*10, g_Hmap.m_pLightColor[index5], (ax+bx)*0.5f, (az+bz)*0.5f);

	g_pD3DDevice->DrawPrimitiveUP(D3DPT_TRIANGLEFAN, point - 2, pV, sizeof(HeightmapVertex));

	point = 0;
	pV[point++] = HeightmapVertex(float(rx+3)*10, g_Hmap.m_HeightData.m_pData[index10], 
		float(rz+1)*10, g_Hmap.m_pLightColor[index10], (dx+0.5f)*0.5f, (dz+0.5f)*0.5f);

	pV[point++] = HeightmapVertex(float(rx+2)*10, g_Hmap.m_HeightData.m_pData[index7], 
		float(rz*10), g_Hmap.m_pLightColor[index7], (ax+dx)*0.5f, (az+dz)*0.5f);

	pV[point++] = HeightmapVertex(float(rx+2)*10, g_Hmap.m_HeightData.m_pData[index6], 
		float(rz+2)*10, g_Hmap.m_pLightColor[index6], 0.5f, 0.5f);

	pV[point++] = HeightmapVertex(float(rx+4)*10, g_Hmap.m_HeightData.m_pData[index11], 
		float(rz+2)*10, g_Hmap.m_pLightColor[index11], (cx+dx)*0.5f, (cz+dz)*0.5f);

	pV[point++] = HeightmapVertex(float(rx+4)*10, g_Hmap.m_HeightData.m_pData[index2], 
		float(rz*10), g_Hmap.m_pLightColor[index2], dx, dz);

	pV[point++] = HeightmapVertex(float(rx+2)*10, g_Hmap.m_HeightData.m_pData[index7], 
		float(rz*10), g_Hmap.m_pLightColor[index7], (ax+dx)*0.5f, (az+dz)*0.5f);

	g_pD3DDevice->DrawPrimitiveUP(D3DPT_TRIANGLEFAN, point - 2, pV, sizeof(HeightmapVertex));

	point = 0;
	pV[point++] = HeightmapVertex(float(rx+3)*10, g_Hmap.m_HeightData.m_pData[index12], 
		float(rz+3)*10, g_Hmap.m_pLightColor[index12], (cx+0.5f)*0.5f, (cz+0.5f)*0.5f);

	pV[point++] = HeightmapVertex(float(rx+2)*10, g_Hmap.m_HeightData.m_pData[index6], 
		float(rz+2)*10, g_Hmap.m_pLightColor[index6], 0.5f, 0.5f);

	pV[point++] = HeightmapVertex(float(rx+2)*10, g_Hmap.m_HeightData.m_pData[index9], 
		float(rz+4)*10, g_Hmap.m_pLightColor[index9], (bx+cx)*0.5f, (bz+cz)*0.5f);

	pV[point++] = HeightmapVertex(float(rx+4)*10, g_Hmap.m_HeightData.m_pData[index3], 
		float(rz+4)*10, g_Hmap.m_pLightColor[index3], cx, cz);

	pV[point++] = HeightmapVertex(float(rx+4)*10, g_Hmap.m_HeightData.m_pData[index11], 
		float(rz+2)*10, g_Hmap.m_pLightColor[index11], (cx+dx)*0.5f, (cz+dz)*0.5f);

	pV[point++] = HeightmapVertex(float(rx+2)*10, g_Hmap.m_HeightData.m_pData[index6], 
		float(rz+2)*10, g_Hmap.m_pLightColor[index6], 0.5f, 0.5f);

	g_pD3DDevice->DrawPrimitiveUP(D3DPT_TRIANGLEFAN, point - 2, pV, sizeof(HeightmapVertex));

	m_numTriangles += 16;
}

//----------------------------------------------------
// LOD3(单纹理时两种渲染方式, 现在多层纹理)
// 帖图尺寸(4*4)
//----------------------------------------------------
void CTerrain::DrawLevel_3(int x, int z)
{
	m_numTriangles += 8;
	if(!g_Hmap.m_bViewerChange)	return;
	
	int rx = (x-128)*4;
	int rz = (z-128)*4;
	int index0 = g_Hmap.GetHeightIndex(x, z);
	int index1 = g_Hmap.GetHeightIndex(x, z+1);
	int index2 = g_Hmap.GetHeightIndex(x+1, z);
	int index3 = g_Hmap.GetHeightIndex(x+1, z+1);
	if(index0==-1 || index1==-1 || index2==-1 || index3==-1)
	{
		return;
	}
	int index4 = g_Hmap.GetHeightIndexOffset(index0, -2, 2);
	int index5 = g_Hmap.GetHeightIndexOffset(index0, -2, 0);
	int index6 = g_Hmap.GetHeightIndexOffset(index1, 0, 2);
	int index7 = g_Hmap.GetHeightIndexOffset(index2, -2, 0);
	int index8 = g_Hmap.GetHeightIndexOffset(index0, 0, 2);

	float ax,az,bx,bz,cx,cz,dx,dz;
	switch(0)
	{
	case 0: ax=0.0f; az=0.0f; bx=0.0f; bz=1.0f; cx=1.0f; cz=1.0f; dx=1.0f; dz=0.0f;	break;
	case 1: ax=0.0f; az=1.0f; bx=1.0f; bz=1.0f; cx=1.0f; cz=0.0f; dx=0.0f; dz=0.0f;	break;
	case 2: ax=1.0f; az=1.0f; bx=1.0f; bz=0.0f; cx=0.0f; cz=0.0f; dx=0.0f; dz=1.0f;	break;
	case 3: ax=1.0f; az=0.0f; bx=0.0f; bz=0.0f; cx=0.0f; cz=1.0f; dx=1.0f; dz=1.0f;	break;
	default:ax=1.0f; az=0.0f; bx=0.0f; bz=0.0f; cx=0.0f; cz=1.0f; dx=1.0f; dz=1.0f;	break;  
	}
	HeightmapVertex pV[10];

	pV[0] = HeightmapVertex(float(rx+2)*10, g_Hmap.m_HeightData.m_pData[index4], 
			float(rz+2)*10, g_Hmap.m_pLightColor[index4], (ax+dx)*0.5f, (az+bz)*0.5f);

	pV[1] = HeightmapVertex(float(rx*10), g_Hmap.m_HeightData.m_pData[index0], 
			float(rz*10), g_Hmap.m_pLightColor[index0], ax, az);

	pV[2] = HeightmapVertex(float(rx*10), g_Hmap.m_HeightData.m_pData[index5], 
			float(rz+2)*10, g_Hmap.m_pLightColor[index5], (ax+bx)*0.5f, (az+bz)*0.5f);

	pV[3] = HeightmapVertex(float(rx*10), g_Hmap.m_HeightData.m_pData[index1], 
			float(rz+4)*10, g_Hmap.m_pLightColor[index1], bx, bz);

	pV[4] = HeightmapVertex(float(rx+2)*10, g_Hmap.m_HeightData.m_pData[index6], 
			float(rz+4)*10, g_Hmap.m_pLightColor[index6], (bx+cx)*0.5f, (bz+cz)*0.5f);

	pV[5] = HeightmapVertex(float(rx+4)*10, g_Hmap.m_HeightData.m_pData[index3], 
			float(rz+4)*10, g_Hmap.m_pLightColor[index3], cx, cz);

	pV[6] = HeightmapVertex(float(rx+4)*10, g_Hmap.m_HeightData.m_pData[index7], 
			float(rz+2)*10, g_Hmap.m_pLightColor[index7], (cx+dx)*0.5f, (cz+dz)*0.5f);

	pV[7] = HeightmapVertex(float(rx+4)*10, g_Hmap.m_HeightData.m_pData[index2], 
			float(rz*10), g_Hmap.m_pLightColor[index2], dx, dz);

	pV[8] = HeightmapVertex(float(rx+2)*10, g_Hmap.m_HeightData.m_pData[index8], 
			float(rz*10), g_Hmap.m_pLightColor[index8], (ax+dx)*0.5f, (az+dz)*0.5f);

	pV[9] = HeightmapVertex(float(rx*10), g_Hmap.m_HeightData.m_pData[index0], 
			float(rz*10), g_Hmap.m_pLightColor[index0], ax, az);	
	//--------------------------------
	// 批处理渲染方式
	//--------------------------------
	m_BlendVertex[m_BlendIndex++] = pV[0];
	m_BlendVertex[m_BlendIndex++] = pV[8];
	m_BlendVertex[m_BlendIndex++] = pV[1];
	m_BlendVertex[m_BlendIndex++] = pV[1];
	m_BlendVertex[m_BlendIndex++] = pV[2];
	m_BlendVertex[m_BlendIndex++] = pV[0];

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -