Advertisement
Guest User

Hexagonal grid glass for Godot

a guest
Nov 17th, 2022
150
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. extends Node
  2.  
  3. # Edited 24.05.2021
  4. # Add some useful functions
  5. # and cleaned up code
  6.  
  7. enum HexTypes{
  8.     vert,
  9.     hor,
  10. }
  11.  
  12. enum GridTypes{
  13.     rect,
  14.     hex
  15. }
  16.  
  17. enum Views{
  18.     iso,
  19.     front,
  20. }
  21.  
  22. const hex_type = HexTypes.vert
  23. const grid_type = GridTypes.hex
  24. const view = Views.iso
  25. const size = 24
  26. const iso_scale = 2.0
  27. const hex_map_size = Vector2(9, 7)
  28.  
  29. var hex_basis:Transform2D
  30. var grid_basis:Transform2D
  31.  
  32. var grid_map_size:Vector2
  33.  
  34. class PriorityStack:
  35.    
  36.     var items:Array
  37.    
  38.     func _init():
  39.         items = Array()
  40.        
  41.     func empty() -> bool:
  42.         return items.size() == 0
  43.        
  44.     func put(item, priority:int) -> void:
  45.         if empty():
  46.             items.append([item, priority])
  47.         elif priority <= items[0][1]:
  48.             items.insert(0, [item, priority])
  49.         elif priority > items[-1][1]:
  50.             items.append([item, priority])
  51.         else:
  52.             for i in range(len(items)):
  53.                 if priority <= items[i][1]:
  54.                     items.insert(i, [item, priority])
  55.                     break
  56.                    
  57.     func take():
  58.         return items.pop_front()[0]
  59.  
  60. func _init():
  61.     var short = int(size*sqrt(3)/2) # 1/2 from short hex diagonal
  62.     var long = int(size/2) # 1/4 from long hex diagonal
  63.    
  64.     hex_basis = Transform2D()
  65.     grid_basis = Transform2D()
  66.    
  67.     grid_map_size = Vector2()
  68.    
  69.     match hex_type:
  70.         HexTypes.vert:
  71.             match view:
  72.                 Views.iso:
  73.                     var pw = int(long*cos(PI/4))
  74.                     var ph = int(short*cos(PI/4))
  75.                    
  76.                     grid_basis.x = Vector2(pw, pw/iso_scale)
  77.                     grid_basis.y = Vector2(-ph, ph/iso_scale)
  78.                    
  79.                 Views.front:
  80.                     grid_basis.x = Vector2(long, 0)
  81.                     grid_basis.y = Vector2(0, short/iso_scale)
  82.                 _:
  83.                     grid_basis.x = Vector2(long, 0)
  84.                     grid_basis.y = Vector2(0, short/iso_scale)
  85.            
  86.             hex_basis.x = grid_basis.x*3 + grid_basis.y
  87.             hex_basis.y = grid_basis.y*2
  88.            
  89.         HexTypes.hor:
  90.             match view:
  91.                 Views.iso:
  92.                     var pw = int(short*cos(PI/4))
  93.                     var ph = int(long*cos(PI/4))
  94.                    
  95.                     grid_basis.x = Vector2(pw, pw/iso_scale)
  96.                     grid_basis.y = Vector2(-ph, ph/iso_scale)
  97.                    
  98.                 Views.front:
  99.                     grid_basis.x = Vector2(short, 0)
  100.                     grid_basis.y = Vector2(0, long/iso_scale)
  101.                    
  102.                 _:
  103.                     grid_basis.x = Vector2(short, 0)
  104.                     grid_basis.y = Vector2(0, long/iso_scale)
  105.            
  106.             hex_basis.x = grid_basis.x*2
  107.             hex_basis.y = grid_basis.x+grid_basis.y*3
  108.            
  109.     match grid_type:
  110.         GridTypes.rect:
  111.             match hex_type:
  112.                 HexTypes.vert:
  113.                     grid_map_size.x = hex_map_size.x*3+1
  114.                     grid_map_size.y = hex_map_size.y*2
  115.                 HexTypes.hor:
  116.                     grid_map_size.x = hex_map_size.x*2
  117.                     grid_map_size.y = hex_map_size.y*3+1
  118.                    
  119.         GridTypes.hex:
  120.             var diagonal = hex_map_size.x*2-1
  121.             match hex_type:
  122.                 HexTypes.vert:
  123.                     grid_map_size.x = diagonal*3+1
  124.                     grid_map_size.y = diagonal*2
  125.                 HexTypes.hor:
  126.                     grid_map_size.x = diagonal*2
  127.                     grid_map_size.y = diagonal*3+1
  128.  
  129. # ###########################################
  130. # _____CONVAERSATIONS_________
  131. # Here are functions for conversations
  132. # between screen and grid values
  133. # ###########################################
  134.  
  135. func cell2pixel(cell:Vector2) -> Vector2:
  136.     return cell.x*grid_basis.x + cell.y*grid_basis.y
  137.  
  138. func pixel2cell(pixel:Vector2, rounding=true) -> Vector2:
  139.     var res = grid_basis.affine_inverse().xform(pixel)
  140.     if rounding: res = res.floor()
  141.     return res
  142.  
  143. func hex2pixel(hex:Vector2) -> Vector2:
  144.     return hex.x*hex_basis.x + hex.y*hex_basis.y
  145.  
  146. func pixel2hex(pixel:Vector2) -> Vector2:
  147.     return round_hex(hex_basis.affine_inverse().xform(pixel))
  148.  
  149. func round_hex(hex:Vector2) -> Vector2:
  150.     var rx = round(hex.x)
  151.     var ry = round(hex.y)
  152.     var rz = round(-hex.x-hex.y)
  153.    
  154.     var x_diff = abs(hex.x-rx)
  155.     var y_diff = abs(hex.y-ry)
  156.     var z_diff = abs(-hex.x-hex.y-rz)
  157.     if x_diff > y_diff and x_diff > z_diff:
  158.         rx = -ry-rz
  159.     elif y_diff > z_diff:
  160.         ry = -rx-rz
  161.     return Vector2(rx, ry)
  162.  
  163. func get_center_cell(hex:Vector2) -> Vector2:
  164.     if hex_type == HexTypes.vert:
  165.         return Vector2(hex.x*3, hex.y*2+hex.x)
  166.     else: # Horizontal
  167.         return Vector2(hex.x*2+hex.y, hex.y*3)
  168.  
  169. func linear2iso(angle:float) -> float:
  170.     return pixel2cell(Vector2(cos(angle), sin(angle)), false).angle()
  171.    
  172. func iso2linear(angle:float) -> float:
  173.     return cell2pixel(Vector2(cos(angle), sin(angle))).angle()
  174.  
  175. # ###########################################
  176. # _____GRID_MANIPULATING_________
  177. # Here are functions for working
  178. # at grid
  179. # ###########################################
  180.  
  181. func direct_hex(hex1:Vector2, hex2:Vector2) -> Vector2:
  182.     var dx = hex2.x - hex1.x
  183.     var dy = hex2.y - hex1.y
  184.     var dz = -hex2.x-hex2.y + hex1.x+hex1.y
  185.     if dx == 0:
  186.         return Vector2(0, sign(dy))
  187.     elif dy == 0:
  188.         return Vector2(sign(dx), 0)
  189.     elif dz == 0:
  190.         return Vector2(sign(dx), sign(dy))
  191.     else:
  192.         if abs(dz) > abs(dx) and abs(dz) > abs(dy):
  193.             if abs(dx) > abs(dy):
  194.                 return Vector2(sign(dx), 0)
  195.             else:
  196.                 return Vector2(0, sign(dy))
  197.         elif abs(dy) > abs(dx):
  198.             if abs(dz) > abs(dx):
  199.                 return Vector2(0, sign(dy))
  200.             else:
  201.                 return Vector2(sign(dx), sign(dy))
  202.         else:
  203.             if abs(dy) > abs(dz):
  204.                 return Vector2(sign(dx), sign(dy))
  205.             else:
  206.                 return Vector2(sign(dx), 0)
  207.  
  208. func in_map(hex:Vector2) -> bool:
  209.     match grid_type:
  210.         GridTypes.hex:
  211.             return _is_in_hex_grid(hex)
  212.         GridTypes.rect:
  213.             if hex_type == HexTypes.vert:
  214.                 return _in_rect_grid_vert(hex)
  215.             else: # Hor orientation
  216.                 return _in_rect_grid_hor(hex)
  217.         _:
  218.             return true
  219.  
  220. func get_map_center() -> Vector2:
  221.     match grid_type:
  222.         GridTypes.hex:
  223.             if hex_type == HexTypes.hor:
  224.                 return _get_hor_hex_map_center()
  225.             else: # Vertical
  226.                 return _get_vert_hex_map_center()
  227.         GridTypes.rect:
  228.             return Vector2() # Rect map has no center
  229.         _:
  230.             return Vector2()
  231.  
  232. func can_stand(hex:Vector2, obsts:PoolVector2Array) -> bool:
  233.     return in_map(hex) and not (hex in obsts)
  234.  
  235. func neighbors(hex_pos:Vector2, obsts:PoolVector2Array) -> PoolVector2Array:
  236.     var res:PoolVector2Array = []
  237.     var _neighbors = PoolVector2Array([Vector2(-1, 0), Vector2(1, -1), Vector2(0, -1), Vector2(1, 0), Vector2(0, 1), Vector2(-1, 1)])
  238.     for i in _neighbors:
  239.         if can_stand(i+hex_pos, obsts):
  240.             res.append(i+hex_pos)
  241.     return res
  242.  
  243. func find_path(start:Vector2, goal:Vector2, obsts:PoolVector2Array) -> PoolVector2Array:
  244.     var frontier = PriorityStack.new()
  245.     frontier.put(start, 0)
  246.     var came_from = {}
  247.     var cost_so_far = {}
  248.     came_from[start] = start
  249.     cost_so_far[start] = 0
  250.    
  251.     var current:Vector2
  252.     var new_cost:int
  253.    
  254.     if not can_stand(goal, obsts):
  255.         return PoolVector2Array()
  256.        
  257.     while not frontier.empty():
  258.         current = frontier.take()
  259.        
  260.         if current == goal:
  261.             break
  262.            
  263.         for next in neighbors(current, obsts):
  264.             new_cost = cost_so_far[current] + 1
  265.                
  266.             if not (next in cost_so_far) or new_cost < cost_so_far[next]:
  267.                 cost_so_far[next] = new_cost
  268.                 frontier.put(next, new_cost+hex_distance(goal, next))
  269.                 came_from[next] = current
  270.                
  271.     if frontier.empty() and current != goal:
  272.         return PoolVector2Array()
  273.        
  274.     current = goal
  275.     var path = PoolVector2Array([current])
  276.    
  277.     while current != start:
  278.         current = came_from[current]
  279.         path.append(current)
  280.    
  281.     path.invert()
  282.     path.remove(0) # removes first position
  283.     return path
  284.  
  285. func rast_line(hex1:Vector2, hex2:Vector2) -> PoolVector2Array:
  286.     var N = hex_distance(hex1, hex2)
  287.     if N == 0: return PoolVector2Array([hex1])
  288.     var res = PoolVector2Array()
  289.     for i in range(N+1):
  290.         res.append(round_hex(lerp(hex1, hex2, i/N)))
  291.     return res
  292.  
  293. func hex_distance(hex1:Vector2, hex2:Vector2) -> int:
  294.     var dif = (hex2-hex1)
  295.     return int(abs(dif.x) + abs(dif.y) + abs(-dif.x-dif.y))/2
  296.  
  297.  
  298. # ###########################################
  299. # _____DRAWING_________
  300. # Here are functions for drawing
  301. # at specific grid according to settings
  302. # ###########################################
  303.  
  304. func draw_hex(hex:Vector2, surf:RID, color:Color, width=1.0, antialiasing=false):
  305.     match hex_type:
  306.         HexTypes.vert:
  307.             _draw_vert_hex(hex, surf, color, width, antialiasing)
  308.         HexTypes.hor:
  309.             _draw_hor_hex(hex, surf, color, width, antialiasing)
  310.  
  311. func fill_hex(hex:Vector2, surf:RID, color:Color, antialiasing):
  312.     if hex_type == HexTypes.hor:
  313.         _fill_hor_hex(hex, surf, color, antialiasing)
  314.     else: # Vertical
  315.         _fill_vert_hex(hex, surf, color, antialiasing)
  316.  
  317. func draw_cell(cell:Vector2, surf:RID, color:Color, width=1.0, antialiasing=false):
  318.     var pixel = cell2pixel(cell)
  319.     var points = PoolVector2Array([
  320.         pixel,
  321.         pixel+grid_basis.x,
  322.         pixel+grid_basis.x+grid_basis.y,
  323.         pixel+grid_basis.y,
  324.         pixel,
  325.     ])
  326.     VisualServer.canvas_item_add_polyline(surf, points, [color], width, antialiasing)
  327.    
  328. func fill_cell(cell:Vector2, surf:RID, color:Color, antialiasing=false):
  329.     var pixel = cell2pixel(cell)
  330.     var points = PoolVector2Array([
  331.         pixel,
  332.         pixel+grid_basis.x,
  333.         pixel+grid_basis.x+grid_basis.y,
  334.         pixel+grid_basis.y,
  335.     ])
  336.     VisualServer.canvas_item_add_polygon(surf, points, [color], [], RID(), RID(), antialiasing)
  337.  
  338. func draw_auxiliary_grid(surf:RID, color:Color, width=1.0, antialiasing=false):
  339.     var offset:Vector2
  340.     if hex_type == HexTypes.hor:
  341.         offset = grid_basis.x+grid_basis.y*2
  342.         if grid_type == GridTypes.hex and int(hex_map_size.x)%2 == 0:
  343.             offset += grid_basis.x
  344.     else:
  345.         offset = grid_basis.x*2+grid_basis.y
  346.         if grid_type == GridTypes.hex and int(hex_map_size.x)%2 == 0:
  347.             offset += grid_basis.y
  348.     for i in grid_map_size.x+1:
  349.         VisualServer.canvas_item_add_line(surf, grid_basis.x*i-offset, grid_basis.x*i+grid_basis.y*grid_map_size.y-offset, color, width, antialiasing)
  350.     for i in grid_map_size.y+1:
  351.         VisualServer.canvas_item_add_line(surf, grid_basis.y*i-offset, grid_basis.x*grid_map_size.x+grid_basis.y*i-offset, color, width, antialiasing)
  352.  
  353. func draw_grid(surf:RID, color:Color, width=1.0, antialiasing=false):
  354.     match grid_type:
  355.         GridTypes.rect:
  356.             match hex_type:
  357.                 HexTypes.vert:
  358.                     _draw_vert_rect_grid(surf, color, width, antialiasing)
  359.                 HexTypes.hor:
  360.                     _draw_hor_rect_grid(surf, color, width, antialiasing)
  361.         GridTypes.hex:
  362.             match hex_type:
  363.                 HexTypes.hor:
  364.                     _draw_hor_hex_grid(surf, color, width, antialiasing)
  365.                 HexTypes.vert:
  366.                     _draw_vert_hex_grid(surf, color, width, antialiasing)
  367.  
  368. func draw_line(surf:RID, hex1:Vector2, hex2:Vector2, color:Color, width=1.0, antialiasing=false):
  369.     var p1 = hex2pixel(hex1)
  370.     var p2 = hex2pixel(hex2)
  371.     VisualServer.canvas_item_add_line(surf, p1, p2, color, width, antialiasing)
  372.  
  373. func draw_polyline(surf:RID, hexes:PoolVector2Array, color:Color, width=1.0, antialiasing=false):
  374.     if len(hexes) < 2: return
  375.     var points = PoolVector2Array()
  376.     for i in hexes:
  377.         points.append(hex2pixel(i))
  378.     VisualServer.canvas_item_add_polyline(surf, points, [color], width, antialiasing)
  379.  
  380. # ###########################################
  381. # _____CALCULATING______
  382. # Here are functions for calculate several
  383. # types of stuff
  384. # ###########################################
  385.  
  386. func _get_vert_hex_vertices(hex:Vector2) -> PoolVector2Array:
  387.     var pixel = hex2pixel(hex)
  388.     return PoolVector2Array([
  389.         pixel+2*grid_basis.x,
  390.         pixel+grid_basis.x+grid_basis.y,
  391.         pixel-grid_basis.x+grid_basis.y,
  392.         pixel-2*grid_basis.x,
  393.         pixel-grid_basis.x-grid_basis.y,
  394.         pixel+grid_basis.x-grid_basis.y
  395.     ])
  396.  
  397. func _get_hor_hex_vertices(hex:Vector2) -> PoolVector2Array:
  398.     var pixel = hex2pixel(hex)
  399.     return PoolVector2Array([
  400.         pixel+grid_basis.x-grid_basis.y,
  401.         pixel+grid_basis.x+grid_basis.y,
  402.         pixel+2*grid_basis.y,
  403.         pixel-grid_basis.x+grid_basis.y,
  404.         pixel-grid_basis.x-grid_basis.y,
  405.         pixel-2*grid_basis.y,
  406.     ])
  407.  
  408. func _get_hor_hex_map_center() -> Vector2:
  409.     return Vector2(int((hex_map_size.x-1)/2), hex_map_size.x-1)
  410.  
  411. func _get_vert_hex_map_center() -> Vector2:
  412.     return Vector2(hex_map_size.x-1, int((hex_map_size.x-1)/2))
  413.  
  414. func _is_in_hex_grid(hex):
  415.     var center = _get_hor_hex_map_center()
  416.     hex -= center
  417.     return hex_distance(center, hex) < hex_map_size.x
  418.  
  419. func _in_rect_grid_hor(hex:Vector2) -> bool:
  420.     return hex.x >= -floor(hex.y/2) and hex.x < hex_map_size.x-ceil(hex.y/2) and hex.y < hex_map_size.y and hex.y >= 0
  421.  
  422. func _in_rect_grid_vert(hex:Vector2) -> bool:
  423.     return hex.x >= 0 and hex.x < hex_map_size.x and hex.y >= -floor(hex.x/2) and hex.y < hex_map_size.y-ceil(hex.x/2)
  424.  
  425. # ###########################################
  426. # _____DRAWING_________
  427. # Here are functions for drawing several
  428. # types of content
  429. # ###########################################
  430.  
  431. func _draw_hor_hex(hex:Vector2, surf:RID, color:Color, width=1.0, antialiasing=false):
  432.     var points = _get_hor_hex_vertices(hex)
  433.     points.append(points[0])
  434.     VisualServer.canvas_item_add_polyline(surf, points, [color], width, antialiasing)
  435.    
  436. func _draw_vert_hex(hex:Vector2, surf:RID, color:Color, width=1.0, antialiasing=false):
  437.     var points = _get_vert_hex_vertices(hex)
  438.     points.append(points[0])
  439.     VisualServer.canvas_item_add_polyline(surf, points, [color], width, antialiasing)
  440.    
  441. func _fill_hor_hex(hex:Vector2, surf:RID, color:Color, antialiasing=false):
  442.     var points = _get_hor_hex_vertices(hex)
  443.     VisualServer.canvas_item_add_polygon(surf, points, [color], [], RID(), RID(), antialiasing)
  444.    
  445. func _fill_vert_hex(hex:Vector2, surf:RID, color:Color, antialiasing=false):
  446.     var points = _get_vert_hex_vertices(hex)
  447.     VisualServer.canvas_item_add_polygon(surf, points, [color], [], RID(), RID(), antialiasing)
  448.  
  449. func _draw_vert_rect_grid(surf:RID, color:Color, width=1.0, antialiasing=false):
  450.     var offset = grid_basis.x*2+grid_basis.y
  451.     # Drawing horizontal lines
  452.     for i in range(1, grid_map_size.x, 3):
  453.         for j in range(1-i%2, grid_map_size.y+1, 2):
  454.             VisualServer.canvas_item_add_line(surf, grid_basis.x*i+grid_basis.y*j-offset, grid_basis.x*(i+2)+grid_basis.y*j-offset, color, width, antialiasing)
  455.            
  456.     # Drawing vertices
  457.     for i in range(0, grid_map_size.x, 3):
  458.         for j in range(grid_map_size.y):
  459.             if int(hex_map_size.x)%2 == 1 or not(i == grid_map_size.x-1 and (j == 0 or j == grid_map_size.y-1)):
  460.                 if j%2 == i%2:
  461.                     VisualServer.canvas_item_add_line(surf, grid_basis.x*(i+1)+grid_basis.y*j-offset, grid_basis.x*i+grid_basis.y*(j+1)-offset, color, width, antialiasing)
  462.                 else:
  463.                     VisualServer.canvas_item_add_line(surf, grid_basis.x*i+grid_basis.y*j-offset, grid_basis.x*(i+1)+grid_basis.y*(j+1)-offset, color, width, antialiasing)
  464.  
  465. func _draw_hor_rect_grid(surf:RID, color:Color, width=1.0, antialiasing=false):
  466.     var offset = grid_basis.x+grid_basis.y*2
  467.     # Drawing vertical lines
  468.     for i in range(1, grid_map_size.y, 3):
  469.         for j in range(1-i%2, grid_map_size.x+1, 2):
  470.             VisualServer.canvas_item_add_line(surf, grid_basis.x*j+grid_basis.y*i-offset, grid_basis.x*j+grid_basis.y*(i+2)-offset, color, width, antialiasing)
  471.  
  472.     # Drawing vertices
  473.     for i in range(0, grid_map_size.y, 3):
  474.         for j in range(grid_map_size.x):
  475.             if int(hex_map_size.y)%2 == 1 or not (i == grid_map_size.y-1 and (j == 0 or j == grid_map_size.x-1)):
  476.                 if i%2 == j%2:
  477.                     VisualServer.canvas_item_add_line(surf, grid_basis.x*j+grid_basis.y*(i+1)-offset, grid_basis.x*(j+1)+grid_basis.y*i-offset, color, width, antialiasing)
  478.                 else:
  479.                     VisualServer.canvas_item_add_line(surf, grid_basis.x*j+grid_basis.y*i-offset, grid_basis.x*(j+1)+grid_basis.y*(i+1)-offset, color, width, antialiasing)
  480.  
  481. func _draw_hor_hex_grid(surf:RID, color:Color, width=1.0, antialiasing=false):
  482.     var parity = int(hex_map_size.x)%2
  483.     var offset = grid_basis.x+grid_basis.y*2 + grid_basis.x*(1-parity)
  484.     var start
  485.     for i in range(0, grid_map_size.y/2, 3): # Drawing vertices
  486.         start = hex_map_size.x - i/3 - 1
  487.         for j in range(start, grid_map_size.x/2):
  488.             if abs(i%2 - j%2) != parity:
  489.                 # Down diagonal
  490.                 VisualServer.canvas_item_add_line(surf, grid_basis.x*j+grid_basis.y*(i+1)-offset, grid_basis.x*(j+1)+grid_basis.y*i-offset, color, width, antialiasing)
  491.                 VisualServer.canvas_item_add_line(surf, grid_basis.x*(grid_map_size.x-j)+grid_basis.y*(i+1)-offset, grid_basis.x*(grid_map_size.x-j-1)+grid_basis.y*i-offset, color, width, antialiasing)
  492.  
  493.                 VisualServer.canvas_item_add_line(surf, grid_basis.x*j+grid_basis.y*(grid_map_size.y-i-1)-offset, grid_basis.x*(j+1)+grid_basis.y*(grid_map_size.y-i)-offset, color, width, antialiasing)
  494.                 VisualServer.canvas_item_add_line(surf, grid_basis.x*(grid_map_size.x-j)+grid_basis.y*(grid_map_size.y-i-1)-offset, grid_basis.x*(grid_map_size.x-j-1)+grid_basis.y*(grid_map_size.y-i)-offset, color, width, antialiasing)
  495.             else:
  496.                 # Top diagonal
  497.                 VisualServer.canvas_item_add_line(surf, grid_basis.x*(j)+grid_basis.y*(i)-offset, grid_basis.x*(j+1)+grid_basis.y*(i+1)-offset, color, width, antialiasing)
  498.                 VisualServer.canvas_item_add_line(surf, grid_basis.x*(grid_map_size.x-j)+grid_basis.y*(i)-offset, grid_basis.x*(grid_map_size.x-j-1)+grid_basis.y*(i+1)-offset, color, width, antialiasing)
  499.  
  500.                 VisualServer.canvas_item_add_line(surf, grid_basis.x*(j)+grid_basis.y*(grid_map_size.y-i)-offset, grid_basis.x*(j+1)+grid_basis.y*(grid_map_size.y-i-1)-offset, color, width, antialiasing)
  501.                 VisualServer.canvas_item_add_line(surf, grid_basis.x*(grid_map_size.x-j)+grid_basis.y*(grid_map_size.y-i)-offset, grid_basis.x*(grid_map_size.x-j-1)+grid_basis.y*(grid_map_size.y-i-1)-offset, color, width, antialiasing)
  502.  
  503.     for i in range(1, grid_map_size.y, 3):
  504.         if i <= grid_map_size.y/2:
  505.             start = hex_map_size.x-1 - i/3
  506.         else:
  507.             start = (i-grid_map_size.y/2)/3
  508.  
  509.         for j in range(abs(parity-i%2), grid_map_size.x+1, 2):
  510.             if j >= start and j <= grid_map_size.x-start:
  511.                 VisualServer.canvas_item_add_line(surf, grid_basis.x*j+grid_basis.y*i-offset, grid_basis.x*j+grid_basis.y*(i+2)-offset, color, width, antialiasing)
  512.  
  513. func _draw_vert_hex_grid(surf:RID, color:Color, width=1.0, antialiasing=false):
  514.     var parity = int(hex_map_size.x)%2
  515.     var offset = grid_basis.x*2+grid_basis.y + (1-parity)*grid_basis.y
  516.     var start
  517.     for j in range(0, grid_map_size.x/2, 3): # Drawing vertices
  518.         start = hex_map_size.x - j/3 - 1
  519.         for i in range(start, grid_map_size.y/2):
  520.             if abs(i%2 - j%2) != parity:
  521.                 # Down diagonal
  522.                 VisualServer.canvas_item_add_line(surf, grid_basis.x*(j+1)+grid_basis.y*(i)-offset, grid_basis.x*(j)+grid_basis.y*(i+1)-offset, color, width, antialiasing)
  523.                 VisualServer.canvas_item_add_line(surf, grid_basis.x*(grid_map_size.x-j-1)+grid_basis.y*(i)-offset, grid_basis.x*(grid_map_size.x-j)+grid_basis.y*(i+1)-offset, color, width, antialiasing)
  524.  
  525.                 VisualServer.canvas_item_add_line(surf, grid_basis.x*(j+1)+grid_basis.y*(grid_map_size.y-i)-offset, grid_basis.x*(j)+grid_basis.y*(grid_map_size.y-i-1)-offset, color, width, antialiasing)
  526.                 VisualServer.canvas_item_add_line(surf, grid_basis.x*(grid_map_size.x-j-1)+grid_basis.y*(grid_map_size.y-i)-offset, grid_basis.x*(grid_map_size.x-j)+grid_basis.y*(grid_map_size.y-i-1)-offset, color, width, antialiasing)
  527.             else:
  528.                 # Top diagonal
  529.                 VisualServer.canvas_item_add_line(surf, grid_basis.x*(j)+grid_basis.y*(i)-offset, grid_basis.x*(j+1)+grid_basis.y*(i+1)-offset, color, width, antialiasing)
  530.                 VisualServer.canvas_item_add_line(surf, grid_basis.x*(grid_map_size.x-j)+grid_basis.y*(i)-offset, grid_basis.x*(grid_map_size.x-j-1)+grid_basis.y*(i+1)-offset, color, width, antialiasing)
  531.  
  532.                 VisualServer.canvas_item_add_line(surf, grid_basis.x*(j)+grid_basis.y*(grid_map_size.y-i)-offset, grid_basis.x*(j+1)+grid_basis.y*(grid_map_size.y-i-1)-offset, color, width, antialiasing)
  533.                 VisualServer.canvas_item_add_line(surf, grid_basis.x*(grid_map_size.x-j)+grid_basis.y*(grid_map_size.y-i)-offset, grid_basis.x*(grid_map_size.x-j-1)+grid_basis.y*(grid_map_size.y-i-1)-offset, color, width, antialiasing)
  534.  
  535.     for i in range(1, grid_map_size.x, 3):
  536.         if i <= grid_map_size.x/2:
  537.             start = hex_map_size.x-1 - i/3
  538.         else:
  539.             start = (i-grid_map_size.x/2)/3
  540.  
  541.         for j in range(abs(parity-i%2), grid_map_size.y+1, 2):
  542.             if j >= start and j <= grid_map_size.y-start:
  543.                 VisualServer.canvas_item_add_line(surf, grid_basis.x*i+grid_basis.y*j-offset, grid_basis.x*(i+2)+grid_basis.y*(j)-offset, color, width, antialiasing)
  544.  
  545.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement