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.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]))

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

@ -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)
for point in triangle.points():
st.add_vertex(Vector3(point.point3d().x, triangle.get_elevation(), point.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)
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()

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

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

Loading…
Cancel
Save