From bf6bfe8107fa8bdd465af74a9fa2df800f7cf588 Mon Sep 17 00:00:00 2001 From: Valentin Stark Date: Sun, 21 Aug 2022 15:13:29 +0200 Subject: [PATCH] meilleurs bordures --- ui/map/map.gd | 9 ++++--- utils/terrain/Terrain.gd | 5 ++++ world/World3d.gd | 27 +++++++++++--------- world/game.gd | 54 +++++++++++++++++++++++----------------- world/game.tscn | 2 +- 5 files changed, 57 insertions(+), 40 deletions(-) diff --git a/ui/map/map.gd b/ui/map/map.gd index 4e76e7c..0521719 100644 --- a/ui/map/map.gd +++ b/ui/map/map.gd @@ -12,10 +12,11 @@ func heightmap(): colors.add_point(0.25, Color("#fbf8b0")) # yellow colors.add_point(0.0, Color("#89cfa5")) # green colors.add_point(-0.999, Color("#5e4fa2")) # blue - var color = colors.interpolate(min(triangle.get_elevation()+0.001, 0.999)) - if triangle.get_data("ocean"): - var factor = pow((triangle.get_elevation()+1), 10) / 5.0 - color = Color("#5e4fa2") + Color(factor, factor, factor, 0.0) + var color = colors.interpolate(min(triangle.get_elevation() + 0.001, 0.999)) + # color = Color.green + if triangle.is_water(): + # var factor = pow((triangle.get_elevation()+1.001), 10) / 5.0 + color = Color("#5e4fa2") if triangle.polygon().size() > 2: draw_polygon(triangle.polygon(), PoolColorArray([color])) diff --git a/utils/terrain/Terrain.gd b/utils/terrain/Terrain.gd index 83de061..2137190 100644 --- a/utils/terrain/Terrain.gd +++ b/utils/terrain/Terrain.gd @@ -95,6 +95,11 @@ class Triangle: polygon.append(point.point2d()) return polygon + func is_water(): + if get_elevation() <= 0: + return true + return false + # Points iterator class Points: var _terrain diff --git a/world/World3d.gd b/world/World3d.gd index 0b38094..36a8e0f 100644 --- a/world/World3d.gd +++ b/world/World3d.gd @@ -14,19 +14,22 @@ func draw_world(): st.begin(Mesh.PRIMITIVE_TRIANGLES) # st.add_smooth_group(true) for triangle in terrain.get_triangles(): - var factor = Vector3(1, 12*10, 1) - for edge in triangle.edges(): - if triangle.get_elevation() > edge.opposite_triangle().get_elevation(): - st.add_vertex(Vector3(edge.start().point3d().x, triangle.get_elevation(), edge.start().point3d().z) * factor) - st.add_vertex(Vector3(edge.end().point3d().x, triangle.get_elevation(), edge.end().point3d().z) * factor) - st.add_vertex(Vector3(edge.start().point3d().x, edge.opposite_triangle().get_elevation(), edge.start().point3d().z) * factor) - - st.add_vertex(Vector3(edge.end().point3d().x, triangle.get_elevation(), edge.end().point3d().z) * factor) - st.add_vertex(Vector3(edge.end().point3d().x, edge.opposite_triangle().get_elevation(), edge.end().point3d().z) * factor) - st.add_vertex(Vector3(edge.start().point3d().x, edge.opposite_triangle().get_elevation(), edge.start().point3d().z) * factor) + if not triangle.is_water(): + if triangle.get_elevation() < 0: + print(triangle.get_elevation()) + var factor = Vector3(1, 120, 1) + for edge in triangle.edges(): + if triangle.get_elevation() > edge.opposite_triangle().get_elevation(): + st.add_vertex(Vector3(edge.start().point3d().x, triangle.get_elevation(), edge.start().point3d().z) * factor) + st.add_vertex(Vector3(edge.end().point3d().x, triangle.get_elevation(), edge.end().point3d().z) * factor) + st.add_vertex(Vector3(edge.start().point3d().x, edge.opposite_triangle().get_elevation(), edge.start().point3d().z) * factor) - for point in triangle.points(): - st.add_vertex(Vector3(point.point3d().x, triangle.get_elevation(), point.point3d().z) * factor) + st.add_vertex(Vector3(edge.end().point3d().x, triangle.get_elevation(), edge.end().point3d().z) * factor) + st.add_vertex(Vector3(edge.end().point3d().x, edge.opposite_triangle().get_elevation(), edge.end().point3d().z) * factor) + st.add_vertex(Vector3(edge.start().point3d().x, edge.opposite_triangle().get_elevation(), edge.start().point3d().z) * factor) + + for point in triangle.points(): + st.add_vertex(Vector3(point.point3d().x, triangle.get_elevation(), point.point3d().z) * factor) st.generate_normals() # st.generate_tangents() diff --git a/world/game.gd b/world/game.gd index f464858..4dc2ac6 100644 --- a/world/game.gd +++ b/world/game.gd @@ -58,18 +58,25 @@ func init_data(): # point.set_data("coast", point_is_coast(point)) # if point.get_data("river"): # set_river_path(point) + var triangles = 0 for triangle in terrain.get_triangles(): + triangles += 1 triangle.set_elevation(find_elevation(triangle.center2d())) # triangle.set_data("elevation", triangle_find_elevation(triangle)) triangle.set_data("water", triangle_is_water(triangle)) - triangle.set_data("ocean", false) - 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)) - + if not triangle.get_data("water"): + if triangle.get_elevation() < 0: + print(triangle.get_elevation()) + if triangle.is_water(): + triangle.set_elevation(0) + # triangle.set_data("ocean", false) + # 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(): var stack = [] for point in terrain.get_points(): @@ -115,23 +122,24 @@ func set_river_path(point): path.append(point.get_index()) for index in path: 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 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) - if point.x < border: - elevation -= ((border - point.x) / border) / 2.0 - if point.y < border: - elevation -= (border - point.y) / border - if point.x > width - border: - elevation -= (border - (width - point.x)) / border - if point.y > height - border: - elevation -= (border - (height - point.y)) / border + var nx = 2 * point.x / width - 1 + var ny = 2 * point.y / height - 1 + + var radius = range_lerp(elevation, -1, 1, 0.8, 1.0) + + var distance = 1 - (1-pow(nx, 2)) * (1-pow(ny,2)) + distance = sqrt(pow(nx, 2) + pow(ny, 2)) + if distance > radius: + elevation = (elevation - range_lerp(distance, radius, 1.0, 0.0, 1.0)) elevation = max(elevation, -1) @@ -144,7 +152,7 @@ func find_elevation(point): return elevation func point_is_water(point): - if (point.get_elevation() <= 0): + if (point.get_elevation() < 0): return true return false @@ -177,7 +185,7 @@ func triangle_find_elevation(triangle): return elevation func triangle_is_water(triangle): - if triangle.get_elevation() < 0: + if triangle.get_elevation() <= 0.0: return true return false @@ -196,10 +204,10 @@ func edge_is_river(edge): func add_trees(): rng.randomize() var treescene = load("res://entities/environment/birchtree/birchtree.tscn") - for point in terrain.get_points(): - if not point.get_data("water"): + for triangle in terrain.get_triangles(): + if not triangle.get_data("water"): var num = rng.randi_range(0, 5) if num == 1: 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) diff --git a/world/game.tscn b/world/game.tscn index 26c0e5f..af1b6c5 100644 --- a/world/game.tscn +++ b/world/game.tscn @@ -28,7 +28,7 @@ z_index = 3 script = ExtResource( 4 ) [node name="Water" type="MeshInstance" parent="World3d"] -transform = Transform( 1, 0, 0, 0, 1, 0, 0, 0, 1, 1000, -0.5, 1000 ) +transform = Transform( 1, 0, 0, 0, 1, 0, 0, 0, 1, 1000, 0, 1000 ) mesh = SubResource( 1 ) material/0 = SubResource( 2 ) -- 2.36.2