using System; using Godot; using Array = Godot.Collections.Array; public static class HexMeshBuilder { public static ArrayMesh CreateFlatHexMesh() { var uvs = new Vector2[19]; var vertices = new Vector3[19]; var normals = new Vector3[19]; const float height = 0.02f; vertices[0] = new(0f, height, 0f); uvs[0] = new(0.5f, 0.5f); normals[0] = Vector3.Up; for (var i = 0; i < 18; i++) { var angleDeg = 60f * i - 30f; var angleRad = Mathf.DegToRad(angleDeg); var x = MathF.Cos(angleRad); var z = MathF.Sin(angleRad); var y = i >= 12 ? height : 0.0f; var s = 1.0f - y; vertices[i + 1] = new(x * s, y, z * s); uvs[i + 1] = i < 6 ? new((i % 6), 0.5f) : i >= 12 ? new Vector2(x * 0.5f + 0.5f, z * 0.5f + 0.5f) : new((i % 6), 0.5f + height); normals[i + 1] = i < 6 ? Vector3.Up : i >= 12 ? new Vector3(x, s, z).Normalized() : new Vector3(x, 0.75f, z).Normalized(); } var indices = new int[18 * 3]; var idx = 0; for (var i = 0; i < 6; i++) { var curr = i + 1; var next = (i + 1) % 6 + 1; indices[idx++] = 0; indices[idx++] = curr + 12; indices[idx++] = next + 12; } for (var j = 0; j < 6; j++) { var curr = j + 7; var next = (j + 1) % 6 + 7; indices[idx++] = curr; indices[idx++] = next; indices[idx++] = next + 6; indices[idx++] = curr; indices[idx++] = next + 6; indices[idx++] = curr + 6; } var arrays = new Array(); arrays.Resize((int)Mesh.ArrayType.Max); arrays[(int)Mesh.ArrayType.Vertex] = vertices; arrays[(int)Mesh.ArrayType.Normal] = normals; arrays[(int)Mesh.ArrayType.Index] = indices; arrays[(int)Mesh.ArrayType.TexUV] = uvs; var mesh = new ArrayMesh(); mesh.AddSurfaceFromArrays(Mesh.PrimitiveType.Triangles, arrays); return mesh; } }