|
|
|
@ -8,7 +8,7 @@ export(int) var spacing = 20 |
|
|
|
export(int, 1, 9) var octaves = 5 |
|
|
|
export(int, 1, 9) var octaves = 5 |
|
|
|
export(int, 1, 30) var wavelength = 8 |
|
|
|
export(int, 1, 30) var wavelength = 8 |
|
|
|
export(int) var border_width = 200 |
|
|
|
export(int) var border_width = 200 |
|
|
|
export(int) var terraces = 10 |
|
|
|
export(int) var terraces = 100 |
|
|
|
export(int) var terrace_height = 5 |
|
|
|
export(int) var terrace_height = 5 |
|
|
|
export(float) var mountain_height = 6.0 / 24.0 |
|
|
|
export(float) var mountain_height = 6.0 / 24.0 |
|
|
|
export(int) var river_proba = 200 |
|
|
|
export(int) var river_proba = 200 |
|
|
|
@ -28,13 +28,13 @@ func _init(): |
|
|
|
Global.terrain.create(width,height,spacing,Global.terrain_name) |
|
|
|
Global.terrain.create(width,height,spacing,Global.terrain_name) |
|
|
|
|
|
|
|
|
|
|
|
var max_step = ( |
|
|
|
var max_step = ( |
|
|
|
Global.terrain.get_triangles().size() |
|
|
|
# Global.terrain.get_triangles().size() |
|
|
|
# + height |
|
|
|
Global.terrain.get_points().size() |
|
|
|
) |
|
|
|
) |
|
|
|
|
|
|
|
|
|
|
|
if Global.terrain.is_created(): |
|
|
|
if Global.terrain.is_created(): |
|
|
|
max_step += Global.terrain.get_points().size() |
|
|
|
max_step += Global.terrain.get_points().size() |
|
|
|
max_step += Global.terrain.get_triangles().size() |
|
|
|
max_step += Global.terrain.get_centers().size() |
|
|
|
Global.loading.set_step(Global.terrain.get_points().size()) |
|
|
|
Global.loading.set_step(Global.terrain.get_points().size()) |
|
|
|
|
|
|
|
|
|
|
|
Global.loading.set_max_step(max_step) |
|
|
|
Global.loading.set_max_step(max_step) |
|
|
|
@ -44,8 +44,8 @@ func _init(): |
|
|
|
Global.terrain.save() |
|
|
|
Global.terrain.save() |
|
|
|
|
|
|
|
|
|
|
|
if Global.terrain.is_created() or Global.terrain.is_loaded(): |
|
|
|
if Global.terrain.is_created() or Global.terrain.is_loaded(): |
|
|
|
Global.terrain.set_data("mesh", create_mesh()) |
|
|
|
|
|
|
|
# create_map() |
|
|
|
# create_map() |
|
|
|
|
|
|
|
Global.terrain.set_data("mesh", create_mesh()) |
|
|
|
# add_trees() |
|
|
|
# add_trees() |
|
|
|
# get_tree().change_scene("res://world/game.tscn") |
|
|
|
# get_tree().change_scene("res://world/game.tscn") |
|
|
|
else: |
|
|
|
else: |
|
|
|
@ -56,6 +56,22 @@ func _init(): |
|
|
|
Global.loading.set_end_time() |
|
|
|
Global.loading.set_end_time() |
|
|
|
|
|
|
|
|
|
|
|
func init_data(): |
|
|
|
func init_data(): |
|
|
|
|
|
|
|
for center in Global.terrain.get_centers(): |
|
|
|
|
|
|
|
center.set_elevation(find_elevation(center.point2d())) |
|
|
|
|
|
|
|
if center.get_elevation() <= 0.0: |
|
|
|
|
|
|
|
center.set_data("water", true) |
|
|
|
|
|
|
|
Global.loading.increment_step() |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
fill_oceans() |
|
|
|
|
|
|
|
remove_holes() |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
for center in Global.terrain.get_centers(): |
|
|
|
|
|
|
|
center.set_data("coast", is_coast(center.to_point())) |
|
|
|
|
|
|
|
# if center.get_data("ocean"): |
|
|
|
|
|
|
|
# center.set_elevation(-1.0) |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
# for point in Global.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)) |
|
|
|
@ -71,16 +87,23 @@ 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) |
|
|
|
for triangle in Global.terrain.get_triangles(): |
|
|
|
# print("a") |
|
|
|
triangle.set_elevation(find_elevation(triangle.center2d())) |
|
|
|
|
|
|
|
# triangle.set_data("elevation", triangle_find_elevation(triangle)) |
|
|
|
# for center in Global.terrain.get_centers(): |
|
|
|
triangle.set_data("water", triangle_is_water(triangle)) |
|
|
|
# print("z") |
|
|
|
if not triangle.get_data("water"): |
|
|
|
# center.set_elevation(find_elevation(center.point2d)) |
|
|
|
if triangle.get_elevation() < 0: |
|
|
|
# Global.loading.increment_step() |
|
|
|
print(triangle.get_elevation()) |
|
|
|
# print(center.get_elevation()) |
|
|
|
if triangle.is_water(): |
|
|
|
# for triangle in Global.terrain.get_triangles(): |
|
|
|
triangle.set_elevation(0) |
|
|
|
# triangle.set_elevation(find_elevation(triangle.center2d())) |
|
|
|
Global.loading.increment_step() |
|
|
|
# # triangle.set_data("elevation", triangle_find_elevation(triangle)) |
|
|
|
|
|
|
|
# triangle.set_data("water", triangle_is_water(triangle)) |
|
|
|
|
|
|
|
# if not triangle.get_data("water"): |
|
|
|
|
|
|
|
# if triangle.get_elevation() < 0: |
|
|
|
|
|
|
|
# print(triangle.get_elevation()) |
|
|
|
|
|
|
|
# if triangle.is_water(): |
|
|
|
|
|
|
|
# triangle.set_elevation(0) |
|
|
|
|
|
|
|
# Global.loading.increment_step() |
|
|
|
# triangle.set_data("ocean", false) |
|
|
|
# triangle.set_data("ocean", false) |
|
|
|
# for point in triangle.points(): |
|
|
|
# for point in triangle.points(): |
|
|
|
# if point.get_data("ocean"): |
|
|
|
# if point.get_data("ocean"): |
|
|
|
@ -89,18 +112,7 @@ func init_data(): |
|
|
|
# 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(): |
|
|
|
|
|
|
|
var stack = [] |
|
|
|
|
|
|
|
for point in Global.terrain.get_points(): |
|
|
|
|
|
|
|
if point.point2d().x < 10 and point.get_data("water") and not point.get_data("ocean"): |
|
|
|
|
|
|
|
stack.append(point.get_index()) |
|
|
|
|
|
|
|
while stack.size(): |
|
|
|
|
|
|
|
var current_point_id = stack.pop_back() |
|
|
|
|
|
|
|
Global.terrain.get_point(current_point_id).set_data("ocean", true) |
|
|
|
|
|
|
|
for neighbour in Global.terrain.get_point(current_point_id).points_around(): |
|
|
|
|
|
|
|
if neighbour.get_data("water") and not neighbour.get_data("ocean"): |
|
|
|
|
|
|
|
stack.append(neighbour.get_index()) |
|
|
|
|
|
|
|
break |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
func set_river_path(point): |
|
|
|
func set_river_path(point): |
|
|
|
#TODO #2 fix rivers |
|
|
|
#TODO #2 fix rivers |
|
|
|
@ -138,30 +150,7 @@ func set_river_path(point): |
|
|
|
|
|
|
|
|
|
|
|
# Point |
|
|
|
# Point |
|
|
|
|
|
|
|
|
|
|
|
func find_elevation(point): |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
# var border = border_width + rng.randf_range(-20.0, 20.0) |
|
|
|
|
|
|
|
var elevation = noise.get_noise_2d(point.x / wavelength, point.y / wavelength) |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
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) |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if elevation > 0.1: |
|
|
|
|
|
|
|
elevation = max(pow((elevation) * 1.2, 1.5), 0.1) |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
elevation = min(elevation, 1) |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
elevation = round(elevation * terraces) / terraces |
|
|
|
|
|
|
|
return elevation |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
func point_is_water(point): |
|
|
|
func point_is_water(point): |
|
|
|
if (point.get_elevation() < 0): |
|
|
|
if (point.get_elevation() < 0): |
|
|
|
@ -224,51 +213,150 @@ func edge_is_river(edge): |
|
|
|
# tree.translation = Vector3(triangle.center3d() * Vector3(1, 12*10, 1)) |
|
|
|
# tree.translation = Vector3(triangle.center3d() * Vector3(1, 12*10, 1)) |
|
|
|
# add_child(tree) |
|
|
|
# add_child(tree) |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
func find_elevation(point): |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
# var border = border_width + rng.randf_range(-20.0, 20.0) |
|
|
|
|
|
|
|
var elevation = noise.get_noise_2d(point.x / wavelength, point.y / wavelength) |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
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) |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if elevation > 0.1: |
|
|
|
|
|
|
|
elevation = max(pow((elevation) * 1.2, 1.5), 0.1) |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
elevation = min(elevation, 1) |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
elevation = round(elevation * terraces) / terraces |
|
|
|
|
|
|
|
return elevation |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
func fill_oceans(): |
|
|
|
|
|
|
|
var stack = [] |
|
|
|
|
|
|
|
var first_center = null |
|
|
|
|
|
|
|
var i = 0.0 |
|
|
|
|
|
|
|
while not first_center: |
|
|
|
|
|
|
|
first_center = Global.terrain.find_point(Vector2(i, i)) |
|
|
|
|
|
|
|
i += 1.0 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
stack.append(first_center.get_index()) |
|
|
|
|
|
|
|
while stack.size(): |
|
|
|
|
|
|
|
var current_point_id = stack.pop_back() |
|
|
|
|
|
|
|
Global.terrain.get_point(current_point_id).set_data("ocean", true) |
|
|
|
|
|
|
|
for neighbour in Global.terrain.get_point(current_point_id).points_around(): |
|
|
|
|
|
|
|
if neighbour.get_data("water") and not neighbour.get_data("ocean"): |
|
|
|
|
|
|
|
stack.append(neighbour.get_index()) |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
func remove_holes(): |
|
|
|
|
|
|
|
for center in Global.terrain.get_centers(): |
|
|
|
|
|
|
|
if center.get_data("water") and not center.get_data("ocean"): |
|
|
|
|
|
|
|
center.set_elevation(0.2) |
|
|
|
|
|
|
|
center.set_data("water", false) |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
func is_coast(point): |
|
|
|
|
|
|
|
if not point.get_data("water"): |
|
|
|
|
|
|
|
for neighbour in point.points_around(): |
|
|
|
|
|
|
|
if neighbour.get_data("ocean"): |
|
|
|
|
|
|
|
return true |
|
|
|
|
|
|
|
return false |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
func create_mesh(): |
|
|
|
func create_mesh(): |
|
|
|
var st = SurfaceTool.new() |
|
|
|
var st = SurfaceTool.new() |
|
|
|
|
|
|
|
|
|
|
|
st.begin(Mesh.PRIMITIVE_TRIANGLES) |
|
|
|
st.begin(Mesh.PRIMITIVE_TRIANGLES) |
|
|
|
for triangle in Global.terrain.get_triangles(): |
|
|
|
var factor = Vector3(1, 120, 1) |
|
|
|
if not triangle.is_water(): |
|
|
|
for center in Global.terrain.get_centers(): |
|
|
|
if triangle.get_elevation() < 0: |
|
|
|
if not center.get_data("water"): |
|
|
|
print(triangle.get_elevation()) |
|
|
|
for edge in center.borders(): |
|
|
|
var factor = Vector3(1, 120, 1) |
|
|
|
if edge.end_center().get_elevation() < edge.start_center().get_elevation(): |
|
|
|
for edge in triangle.edges(): |
|
|
|
var top = edge.start_center().get_elevation() |
|
|
|
if triangle.get_elevation() > edge.opposite_triangle().get_elevation(): |
|
|
|
# if edge.start_center().get_data("ocean"): |
|
|
|
st.add_vertex(Vector3(edge.start().point3d().x, triangle.get_elevation(), edge.start().point3d().z) * factor) |
|
|
|
# top = -1.0 |
|
|
|
st.add_vertex(Vector3(edge.end().point3d().x, triangle.get_elevation(), edge.end().point3d().z) * factor) |
|
|
|
var bottom = edge.end_center().get_elevation() |
|
|
|
st.add_vertex(Vector3(edge.start().point3d().x, edge.opposite_triangle().get_elevation(), edge.start().point3d().z) * factor) |
|
|
|
if edge.end_center().get_data("ocean"): |
|
|
|
|
|
|
|
bottom = 0.0 |
|
|
|
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_corner().point3d().x, bottom, edge.start_corner().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_corner().point3d().x, top, edge.end_corner().point3d().z) * factor) |
|
|
|
|
|
|
|
st.add_vertex(Vector3(edge.start_corner().point3d().x, top, edge.start_corner().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.start_corner().point3d().x, bottom, edge.start_corner().point3d().z) * factor) |
|
|
|
|
|
|
|
st.add_vertex(Vector3(edge.end_corner().point3d().x, bottom, edge.end_corner().point3d().z) * factor) |
|
|
|
|
|
|
|
st.add_vertex(Vector3(edge.end_corner().point3d().x, top, edge.end_corner().point3d().z) * factor) |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
for corner_count in center.corners().size(): |
|
|
|
|
|
|
|
var current_corner = center.corners()[corner_count] |
|
|
|
|
|
|
|
var next_corner |
|
|
|
|
|
|
|
if corner_count < center.corners().size() - 1: |
|
|
|
|
|
|
|
next_corner = center.corners()[corner_count+1] |
|
|
|
|
|
|
|
else: |
|
|
|
|
|
|
|
next_corner = center.corners()[0] |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
st.add_vertex(Vector3(current_corner.point2d().x, center.get_elevation(), current_corner.point2d().y) * factor) |
|
|
|
|
|
|
|
st.add_vertex(Vector3(next_corner.point2d().x, center.get_elevation(), next_corner.point2d().y) * factor) |
|
|
|
|
|
|
|
st.add_vertex(Vector3(center.point2d().x, center.get_elevation(), center.point2d().y) * factor) |
|
|
|
Global.loading.increment_step() |
|
|
|
Global.loading.increment_step() |
|
|
|
|
|
|
|
|
|
|
|
st.generate_normals() |
|
|
|
st.generate_normals() |
|
|
|
st.generate_tangents() |
|
|
|
|
|
|
|
st.index() |
|
|
|
st.index() |
|
|
|
|
|
|
|
|
|
|
|
var mi = MeshInstance.new() |
|
|
|
var mi = MeshInstance.new() |
|
|
|
mi.mesh = st.commit() |
|
|
|
mi.mesh = st.commit() |
|
|
|
var material = load("res://world/world.material") |
|
|
|
var material = load("res://world/world.material") |
|
|
|
mi.set_surface_material(0, material) |
|
|
|
mi.set_surface_material(0, material) |
|
|
|
mi.create_convex_collision() |
|
|
|
mi.create_trimesh_collision() |
|
|
|
mi.cast_shadow = GeometryInstance.SHADOW_CASTING_SETTING_ON |
|
|
|
mi.cast_shadow = GeometryInstance.SHADOW_CASTING_SETTING_ON |
|
|
|
return mi |
|
|
|
return mi |
|
|
|
|
|
|
|
|
|
|
|
# Enregistrement de la map + intégration dans la génération du monde #32 |
|
|
|
# Enregistrement de la map + intégration dans la génération du monde #32 |
|
|
|
|
|
|
|
|
|
|
|
func create_map(): |
|
|
|
# func create_map(): |
|
|
|
var img = Image.new() |
|
|
|
# print("oui") |
|
|
|
img.create(width, height, false, Image.FORMAT_RGBA8) |
|
|
|
# var viewport = Viewport.new() |
|
|
|
img.lock() |
|
|
|
# viewport.size = Vector2(width, height) |
|
|
|
|
|
|
|
# var canvas = Node2D.new() |
|
|
|
for y in height: |
|
|
|
# viewport.add_child(canvas) |
|
|
|
Global.loading.increment_step() |
|
|
|
# canvas.draw_line(Vector2(0.0, 0.0), Vector2(1000.0, 1000.0), [Color("#5e4fa2")) |
|
|
|
for x in width: |
|
|
|
# for center in Global.terrain.get_centers(): |
|
|
|
img.set_pixel(x,y,Color(randf(), randf(), randf())) |
|
|
|
# var colors = Gradient.new() |
|
|
|
|
|
|
|
# colors.add_point(0.999, Color("#9e0142")) # red |
|
|
|
img.unlock() |
|
|
|
# colors.add_point(0.5, Color("#dc865d")) # orange |
|
|
|
|
|
|
|
# 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(center.get_elevation() + 0.001, 0.999)) |
|
|
|
|
|
|
|
# # color = Color.green |
|
|
|
|
|
|
|
# if center.get_data("water"): |
|
|
|
|
|
|
|
# # var factor = pow((center.get_elevation()+1.001), 10) / 5.0 |
|
|
|
|
|
|
|
# color = Color("#5e4fa2") |
|
|
|
|
|
|
|
# if center.polygon().size() > 2: |
|
|
|
|
|
|
|
# canvas.draw_polygon(center.polygon(), PoolColorArray([color])) |
|
|
|
|
|
|
|
# Global.loading.increment_step() |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
# var img = viewport.get_texture().get_data() |
|
|
|
|
|
|
|
# img.flip_y() |
|
|
|
|
|
|
|
# var err = img.save_png("user://terrain/heightmap.png") |
|
|
|
|
|
|
|
# print(err) |
|
|
|
|
|
|
|
# # print("non") |
|
|
|
|