|
|
|
@ -58,18 +58,25 @@ func init_data(): |
|
|
|
# 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) |
|
|
|
|
|
|
|
var triangles = 0 |
|
|
|
for triangle in terrain.get_triangles(): |
|
|
|
for triangle in terrain.get_triangles(): |
|
|
|
|
|
|
|
triangles += 1 |
|
|
|
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)) |
|
|
|
triangle.set_data("ocean", false) |
|
|
|
if not triangle.get_data("water"): |
|
|
|
for point in triangle.points(): |
|
|
|
if triangle.get_elevation() < 0: |
|
|
|
if point.get_data("ocean"): |
|
|
|
print(triangle.get_elevation()) |
|
|
|
triangle.set_data("ocean", true) |
|
|
|
if triangle.is_water(): |
|
|
|
for edge in terrain.get_edges(): |
|
|
|
triangle.set_elevation(0) |
|
|
|
edge.set_data("coast", edge_is_coast(edge)) |
|
|
|
# triangle.set_data("ocean", false) |
|
|
|
edge.set_data("river", edge_is_river(edge)) |
|
|
|
# for point in triangle.points(): |
|
|
|
|
|
|
|
# if point.get_data("ocean"): |
|
|
|
|
|
|
|
# triangle.set_data("ocean", true) |
|
|
|
|
|
|
|
# for edge in terrain.get_edges(): |
|
|
|
|
|
|
|
# edge.set_data("coast", edge_is_coast(edge)) |
|
|
|
|
|
|
|
# edge.set_data("river", edge_is_river(edge)) |
|
|
|
|
|
|
|
print(triangles) |
|
|
|
func fill_oceans(): |
|
|
|
func fill_oceans(): |
|
|
|
var stack = [] |
|
|
|
var stack = [] |
|
|
|
for point in terrain.get_points(): |
|
|
|
for point in terrain.get_points(): |
|
|
|
@ -115,23 +122,24 @@ 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) |
|
|
|
terrain.get_point(index).set_data("river", true) |
|
|
|
terrain.get_point(index).set_data("water", true) |
|
|
|
# terrain.get_point(index).set_data("water", true) |
|
|
|
|
|
|
|
|
|
|
|
# Point |
|
|
|
# Point |
|
|
|
|
|
|
|
|
|
|
|
func find_elevation(point): |
|
|
|
func find_elevation(point): |
|
|
|
|
|
|
|
|
|
|
|
var border = border_width + rng.randf_range(-20.0, 20.0) |
|
|
|
# var border = border_width + rng.randf_range(-20.0, 20.0) |
|
|
|
var elevation = noise.get_noise_2d(point.x / wavelength, point.y / wavelength) |
|
|
|
var elevation = noise.get_noise_2d(point.x / wavelength, point.y / wavelength) |
|
|
|
|
|
|
|
|
|
|
|
if point.x < border: |
|
|
|
var nx = 2 * point.x / width - 1 |
|
|
|
elevation -= ((border - point.x) / border) / 2.0 |
|
|
|
var ny = 2 * point.y / height - 1 |
|
|
|
if point.y < border: |
|
|
|
|
|
|
|
elevation -= (border - point.y) / border |
|
|
|
var radius = range_lerp(elevation, -1, 1, 0.8, 1.0) |
|
|
|
if point.x > width - border: |
|
|
|
|
|
|
|
elevation -= (border - (width - point.x)) / border |
|
|
|
var distance = 1 - (1-pow(nx, 2)) * (1-pow(ny,2)) |
|
|
|
if point.y > height - border: |
|
|
|
distance = sqrt(pow(nx, 2) + pow(ny, 2)) |
|
|
|
elevation -= (border - (height - point.y)) / border |
|
|
|
if distance > radius: |
|
|
|
|
|
|
|
elevation = (elevation - range_lerp(distance, radius, 1.0, 0.0, 1.0)) |
|
|
|
|
|
|
|
|
|
|
|
elevation = max(elevation, -1) |
|
|
|
elevation = max(elevation, -1) |
|
|
|
|
|
|
|
|
|
|
|
@ -144,7 +152,7 @@ func find_elevation(point): |
|
|
|
return elevation |
|
|
|
return elevation |
|
|
|
|
|
|
|
|
|
|
|
func point_is_water(point): |
|
|
|
func point_is_water(point): |
|
|
|
if (point.get_elevation() <= 0): |
|
|
|
if (point.get_elevation() < 0): |
|
|
|
return true |
|
|
|
return true |
|
|
|
return false |
|
|
|
return false |
|
|
|
|
|
|
|
|
|
|
|
@ -177,7 +185,7 @@ func triangle_find_elevation(triangle): |
|
|
|
return elevation |
|
|
|
return elevation |
|
|
|
|
|
|
|
|
|
|
|
func triangle_is_water(triangle): |
|
|
|
func triangle_is_water(triangle): |
|
|
|
if triangle.get_elevation() < 0: |
|
|
|
if triangle.get_elevation() <= 0.0: |
|
|
|
return true |
|
|
|
return true |
|
|
|
return false |
|
|
|
return false |
|
|
|
|
|
|
|
|
|
|
|
@ -196,10 +204,10 @@ 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 point in terrain.get_points(): |
|
|
|
for triangle in terrain.get_triangles(): |
|
|
|
if not point.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: |
|
|
|
var tree = treescene.instance() |
|
|
|
var tree = treescene.instance() |
|
|
|
tree.translation = Vector3(point.point3d() * Vector3(1, 12*10, 1)) |
|
|
|
tree.translation = Vector3(triangle.center3d() * Vector3(1, 12*10, 1)) |
|
|
|
add_child(tree) |
|
|
|
add_child(tree) |
|
|
|
|