lodterrain.cpp

来自「里内面有两个关于地形的模拟的范例,仔细看一下会收获不小啊」· C++ 代码 · 共 1,235 行 · 第 1/3 页

CPP
1,235
字号
			i=0;
			GenerateVertex(x+iChildNodeOffset,z-iChildNodeOffset,vertices[i]);
			i++;
			GenerateVertex(fRightX,z,vertices[i]);
			i++;
			if((x+iOutChildNodeOffset)<=m_iTerrainSize && GetQuadMatData(iX+iOutChildNodeOffset,iZ-iChildNodeOffset)==true){
				GenerateVertex(fRightX,z-iChildNodeOffset,vertices[i]);
				i++;
			}
			GenerateVertex(fRightX,fBottomZ,vertices[i]);
			i++;
			if((z-iOutChildNodeOffset)>=0 && GetQuadMatData(iX+iChildNodeOffset,iZ-iOutChildNodeOffset)==true){
				GenerateVertex(x+iChildNodeOffset,fBottomZ,vertices[i]); 
				i++;
			}
			GenerateVertex(x,fBottomZ,vertices[i]);
			i++;
			GenerateVertex(x,z-iChildNodeOffset,vertices[i]);
			i++;
			GenerateVertex(x,z,vertices[i]);
			i++;
			GenerateVertex(x+iChildNodeOffset,z,vertices[i]);
			i++;
			GenerateVertex(fRightX,z,vertices[i]);
			i++;
			//渲染三角扇形
			RenderTriFan(vertices,i);
			//继续分割其余3个节点
			RenderNode(x-iChildNodeOffset,z-iChildNodeOffset,iChildNodeLength);
			RenderNode(x-iChildNodeOffset,z+iChildNodeOffset,iChildNodeLength);
			RenderNode(x+iChildNodeOffset,z+iChildNodeOffset,iChildNodeLength);
		}
		if(bTopRight==true && bTopLeft==true && bBottomRight==true && bBottomLeft==false){
			i=0;
			GenerateVertex(x-iChildNodeOffset,z-iChildNodeOffset,vertices[i]);
			i++;
			GenerateVertex(x,z,vertices[i]);
			i++;
			GenerateVertex(x,z-iChildNodeOffset,vertices[i]);
			i++;
			GenerateVertex(x,fBottomZ,vertices[i]);
			i++;
			if((z-iOutChildNodeOffset)>=0 && GetQuadMatData(iX-iChildNodeOffset,iZ-iOutChildNodeOffset)==true){
				GenerateVertex(x-iChildNodeOffset,fBottomZ,vertices[i]);
				i++;
			}
			GenerateVertex(fLeftX,fBottomZ,vertices[i]);
			i++;
			if((x-iOutChildNodeOffset)>=0 && GetQuadMatData(iX-iOutChildNodeOffset,iZ-iChildNodeOffset)==true){
				GenerateVertex(fLeftX,z-iChildNodeOffset,vertices[i]);
				i++;
			}
			GenerateVertex(fLeftX,z,vertices[i]);
			i++;
			GenerateVertex(x-iChildNodeOffset,z,vertices[i]);
			i++;
			GenerateVertex(x,z,vertices[i]);
			i++;
			//渲染三角扇形
			RenderTriFan(vertices,i);
			//继续分割其余3个节点
			RenderNode(x-iChildNodeOffset,z+iChildNodeOffset,iChildNodeLength);
			RenderNode(x+iChildNodeOffset,z+iChildNodeOffset,iChildNodeLength);
			RenderNode(x+iChildNodeOffset,z-iChildNodeOffset,iChildNodeLength);
		}
		//2个节点分割的情形
		if(bTopRight==true && bTopLeft==false && bBottomRight==true && bBottomLeft==false){
			//渲染第1个三角扇形
			i=0;
			GenerateVertex(x-iChildNodeOffset,z+iChildNodeOffset,vertices[i]);
			i++;
			GenerateVertex(x,fTopZ,vertices[i]);
			i++;
			GenerateVertex(x,z+iChildNodeOffset,vertices[i]);
			i++;
			GenerateVertex(x,z,vertices[i]);
			i++;
			GenerateVertex(fLeftX,z,vertices[i]);
			i++;
			if((x-iOutChildNodeOffset)>=0 && GetQuadMatData(iX-iOutChildNodeOffset,iZ+iChildNodeOffset)==true){
				GenerateVertex(fLeftX,z+iChildNodeOffset,vertices[i]);
				i++;
			}
			GenerateVertex(fLeftX,fTopZ,vertices[i]);
			i++;
			if((z+iOutChildNodeOffset)<=m_iTerrainSize && GetQuadMatData(iX-iChildNodeOffset,iZ+iOutChildNodeOffset)==true){
				GenerateVertex(x-iChildNodeOffset,fTopZ,vertices[i]);
				i++;
			}
			GenerateVertex(x,fTopZ,vertices[i]);
			i++;
			RenderTriFan(vertices,i);		
			//渲染第2个三角扇形
			i=0;
			GenerateVertex(x-iChildNodeOffset,z-iChildNodeOffset,vertices[i]);
			i++;
			GenerateVertex(x,z,vertices[i]);
			i++;
			GenerateVertex(x,z-iChildNodeOffset,vertices[i]);
			i++;
			GenerateVertex(x,fBottomZ,vertices[i]);
			i++;
			if((z-iOutChildNodeOffset)>=0 && GetQuadMatData(iX-iChildNodeOffset,iZ-iOutChildNodeOffset)==true){
				GenerateVertex(x-iChildNodeOffset,fBottomZ,vertices[i]);
				i++;
			}
			GenerateVertex(fLeftX,fBottomZ,vertices[i]);
			i++;
			if((x-iOutChildNodeOffset)>=0 && GetQuadMatData(iX-iOutChildNodeOffset,iZ-iChildNodeOffset)==true){
				GenerateVertex(fLeftX,z-iChildNodeOffset,vertices[i]);
				i++;
			}
			GenerateVertex(fLeftX,z,vertices[i]);
			i++;
			GenerateVertex(x,z,vertices[i]);
			i++;
			RenderTriFan(vertices,i);	
			//继续分割其余2个节点
			RenderNode(x+iChildNodeOffset,z+iChildNodeOffset,iChildNodeLength);
			RenderNode(x+iChildNodeOffset,z-iChildNodeOffset,iChildNodeLength);
		}	
		if(bTopRight==true && bTopLeft==false && bBottomRight==false && bBottomLeft==true){
			i=0;
			GenerateVertex(x-iChildNodeOffset,z+iChildNodeOffset,vertices[i]);
			i++;
			GenerateVertex(x,fTopZ,vertices[i]);
			i++;
			GenerateVertex(x,z+iChildNodeOffset,vertices[i]);
			i++;
			GenerateVertex(x,z,vertices[i]);
			i++;
			GenerateVertex(x-iChildNodeOffset,z,vertices[i]);
			i++;
			GenerateVertex(fLeftX,z,vertices[i]);
			i++;
			if((x-iOutChildNodeOffset)>=0 && GetQuadMatData(iX-iOutChildNodeOffset,iZ+iChildNodeOffset)==true){
				GenerateVertex(fLeftX,z+iChildNodeOffset,vertices[i]);
				i++;
			}
			GenerateVertex(fLeftX,fTopZ,vertices[i]);
			i++;
			if((z+iOutChildNodeOffset)<=m_iTerrainSize && GetQuadMatData(iX-iChildNodeOffset,iZ+iOutChildNodeOffset)==true){
				GenerateVertex(x-iChildNodeOffset,fTopZ,vertices[i]);
				i++;
			}
			GenerateVertex(x,fTopZ,vertices[i]);
			i++;
			RenderTriFan(vertices,i);
			//
			i=0;
			GenerateVertex(x+iChildNodeOffset,z-iChildNodeOffset,vertices[i]);
			i++;
			GenerateVertex(fRightX,z,vertices[i]);
			i++;
			if((x+iOutChildNodeOffset)<=m_iTerrainSize && GetQuadMatData(iX+iOutChildNodeOffset,iZ-iChildNodeOffset)==true){
				GenerateVertex(fRightX,z-iChildNodeOffset,vertices[i]);
				i++;
			}
			GenerateVertex(fRightX,fBottomZ,vertices[i]);
			i++;
			if((z-iOutChildNodeOffset)>=0 && GetQuadMatData(iX+iChildNodeOffset,iZ-iOutChildNodeOffset)==true){
				GenerateVertex(x+iChildNodeOffset,fBottomZ,vertices[i]);
				i++;
			}
			GenerateVertex(x,fBottomZ,vertices[i]);
			i++;
			GenerateVertex(x,z-iChildNodeOffset,vertices[i]);
			i++;
			GenerateVertex(x,z,vertices[i]);
			i++;
			GenerateVertex(x+iChildNodeOffset,z,vertices[i]);
			i++;
			GenerateVertex(fRightX,z,vertices[i]);
			i++;
			RenderTriFan(vertices,i);
			//
			RenderNode(x+iChildNodeOffset,z+iChildNodeOffset,iChildNodeLength);
			RenderNode(x-iChildNodeOffset,z-iChildNodeOffset,iChildNodeLength);
		}
		if(bTopRight==true && bTopLeft==true && bBottomRight==false && bBottomLeft==false){
			i=0;
			GenerateVertex(x+iChildNodeOffset,z-iChildNodeOffset,vertices[i]);
			i++;
			GenerateVertex(fRightX,z,vertices[i]);
			i++;
			if((x+iOutChildNodeOffset)<=m_iTerrainSize && GetQuadMatData(iX+iOutChildNodeOffset,iZ-iChildNodeOffset)==true){
				GenerateVertex(fRightX,z-iChildNodeOffset,vertices[i]);
				i++;
			}
			GenerateVertex(fRightX,fBottomZ,vertices[i]);
			i++;
			if((z-iOutChildNodeOffset)>=0 && GetQuadMatData(iX+iChildNodeOffset,iZ-iOutChildNodeOffset)==true){
				GenerateVertex(x+iChildNodeOffset,fBottomZ,vertices[i]);
				i++;
			}
			GenerateVertex(x,fBottomZ,vertices[i]);
			i++;
			GenerateVertex(x,z,vertices[i]);
			i++;
			GenerateVertex(x+iChildNodeOffset,z,vertices[i]);
			i++;
			GenerateVertex(fRightX,z,vertices[i]);
			i++;
			RenderTriFan(vertices,i);
			//渲染第2个三角扇形
			i=0;
			GenerateVertex(x-iChildNodeOffset,z-iChildNodeOffset,vertices[i]);
			i++;
			GenerateVertex(x,z,vertices[i]);
			i++;
			GenerateVertex(x,fBottomZ,vertices[i]);
			i++;
			if((z-iOutChildNodeOffset)>=0 && GetQuadMatData(iX-iChildNodeOffset,iZ-iOutChildNodeOffset)==true){
				GenerateVertex(x-iChildNodeOffset,fBottomZ,vertices[i]);//////
				i++;
			}
			GenerateVertex(fLeftX,fBottomZ,vertices[i]);
			i++;
			if((x-iOutChildNodeOffset)>=0 && GetQuadMatData(iX-iOutChildNodeOffset,iZ-iChildNodeOffset)==true){
				GenerateVertex(fLeftX,z-iChildNodeOffset,vertices[i]);
				i++;
			}
			GenerateVertex(fLeftX,z,vertices[i]);
			i++;
			GenerateVertex(x-iChildNodeOffset,z,vertices[i]);
			i++;
			GenerateVertex(x,z,vertices[i]);
			i++;
			RenderTriFan(vertices,i);
			//
			RenderNode(x+iChildNodeOffset,z+iChildNodeOffset,iChildNodeLength);
			RenderNode(x-iChildNodeOffset,z+iChildNodeOffset,iChildNodeLength);
		}
		if(bTopRight==false && bTopLeft==false && bBottomRight==true && bBottomLeft==true){
			i=0;
			GenerateVertex(x+iChildNodeOffset,z+iChildNodeOffset,vertices[i]);
			i++;
			GenerateVertex(fRightX,fTopZ,vertices[i]);
			i++;
			if((x+iOutChildNodeOffset)<=m_iTerrainSize && GetQuadMatData(iX+iOutChildNodeOffset,iZ+iChildNodeOffset)==true){
				GenerateVertex(fRightX,z+iChildNodeOffset,vertices[i]);
				i++;
			}
			GenerateVertex(fRightX,z,vertices[i]);
			i++;
			GenerateVertex(x+iChildNodeOffset,z,vertices[i]);
			i++;
			GenerateVertex(x,z,vertices[i]);
			i++;
			GenerateVertex(x,fTopZ,vertices[i]);
			i++;
			if((z+iOutChildNodeOffset)<=m_iTerrainSize && GetQuadMatData(iX+iChildNodeOffset,iZ+iOutChildNodeOffset)==true){
				GenerateVertex(x+iChildNodeOffset,fTopZ,vertices[i]);
				i++;
			}
			GenerateVertex(fRightX,fTopZ,vertices[i]);
			i++;
			RenderTriFan(vertices,i);
			//渲染第2个三角扇形
			i=0;
			GenerateVertex(x-iChildNodeOffset,z+iChildNodeOffset,vertices[i]);
			i++;
			GenerateVertex(x,fTopZ,vertices[i]);
			i++;
			GenerateVertex(x,z,vertices[i]);
			i++;
			GenerateVertex(x-iChildNodeOffset,z,vertices[i]);
			i++;
			GenerateVertex(fLeftX,z,vertices[i]);
			i++;
			if((x-iOutChildNodeOffset)>=0 && GetQuadMatData(iX-iOutChildNodeOffset,iZ+iChildNodeOffset)==true){
				GenerateVertex(fLeftX,z+iChildNodeOffset,vertices[i]);
				i++;
			}
			GenerateVertex(fLeftX,fTopZ,vertices[i]);
			i++;
			if((z+iOutChildNodeOffset)<=m_iTerrainSize && GetQuadMatData(iX-iChildNodeOffset,iZ+iOutChildNodeOffset)==true){
				GenerateVertex(x-iChildNodeOffset,fTopZ,vertices[i]);
				i++;
			}
			GenerateVertex(x,fTopZ,vertices[i]);
			i++;
			RenderTriFan(vertices,i);
			//
			RenderNode(x+iChildNodeOffset,z-iChildNodeOffset,iChildNodeLength);
			RenderNode(x-iChildNodeOffset,z-iChildNodeOffset,iChildNodeLength);
		}
		if(bTopRight==false && bTopLeft==true && bBottomRight==true && bBottomLeft==false){
			i=0;
			GenerateVertex(x+iChildNodeOffset,z+iChildNodeOffset,vertices[i]);
			i++;
			GenerateVertex(fRightX,fTopZ,vertices[i]);
			i++;
			if((x+iOutChildNodeOffset)<=m_iTerrainSize && GetQuadMatData(iX+iOutChildNodeOffset,iZ+iChildNodeOffset)==true){
				GenerateVertex(fRightX,z+iChildNodeOffset,vertices[i]);
				i++;
			}
			GenerateVertex(fRightX,z,vertices[i]);
			i++;
			GenerateVertex(x+iChildNodeOffset,z,vertices[i]);
			i++;
			GenerateVertex(x,z,vertices[i]);
			i++;
			GenerateVertex(x,z+iChildNodeOffset,vertices[i]);
			i++;
			GenerateVertex(x,fTopZ,vertices[i]);
			i++;
			if((z+iOutChildNodeOffset)<=m_iTerrainSize && GetQuadMatData(iX+iChildNodeOffset,iZ+iOutChildNodeOffset)==true){
				GenerateVertex(x+iChildNodeOffset,fTopZ,vertices[i]);
				i++;
			}
			GenerateVertex(fRightX,fTopZ,vertices[i]);
			i++;
			RenderTriFan(vertices,i);
			//渲染第2个三角扇形
			i=0;
			GenerateVertex(x-iChildNodeOffset,z-iChildNodeOffset,vertices[i]);
			i++;
			GenerateVertex(x,z,vertices[i]);
			i++;
			GenerateVertex(x,z-iChildNodeOffset,vertices[i]);
			i++;
			GenerateVertex(x,fBottomZ,vertices[i]);
			i++;
			if((z-iOutChildNodeOffset)>=0 && GetQuadMatData(iX-iChildNodeOffset,iZ-iOutChildNodeOffset)==true){
				GenerateVertex(x-iChildNodeOffset,fBottomZ,vertices[i]);
				i++;
			}
			GenerateVertex(fLeftX,fBottomZ,vertices[i]);
			i++;
			if((x-iOutChildNodeOffset)>=0 && GetQuadMatData(iX-iOutChildNodeOffset,iZ-iChildNodeOffset)==true){
				GenerateVertex(fLeftX,z-iChildNodeOffset,vertices[i]);
				i++;
			}
			GenerateVertex(fLeftX,z,vertices[i]);
			i++;
			GenerateVertex(x-iChildNodeOffset,z,vertices[i]);
			i++;
			GenerateVertex(x,z,vertices[i]);
			i++;
			RenderTriFan(vertices,i);
			//
			RenderNode(x+iChildNodeOffset,z-iChildNodeOffset,iChildNodeLength);
			RenderNode(x-iChildNodeOffset,z+iChildNodeOffset,iChildNodeLength);
		}
		if(bTopRight==false && bTopLeft==true && bBottomRight==false && bBottomLeft==true){
			i=0;
			GenerateVertex(x+iChildNodeOffset,z+iChildNodeOffset,vertices[i]);
			i++;
			GenerateVertex(fRightX,fTopZ,vertices[i]);
			i++;
			if((x+iOutChildNodeOffset)<=m_iTerrainSize && GetQuadMatData(iX+iOutChildNodeOffset,iZ+iChildNodeOffset)==true){
				GenerateVertex(fRightX,z+iChildNodeOffset,vertices[i]);
				i++;
			}
			GenerateVertex(fRightX,z,vertices[i]);
			i++;
			GenerateVertex(x,z,vertices[i]);
			i++;
			GenerateVertex(x,z+iChildNodeOffset,vertices[i]);
			i++;
			GenerateVertex(x,fTopZ,vertices[i]);
			i++;
			if((z+iOutChildNodeOffset)<=m_iTerrainSize && GetQuadMatData(iX+iChildNodeOffset,iZ+iOutChildNodeOffset)==true){
				GenerateVertex(x+iChildNodeOffset,fTopZ,vertices[i]);  
				i++;
			}
			GenerateVertex(fRightX,fTopZ,vertices[i]);
			i++;
			RenderTriFan(vertices,i);
			//渲染第2个三角扇形
			i=0;
			GenerateVertex(x+iChildNodeOffset,z-iChildNodeOffset,vertices[i]);
			i++;
			GenerateVertex(fRightX,z,vertices[i]);
			i++;
			if((x+iOutChildNodeOffset)<=m_iTerrainSize && GetQuadMatData(iX+iOutChildNodeOffset,iZ-iChildNodeOffset)==true){
				GenerateVertex(fRightX,z-iChildNodeOffset,vertices[i]);
				i++;
			}
			GenerateVertex(fRightX,fBottomZ,vertices[i]);
			i++;
			if((z-iOutChildNodeOffset)>=0 && GetQuadMatData(iX+iChildNodeOffset,iZ-iOutChildNodeOffset)==true){
				GenerateVertex(x+iChildNodeOffset,fBottomZ,vertices[i]);
				i++;
			}
			GenerateVertex(x,fBottomZ,vertices[i]);
			i++;
			GenerateVertex(x,z-iChildNodeOffset,vertices[i]);
			i++;
			GenerateVertex(x,z,vertices[i]);
			i++;
			GenerateVertex(fRightX,z,vertices[i]);
			i++;
			RenderTriFan(vertices,i);
			//
			RenderNode(x-iChildNodeOffset,z+iChildNodeOffset,iChildNodeLength);
			RenderNode(x-iChildNodeOffset,z-iChildNodeOffset,iChildNodeLength);
		}
		//1个节点继续分割的情形
		if(bTopRight==true && bTopLeft==false && bBottomRight==false && bBottomLeft==false){
			i=0;
			GenerateVertex(x+iChildNodeOffset,z-iChildNodeOffset,vertices[i]);
			i++;
			GenerateVertex(fRightX,z,vertices[i]);
			i++;
			if((x+iOutChildNodeOffset)<=m_iTerrainSize && GetQuadMatData(iX+iOutChildNodeOffset,iZ-iChildNodeOffset)==true){
				GenerateVertex(fRightX,z-iChildNodeOffset,vertices[i]);
				i++;
			}
			GenerateVertex(fRightX,fBottomZ,vertices[i]);
			i++;

⌨️ 快捷键说明

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