diff --git a/menu/LoadWorld.gd b/menu/LoadWorld.gd new file mode 100644 index 0000000..23cdbda --- /dev/null +++ b/menu/LoadWorld.gd @@ -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") diff --git a/menu/LoadWorld.tscn b/menu/LoadWorld.tscn new file mode 100644 index 0000000..49e59ce --- /dev/null +++ b/menu/LoadWorld.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"] diff --git a/menu/LoadingScreen.gd b/menu/LoadingScreen.gd new file mode 100644 index 0000000..7e9544f --- /dev/null +++ b/menu/LoadingScreen.gd @@ -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() diff --git a/menu/LoadingScreen.tscn b/menu/LoadingScreen.tscn new file mode 100644 index 0000000..b4df5ca --- /dev/null +++ b/menu/LoadingScreen.tscn @@ -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 diff --git a/menu/MainMenu.gd b/menu/MainMenu.gd new file mode 100644 index 0000000..b34cc0d --- /dev/null +++ b/menu/MainMenu.gd @@ -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() diff --git a/menu/MainMenu.tscn b/menu/MainMenu.tscn new file mode 100644 index 0000000..cd65497 --- /dev/null +++ b/menu/MainMenu.tscn @@ -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"] diff --git a/menu/NewWorld.gd b/menu/NewWorld.gd new file mode 100644 index 0000000..f7e9108 --- /dev/null +++ b/menu/NewWorld.gd @@ -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") diff --git a/menu/NewWorld.tscn b/menu/NewWorld.tscn new file mode 100644 index 0000000..6486cc1 --- /dev/null +++ b/menu/NewWorld.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"] diff --git a/project.godot b/project.godot index 42ff1a3..baed0d8 100644 --- a/project.godot +++ b/project.godot @@ -33,19 +33,25 @@ _global_script_classes=[ { "class": "Terrain", "language": "GDScript", "path": "res://utils/terrain/Terrain.gd" +}, { +"base": "Reference", +"class": "WorldGeneration", +"language": "GDScript", +"path": "res://utils/world_generation/WorldGeneration.gd" } ] _global_script_class_icons={ "CameraController": "", "CameraOutline": "", "Delaunator": "", "PoissonDiscSampling": "", -"Terrain": "" +"Terrain": "", +"WorldGeneration": "" } [application] config/name="Societer" -run/main_scene="res://world/game.tscn" +run/main_scene="res://menu/MainMenu.tscn" config/icon="res://icon.png" [autoload] diff --git a/theme/fonts/monogram.ttf b/theme/fonts/monogram.ttf new file mode 100644 index 0000000..aceaeba Binary files /dev/null and b/theme/fonts/monogram.ttf differ diff --git a/theme/theme.tres b/theme/theme.tres new file mode 100644 index 0000000..6941bd0 --- /dev/null +++ b/theme/theme.tres @@ -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 ) diff --git a/ui/map/map.gd b/ui/map/map.gd index 0521719..786c358 100644 --- a/ui/map/map.gd +++ b/ui/map/map.gd @@ -2,10 +2,9 @@ extends Node2D signal map_clicked -var terrain - func heightmap(): - for triangle in terrain.get_triangles(): + print (Global.terrain) + for triangle in Global.terrain.get_triangles(): var colors = Gradient.new() colors.add_point(0.999, Color("#9e0142")) # red colors.add_point(0.5, Color("#dc865d")) # orange @@ -21,7 +20,7 @@ func heightmap(): draw_polygon(triangle.polygon(), PoolColorArray([color])) var coastline = PoolVector2Array() - for edge in terrain.get_edges(): + for edge in Global.terrain.get_edges(): if edge.get_data("coast"): coastline.append(edge.line()[0]) coastline.append(edge.line()[1]) @@ -30,26 +29,26 @@ func heightmap(): draw_multiline(coastline, Color.black) 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) 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) func draw_voronoi_cells_old(): var seen = [] - for edge_idx in terrain.edges(): + for edge_idx in Global.terrain.edges(): var triangles = [] 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): 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: - triangles.append(terrain.triangle_of_edge(edge_around_idx)) + triangles.append(Global.terrain.triangle_of_edge(edge_around_idx)) for triangle in triangles: - vertices.append(terrain.triangle_center(triangle)) + vertices.append(Global.terrain.triangle_center(triangle)) if triangles.size() > 2: var color = Color(randf(), randf(), randf(), 1) @@ -58,26 +57,26 @@ func draw_voronoi_cells_old(): voronoi_cell.append(Vector2(vertice.x, vertice.z)) draw_polygon(voronoi_cell, PoolColorArray([color])) 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) if polygon.size() > 2: draw_polygon(polygon, PoolColorArray([color])) func draw_voronoi_cells_convex_hull(): - for point_idx in terrain.points(): + for point_idx in Global.terrain.points(): var triangles = [] 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: triangles.append(0) else: - var edges = terrain.edges_around_point(incoming) + var edges = Global.terrain.edges_around_point(incoming) 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: - vertices.append(terrain.triangle_center(triangle_idx)) + vertices.append(Global.terrain.triangle_center(triangle_idx)) if triangles.size() > 2: var color = Color(randf(), randf(), randf(), 1) @@ -99,7 +98,3 @@ func _process(_delta): var new_position = get_viewport().get_mouse_position() / scale if new_position.x <= 2000 and new_position.y <= 2000: emit_signal("map_clicked", new_position) - -func _on_Game_world_loaded(game_terrain): - terrain = game_terrain - update() diff --git a/utils/Global.gd b/utils/Global.gd index 59cc6a7..03cd234 100644 --- a/utils/Global.gd +++ b/utils/Global.gd @@ -1,10 +1,66 @@ extends Node var debug = true -var terrain +var terrain_name = "" +var terrain_mesh: Mesh +var terrain = Terrain.new() +var loading = loading_helper.new() # Debuging messages func print_debug(message): if debug: 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 diff --git a/utils/terrain/Terrain.gd b/utils/terrain/Terrain.gd index 9513319..10f2600 100644 --- a/utils/terrain/Terrain.gd +++ b/utils/terrain/Terrain.gd @@ -580,6 +580,13 @@ func _create_points(): _points[point_idx].z = points2d[point_idx].y # Terrain methodes +func set_data(key,value): + _data[key] = value + +func get_data(key): + if _data.has(key): + return _data[key] + func get_triangles(): var triangles = Triangles.new(self) return triangles diff --git a/world/game.gd b/utils/world_generation/WorldGeneration.gd similarity index 53% rename from world/game.gd rename to utils/world_generation/WorldGeneration.gd index a680ee2..53bded3 100644 --- a/world/game.gd +++ b/utils/world_generation/WorldGeneration.gd @@ -1,6 +1,6 @@ -extends Node +extends Reference -signal world_loaded +class_name WorldGeneration export(int) var width = 2048 export(int) var height = 2048 @@ -16,35 +16,47 @@ export(int) var river_proba = 200 var rng = RandomNumberGenerator.new() var noise = OpenSimplexNoise.new() -var terrain - -func _ready(): +func _init(): + Global.loading.reset() rng.randomize() noise.seed = rng.randi() 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) + + var max_step = ( + Global.terrain.get_triangles().size() + # + height + ) - terrain = Terrain.new() + 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()) - Global.print_debug(terrain.list()) - - if terrain.exists(terrain_name): - terrain.load(terrain_name) - else: - terrain.create(width,height,spacing,terrain_name) + Global.loading.set_max_step(max_step) - if terrain.is_created() or terrain.is_loaded(): + if Global.terrain.is_created(): init_data() - add_trees() - emit_signal("world_loaded", terrain) + Global.terrain.save() + + 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: - 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 palais ..., pas de palais.") + Global.loading.set_end_time() + 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_data("water", point_is_water(point)) # point.set_data("mountain", point_is_mountain(point)) @@ -52,16 +64,14 @@ func init_data(): # 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"): # point.set_elevation(0.1) # point.set_data("water", false) # 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 + for triangle in Global.terrain.get_triangles(): triangle.set_elevation(find_elevation(triangle.center2d())) # triangle.set_data("elevation", triangle_find_elevation(triangle)) triangle.set_data("water", triangle_is_water(triangle)) @@ -70,23 +80,24 @@ func init_data(): print(triangle.get_elevation()) if triangle.is_water(): triangle.set_elevation(0) + Global.loading.increment_step() # 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(): + # for edge in Global.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(): + 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() - terrain.get_point(current_point_id).set_data("ocean", true) - for neighbour in terrain.get_point(current_point_id).points_around(): + 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 @@ -101,13 +112,13 @@ func set_river_path(point): while stack.size(): 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) - start_elevation = terrain.get_point(current_point_id).get_elevation() + start_elevation = Global.terrain.get_point(current_point_id).get_elevation() stack = [] - if terrain.get_point(current_point_id).get_data("ocean"): + if Global.terrain.get_point(current_point_id).get_data("ocean"): 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()): stack.append(neighbour.get_index()) came_from[neighbour.get_index()] = current_point_id @@ -122,8 +133,8 @@ 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) + Global.terrain.get_point(index).set_data("river", true) + # Global.terrain.get_point(index).set_data("water", true) # Point @@ -202,13 +213,62 @@ func edge_is_river(edge): return true return false -func add_trees(): - rng.randomize() - var treescene = load("res://entities/environment/birchtree/birchtree.tscn") - 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(triangle.center3d() * Vector3(1, 12*10, 1)) - add_child(tree) +# func add_trees(): +# rng.randomize() +# var treescene = load("res://entities/environment/birchtree/birchtree.tscn") +# for triangle in Global.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(triangle.center3d() * Vector3(1, 12*10, 1)) +# 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() diff --git a/world.mesh b/world.mesh new file mode 100644 index 0000000..4cfcc1f Binary files /dev/null and b/world.mesh differ diff --git a/world/World3d.gd b/world/World3d.gd index 36a8e0f..dc3c38b 100644 --- a/world/World3d.gd +++ b/world/World3d.gd @@ -1,51 +1,5 @@ extends Spatial -var terrain - func _ready(): - pass - - -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) + var mi = Global.terrain.get_data("mesh") add_child(mi) - -func _on_Game_world_loaded(game_terrain): - terrain = game_terrain - draw_world() diff --git a/world/game.tscn b/world/game.tscn index 51f1d10..8136975 100644 --- a/world/game.tscn +++ b/world/game.tscn @@ -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://world/game.gd" type="Script" id=2] [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://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 ) [node name="Game" type="Node"] -script = ExtResource( 2 ) [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 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="camera_moved" from="World3d/CamBase/Camera" to="UI/Map/Cursor" method="_on_Camera_camera_moved"]