diff --git a/menu/LoadingScreen.gd b/menu/LoadingScreen.gd index 57858a2..662f126 100644 --- a/menu/LoadingScreen.gd +++ b/menu/LoadingScreen.gd @@ -2,24 +2,20 @@ extends Control var thread var world = {} +var old_step = 0 func _ready(): thread = Thread.new() thread.start(self, "_generate_world") set_process(true) -# -# while true: -# if "step" in world: -# if world.step >= world.max_step: -# break -# print(world.step) -# $ProgressBar.value = world.step / world.max_step * 100 + Global.loading.set_start_time() -func _process(delta): - if "step" in world: - print(world.step) - if world.step >= 2: - get_tree().change_scene("res://world/game.tscn") +func _process(_delta): + $ProgressBar.value = Global.loading.get_percentage() + if (Global.loading.get_percentage() >= 100): + Global.loading.set_end_time() + print(Global.loading.get_elapsed_time("s")) + get_tree().change_scene("res://world/game.tscn") func _exit_tree(): thread.wait_to_finish() diff --git a/project.godot b/project.godot index bc1444c..baed0d8 100644 --- a/project.godot +++ b/project.godot @@ -34,7 +34,7 @@ _global_script_classes=[ { "language": "GDScript", "path": "res://utils/terrain/Terrain.gd" }, { -"base": "Control", +"base": "Reference", "class": "WorldGeneration", "language": "GDScript", "path": "res://utils/world_generation/WorldGeneration.gd" diff --git a/ui/map/map.gd b/ui/map/map.gd index 786c358..890b4d2 100644 --- a/ui/map/map.gd +++ b/ui/map/map.gd @@ -87,7 +87,7 @@ func draw_voronoi_cells_convex_hull(): func _draw(): print("before drawing") - heightmap() + # heightmap() # draw_voronoi_cells() # draw_triangles_edges() # draw_voronoi_cells_convex_hull() diff --git a/utils/Global.gd b/utils/Global.gd index 67c7fcf..03cd234 100644 --- a/utils/Global.gd +++ b/utils/Global.gd @@ -2,10 +2,65 @@ extends Node var debug = true 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 2137190..66a4a91 100644 --- a/utils/terrain/Terrain.gd +++ b/utils/terrain/Terrain.gd @@ -392,6 +392,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/utils/world_generation/WorldGeneration.gd b/utils/world_generation/WorldGeneration.gd index bbc5045..3324070 100644 --- a/utils/world_generation/WorldGeneration.gd +++ b/utils/world_generation/WorldGeneration.gd @@ -1,4 +1,4 @@ -extends Control +extends Reference class_name WorldGeneration @@ -16,28 +16,27 @@ export(int) var river_proba = 200 var rng = RandomNumberGenerator.new() var noise = OpenSimplexNoise.new() -var step = 0 -var max_step = 5 - func _init(): + Global.loading.reset() rng.randomize() noise.seed = rng.randi() noise.octaves = octaves - + if Global.terrain.exists(Global.terrain_name): Global.terrain.load(Global.terrain_name) else: Global.terrain.create(width,height,spacing,Global.terrain_name) - - step += 1 + + Global.loading.set_max_step(Global.terrain.get_triangles().size() + height) if Global.terrain.is_created(): init_data() Global.terrain.save() - + if Global.terrain.is_created() or Global.terrain.is_loaded(): - add_trees() - step += 1 + 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 Global.terrain, pas de construction ...") @@ -201,13 +200,64 @@ func edge_is_river(edge): return true return false -func add_trees(): - rng.randomize() - var treescene = load("res://entities/environment/birchtree/birchtree.tscn") +# 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.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) + 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 + +func create_map(): + var img = Image.new() + img.create(width, height, false, Image.FORMAT_RGBA8) + img.lock() + + for y in height: + # print(y) + Global.loading.increment_step() + for x in width: + img.set_pixel(x,y,Color(randf(), randf(), randf())) + + img.unlock() + + + pass diff --git a/world.mesh b/world.mesh index d76dd56..4cfcc1f 100644 Binary files a/world.mesh and b/world.mesh differ diff --git a/world/World3d.gd b/world/World3d.gd index c9fe61c..dc3c38b 100644 --- a/world/World3d.gd +++ b/world/World3d.gd @@ -1,46 +1,5 @@ extends Spatial func _ready(): - draw_world() - -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 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) - - st.generate_normals() -# st.generate_tangents() - st.index() - # Commit to a mesh. - var mesh = st.commit() - - var file_name = "user://terrain/%s/world.mesh" % (Global.terrain_name) - ResourceSaver.save(file_name, mesh) - - 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 + var mi = Global.terrain.get_data("mesh") add_child(mi)