transfert de terrain dans global

pull/34/head
Valentin Stark 3 years ago
parent 117bcfe7ee
commit e9f933b85a
  1. 35
      ui/map/map.gd
  2. 7
      world/World3d.gd
  3. 55
      world/game.gd

@ -2,10 +2,8 @@ extends Node2D
signal map_clicked signal map_clicked
var terrain
func heightmap(): func heightmap():
for triangle in terrain.get_triangles(): for triangle in Global.terrain.get_triangles():
var colors = Gradient.new() var colors = Gradient.new()
colors.add_point(0.999, Color("#9e0142")) # red colors.add_point(0.999, Color("#9e0142")) # red
colors.add_point(0.5, Color("#dc865d")) # orange colors.add_point(0.5, Color("#dc865d")) # orange
@ -21,7 +19,7 @@ func heightmap():
draw_polygon(triangle.polygon(), PoolColorArray([color])) draw_polygon(triangle.polygon(), PoolColorArray([color]))
var coastline = PoolVector2Array() var coastline = PoolVector2Array()
for edge in terrain.get_edges(): for edge in Global.terrain.get_edges():
if edge.get_data("coast"): if edge.get_data("coast"):
coastline.append(edge.line()[0]) coastline.append(edge.line()[0])
coastline.append(edge.line()[1]) coastline.append(edge.line()[1])
@ -30,26 +28,26 @@ func heightmap():
draw_multiline(coastline, Color.black) draw_multiline(coastline, Color.black)
func draw_triangles_edges(color=Color("#000000")): func draw_triangles_edges(color=Color("#000000")):
for line in terrain.get_edges_as_line(): for line in Global.terrain.get_edges_as_line():
draw_line(line[0], line[1], color) draw_line(line[0], line[1], color)
func draw_voronoi_edges(color=Color("#000000")): func draw_voronoi_edges(color=Color("#000000")):
for line in terrain.get_voronoi_edges_as_line(): for line in Global.terrain.get_voronoi_edges_as_line():
draw_line(line[0], line[1], color) draw_line(line[0], line[1], color)
func draw_voronoi_cells_old(): func draw_voronoi_cells_old():
var seen = [] var seen = []
for edge_idx in terrain.edges(): for edge_idx in Global.terrain.edges():
var triangles = [] var triangles = []
var vertices = [] var vertices = []
var p = terrain._triangles[terrain.next_half_edge(edge_idx)] var p = Global.terrain._triangles[Global.terrain.next_half_edge(edge_idx)]
if not seen.has(p): if not seen.has(p):
seen.append(p) seen.append(p)
var edges = terrain.edges_around_point(edge_idx) var edges = Global.terrain.edges_around_point(edge_idx)
for edge_around_idx in edges: for edge_around_idx in edges:
triangles.append(terrain.triangle_of_edge(edge_around_idx)) triangles.append(Global.terrain.triangle_of_edge(edge_around_idx))
for triangle in triangles: for triangle in triangles:
vertices.append(terrain.triangle_center(triangle)) vertices.append(Global.terrain.triangle_center(triangle))
if triangles.size() > 2: if triangles.size() > 2:
var color = Color(randf(), randf(), randf(), 1) var color = Color(randf(), randf(), randf(), 1)
@ -58,26 +56,26 @@ func draw_voronoi_cells_old():
voronoi_cell.append(Vector2(vertice.x, vertice.z)) voronoi_cell.append(Vector2(vertice.x, vertice.z))
draw_polygon(voronoi_cell, PoolColorArray([color])) draw_polygon(voronoi_cell, PoolColorArray([color]))
func draw_voronoi_cells(): func draw_voronoi_cells():
for polygon in terrain.get_voronoi_cells_as_polygon(): for polygon in Global.terrain.get_voronoi_cells_as_polygon():
var color = Color(randf(), randf(), randf(), 1) var color = Color(randf(), randf(), randf(), 1)
if polygon.size() > 2: if polygon.size() > 2:
draw_polygon(polygon, PoolColorArray([color])) draw_polygon(polygon, PoolColorArray([color]))
func draw_voronoi_cells_convex_hull(): func draw_voronoi_cells_convex_hull():
for point_idx in terrain.points(): for point_idx in Global.terrain.points():
var triangles = [] var triangles = []
var vertices = [] var vertices = []
var incoming = terrain._points_to_half_edges.get(point_idx) var incoming = Global.terrain._points_to_half_edges.get(point_idx)
if incoming == null: if incoming == null:
triangles.append(0) triangles.append(0)
else: else:
var edges = terrain.edges_around_point(incoming) var edges = Global.terrain.edges_around_point(incoming)
for edge_idx in edges: for edge_idx in edges:
triangles.append(terrain.triangle_of_edge(edge_idx)) triangles.append(Global.terrain.triangle_of_edge(edge_idx))
for triangle_idx in triangles: for triangle_idx in triangles:
vertices.append(terrain.triangle_center(triangle_idx)) vertices.append(Global.terrain.triangle_center(triangle_idx))
if triangles.size() > 2: if triangles.size() > 2:
var color = Color(randf(), randf(), randf(), 1) var color = Color(randf(), randf(), randf(), 1)
@ -100,6 +98,5 @@ func _process(_delta):
if new_position.x <= 2000 and new_position.y <= 2000: if new_position.x <= 2000 and new_position.y <= 2000:
emit_signal("map_clicked", new_position) emit_signal("map_clicked", new_position)
func _on_Game_world_loaded(game_terrain): func _on_Game_world_loaded():
terrain = game_terrain
update() update()

@ -1,7 +1,5 @@
extends Spatial extends Spatial
var terrain
func _ready(): func _ready():
pass pass
@ -13,7 +11,7 @@ func draw_world():
st.begin(Mesh.PRIMITIVE_TRIANGLES) st.begin(Mesh.PRIMITIVE_TRIANGLES)
# st.add_smooth_group(true) # st.add_smooth_group(true)
for triangle in terrain.get_triangles(): for triangle in Global.terrain.get_triangles():
if not triangle.is_water(): if not triangle.is_water():
if triangle.get_elevation() < 0: if triangle.get_elevation() < 0:
print(triangle.get_elevation()) print(triangle.get_elevation())
@ -46,6 +44,5 @@ func draw_world():
print(mi) print(mi)
add_child(mi) add_child(mi)
func _on_Game_world_loaded(game_terrain): func _on_Game_world_loaded():
terrain = game_terrain
draw_world() draw_world()

@ -16,39 +16,32 @@ export(int) var river_proba = 200
var rng = RandomNumberGenerator.new() var rng = RandomNumberGenerator.new()
var noise = OpenSimplexNoise.new() var noise = OpenSimplexNoise.new()
var terrain
func _ready(): func _ready():
rng.randomize() rng.randomize()
noise.seed = rng.randi() noise.seed = rng.randi()
noise.octaves = octaves noise.octaves = octaves
# var Global.terrain_name="bonjour90" if Global.terrain.exists(Global.terrain_name):
terrain = Global.terrain Global.terrain.load(Global.terrain_name)
print(terrain.list())
if terrain.exists(Global.terrain_name):
terrain.load(Global.terrain_name)
else: else:
terrain.create(width,height,spacing,Global.terrain_name) Global.terrain.create(width,height,spacing,Global.terrain_name)
if terrain.is_created(): if Global.terrain.is_created():
init_data() init_data()
terrain.save_data() Global.terrain.save_data()
if terrain.is_created() or terrain.is_loaded(): if Global.terrain.is_created() or Global.terrain.is_loaded():
Global.terrain.load_data(Global.terrain_name)
add_trees() add_trees()
emit_signal("world_loaded", terrain) emit_signal("world_loaded")
else: else:
Global.print_debug("Pas de terrain, pas de construction ...") Global.print_debug("Pas de Global.terrain, pas de construction ...")
Global.print_debug("Pas de construction ..., pas de palais ...") Global.print_debug("Pas de construction ..., pas de palais ...")
Global.print_debug("Pas de palais ..., pas de palais.") Global.print_debug("Pas de palais ..., pas de palais.")
func init_data(): func init_data():
# for point in terrain.get_points(): # for point in Global.terrain.get_points():
# point.set_elevation(point_find_elevation(point.point2d())) # point.set_elevation(point_find_elevation(point.point2d()))
# point.set_data("water", point_is_water(point)) # point.set_data("water", point_is_water(point))
# point.set_data("mountain", point_is_mountain(point)) # point.set_data("mountain", point_is_mountain(point))
@ -56,14 +49,14 @@ func init_data():
# fill_oceans() # fill_oceans()
# for point in terrain.get_points(): # for point in Global.terrain.get_points():
# if point.get_data("water") and not point.get_data("ocean"): # if point.get_data("water") and not point.get_data("ocean"):
# point.set_elevation(0.1) # point.set_elevation(0.1)
# point.set_data("water", false) # point.set_data("water", false)
# point.set_data("coast", point_is_coast(point)) # point.set_data("coast", point_is_coast(point))
# if point.get_data("river"): # if point.get_data("river"):
# set_river_path(point) # set_river_path(point)
for triangle in terrain.get_triangles(): for triangle in Global.terrain.get_triangles():
triangle.set_elevation(find_elevation(triangle.center2d())) triangle.set_elevation(find_elevation(triangle.center2d()))
# triangle.set_data("elevation", triangle_find_elevation(triangle)) # triangle.set_data("elevation", triangle_find_elevation(triangle))
triangle.set_data("water", triangle_is_water(triangle)) triangle.set_data("water", triangle_is_water(triangle))
@ -76,19 +69,19 @@ func init_data():
# for point in triangle.points(): # for point in triangle.points():
# if point.get_data("ocean"): # if point.get_data("ocean"):
# triangle.set_data("ocean", true) # triangle.set_data("ocean", true)
# for edge in terrain.get_edges(): # for edge in Global.terrain.get_edges():
# edge.set_data("coast", edge_is_coast(edge)) # edge.set_data("coast", edge_is_coast(edge))
# edge.set_data("river", edge_is_river(edge)) # edge.set_data("river", edge_is_river(edge))
func fill_oceans(): func fill_oceans():
var stack = [] var stack = []
for point in terrain.get_points(): for point in Global.terrain.get_points():
if point.point2d().x < 10 and point.get_data("water") and not point.get_data("ocean"): if point.point2d().x < 10 and point.get_data("water") and not point.get_data("ocean"):
stack.append(point.get_index()) stack.append(point.get_index())
while stack.size(): while stack.size():
var current_point_id = stack.pop_back() var current_point_id = stack.pop_back()
terrain.get_point(current_point_id).set_data("ocean", true) Global.terrain.get_point(current_point_id).set_data("ocean", true)
for neighbour in terrain.get_point(current_point_id).points_around(): for neighbour in Global.terrain.get_point(current_point_id).points_around():
if neighbour.get_data("water") and not neighbour.get_data("ocean"): if neighbour.get_data("water") and not neighbour.get_data("ocean"):
stack.append(neighbour.get_index()) stack.append(neighbour.get_index())
break break
@ -103,13 +96,13 @@ func set_river_path(point):
while stack.size(): while stack.size():
var current_point_id = stack.pop_front() var current_point_id = stack.pop_front()
if terrain.get_point(current_point_id).get_elevation() < start_elevation: if Global.terrain.get_point(current_point_id).get_elevation() < start_elevation:
waypoints.append(current_point_id) waypoints.append(current_point_id)
start_elevation = terrain.get_point(current_point_id).get_elevation() start_elevation = Global.terrain.get_point(current_point_id).get_elevation()
stack = [] stack = []
if terrain.get_point(current_point_id).get_data("ocean"): if Global.terrain.get_point(current_point_id).get_data("ocean"):
break break
for neighbour in terrain.get_point(current_point_id).points_around(): for neighbour in Global.terrain.get_point(current_point_id).points_around():
if not came_from.has(neighbour.get_index()): if not came_from.has(neighbour.get_index()):
stack.append(neighbour.get_index()) stack.append(neighbour.get_index())
came_from[neighbour.get_index()] = current_point_id came_from[neighbour.get_index()] = current_point_id
@ -124,8 +117,8 @@ func set_river_path(point):
path.append(point.get_index()) path.append(point.get_index())
for index in path: for index in path:
terrain.get_point(index).set_data("river", true) Global.terrain.get_point(index).set_data("river", true)
# terrain.get_point(index).set_data("water", true) # Global.terrain.get_point(index).set_data("water", true)
# Point # Point
@ -207,7 +200,7 @@ func edge_is_river(edge):
func add_trees(): func add_trees():
rng.randomize() rng.randomize()
var treescene = load("res://entities/environment/birchtree/birchtree.tscn") var treescene = load("res://entities/environment/birchtree/birchtree.tscn")
for triangle in terrain.get_triangles(): for triangle in Global.terrain.get_triangles():
if not triangle.get_data("water"): if not triangle.get_data("water"):
var num = rng.randi_range(0, 5) var num = rng.randi_range(0, 5)
if num == 1: if num == 1:

Loading…
Cancel
Save