meilleurs bordures #25

Merged
eriwyn merged 1 commits from 24-meilleurs-borders-pour-le-bruit into main 3 years ago
  1. 9
      ui/map/map.gd
  2. 5
      utils/terrain/Terrain.gd
  3. 29
      world/World3d.gd
  4. 54
      world/game.gd
  5. 2
      world/game.tscn

@ -12,10 +12,11 @@ func heightmap():
colors.add_point(0.25, Color("#fbf8b0")) # yellow colors.add_point(0.25, Color("#fbf8b0")) # yellow
colors.add_point(0.0, Color("#89cfa5")) # green colors.add_point(0.0, Color("#89cfa5")) # green
colors.add_point(-0.999, Color("#5e4fa2")) # blue colors.add_point(-0.999, Color("#5e4fa2")) # blue
var color = colors.interpolate(min(triangle.get_elevation()+0.001, 0.999)) var color = colors.interpolate(min(triangle.get_elevation() + 0.001, 0.999))
if triangle.get_data("ocean"): # color = Color.green
var factor = pow((triangle.get_elevation()+1), 10) / 5.0 if triangle.is_water():
color = Color("#5e4fa2") + Color(factor, factor, factor, 0.0) # var factor = pow((triangle.get_elevation()+1.001), 10) / 5.0
color = Color("#5e4fa2")
if triangle.polygon().size() > 2: if triangle.polygon().size() > 2:
draw_polygon(triangle.polygon(), PoolColorArray([color])) draw_polygon(triangle.polygon(), PoolColorArray([color]))

@ -95,6 +95,11 @@ class Triangle:
polygon.append(point.point2d()) polygon.append(point.point2d())
return polygon return polygon
func is_water():
if get_elevation() <= 0:
return true
return false
# Points iterator # Points iterator
class Points: class Points:
var _terrain var _terrain

@ -14,19 +14,22 @@ 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 terrain.get_triangles():
var factor = Vector3(1, 12*10, 1) if not triangle.is_water():
for edge in triangle.edges(): if triangle.get_elevation() < 0:
if triangle.get_elevation() > edge.opposite_triangle().get_elevation(): print(triangle.get_elevation())
st.add_vertex(Vector3(edge.start().point3d().x, triangle.get_elevation(), edge.start().point3d().z) * factor) var factor = Vector3(1, 120, 1)
st.add_vertex(Vector3(edge.end().point3d().x, triangle.get_elevation(), edge.end().point3d().z) * factor) for edge in triangle.edges():
st.add_vertex(Vector3(edge.start().point3d().x, edge.opposite_triangle().get_elevation(), edge.start().point3d().z) * factor) 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.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)
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)
for point in triangle.points(): st.add_vertex(Vector3(edge.end().point3d().x, edge.opposite_triangle().get_elevation(), edge.end().point3d().z) * factor)
st.add_vertex(Vector3(point.point3d().x, triangle.get_elevation(), point.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_normals()
# st.generate_tangents() # st.generate_tangents()

@ -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)

@ -28,7 +28,7 @@ z_index = 3
script = ExtResource( 4 ) script = ExtResource( 4 )
[node name="Water" type="MeshInstance" parent="World3d"] [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 ) mesh = SubResource( 1 )
material/0 = SubResource( 2 ) material/0 = SubResource( 2 )

Loading…
Cancel
Save