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

📄 terrain.cpp

📁 3D游戏展示程序
💻 CPP
📖 第 1 页 / 共 3 页
字号:
	m_BlendVertex[m_BlendIndex++] = pV[0];
	m_BlendVertex[m_BlendIndex++] = pV[2];
	m_BlendVertex[m_BlendIndex++] = pV[3];
	m_BlendVertex[m_BlendIndex++] = pV[3];
	m_BlendVertex[m_BlendIndex++] = pV[4];
	m_BlendVertex[m_BlendIndex++] = pV[0];

	m_BlendVertex[m_BlendIndex++] = pV[0];
	m_BlendVertex[m_BlendIndex++] = pV[4];
	m_BlendVertex[m_BlendIndex++] = pV[5];
	m_BlendVertex[m_BlendIndex++] = pV[5];
	m_BlendVertex[m_BlendIndex++] = pV[6];
	m_BlendVertex[m_BlendIndex++] = pV[0];

	m_BlendVertex[m_BlendIndex++] = pV[0];
	m_BlendVertex[m_BlendIndex++] = pV[6];
	m_BlendVertex[m_BlendIndex++] = pV[7];
	m_BlendVertex[m_BlendIndex++] = pV[7];
	m_BlendVertex[m_BlendIndex++] = pV[8];
	m_BlendVertex[m_BlendIndex++] = pV[0];
}

//----------------------------------------------------
// LOD4(4格和2格的过渡层)
// 帖图尺寸(2*2)
//----------------------------------------------------
void CTerrain::DrawLevel_4(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, -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;  
	}
	int point = 0;

	pV[point++] = 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[point++] = HeightmapVertex(float(rx*10), g_Hmap.m_HeightData.m_pData[index0], 
		float(rz*10), g_Hmap.m_pLightColor[index0], ax, az);

	if(m_LODmap[z][x-1] < 4)
	{
		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);
		m_numTriangles++;
	}

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

	if(m_LODmap[z+1][x] < 4)
	{
		pV[point++] = 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);
		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] < 4)
	{
		pV[point++] = 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);
		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] < 4)
	{
		pV[point++] = 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);
		m_numTriangles++;
	}

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

	m_numTriangles += 4;
	g_pD3DDevice->DrawPrimitiveUP(D3DPT_TRIANGLEFAN, point - 2, pV, sizeof(HeightmapVertex));
}

//----------------------------------------------------
// LV5(单层纹理两种渲染方式, 现在是多层纹理)
// LOD1-LOD5为1*1格子
// 帖图尺寸(2*2)
//----------------------------------------------------
void CTerrain::DrawLevel_5(int x, int z)
{
	m_numTriangles += 2;
	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;
	}
	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[4];
	pV[0] = HeightmapVertex(float(rx*10), g_Hmap.m_HeightData.m_pData[index0], 
			float(rz*10), g_Hmap.m_pLightColor[index0], ax, az);

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

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

	pV[3] = HeightmapVertex(float(rx+4)*10, g_Hmap.m_HeightData.m_pData[index2], 
			float(rz*10), g_Hmap.m_pLightColor[index2], dx, dz);
	//--------------------------------
	// 批处理渲染方式
	//--------------------------------
	m_BlendVertex[m_BlendIndex++] = pV[0];
	m_BlendVertex[m_BlendIndex++] = pV[1];
	m_BlendVertex[m_BlendIndex++] = pV[2];
	m_BlendVertex[m_BlendIndex++] = pV[2];
	m_BlendVertex[m_BlendIndex++] = pV[3];
	m_BlendVertex[m_BlendIndex++] = pV[0];
}

//----------------------------------------------------
// LOD6(8格和4格的过渡层)
// 2*2的格子(LV6 & LV7不显示过度纹理)
//----------------------------------------------------
void CTerrain::DrawLevel_6(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+2);
	int index2 = g_Hmap.GetHeightIndex(x+2, z);
	int index3 = g_Hmap.GetHeightIndex(x+2, z+2);
	if(index0==-1 || index1==-1 || index2==-1 || index3==-1)
	{
		return;
	}
	int index4 = g_Hmap.GetHeightIndex(x+1, z+1);
	int index5 = g_Hmap.GetHeightIndex(x, z+1);
	int index6 = g_Hmap.GetHeightIndex(x+1, z+2);
	int index7 = g_Hmap.GetHeightIndex(x+2, z+1);
	int index8 = g_Hmap.GetHeightIndex(x+1, z);

	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+4)*10, g_Hmap.m_HeightData.m_pData[index4], 
		float(rz+4)*10, g_Hmap.m_pLightColor[index4], 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);

	if(m_LODmap[z][x-2] != 7)
	{
		pV[point++] = HeightmapVertex(float(rx*10), g_Hmap.m_HeightData.m_pData[index5], 
			float(rz+4)*10, g_Hmap.m_pLightColor[index5], (ax+bx)*0.5f, (az+bz)*0.5f);
		m_numTriangles++;
	}
	
	pV[point++] = HeightmapVertex(float(rx*10), g_Hmap.m_HeightData.m_pData[index1], 
		float(rz+8)*10, g_Hmap.m_pLightColor[index1], bx, bz);

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

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

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

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

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

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

	m_numTriangles += 4;
	g_pD3DDevice->DrawPrimitiveUP(D3DPT_TRIANGLEFAN, point - 2, pV, sizeof(HeightmapVertex));
}

//----------------------------------------------------
// LOD7使用批处理方式
// 2*2的格子
//----------------------------------------------------
void CTerrain::DrawLevel_7(int x, int z)
{
	m_numTriangles += 2;
	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+2);
	int index2 = g_Hmap.GetHeightIndex(x+2, z);
	int index3 = g_Hmap.GetHeightIndex(x+2, z+2);
	if(index0==-1 || index1==-1 || index2==-1 || index3==-1)
	{
		return;
	}

	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;  
	}
	m_BlendVertex[m_BlendIndex++] = 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++] = HeightmapVertex(float(rx*10), g_Hmap.m_HeightData.m_pData[index1], 
		float(rz+8)*10, g_Hmap.m_pLightColor[index1], bx, bz);

	m_BlendVertex[m_BlendIndex++] = HeightmapVertex(float(rx+8)*10, g_Hmap.m_HeightData.m_pData[index3], 
		float(rz+8)*10, g_Hmap.m_pLightColor[index3], cx, cz);

	m_BlendVertex[m_BlendIndex++] = HeightmapVertex(float(rx+8)*10, g_Hmap.m_HeightData.m_pData[index3], 
		float(rz+8)*10, g_Hmap.m_pLightColor[index3], cx, cz);

	m_BlendVertex[m_BlendIndex++] = HeightmapVertex(float(rx+8)*10, g_Hmap.m_HeightData.m_pData[index2], 
		float(rz*10), g_Hmap.m_pLightColor[index2], dx, dz);

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



⌨️ 快捷键说明

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