ported from perforce
This commit is contained in:
75
DonkeysAndDroids.Godot/HexMeshBuilder.cs
Normal file
75
DonkeysAndDroids.Godot/HexMeshBuilder.cs
Normal file
@@ -0,0 +1,75 @@
|
||||
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;
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user