📄 terrain.cpp
字号:
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 + -