Advertisement
Guest User

Godot Weird y Axis Offset using ArrayMesh

a guest
Feb 5th, 2022
52
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C# 10.81 KB | None | 0 0
  1. using Godot;
  2. using System.Collections.Generic;
  3. using Array = Godot.Collections.Array;
  4.  
  5. public class HexMeshGenerator : Spatial {
  6.  
  7.     private MeshInstance mMeshInstance;
  8.     private ArrayMesh mHexMesh;
  9.    
  10.     public const int CHUNK_LENGTH = 2;
  11.     public const float INNER_HEX_EDGE_LENGTH = 0.8F;
  12.     public const float OUTER_HEX_EDGE_LENGTH = 1.0F;
  13.    
  14.     public const float HEX_RADIUS_TO_EDGE_DISTANCE_RATIO = 0.866025404f;
  15.    
  16.     public const float HEX_CHUNK_SIZE_X = CHUNK_LENGTH * OUTER_HEX_EDGE_LENGTH * HEX_RADIUS_TO_EDGE_DISTANCE_RATIO * 2;
  17.     public const float HEX_CHUNK_SIZE_Y = CHUNK_LENGTH * OUTER_HEX_EDGE_LENGTH * 1.5F;
  18.    
  19.     public override void _Ready() {
  20.        
  21.         mMeshInstance = GetNode<MeshInstance>("MeshInstance");
  22.         mHexMesh = new ArrayMesh();
  23.        
  24.         int hexSum = CHUNK_LENGTH * CHUNK_LENGTH;
  25.         Vector3[] vertices = new Vector3[hexSum * (int)EHexVertices.VERTICE_AMOUNT_PER_HEX];
  26.         Color[] colors = new Color[vertices.Length];
  27.         List<int> indices = new List<int>();
  28.        
  29.         for (int x = 0; x < CHUNK_LENGTH; x++) {
  30.            
  31.             for (int y = 0; y < CHUNK_LENGTH; y++) {
  32.                
  33.                 int baseIndex = (x + y * CHUNK_LENGTH) * (int)EHexVertices.VERTICE_AMOUNT_PER_HEX;
  34.                
  35.                 Vector3 centerPoint = new Vector3(x * OUTER_HEX_EDGE_LENGTH * HEX_RADIUS_TO_EDGE_DISTANCE_RATIO * 2 +
  36.                                                   (y % 2 == 0
  37.                                                       ? (OUTER_HEX_EDGE_LENGTH * HEX_RADIUS_TO_EDGE_DISTANCE_RATIO)
  38.                                                       : 0),
  39.                     0,
  40.                     y * OUTER_HEX_EDGE_LENGTH * 1.5F);
  41.                
  42.                 vertices[baseIndex + (int)EHexVertices.CENTER] = centerPoint;
  43.                
  44.                 // All the following stuff could also easily be done by just using sin/cos and rotating by 60 degree for each step...
  45.                 // But that would have been just too easy....
  46.                 vertices[baseIndex + (int)EHexVertices.INNER_HEX_TOP] =
  47.                     centerPoint + new Vector3(0, 0, -INNER_HEX_EDGE_LENGTH);
  48.                
  49.                 vertices[baseIndex + (int)EHexVertices.INNER_HEX_RIGHT_TOP] = centerPoint +
  50.                                                                               new Vector3(INNER_HEX_EDGE_LENGTH * HEX_RADIUS_TO_EDGE_DISTANCE_RATIO,
  51.                                                                                   0,
  52.                                                                                   -0.5F * INNER_HEX_EDGE_LENGTH);
  53.                
  54.                 vertices[baseIndex + (int)EHexVertices.INNER_HEX_RIGHT_BOTTOM] = centerPoint +
  55.                     new Vector3(INNER_HEX_EDGE_LENGTH * HEX_RADIUS_TO_EDGE_DISTANCE_RATIO, 0, 0.5F * INNER_HEX_EDGE_LENGTH);
  56.                
  57.                 vertices[baseIndex + (int)EHexVertices.INNER_HEX_BOTTOM] =
  58.                     centerPoint + new Vector3(0, 0, INNER_HEX_EDGE_LENGTH);
  59.                
  60.                 vertices[baseIndex + (int)EHexVertices.INNER_HEX_LEFT_BOTTOM] = centerPoint +
  61.                     new Vector3(-INNER_HEX_EDGE_LENGTH * HEX_RADIUS_TO_EDGE_DISTANCE_RATIO, 0, 0.5F * INNER_HEX_EDGE_LENGTH);
  62.                
  63.                 vertices[baseIndex + (int)EHexVertices.INNER_HEX_LEFT_TOP] = centerPoint +
  64.                                                                              new Vector3(-INNER_HEX_EDGE_LENGTH * HEX_RADIUS_TO_EDGE_DISTANCE_RATIO, 0,
  65.                                                                                  -0.5F * INNER_HEX_EDGE_LENGTH);
  66.                
  67.                 // Outer Hex
  68.                 vertices[baseIndex + (int)EHexVertices.OUTER_HEX_TOP] =
  69.                     centerPoint + new Vector3(0, 0, -OUTER_HEX_EDGE_LENGTH);
  70.                
  71.                 vertices[baseIndex + (int)EHexVertices.OUTER_HEX_RIGHT_TOP] = centerPoint +
  72.                                                                               new Vector3(OUTER_HEX_EDGE_LENGTH * HEX_RADIUS_TO_EDGE_DISTANCE_RATIO, 0,
  73.                                                                                   -0.5F * OUTER_HEX_EDGE_LENGTH);
  74.                
  75.                 vertices[baseIndex + (int)EHexVertices.OUTER_HEX_RIGHT_BOTTOM] = centerPoint +
  76.                     new Vector3(OUTER_HEX_EDGE_LENGTH * HEX_RADIUS_TO_EDGE_DISTANCE_RATIO, 0, 0.5F * OUTER_HEX_EDGE_LENGTH);
  77.                
  78.                 vertices[baseIndex + (int)EHexVertices.OUTER_HEX_BOTTOM] =
  79.                     centerPoint + new Vector3(0, 0, OUTER_HEX_EDGE_LENGTH);
  80.                
  81.                 vertices[baseIndex + (int)EHexVertices.OUTER_HEX_LEFT_BOTTOM] = centerPoint +
  82.                     new Vector3(-OUTER_HEX_EDGE_LENGTH * HEX_RADIUS_TO_EDGE_DISTANCE_RATIO, 0, 0.5F * OUTER_HEX_EDGE_LENGTH);
  83.                
  84.                 vertices[baseIndex + (int)EHexVertices.OUTER_HEX_LEFT_TOP] = centerPoint +
  85.                                                                              new Vector3(-OUTER_HEX_EDGE_LENGTH * HEX_RADIUS_TO_EDGE_DISTANCE_RATIO, 0,
  86.                                                                                  -0.5F * OUTER_HEX_EDGE_LENGTH);
  87.                
  88.                 // Adding indices
  89.                 // Inner
  90.                 // Inner Top to Right
  91.                 indices.Add(baseIndex + (int)EHexVertices.INNER_HEX_TOP);
  92.                 indices.Add(baseIndex + (int)EHexVertices.INNER_HEX_RIGHT_TOP);
  93.                 indices.Add(baseIndex + (int)EHexVertices.CENTER);
  94.                
  95.                 // Inner TopRight to BottomRight
  96.                 indices.Add(baseIndex + (int)EHexVertices.INNER_HEX_RIGHT_TOP);
  97.                 indices.Add(baseIndex + (int)EHexVertices.INNER_HEX_RIGHT_BOTTOM);
  98.                 indices.Add(baseIndex + (int)EHexVertices.CENTER);
  99.                
  100.                 // Inner BottomRight to Bottom
  101.                 indices.Add(baseIndex + (int)EHexVertices.INNER_HEX_RIGHT_BOTTOM);
  102.                 indices.Add(baseIndex + (int)EHexVertices.INNER_HEX_BOTTOM);
  103.                 indices.Add(baseIndex + (int)EHexVertices.CENTER);
  104.                
  105.                 // Inner Bottom to LeftBottom
  106.                 indices.Add(baseIndex + (int)EHexVertices.INNER_HEX_BOTTOM);
  107.                 indices.Add(baseIndex + (int)EHexVertices.INNER_HEX_LEFT_BOTTOM);
  108.                 indices.Add(baseIndex + (int)EHexVertices.CENTER);
  109.                
  110.                 // Inner LeftBottom to LeftTop
  111.                 indices.Add(baseIndex + (int)EHexVertices.INNER_HEX_LEFT_BOTTOM);
  112.                 indices.Add(baseIndex + (int)EHexVertices.INNER_HEX_LEFT_TOP);
  113.                 indices.Add(baseIndex + (int)EHexVertices.CENTER);
  114.                
  115.                 // Inner LeftTop to Top
  116.                 indices.Add(baseIndex + (int)EHexVertices.INNER_HEX_LEFT_TOP);
  117.                 indices.Add(baseIndex + (int)EHexVertices.INNER_HEX_TOP);
  118.                 indices.Add(baseIndex + (int)EHexVertices.CENTER);
  119.                
  120.                 // =====================================================
  121.                 // Outer
  122.                 // Outer Outer Top to RightTop
  123.                 indices.Add(baseIndex + (int)EHexVertices.OUTER_HEX_TOP);
  124.                 indices.Add(baseIndex + (int)EHexVertices.OUTER_HEX_RIGHT_TOP);
  125.                 indices.Add(baseIndex + (int)EHexVertices.INNER_HEX_TOP);
  126.                
  127.                 //// Outer Inner Top to RightTop
  128.                 indices.Add(baseIndex + (int)EHexVertices.INNER_HEX_TOP);
  129.                 indices.Add(baseIndex + (int)EHexVertices.OUTER_HEX_RIGHT_TOP);
  130.                 indices.Add(baseIndex + (int)EHexVertices.INNER_HEX_RIGHT_TOP);
  131.                
  132.                 //// Outer Outer RightTop to RightBottom
  133.                 indices.Add(baseIndex + (int)EHexVertices.OUTER_HEX_RIGHT_TOP);
  134.                 indices.Add(baseIndex + (int)EHexVertices.OUTER_HEX_RIGHT_BOTTOM);
  135.                 indices.Add(baseIndex + (int)EHexVertices.INNER_HEX_RIGHT_TOP);
  136.                
  137.                 //// Outer Inner RightTop to RightBottom
  138.                 indices.Add(baseIndex + (int)EHexVertices.INNER_HEX_RIGHT_TOP);
  139.                 indices.Add(baseIndex + (int)EHexVertices.OUTER_HEX_RIGHT_BOTTOM);
  140.                 indices.Add(baseIndex + (int)EHexVertices.INNER_HEX_RIGHT_BOTTOM);
  141.                
  142.                 //// Outer Outer RightBottom to Bottom
  143.                 indices.Add(baseIndex + (int)EHexVertices.INNER_HEX_RIGHT_BOTTOM);
  144.                 indices.Add(baseIndex + (int)EHexVertices.OUTER_HEX_RIGHT_BOTTOM);
  145.                 indices.Add(baseIndex + (int)EHexVertices.OUTER_HEX_BOTTOM);
  146.                
  147.                 //// Outer Inner RightBottom to Bottom
  148.                 indices.Add(baseIndex + (int)EHexVertices.INNER_HEX_RIGHT_BOTTOM);
  149.                 indices.Add(baseIndex + (int)EHexVertices.OUTER_HEX_BOTTOM);
  150.                 indices.Add(baseIndex + (int)EHexVertices.INNER_HEX_BOTTOM);
  151.                
  152.                 //// Outer Outer Bottom to LeftBottom
  153.                 indices.Add(baseIndex + (int)EHexVertices.INNER_HEX_BOTTOM);
  154.                 indices.Add(baseIndex + (int)EHexVertices.OUTER_HEX_BOTTOM);
  155.                 indices.Add(baseIndex + (int)EHexVertices.OUTER_HEX_LEFT_BOTTOM);
  156.                
  157.                 //// Outer Inner Bottom to LeftBottom
  158.                 indices.Add(baseIndex + (int)EHexVertices.INNER_HEX_BOTTOM);
  159.                 indices.Add(baseIndex + (int)EHexVertices.OUTER_HEX_LEFT_BOTTOM);
  160.                 indices.Add(baseIndex + (int)EHexVertices.INNER_HEX_LEFT_BOTTOM);
  161.                
  162.                 //// Outer Outer LeftBottom to LeftTop
  163.                 indices.Add(baseIndex + (int)EHexVertices.OUTER_HEX_LEFT_TOP);
  164.                 indices.Add(baseIndex + (int)EHexVertices.INNER_HEX_LEFT_BOTTOM);
  165.                 indices.Add(baseIndex + (int)EHexVertices.OUTER_HEX_LEFT_BOTTOM);
  166.                
  167.                 //// Outer Inner LeftBottom to LeftTop
  168.                 indices.Add(baseIndex + (int)EHexVertices.OUTER_HEX_LEFT_TOP);
  169.                 indices.Add(baseIndex + (int)EHexVertices.INNER_HEX_LEFT_TOP);
  170.                 indices.Add(baseIndex + (int)EHexVertices.INNER_HEX_LEFT_BOTTOM);
  171.                
  172.                 //// Outer Outer LeftTop to Top
  173.                 indices.Add(baseIndex + (int)EHexVertices.OUTER_HEX_TOP);
  174.                 indices.Add(baseIndex + (int)EHexVertices.INNER_HEX_LEFT_TOP);
  175.                 indices.Add(baseIndex + (int)EHexVertices.OUTER_HEX_LEFT_TOP);
  176.                
  177.                 //// Outer Inner LeftTop to Top
  178.                 indices.Add(baseIndex + (int)EHexVertices.OUTER_HEX_TOP);
  179.                 indices.Add(baseIndex + (int)EHexVertices.INNER_HEX_TOP);
  180.                 indices.Add(baseIndex + (int)EHexVertices.INNER_HEX_LEFT_TOP);
  181.                
  182.                 // Colors
  183.                 colors[baseIndex + (int)EHexVertices.CENTER] = new Color(0, 0, 1);
  184.                
  185.                 colors[baseIndex + (int)EHexVertices.INNER_HEX_TOP] = new Color(1, 0, 0);
  186.                 colors[baseIndex + (int)EHexVertices.INNER_HEX_LEFT_TOP] = new Color(1, 0, 0);
  187.                 colors[baseIndex + (int)EHexVertices.INNER_HEX_LEFT_BOTTOM] = new Color(1, 0, 0);
  188.                 colors[baseIndex + (int)EHexVertices.INNER_HEX_RIGHT_TOP] = new Color(1, 0, 0);
  189.                 colors[baseIndex + (int)EHexVertices.INNER_HEX_RIGHT_BOTTOM] = new Color(1, 0, 0);
  190.                 colors[baseIndex + (int)EHexVertices.INNER_HEX_BOTTOM] = new Color(1, 0, 0);
  191.                
  192.                 colors[baseIndex + (int)EHexVertices.OUTER_HEX_TOP] = new Color(0, 1, 0);
  193.                 colors[baseIndex + (int)EHexVertices.OUTER_HEX_LEFT_TOP] = new Color(0, 1, 0);
  194.                 colors[baseIndex + (int)EHexVertices.OUTER_HEX_LEFT_BOTTOM] = new Color(0, 1, 0);
  195.                 colors[baseIndex + (int)EHexVertices.OUTER_HEX_RIGHT_TOP] = new Color(0, 1, 0);
  196.                 colors[baseIndex + (int)EHexVertices.OUTER_HEX_RIGHT_BOTTOM] = new Color(0, 1, 0);
  197.                 colors[baseIndex + (int)EHexVertices.OUTER_HEX_BOTTOM] = new Color(0, 1, 0);
  198.             }
  199.         }
  200.        
  201.         // Create ArrayMesh
  202.         Array meshArrays = new Array();
  203.        
  204.         meshArrays.Resize((int)ArrayMesh.ArrayType.Max);
  205.        
  206.         meshArrays[(int)ArrayMesh.ArrayType.Vertex] = vertices;
  207.         meshArrays[(int)ArrayMesh.ArrayType.Index] = indices.ToArray();
  208.         meshArrays[(int)ArrayMesh.ArrayType.Color] = colors;
  209.        
  210.         mHexMesh.AddSurfaceFromArrays(Mesh.PrimitiveType.Triangles, meshArrays);
  211.  
  212.         mMeshInstance.Mesh = mHexMesh;
  213.     }
  214.    
  215.     public override void _Process(float delta) {
  216.        
  217.        
  218.     }
  219.  
  220.     public enum EHexVertices {
  221.        
  222.         CENTER = 0,
  223.         INNER_HEX_TOP = 1,
  224.         INNER_HEX_RIGHT_TOP = 2,
  225.         INNER_HEX_RIGHT_BOTTOM = 3,
  226.         INNER_HEX_BOTTOM = 4,
  227.         INNER_HEX_LEFT_BOTTOM = 5,
  228.         INNER_HEX_LEFT_TOP = 6,
  229.         OUTER_HEX_TOP = 7,
  230.         OUTER_HEX_RIGHT_TOP = 8,
  231.         OUTER_HEX_RIGHT_BOTTOM = 9,
  232.         OUTER_HEX_BOTTOM = 10,
  233.         OUTER_HEX_LEFT_BOTTOM = 11,
  234.         OUTER_HEX_LEFT_TOP = 12,
  235.         VERTICE_AMOUNT_PER_HEX = 13,
  236.     }
  237. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement