Files
zfxaction25/DonkeysAndDroids.Godot/HexMeshBuilder.cs
2026-04-19 00:43:27 +02:00

75 lines
2.2 KiB
C#

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;
}
}