75 lines
2.2 KiB
C#
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;
|
|
}
|
|
} |