/** * Generate a triagle mesh for the hexagon */ public ITriangleMesh GenerateMesh() { ITriangleMesh mesh = new TriangleMesh(); Vector2[] texCoords = new Vector2[7]; Vector2 texCoordCenter = new Vector2(0.2f, 0.2f); for (int i = 0; i < 6; i++) { Vector3 v = GetCorner(i); mesh.AddVertex(v); texCoords[i] = getTexCoord(0.2f, texCoordCenter, i); } mesh.AddVertex(pos); texCoords[6] = texCoordCenter; int texCoordStartIndex = mesh.GetNumberOfTexCoords(); for (int i = 0; i < 7; i++) { mesh.AddTextureCoordinate(texCoords[i]); } for (int i = 0; i < 6; i++) { Triangle t = new Triangle(i, 6, (i + 1) % 6, texCoordStartIndex + i, texCoordStartIndex + 6, texCoordStartIndex + (i + 1) % 6); mesh.AddTriangle(t); } mesh.ComputeTriangleNormals(); return(mesh); }
public ITriangleMesh GenerateIslandMesh() { HexagonField field = new HexagonField(); field.GenerateField(); ITriangleMesh mesh = new TriangleMesh(); // Top ITriangleMesh topMesh = CreateTopSurface(field.GetAllHexagons()); TriangleMeshFactory.Unite(mesh, topMesh); // Grass float grassBorderHeight = field.SideLength * 0.1f; Vector2[] grassBoundaryTexCoords = { new Vector2(0.1f, 0.1f), new Vector2(0.1f, 0.2f), new Vector2(0.2f, 0.1f), new Vector2(0.2f, 0.2f) }; ITriangleMesh grassBoundary = CreateBoundary(mesh, field.SideLength, grassBorderHeight, grassBorderHeight, new Vector3(0, 0, 0), grassBoundaryTexCoords); TriangleMeshFactory.Unite(mesh, grassBoundary); // Middle-bottom ITriangleMesh middleMesh = CreateMiddle(mesh, field.GetBorderHexagons(), field.SideLength); TriangleMeshFactory.Unite(mesh, middleMesh); ITriangleMesh bottomMesh = CreateTopSurface(field.GetNonBorderHexagons()); // Mud float mudHeight = 2 * field.SideLength; float mudBorderHeight = field.SideLength * 0.3f; Vector2[] mudBoundaryTexCoords = { new Vector2(0.7f, 0.1f), new Vector2(0.7f, 0.2f), new Vector2(0.8f, 0.1f), new Vector2(0.8f, 0.2f) }; ITriangleMesh mudBoundary = CreateBoundary(bottomMesh, mudHeight, 0, mudBorderHeight, new Vector3(0, 0, 0), mudBoundaryTexCoords); TriangleMeshFactory.Translate(mudBoundary, new Vector3(0, 0, -field.SideLength)); TriangleMeshFactory.Unite(mesh, mudBoundary); // Bottom TriangleMeshFactory.Flip(bottomMesh); TriangleMeshFactory.Translate(bottomMesh, new Vector3(0, 0, -(mudHeight + field.SideLength))); TriangleMeshFactory.Unite(mesh, bottomMesh); mesh = TriangleMeshFactory.Snap(mesh, 1e-5f); mesh.ComputeTriangleNormals(); mesh.SetTexture(new Texture("textures/island.png")); return(mesh); }