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