Voronoi class VoronoiCenter, VoronoiCorner and VoronoiEdge

pull/27/head
Alain STARK 3 years ago
parent dbb4cd1931
commit 31b585f1d7
  1. 140
      utils/terrain/Terrain.gd
  2. 26
      world/game.gd

@ -3,6 +3,140 @@ extends Reference
# Build terrain from delaunay graph
class_name Terrain
# Voronoi Center iterator
class VoronoiCenters:
var _terrain
var _curr
var _end
func _init(terrain):
self._terrain = terrain
self._curr = 0
self._end = _terrain._points.size()
func _should_continue():
return (_curr < _end)
func _iter_init(_arg):
_curr = 0
return _should_continue()
func _iter_next(_arg):
_curr += 1
return _should_continue()
func _iter_get(_arg):
var point = Point.new(_curr,_terrain)
return point
func size():
return _end
# Voronoi Center object
class VoronoiCenter:
var _idx
var _terrain
func _init(idx, terrain):
self._idx = idx
self._terrain = terrain
func to_point():
return Point.new(_idx, _terrain)
func get_index():
return _idx
func has_key(key):
return _terrain._points_data[_idx].has(key)
func set_data(key,value):
var data = _terrain._points_data[_idx]
data[key] = value
func get_data(key):
var data = _terrain._points_data[_idx]
if data.has(key):
return data[key]
func point3d():
return _terrain._points[_idx]
func point2d():
var point3d:Vector3 = _terrain._points[_idx]
var point2d:Vector2 = Vector2(point3d.x, point3d.z)
return(point2d)
func set_elevation(elevation:float):
_terrain._points[_idx].y = elevation
func get_elevation():
return(_terrain._points[_idx].y)
func neighbors():
var list_centers = []
for point in to_point().points_around():
list_centers.append(point.to_center())
return list_centers
func borders():
var list_edges = []
for edge in to_point().edges_around():
var center_start = edge.start().to_center()
var center_end = edge.end().to_center()
var corner_start = VoronoiCorner.new(edge.triangle())
var corner_end = VoronoiCorner.new(edge.opposite().triangle())
list_edges.append(VoronoiEdge.new(corner_start,corner_end,center_start,center_end))
return list_edges
func corners():
var list_corners = []
for triangle in to_point().triangles_around():
var corner = VoronoiCorner.new(triangle)
list_corners.append(corner)
return list_corners
# Voronoi Corner object
class VoronoiCorner:
var _triangle
func _init(triangle):
self._triangle = triangle
func point3d():
return _triangle.center3d()
func point2d():
return _triangle.center2d()
# Voronoi Edge object
class VoronoiEdge:
var _start_corner
var _end_corner
var _start_center
var _end_center
func _init(start_corner, end_corner, start_center, end_center):
self._start_corner = end_corner
self._end_corner = start_corner
self._start_center = end_center
self._end_center = start_center
func start_corner():
return _start_corner
func end_corner():
return _end_corner
func start_center():
return _start_center
func end_center():
return _end_center
# Triangles iterator
class Triangles:
var _terrain
@ -125,6 +259,9 @@ class Point:
self._idx = idx
self._terrain = terrain
func to_center():
return VoronoiCenter.new(_idx, _terrain)
func get_index():
return _idx
@ -391,6 +528,9 @@ func get_points():
func get_point(idx):
return Point.new(idx, self)
func get_center(idx):
return VoronoiCenter.new(idx, self)
func get_edge(idx):
return Edge.new(idx, self)

@ -24,7 +24,7 @@ func _ready():
noise.octaves = octaves
# terrain = Terrain.new(width,height,spacing,false)
var terrain_name="bonjour"
var terrain_name="bonjour01"
terrain = Terrain.new()
print(terrain.list())
@ -35,6 +35,30 @@ func _ready():
terrain.create(width,height,spacing,terrain_name)
if terrain.is_created() or terrain.is_loaded():
var center = terrain.get_center(43)
for edge in center.borders():
Global.print_debug("Corner start :")
Global.print_debug(edge.start_corner().point2d())
Global.print_debug("Corner end :")
Global.print_debug(edge.end_corner().point2d())
Global.print_debug("Center start :")
Global.print_debug(edge.start_center().point2d())
Global.print_debug("Center end :")
Global.print_debug(edge.end_center().point2d())
"""
Global.print_debug("Corners of center :")
for corner in center.corners():
Global.print_debug(corner.point2d())
Global.print_debug("Find neighbors")
for neighbor in center.neighbors():
Global.print_debug("Corners of neighbor :")
for corner in neighbor.corners():
Global.print_debug(corner.point2d())
"""
init_data()
add_trees()
emit_signal("world_loaded", terrain)

Loading…
Cancel
Save