public Terrain CreateTerrain() { var terrain = new Terrain() { AmbientColor = new Vector3(0.1f, 0.1f, 0.1f), DiffuseColor = Color.White.ToVector3(), SpecularColor = Color.White.ToVector3(), Shininess = 40, Texture = PrimaryTexture, SecondaryTexture = SecondaryTexture, MarkTexture = MarkTexture }; GenerateVertices(terrain, GeneratePositions()); for(int i = 0; i < SquareCount; ++i) for (int j = 0; j < SquareCount; ++j) { terrain.AddIndex((i + 1) * (SquareCount + 1) + j); terrain.AddIndex(i * (SquareCount + 1) + j + 1); terrain.AddIndex(i*(SquareCount + 1) + j); terrain.AddIndex((i + 1)*(SquareCount + 1) + j); terrain.AddIndex((i + 1)*(SquareCount + 1) + j + 1); terrain.AddIndex(i*(SquareCount + 1) + j + 1); } terrain.InitializePrimitive(GraphicsDevice); return terrain; }
private void GenerateVertices(Terrain terrain, Vector3[,] positions) { for(int i = 0; i < SquareCount+1; ++i) for (int j = 0; j < SquareCount + 1; ++j) { var textureCoordinates = new Vector2(i / (float)SquareCount, (float)j / (float)SquareCount); var normal = (i == 0 || j == 0 || i == SquareCount || j == SquareCount) ? Vector3.Up : CalculateNormal(i, j, positions); terrain.AddVertex(positions[i, j], normal, textureCoordinates); } }