Menu-principal-chargement-du-terrain #34

Merged
eriwyn merged 10 commits from menu-principal-chargement-du-terrain into main 3 years ago
  1. 18
      menu/LoadWorld.gd
  2. 53
      menu/LoadWorld.tscn
  3. 24
      menu/LoadingScreen.gd
  4. 18
      menu/LoadingScreen.tscn
  5. 17
      menu/MainMenu.gd
  6. 52
      menu/MainMenu.tscn
  7. 14
      menu/NewWorld.gd
  8. 64
      menu/NewWorld.tscn
  9. 10
      project.godot
  10. BIN
      theme/fonts/monogram.ttf
  11. 82
      theme/theme.tres
  12. 37
      ui/map/map.gd
  13. 58
      utils/Global.gd
  14. 7
      utils/terrain/Terrain.gd
  15. 144
      utils/world_generation/WorldGeneration.gd
  16. BIN
      world.mesh
  17. 48
      world/World3d.gd
  18. 6
      world/game.tscn

@ -0,0 +1,18 @@
extends Control
func _ready():
for terrain in Global.terrain.list():
var name = terrain.name
var button = Button.new()
button.text = terrain.name
button.connect("pressed", self, "_button_pressed", [name])
$VBoxContainer/ScrollContainer/WorldList.add_child(button)
func _on_CancelButton_pressed():
get_tree().change_scene("res://menu/MainMenu.tscn")
func _button_pressed(name):
Global.terrain_name = name
get_tree().change_scene("res://menu/LoadingScreen.tscn")

@ -0,0 +1,53 @@
[gd_scene load_steps=3 format=2]
[ext_resource path="res://theme/theme.tres" type="Theme" id=1]
[ext_resource path="res://menu/LoadWorld.gd" type="Script" id=2]
[node name="LoadWorld" type="Control"]
anchor_left = 0.5
anchor_top = 0.5
anchor_right = 0.5
anchor_bottom = 0.5
margin_left = -512.0
margin_top = -300.0
margin_right = 512.0
margin_bottom = 300.0
theme = ExtResource( 1 )
script = ExtResource( 2 )
[node name="VBoxContainer" type="VBoxContainer" parent="."]
anchor_left = 0.5
anchor_top = 0.5
anchor_right = 0.5
anchor_bottom = 0.5
margin_left = -240.0
margin_top = -131.5
margin_right = 240.0
margin_bottom = 131.5
[node name="Title" type="Label" parent="VBoxContainer"]
margin_right = 480.0
margin_bottom = 64.0
text = "Charger un monde"
align = 1
[node name="ScrollContainer" type="ScrollContainer" parent="VBoxContainer"]
margin_top = 68.0
margin_right = 480.0
margin_bottom = 218.0
rect_min_size = Vector2( 0, 150 )
[node name="WorldList" type="VBoxContainer" parent="VBoxContainer/ScrollContainer"]
[node name="HBoxContainer" type="HBoxContainer" parent="VBoxContainer"]
margin_top = 222.0
margin_right = 480.0
margin_bottom = 263.0
[node name="CancelButton" type="Button" parent="VBoxContainer/HBoxContainer"]
margin_right = 480.0
margin_bottom = 41.0
size_flags_horizontal = 3
text = "Annuler"
[connection signal="pressed" from="VBoxContainer/HBoxContainer/CancelButton" to="." method="_on_CancelButton_pressed"]

@ -0,0 +1,24 @@
extends Control
var thread
var world = {}
var old_step = 0
func _ready():
thread = Thread.new()
thread.start(self, "_generate_world")
set_process(true)
Global.loading.set_start_time()
func _process(_delta):
$ProgressBar.value = Global.loading.get_percentage()
if (Global.loading.get_end_time() > 0):
Global.print_debug("Elapsed time : %f seconds" % Global.loading.get_elapsed_time("s"))
get_tree().change_scene("res://world/game.tscn")
func _exit_tree():
thread.wait_to_finish()
func _generate_world():
world = WorldGeneration.new()

@ -0,0 +1,18 @@
[gd_scene load_steps=2 format=2]
[ext_resource path="res://menu/LoadingScreen.gd" type="Script" id=1]
[node name="LoadingScreen" type="Control"]
anchor_right = 1.0
anchor_bottom = 1.0
script = ExtResource( 1 )
[node name="ProgressBar" type="ProgressBar" parent="."]
anchor_left = 0.5
anchor_top = 0.5
anchor_right = 0.5
anchor_bottom = 0.5
margin_left = -82.5
margin_top = -7.0
margin_right = 82.5
margin_bottom = 7.0

@ -0,0 +1,17 @@
extends Control
func _ready():
pass
func _on_NewButton_pressed():
get_tree().change_scene("res://menu/NewWorld.tscn")
func _on_LoadButton_pressed():
get_tree().change_scene("res://menu/LoadWorld.tscn")
func _on_QuitButton_pressed():
get_tree().quit()

@ -0,0 +1,52 @@
[gd_scene load_steps=4 format=2]
[ext_resource path="res://theme/theme.tres" type="Theme" id=1]
[ext_resource path="res://menu/MainMenu.gd" type="Script" id=2]
[sub_resource type="Theme" id=1]
[node name="MainMenu" type="Control"]
anchor_right = 1.0
anchor_bottom = 1.0
theme = ExtResource( 1 )
script = ExtResource( 2 )
[node name="VBoxContainer" type="VBoxContainer" parent="."]
anchor_left = 0.5
anchor_top = 0.5
anchor_right = 0.5
anchor_bottom = 0.5
margin_left = -158.0
margin_top = -74.5
margin_right = 158.0
margin_bottom = 74.5
[node name="Title" type="Label" parent="VBoxContainer"]
margin_right = 316.0
margin_bottom = 131.0
text = "Societer
"
align = 1
[node name="NewButton" type="Button" parent="VBoxContainer"]
margin_top = 135.0
margin_right = 316.0
margin_bottom = 176.0
theme = SubResource( 1 )
text = "Nouveau monde"
[node name="LoadButton" type="Button" parent="VBoxContainer"]
margin_top = 180.0
margin_right = 316.0
margin_bottom = 221.0
text = "Charger un monde"
[node name="QuitButton" type="Button" parent="VBoxContainer"]
margin_top = 225.0
margin_right = 316.0
margin_bottom = 266.0
text = "Quitter"
[connection signal="pressed" from="VBoxContainer/NewButton" to="." method="_on_NewButton_pressed"]
[connection signal="pressed" from="VBoxContainer/LoadButton" to="." method="_on_LoadButton_pressed"]
[connection signal="pressed" from="VBoxContainer/QuitButton" to="." method="_on_QuitButton_pressed"]

@ -0,0 +1,14 @@
extends Control
func _ready():
pass
func _on_CancelButton_pressed():
get_tree().change_scene("res://menu/MainMenu.tscn")
func _on_CreateButton_pressed():
Global.terrain_name = $VBoxContainer/LineEdit.text
get_tree().change_scene("res://menu/LoadingScreen.tscn")

@ -0,0 +1,64 @@
[gd_scene load_steps=5 format=2]
[ext_resource path="res://theme/theme.tres" type="Theme" id=1]
[ext_resource path="res://theme/fonts/monogram.ttf" type="DynamicFontData" id=2]
[ext_resource path="res://menu/NewWorld.gd" type="Script" id=3]
[sub_resource type="DynamicFont" id=1]
size = 35
font_data = ExtResource( 2 )
[node name="NewWorld" type="Control"]
anchor_right = 1.0
anchor_bottom = 1.0
rect_pivot_offset = Vector2( -383, -181 )
theme = ExtResource( 1 )
script = ExtResource( 3 )
[node name="VBoxContainer" type="VBoxContainer" parent="."]
anchor_left = 0.5
anchor_top = 0.5
anchor_right = 0.5
anchor_bottom = 0.5
margin_left = -195.0
margin_top = -85.0
margin_right = 195.0
margin_bottom = 85.0
[node name="Title" type="Label" parent="VBoxContainer"]
margin_right = 390.0
margin_bottom = 64.0
text = "Nouveau monde"
align = 1
[node name="Label" type="Label" parent="VBoxContainer"]
margin_top = 68.0
margin_right = 390.0
margin_bottom = 97.0
custom_fonts/font = SubResource( 1 )
text = "Nom du monde :"
[node name="LineEdit" type="LineEdit" parent="VBoxContainer"]
margin_top = 101.0
margin_right = 390.0
margin_bottom = 125.0
[node name="HBoxContainer" type="HBoxContainer" parent="VBoxContainer"]
margin_top = 129.0
margin_right = 390.0
margin_bottom = 170.0
[node name="CreateButton" type="Button" parent="VBoxContainer/HBoxContainer"]
margin_right = 247.0
margin_bottom = 41.0
text = "Nouveau monde"
[node name="CancelButton" type="Button" parent="VBoxContainer/HBoxContainer"]
margin_left = 251.0
margin_right = 390.0
margin_bottom = 41.0
size_flags_horizontal = 3
text = "Annuler"
[connection signal="pressed" from="VBoxContainer/HBoxContainer/CreateButton" to="." method="_on_CreateButton_pressed"]
[connection signal="pressed" from="VBoxContainer/HBoxContainer/CancelButton" to="." method="_on_CancelButton_pressed"]

@ -33,19 +33,25 @@ _global_script_classes=[ {
"class": "Terrain", "class": "Terrain",
"language": "GDScript", "language": "GDScript",
"path": "res://utils/terrain/Terrain.gd" "path": "res://utils/terrain/Terrain.gd"
}, {
"base": "Reference",
"class": "WorldGeneration",
"language": "GDScript",
"path": "res://utils/world_generation/WorldGeneration.gd"
} ] } ]
_global_script_class_icons={ _global_script_class_icons={
"CameraController": "", "CameraController": "",
"CameraOutline": "", "CameraOutline": "",
"Delaunator": "", "Delaunator": "",
"PoissonDiscSampling": "", "PoissonDiscSampling": "",
"Terrain": "" "Terrain": "",
"WorldGeneration": ""
} }
[application] [application]
config/name="Societer" config/name="Societer"
run/main_scene="res://world/game.tscn" run/main_scene="res://menu/MainMenu.tscn"
config/icon="res://icon.png" config/icon="res://icon.png"
[autoload] [autoload]

Binary file not shown.

@ -0,0 +1,82 @@
[gd_resource type="Theme" load_steps=21 format=2]
[ext_resource path="res://theme/fonts/monogram.ttf" type="DynamicFontData" id=1]
[sub_resource type="DynamicFontData" id=1]
font_path = "res://theme/fonts/monogram.ttf"
[sub_resource type="DynamicFont" id=2]
size = 50
font_data = SubResource( 1 )
[sub_resource type="Gradient" id=12]
interpolation_mode = 1
colors = PoolColorArray( 0.596078, 0.596078, 0.596078, 1, 1, 1, 1, 1 )
[sub_resource type="GradientTexture" id=13]
gradient = SubResource( 12 )
[sub_resource type="GradientTexture" id=14]
[sub_resource type="StyleBoxTexture" id=15]
texture = SubResource( 14 )
normal_map = SubResource( 13 )
region_rect = Rect2( 0, 0, 2048, 1 )
[sub_resource type="Gradient" id=16]
interpolation_mode = 1
colors = PoolColorArray( 0.47451, 0.47451, 0.47451, 1, 1, 1, 1, 1 )
[sub_resource type="GradientTexture" id=17]
gradient = SubResource( 16 )
[sub_resource type="StyleBoxTexture" id=18]
texture = SubResource( 17 )
region_rect = Rect2( 0, 0, 2048, 1 )
[sub_resource type="Gradient" id=19]
interpolation_mode = 1
colors = PoolColorArray( 0.266667, 0.266667, 0.266667, 1, 1, 1, 1, 1 )
[sub_resource type="GradientTexture" id=20]
gradient = SubResource( 19 )
[sub_resource type="StyleBoxTexture" id=21]
texture = SubResource( 20 )
region_rect = Rect2( 0, 0, 2048, 1 )
[sub_resource type="Gradient" id=6]
interpolation_mode = 1
colors = PoolColorArray( 0.47451, 0.47451, 0.47451, 1, 1, 1, 1, 1 )
[sub_resource type="GradientTexture" id=7]
gradient = SubResource( 6 )
[sub_resource type="StyleBoxTexture" id=5]
texture = SubResource( 7 )
region_rect = Rect2( 0, 0, 2048, 1 )
[sub_resource type="Gradient" id=9]
interpolation_mode = 1
colors = PoolColorArray( 0.239216, 0.239216, 0.239216, 1, 1, 1, 1, 1 )
[sub_resource type="GradientTexture" id=10]
gradient = SubResource( 9 )
[sub_resource type="StyleBoxTexture" id=11]
texture = SubResource( 10 )
region_rect = Rect2( 0, 0, 2048, 1 )
[sub_resource type="DynamicFont" id=8]
size = 80
font_data = ExtResource( 1 )
[resource]
Button/colors/font_color_hover = Color( 0.854902, 0.439216, 0.439216, 1 )
Button/fonts/font = SubResource( 2 )
Button/styles/disabled = SubResource( 15 )
Button/styles/focus = SubResource( 18 )
Button/styles/hover = SubResource( 21 )
Button/styles/normal = SubResource( 5 )
Button/styles/pressed = SubResource( 11 )
Label/fonts/font = SubResource( 8 )

@ -2,10 +2,9 @@ extends Node2D
signal map_clicked signal map_clicked
var terrain
func heightmap(): func heightmap():
for triangle in terrain.get_triangles(): print (Global.terrain)
for triangle in Global.terrain.get_triangles():
var colors = Gradient.new() var colors = Gradient.new()
colors.add_point(0.999, Color("#9e0142")) # red colors.add_point(0.999, Color("#9e0142")) # red
colors.add_point(0.5, Color("#dc865d")) # orange colors.add_point(0.5, Color("#dc865d")) # orange
@ -21,7 +20,7 @@ func heightmap():
draw_polygon(triangle.polygon(), PoolColorArray([color])) draw_polygon(triangle.polygon(), PoolColorArray([color]))
var coastline = PoolVector2Array() var coastline = PoolVector2Array()
for edge in terrain.get_edges(): for edge in Global.terrain.get_edges():
if edge.get_data("coast"): if edge.get_data("coast"):
coastline.append(edge.line()[0]) coastline.append(edge.line()[0])
coastline.append(edge.line()[1]) coastline.append(edge.line()[1])
@ -30,26 +29,26 @@ func heightmap():
draw_multiline(coastline, Color.black) draw_multiline(coastline, Color.black)
func draw_triangles_edges(color=Color("#000000")): func draw_triangles_edges(color=Color("#000000")):
for line in terrain.get_edges_as_line(): for line in Global.terrain.get_edges_as_line():
draw_line(line[0], line[1], color) draw_line(line[0], line[1], color)
func draw_voronoi_edges(color=Color("#000000")): func draw_voronoi_edges(color=Color("#000000")):
for line in terrain.get_voronoi_edges_as_line(): for line in Global.terrain.get_voronoi_edges_as_line():
draw_line(line[0], line[1], color) draw_line(line[0], line[1], color)
func draw_voronoi_cells_old(): func draw_voronoi_cells_old():
var seen = [] var seen = []
for edge_idx in terrain.edges(): for edge_idx in Global.terrain.edges():
var triangles = [] var triangles = []
var vertices = [] var vertices = []
var p = terrain._triangles[terrain.next_half_edge(edge_idx)] var p = Global.terrain._triangles[Global.terrain.next_half_edge(edge_idx)]
if not seen.has(p): if not seen.has(p):
seen.append(p) seen.append(p)
var edges = terrain.edges_around_point(edge_idx) var edges = Global.terrain.edges_around_point(edge_idx)
for edge_around_idx in edges: for edge_around_idx in edges:
triangles.append(terrain.triangle_of_edge(edge_around_idx)) triangles.append(Global.terrain.triangle_of_edge(edge_around_idx))
for triangle in triangles: for triangle in triangles:
vertices.append(terrain.triangle_center(triangle)) vertices.append(Global.terrain.triangle_center(triangle))
if triangles.size() > 2: if triangles.size() > 2:
var color = Color(randf(), randf(), randf(), 1) var color = Color(randf(), randf(), randf(), 1)
@ -58,26 +57,26 @@ func draw_voronoi_cells_old():
voronoi_cell.append(Vector2(vertice.x, vertice.z)) voronoi_cell.append(Vector2(vertice.x, vertice.z))
draw_polygon(voronoi_cell, PoolColorArray([color])) draw_polygon(voronoi_cell, PoolColorArray([color]))
func draw_voronoi_cells(): func draw_voronoi_cells():
for polygon in terrain.get_voronoi_cells_as_polygon(): for polygon in Global.terrain.get_voronoi_cells_as_polygon():
var color = Color(randf(), randf(), randf(), 1) var color = Color(randf(), randf(), randf(), 1)
if polygon.size() > 2: if polygon.size() > 2:
draw_polygon(polygon, PoolColorArray([color])) draw_polygon(polygon, PoolColorArray([color]))
func draw_voronoi_cells_convex_hull(): func draw_voronoi_cells_convex_hull():
for point_idx in terrain.points(): for point_idx in Global.terrain.points():
var triangles = [] var triangles = []
var vertices = [] var vertices = []
var incoming = terrain._points_to_half_edges.get(point_idx) var incoming = Global.terrain._points_to_half_edges.get(point_idx)
if incoming == null: if incoming == null:
triangles.append(0) triangles.append(0)
else: else:
var edges = terrain.edges_around_point(incoming) var edges = Global.terrain.edges_around_point(incoming)
for edge_idx in edges: for edge_idx in edges:
triangles.append(terrain.triangle_of_edge(edge_idx)) triangles.append(Global.terrain.triangle_of_edge(edge_idx))
for triangle_idx in triangles: for triangle_idx in triangles:
vertices.append(terrain.triangle_center(triangle_idx)) vertices.append(Global.terrain.triangle_center(triangle_idx))
if triangles.size() > 2: if triangles.size() > 2:
var color = Color(randf(), randf(), randf(), 1) var color = Color(randf(), randf(), randf(), 1)
@ -99,7 +98,3 @@ func _process(_delta):
var new_position = get_viewport().get_mouse_position() / scale var new_position = get_viewport().get_mouse_position() / scale
if new_position.x <= 2000 and new_position.y <= 2000: if new_position.x <= 2000 and new_position.y <= 2000:
emit_signal("map_clicked", new_position) emit_signal("map_clicked", new_position)
func _on_Game_world_loaded(game_terrain):
terrain = game_terrain
update()

@ -1,10 +1,66 @@
extends Node extends Node
var debug = true var debug = true
var terrain var terrain_name = ""
var terrain_mesh: Mesh
var terrain = Terrain.new()
var loading = loading_helper.new()
# Debuging messages # Debuging messages
func print_debug(message): func print_debug(message):
if debug: if debug:
print(message) print(message)
class loading_helper:
var _step = 0
var _max_step = 0
var _start_time = 0
var _end_time = 0
func _init():
pass
func reset():
_step = 0
_max_step = 0
_start_time = 0
_end_time = 0
func set_step(number: int):
_step = number
func get_step():
return _step
func increment_step():
_step += 1
func set_max_step(number: int):
_max_step = number
func get_max_step():
return _max_step
func set_start_time():
_start_time = OS.get_ticks_msec()
func get_start_time():
return _start_time
func set_end_time():
_end_time = OS.get_ticks_msec()
func get_end_time():
return _end_time
func get_elapsed_time(unit):
var elapsed_time = _end_time - _start_time
if unit == "s":
elapsed_time = float(elapsed_time) / 1000.0
return elapsed_time
func get_percentage():
if get_max_step() > 0:
return float(get_step()) / float(get_max_step()) * 100
return 0

@ -580,6 +580,13 @@ func _create_points():
_points[point_idx].z = points2d[point_idx].y _points[point_idx].z = points2d[point_idx].y
# Terrain methodes # Terrain methodes
func set_data(key,value):
_data[key] = value
func get_data(key):
if _data.has(key):
return _data[key]
func get_triangles(): func get_triangles():
var triangles = Triangles.new(self) var triangles = Triangles.new(self)
return triangles return triangles

@ -1,6 +1,6 @@
extends Node extends Reference
signal world_loaded class_name WorldGeneration
export(int) var width = 2048 export(int) var width = 2048
export(int) var height = 2048 export(int) var height = 2048
@ -16,35 +16,47 @@ export(int) var river_proba = 200
var rng = RandomNumberGenerator.new() var rng = RandomNumberGenerator.new()
var noise = OpenSimplexNoise.new() var noise = OpenSimplexNoise.new()
var terrain func _init():
Global.loading.reset()
func _ready():
rng.randomize() rng.randomize()
noise.seed = rng.randi() noise.seed = rng.randi()
noise.octaves = octaves noise.octaves = octaves
var terrain_name="bonjour01" if Global.terrain.exists(Global.terrain_name):
Global.terrain.load(Global.terrain_name)
else:
Global.terrain.create(width,height,spacing,Global.terrain_name)
terrain = Terrain.new() var max_step = (
Global.terrain.get_triangles().size()
# + height
)
Global.print_debug(terrain.list()) if Global.terrain.is_created():
max_step += Global.terrain.get_points().size()
max_step += Global.terrain.get_triangles().size()
Global.loading.set_step(Global.terrain.get_points().size())
if terrain.exists(terrain_name): Global.loading.set_max_step(max_step)
terrain.load(terrain_name)
else:
terrain.create(width,height,spacing,terrain_name)
if terrain.is_created() or terrain.is_loaded(): if Global.terrain.is_created():
init_data() init_data()
add_trees() Global.terrain.save()
emit_signal("world_loaded", terrain)
if Global.terrain.is_created() or Global.terrain.is_loaded():
Global.terrain.set_data("mesh", create_mesh())
# create_map()
# add_trees()
# get_tree().change_scene("res://world/game.tscn")
else: else:
Global.print_debug("Pas de terrain, pas de construction ...") Global.print_debug("Pas de Global.terrain, pas de construction ...")
Global.print_debug("Pas de construction ..., pas de palais ...") Global.print_debug("Pas de construction ..., pas de palais ...")
Global.print_debug("Pas de palais ..., pas de palais.") Global.print_debug("Pas de palais ..., pas de palais.")
Global.loading.set_end_time()
func init_data(): func init_data():
# for point in 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))
# point.set_data("mountain", point_is_mountain(point)) # point.set_data("mountain", point_is_mountain(point))
@ -52,16 +64,14 @@ func init_data():
# fill_oceans() # fill_oceans()
# for point in terrain.get_points(): # for point in Global.terrain.get_points():
# if point.get_data("water") and not point.get_data("ocean"): # if point.get_data("water") and not point.get_data("ocean"):
# point.set_elevation(0.1) # point.set_elevation(0.1)
# point.set_data("water", false) # point.set_data("water", false)
# 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 Global.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))
@ -70,23 +80,24 @@ func init_data():
print(triangle.get_elevation()) print(triangle.get_elevation())
if triangle.is_water(): if triangle.is_water():
triangle.set_elevation(0) 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"):
# triangle.set_data("ocean", true) # triangle.set_data("ocean", true)
# for edge in terrain.get_edges(): # for edge in Global.terrain.get_edges():
# 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))
print(triangles)
func fill_oceans(): func fill_oceans():
var stack = [] var stack = []
for point in terrain.get_points(): for point in Global.terrain.get_points():
if point.point2d().x < 10 and point.get_data("water") and not point.get_data("ocean"): if point.point2d().x < 10 and point.get_data("water") and not point.get_data("ocean"):
stack.append(point.get_index()) stack.append(point.get_index())
while stack.size(): while stack.size():
var current_point_id = stack.pop_back() var current_point_id = stack.pop_back()
terrain.get_point(current_point_id).set_data("ocean", true) Global.terrain.get_point(current_point_id).set_data("ocean", true)
for neighbour in terrain.get_point(current_point_id).points_around(): for neighbour in Global.terrain.get_point(current_point_id).points_around():
if neighbour.get_data("water") and not neighbour.get_data("ocean"): if neighbour.get_data("water") and not neighbour.get_data("ocean"):
stack.append(neighbour.get_index()) stack.append(neighbour.get_index())
break break
@ -101,13 +112,13 @@ func set_river_path(point):
while stack.size(): while stack.size():
var current_point_id = stack.pop_front() var current_point_id = stack.pop_front()
if terrain.get_point(current_point_id).get_elevation() < start_elevation: if Global.terrain.get_point(current_point_id).get_elevation() < start_elevation:
waypoints.append(current_point_id) waypoints.append(current_point_id)
start_elevation = terrain.get_point(current_point_id).get_elevation() start_elevation = Global.terrain.get_point(current_point_id).get_elevation()
stack = [] stack = []
if terrain.get_point(current_point_id).get_data("ocean"): if Global.terrain.get_point(current_point_id).get_data("ocean"):
break break
for neighbour in terrain.get_point(current_point_id).points_around(): for neighbour in Global.terrain.get_point(current_point_id).points_around():
if not came_from.has(neighbour.get_index()): if not came_from.has(neighbour.get_index()):
stack.append(neighbour.get_index()) stack.append(neighbour.get_index())
came_from[neighbour.get_index()] = current_point_id came_from[neighbour.get_index()] = current_point_id
@ -122,8 +133,8 @@ 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) Global.terrain.get_point(index).set_data("river", true)
# terrain.get_point(index).set_data("water", true) # Global.terrain.get_point(index).set_data("water", true)
# Point # Point
@ -202,13 +213,62 @@ func edge_is_river(edge):
return true return true
return false return false
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 triangle in terrain.get_triangles(): # for triangle in Global.terrain.get_triangles():
if not triangle.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(triangle.center3d() * Vector3(1, 12*10, 1)) # tree.translation = Vector3(triangle.center3d() * Vector3(1, 12*10, 1))
add_child(tree) # add_child(tree)
func create_mesh():
var st = SurfaceTool.new()
st.begin(Mesh.PRIMITIVE_TRIANGLES)
for triangle in Global.terrain.get_triangles():
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)
Global.loading.increment_step()
st.generate_normals()
st.generate_tangents()
st.index()
var mi = MeshInstance.new()
mi.mesh = st.commit()
var material = load("res://world/world.material")
mi.set_surface_material(0, material)
mi.create_convex_collision()
mi.cast_shadow = GeometryInstance.SHADOW_CASTING_SETTING_ON
return mi
# Enregistrement de la map + intégration dans la génération du monde #32
func create_map():
var img = Image.new()
img.create(width, height, false, Image.FORMAT_RGBA8)
img.lock()
for y in height:
Global.loading.increment_step()
for x in width:
img.set_pixel(x,y,Color(randf(), randf(), randf()))
img.unlock()

Binary file not shown.

@ -1,51 +1,5 @@
extends Spatial extends Spatial
var terrain
func _ready(): func _ready():
pass var mi = Global.terrain.get_data("mesh")
func draw_world():
# for i in range(0, 1, 1):
# print(i)
var st = SurfaceTool.new()
st.begin(Mesh.PRIMITIVE_TRIANGLES)
# st.add_smooth_group(true)
for triangle in terrain.get_triangles():
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()
st.index()
# Commit to a mesh.
var mesh = st.commit()
var mi = MeshInstance.new()
mi.mesh = mesh
var material = load("res://world/world.material")
mi.set_surface_material(0, material)
mi.create_trimesh_collision()
mi.cast_shadow = GeometryInstance.SHADOW_CASTING_SETTING_ON
print(mi)
add_child(mi) add_child(mi)
func _on_Game_world_loaded(game_terrain):
terrain = game_terrain
draw_world()

@ -1,7 +1,6 @@
[gd_scene load_steps=8 format=2] [gd_scene load_steps=7 format=2]
[ext_resource path="res://ui/ui.tscn" type="PackedScene" id=1] [ext_resource path="res://ui/ui.tscn" type="PackedScene" id=1]
[ext_resource path="res://world/game.gd" type="Script" id=2]
[ext_resource path="res://world/default_env.tres" type="Environment" id=3] [ext_resource path="res://world/default_env.tres" type="Environment" id=3]
[ext_resource path="res://world/World3d.gd" type="Script" id=4] [ext_resource path="res://world/World3d.gd" type="Script" id=4]
[ext_resource path="res://utils/camera/CamBase.tscn" type="PackedScene" id=5] [ext_resource path="res://utils/camera/CamBase.tscn" type="PackedScene" id=5]
@ -13,7 +12,6 @@ size = Vector2( 2000, 2000 )
albedo_color = Color( 0.054902, 0.533333, 0.741176, 1 ) albedo_color = Color( 0.054902, 0.533333, 0.741176, 1 )
[node name="Game" type="Node"] [node name="Game" type="Node"]
script = ExtResource( 2 )
[node name="UI" parent="." instance=ExtResource( 1 )] [node name="UI" parent="." instance=ExtResource( 1 )]
@ -48,8 +46,6 @@ transform = Transform( 0.971628, 0.168947, -0.16552, 0, 0.699825, 0.714314, 0.23
light_energy = 0.1 light_energy = 0.1
shadow_enabled = true shadow_enabled = true
[connection signal="world_loaded" from="." to="UI/Map" method="_on_Game_world_loaded"]
[connection signal="world_loaded" from="." to="World3d" method="_on_Game_world_loaded"]
[connection signal="map_clicked" from="UI/Map" to="World3d/CamBase/Camera" method="_on_Map_map_clicked"] [connection signal="map_clicked" from="UI/Map" to="World3d/CamBase/Camera" method="_on_Map_map_clicked"]
[connection signal="camera_moved" from="World3d/CamBase/Camera" to="UI/Map/Cursor" method="_on_Camera_camera_moved"] [connection signal="camera_moved" from="World3d/CamBase/Camera" to="UI/Map/Cursor" method="_on_Camera_camera_moved"]

Loading…
Cancel
Save