Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- using Godot;
- using System.Collections.Generic;
- using Array = Godot.Collections.Array;
- public class HexMeshGenerator : Spatial {
- private MeshInstance mMeshInstance;
- private ArrayMesh mHexMesh;
- public const int CHUNK_LENGTH = 2;
- public const float INNER_HEX_EDGE_LENGTH = 0.8F;
- public const float OUTER_HEX_EDGE_LENGTH = 1.0F;
- public const float HEX_RADIUS_TO_EDGE_DISTANCE_RATIO = 0.866025404f;
- public const float HEX_CHUNK_SIZE_X = CHUNK_LENGTH * OUTER_HEX_EDGE_LENGTH * HEX_RADIUS_TO_EDGE_DISTANCE_RATIO * 2;
- public const float HEX_CHUNK_SIZE_Y = CHUNK_LENGTH * OUTER_HEX_EDGE_LENGTH * 1.5F;
- public override void _Ready() {
- mMeshInstance = GetNode<MeshInstance>("MeshInstance");
- mHexMesh = new ArrayMesh();
- int hexSum = CHUNK_LENGTH * CHUNK_LENGTH;
- Vector3[] vertices = new Vector3[hexSum * (int)EHexVertices.VERTICE_AMOUNT_PER_HEX];
- Color[] colors = new Color[vertices.Length];
- List<int> indices = new List<int>();
- for (int x = 0; x < CHUNK_LENGTH; x++) {
- for (int y = 0; y < CHUNK_LENGTH; y++) {
- int baseIndex = (x + y * CHUNK_LENGTH) * (int)EHexVertices.VERTICE_AMOUNT_PER_HEX;
- Vector3 centerPoint = new Vector3(x * OUTER_HEX_EDGE_LENGTH * HEX_RADIUS_TO_EDGE_DISTANCE_RATIO * 2 +
- (y % 2 == 0
- ? (OUTER_HEX_EDGE_LENGTH * HEX_RADIUS_TO_EDGE_DISTANCE_RATIO)
- : 0),
- 0,
- y * OUTER_HEX_EDGE_LENGTH * 1.5F);
- vertices[baseIndex + (int)EHexVertices.CENTER] = centerPoint;
- // All the following stuff could also easily be done by just using sin/cos and rotating by 60 degree for each step...
- // But that would have been just too easy....
- vertices[baseIndex + (int)EHexVertices.INNER_HEX_TOP] =
- centerPoint + new Vector3(0, 0, -INNER_HEX_EDGE_LENGTH);
- vertices[baseIndex + (int)EHexVertices.INNER_HEX_RIGHT_TOP] = centerPoint +
- new Vector3(INNER_HEX_EDGE_LENGTH * HEX_RADIUS_TO_EDGE_DISTANCE_RATIO,
- 0,
- -0.5F * INNER_HEX_EDGE_LENGTH);
- vertices[baseIndex + (int)EHexVertices.INNER_HEX_RIGHT_BOTTOM] = centerPoint +
- new Vector3(INNER_HEX_EDGE_LENGTH * HEX_RADIUS_TO_EDGE_DISTANCE_RATIO, 0, 0.5F * INNER_HEX_EDGE_LENGTH);
- vertices[baseIndex + (int)EHexVertices.INNER_HEX_BOTTOM] =
- centerPoint + new Vector3(0, 0, INNER_HEX_EDGE_LENGTH);
- vertices[baseIndex + (int)EHexVertices.INNER_HEX_LEFT_BOTTOM] = centerPoint +
- new Vector3(-INNER_HEX_EDGE_LENGTH * HEX_RADIUS_TO_EDGE_DISTANCE_RATIO, 0, 0.5F * INNER_HEX_EDGE_LENGTH);
- vertices[baseIndex + (int)EHexVertices.INNER_HEX_LEFT_TOP] = centerPoint +
- new Vector3(-INNER_HEX_EDGE_LENGTH * HEX_RADIUS_TO_EDGE_DISTANCE_RATIO, 0,
- -0.5F * INNER_HEX_EDGE_LENGTH);
- // Outer Hex
- vertices[baseIndex + (int)EHexVertices.OUTER_HEX_TOP] =
- centerPoint + new Vector3(0, 0, -OUTER_HEX_EDGE_LENGTH);
- vertices[baseIndex + (int)EHexVertices.OUTER_HEX_RIGHT_TOP] = centerPoint +
- new Vector3(OUTER_HEX_EDGE_LENGTH * HEX_RADIUS_TO_EDGE_DISTANCE_RATIO, 0,
- -0.5F * OUTER_HEX_EDGE_LENGTH);
- vertices[baseIndex + (int)EHexVertices.OUTER_HEX_RIGHT_BOTTOM] = centerPoint +
- new Vector3(OUTER_HEX_EDGE_LENGTH * HEX_RADIUS_TO_EDGE_DISTANCE_RATIO, 0, 0.5F * OUTER_HEX_EDGE_LENGTH);
- vertices[baseIndex + (int)EHexVertices.OUTER_HEX_BOTTOM] =
- centerPoint + new Vector3(0, 0, OUTER_HEX_EDGE_LENGTH);
- vertices[baseIndex + (int)EHexVertices.OUTER_HEX_LEFT_BOTTOM] = centerPoint +
- new Vector3(-OUTER_HEX_EDGE_LENGTH * HEX_RADIUS_TO_EDGE_DISTANCE_RATIO, 0, 0.5F * OUTER_HEX_EDGE_LENGTH);
- vertices[baseIndex + (int)EHexVertices.OUTER_HEX_LEFT_TOP] = centerPoint +
- new Vector3(-OUTER_HEX_EDGE_LENGTH * HEX_RADIUS_TO_EDGE_DISTANCE_RATIO, 0,
- -0.5F * OUTER_HEX_EDGE_LENGTH);
- // Adding indices
- // Inner
- // Inner Top to Right
- indices.Add(baseIndex + (int)EHexVertices.INNER_HEX_TOP);
- indices.Add(baseIndex + (int)EHexVertices.INNER_HEX_RIGHT_TOP);
- indices.Add(baseIndex + (int)EHexVertices.CENTER);
- // Inner TopRight to BottomRight
- indices.Add(baseIndex + (int)EHexVertices.INNER_HEX_RIGHT_TOP);
- indices.Add(baseIndex + (int)EHexVertices.INNER_HEX_RIGHT_BOTTOM);
- indices.Add(baseIndex + (int)EHexVertices.CENTER);
- // Inner BottomRight to Bottom
- indices.Add(baseIndex + (int)EHexVertices.INNER_HEX_RIGHT_BOTTOM);
- indices.Add(baseIndex + (int)EHexVertices.INNER_HEX_BOTTOM);
- indices.Add(baseIndex + (int)EHexVertices.CENTER);
- // Inner Bottom to LeftBottom
- indices.Add(baseIndex + (int)EHexVertices.INNER_HEX_BOTTOM);
- indices.Add(baseIndex + (int)EHexVertices.INNER_HEX_LEFT_BOTTOM);
- indices.Add(baseIndex + (int)EHexVertices.CENTER);
- // Inner LeftBottom to LeftTop
- indices.Add(baseIndex + (int)EHexVertices.INNER_HEX_LEFT_BOTTOM);
- indices.Add(baseIndex + (int)EHexVertices.INNER_HEX_LEFT_TOP);
- indices.Add(baseIndex + (int)EHexVertices.CENTER);
- // Inner LeftTop to Top
- indices.Add(baseIndex + (int)EHexVertices.INNER_HEX_LEFT_TOP);
- indices.Add(baseIndex + (int)EHexVertices.INNER_HEX_TOP);
- indices.Add(baseIndex + (int)EHexVertices.CENTER);
- // =====================================================
- // Outer
- // Outer Outer Top to RightTop
- indices.Add(baseIndex + (int)EHexVertices.OUTER_HEX_TOP);
- indices.Add(baseIndex + (int)EHexVertices.OUTER_HEX_RIGHT_TOP);
- indices.Add(baseIndex + (int)EHexVertices.INNER_HEX_TOP);
- //// Outer Inner Top to RightTop
- indices.Add(baseIndex + (int)EHexVertices.INNER_HEX_TOP);
- indices.Add(baseIndex + (int)EHexVertices.OUTER_HEX_RIGHT_TOP);
- indices.Add(baseIndex + (int)EHexVertices.INNER_HEX_RIGHT_TOP);
- //// Outer Outer RightTop to RightBottom
- indices.Add(baseIndex + (int)EHexVertices.OUTER_HEX_RIGHT_TOP);
- indices.Add(baseIndex + (int)EHexVertices.OUTER_HEX_RIGHT_BOTTOM);
- indices.Add(baseIndex + (int)EHexVertices.INNER_HEX_RIGHT_TOP);
- //// Outer Inner RightTop to RightBottom
- indices.Add(baseIndex + (int)EHexVertices.INNER_HEX_RIGHT_TOP);
- indices.Add(baseIndex + (int)EHexVertices.OUTER_HEX_RIGHT_BOTTOM);
- indices.Add(baseIndex + (int)EHexVertices.INNER_HEX_RIGHT_BOTTOM);
- //// Outer Outer RightBottom to Bottom
- indices.Add(baseIndex + (int)EHexVertices.INNER_HEX_RIGHT_BOTTOM);
- indices.Add(baseIndex + (int)EHexVertices.OUTER_HEX_RIGHT_BOTTOM);
- indices.Add(baseIndex + (int)EHexVertices.OUTER_HEX_BOTTOM);
- //// Outer Inner RightBottom to Bottom
- indices.Add(baseIndex + (int)EHexVertices.INNER_HEX_RIGHT_BOTTOM);
- indices.Add(baseIndex + (int)EHexVertices.OUTER_HEX_BOTTOM);
- indices.Add(baseIndex + (int)EHexVertices.INNER_HEX_BOTTOM);
- //// Outer Outer Bottom to LeftBottom
- indices.Add(baseIndex + (int)EHexVertices.INNER_HEX_BOTTOM);
- indices.Add(baseIndex + (int)EHexVertices.OUTER_HEX_BOTTOM);
- indices.Add(baseIndex + (int)EHexVertices.OUTER_HEX_LEFT_BOTTOM);
- //// Outer Inner Bottom to LeftBottom
- indices.Add(baseIndex + (int)EHexVertices.INNER_HEX_BOTTOM);
- indices.Add(baseIndex + (int)EHexVertices.OUTER_HEX_LEFT_BOTTOM);
- indices.Add(baseIndex + (int)EHexVertices.INNER_HEX_LEFT_BOTTOM);
- //// Outer Outer LeftBottom to LeftTop
- indices.Add(baseIndex + (int)EHexVertices.OUTER_HEX_LEFT_TOP);
- indices.Add(baseIndex + (int)EHexVertices.INNER_HEX_LEFT_BOTTOM);
- indices.Add(baseIndex + (int)EHexVertices.OUTER_HEX_LEFT_BOTTOM);
- //// Outer Inner LeftBottom to LeftTop
- indices.Add(baseIndex + (int)EHexVertices.OUTER_HEX_LEFT_TOP);
- indices.Add(baseIndex + (int)EHexVertices.INNER_HEX_LEFT_TOP);
- indices.Add(baseIndex + (int)EHexVertices.INNER_HEX_LEFT_BOTTOM);
- //// Outer Outer LeftTop to Top
- indices.Add(baseIndex + (int)EHexVertices.OUTER_HEX_TOP);
- indices.Add(baseIndex + (int)EHexVertices.INNER_HEX_LEFT_TOP);
- indices.Add(baseIndex + (int)EHexVertices.OUTER_HEX_LEFT_TOP);
- //// Outer Inner LeftTop to Top
- indices.Add(baseIndex + (int)EHexVertices.OUTER_HEX_TOP);
- indices.Add(baseIndex + (int)EHexVertices.INNER_HEX_TOP);
- indices.Add(baseIndex + (int)EHexVertices.INNER_HEX_LEFT_TOP);
- // Colors
- colors[baseIndex + (int)EHexVertices.CENTER] = new Color(0, 0, 1);
- colors[baseIndex + (int)EHexVertices.INNER_HEX_TOP] = new Color(1, 0, 0);
- colors[baseIndex + (int)EHexVertices.INNER_HEX_LEFT_TOP] = new Color(1, 0, 0);
- colors[baseIndex + (int)EHexVertices.INNER_HEX_LEFT_BOTTOM] = new Color(1, 0, 0);
- colors[baseIndex + (int)EHexVertices.INNER_HEX_RIGHT_TOP] = new Color(1, 0, 0);
- colors[baseIndex + (int)EHexVertices.INNER_HEX_RIGHT_BOTTOM] = new Color(1, 0, 0);
- colors[baseIndex + (int)EHexVertices.INNER_HEX_BOTTOM] = new Color(1, 0, 0);
- colors[baseIndex + (int)EHexVertices.OUTER_HEX_TOP] = new Color(0, 1, 0);
- colors[baseIndex + (int)EHexVertices.OUTER_HEX_LEFT_TOP] = new Color(0, 1, 0);
- colors[baseIndex + (int)EHexVertices.OUTER_HEX_LEFT_BOTTOM] = new Color(0, 1, 0);
- colors[baseIndex + (int)EHexVertices.OUTER_HEX_RIGHT_TOP] = new Color(0, 1, 0);
- colors[baseIndex + (int)EHexVertices.OUTER_HEX_RIGHT_BOTTOM] = new Color(0, 1, 0);
- colors[baseIndex + (int)EHexVertices.OUTER_HEX_BOTTOM] = new Color(0, 1, 0);
- }
- }
- // Create ArrayMesh
- Array meshArrays = new Array();
- meshArrays.Resize((int)ArrayMesh.ArrayType.Max);
- meshArrays[(int)ArrayMesh.ArrayType.Vertex] = vertices;
- meshArrays[(int)ArrayMesh.ArrayType.Index] = indices.ToArray();
- meshArrays[(int)ArrayMesh.ArrayType.Color] = colors;
- mHexMesh.AddSurfaceFromArrays(Mesh.PrimitiveType.Triangles, meshArrays);
- mMeshInstance.Mesh = mHexMesh;
- }
- public override void _Process(float delta) {
- }
- public enum EHexVertices {
- CENTER = 0,
- INNER_HEX_TOP = 1,
- INNER_HEX_RIGHT_TOP = 2,
- INNER_HEX_RIGHT_BOTTOM = 3,
- INNER_HEX_BOTTOM = 4,
- INNER_HEX_LEFT_BOTTOM = 5,
- INNER_HEX_LEFT_TOP = 6,
- OUTER_HEX_TOP = 7,
- OUTER_HEX_RIGHT_TOP = 8,
- OUTER_HEX_RIGHT_BOTTOM = 9,
- OUTER_HEX_BOTTOM = 10,
- OUTER_HEX_LEFT_BOTTOM = 11,
- OUTER_HEX_LEFT_TOP = 12,
- VERTICE_AMOUNT_PER_HEX = 13,
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement