From 86e2162c6fd85d20d9855faf521bd59d3cf0f6a3 Mon Sep 17 00:00:00 2001 From: Zacharie Guet Date: Fri, 6 Mar 2026 10:13:18 +0100 Subject: [PATCH] =?UTF-8?q?ajout=20d'une=20bordure=20al=C3=A9atoire=20entr?= =?UTF-8?q?e=20chunks?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- stages/terrain/region/scripts/chunk.gd | 149 ++++++++++++------ stages/terrain/region/scripts/region.gd | 21 +-- .../scripts/tile_map_layers/region_layer.gd | 11 +- .../terrain/region/scripts/tiles_diff_data.gd | 1 + stages/terrain/region/test_chunk.tscn | 26 +++ 5 files changed, 133 insertions(+), 75 deletions(-) diff --git a/stages/terrain/region/scripts/chunk.gd b/stages/terrain/region/scripts/chunk.gd index e35d183..ae36788 100644 --- a/stages/terrain/region/scripts/chunk.gd +++ b/stages/terrain/region/scripts/chunk.gd @@ -1,4 +1,3 @@ -@tool extends Node2D class_name Chunk @@ -6,16 +5,20 @@ const GENERATION_NUMBER = 4 const NOISE_IMAGE_SIZE := 150 -const MAX_DECONTAMINATION_DISTANCE=2 +const MAX_DECONTAMINATION_DISTANCE=3 +const RANDOM_PADDING_NOISE_FREQUENCY := 0.01 const ROCK_NOISE_FREQUENCY := 0.01 const DECONTAMINATION_NOISE_FREQUENCY := 0.01 +const CHUNK_RANDOM_PADDING := 2 + @export var region_data : RegionData @export var chunk_coord : Vector2i var is_generated : bool = false +var random_padding_noise : Noise = null var rock_noise_image : Noise = null var cristal_noise_image : Noise = null var decontamination_noise_image : Noise = null @@ -28,13 +31,21 @@ var generation_thread : Thread var generation_semaphore : Semaphore -@export_tool_button("Update", "Callable") var update_action = func(): - generation_semaphore.post() - for c in get_children(): - c.queue_free() +var all_tiles : Array[Vector2i] +var all_global_tiles : Array[Vector2i] - setup_position() - generate() +# @export_tool_button("Update", "Callable") var update_action = func(): +# generation_semaphore.post() +# for c in get_children(): +# c.queue_free() + +# setup_position() +# # queue_redraw() +# generate() + +# @export_tool_button("Clear", "Callable") var clear_action = func(): +# for c in get_children(): +# c.queue_free() func _init( _chunk_coord : Vector2i = Vector2i.ZERO, @@ -60,7 +71,10 @@ func generate(): rock_noise_image = generate_noise(region_data.region_seed + 1, ROCK_NOISE_FREQUENCY) decontamination_noise_image = generate_noise(region_data.region_seed + 2, DECONTAMINATION_NOISE_FREQUENCY) cristal_noise_image = generate_noise(region_data.region_seed + 3, ROCK_NOISE_FREQUENCY) + random_padding_noise = generate_noise(region_data.region_seed + 10, RANDOM_PADDING_NOISE_FREQUENCY) + all_tiles = calculate_all_tiles() + rock_layer = RockLayer.new(region_data) ground_layer = GroundLayer.new(region_data) decontamination_layer = DecontaminationLayer.new(region_data) @@ -81,13 +95,49 @@ func generate(): is_generated = true -# func unload(): -# for x in range(Region.CHUNK_TILE_SIZE): -# for y in range(Region.CHUNK_TILE_SIZE): -# var global_coord = Vector2i(x, y) + Region.CHUNK_TILE_SIZE * chunk_coord -# region.rock_layer.erase_cell(global_coord) -# region.ground_layer.erase_cell(global_coord) -# region.decontamination_layer.erase_cell(global_coord) +func calculate_all_tiles() -> Array[Vector2i]: + var coords : Array[Vector2i] = [] + + for x in range(-CHUNK_RANDOM_PADDING, Region.CHUNK_TILE_SIZE + CHUNK_RANDOM_PADDING): + for y in range(-CHUNK_RANDOM_PADDING, Region.CHUNK_TILE_SIZE + CHUNK_RANDOM_PADDING): + var coord := Vector2i(x,y) + if is_tile_in_chunk(coord): + coords.append(coord) + return coords + +func is_tile_in_chunk(coord : Vector2i) -> bool: + var check_select = (chunk_coord.x + chunk_coord.y%2)%2 == 0 + var x := coord.x + var y := coord.y + + if not ( + x in range(-CHUNK_RANDOM_PADDING, Region.CHUNK_TILE_SIZE + CHUNK_RANDOM_PADDING) + and y in range(-CHUNK_RANDOM_PADDING, Region.CHUNK_TILE_SIZE + CHUNK_RANDOM_PADDING) + ): + return false + + if not ( + (x < 0 or x >= Region.CHUNK_TILE_SIZE) + and (y < 0 or y >= Region.CHUNK_TILE_SIZE) + ): + if ( + x in range(-CHUNK_RANDOM_PADDING, CHUNK_RANDOM_PADDING) + or x in range(Region.CHUNK_TILE_SIZE - CHUNK_RANDOM_PADDING, Region.CHUNK_TILE_SIZE + CHUNK_RANDOM_PADDING) + or y in range(-CHUNK_RANDOM_PADDING, CHUNK_RANDOM_PADDING) + or y in range(Region.CHUNK_TILE_SIZE - CHUNK_RANDOM_PADDING, Region.CHUNK_TILE_SIZE + CHUNK_RANDOM_PADDING) + ): + var tile_value = get_tile_value_from_noise(Vector2i(x,y), random_padding_noise) + if check_select: + if tile_value >= 0.5: + return true + else : + if tile_value < 0.5: + return true + else: + return true + + return false + # Debug # func _draw(): @@ -98,17 +148,17 @@ func generate(): # 3 # ) - # for x in range(NOISE_IMAGE_SIZE): - # for y in range(NOISE_IMAGE_SIZE): - # var noise_value = rock_noise_image.get_noise_2d( - # x, - # y - # ) - # draw_rect( - # Rect2(Vector2i(x,y) * Region.CHUNK_SIZE / NOISE_IMAGE_SIZE, Vector2i.ONE * Region.CHUNK_SIZE / NOISE_IMAGE_SIZE), - # Color.WHITE * ((noise_value+1)/2), - # true, - # ) +# for x in range(NOISE_IMAGE_SIZE): +# for y in range(NOISE_IMAGE_SIZE): +# var noise_value = random_padding_noise.get_noise_2d( +# x, +# y +# ) +# draw_rect( +# Rect2(Vector2i(x,y) * Region.CHUNK_SIZE / NOISE_IMAGE_SIZE, Vector2i.ONE * Region.CHUNK_SIZE / NOISE_IMAGE_SIZE), +# Color.WHITE * ((noise_value+1)/2), +# true, +# ) func generate_noise( noise_seed : int, @@ -139,14 +189,12 @@ func get_tile_value_from_noise(tile_position : Vector2i, noise : Noise) -> float func generate_rocks(layer : RockLayer): var cristals : Array[Vector2i] = [] var rocks : Array[Vector2i] = [] - for x in range(0, Region.CHUNK_TILE_SIZE): - for y in range(0, Region.CHUNK_TILE_SIZE): - var tile_type := get_generated_rock_type(Vector2i(x, y)) - var coord = Vector2i(x, y) - if tile_type == RockLayer.TileType.CRISTAL: - cristals.append(coord) - elif tile_type == RockLayer.TileType.ROCK: - rocks.append(coord) + for coord in all_tiles: + var tile_type := get_generated_rock_type(coord) + if tile_type == RockLayer.TileType.CRISTAL: + cristals.append(coord) + elif tile_type == RockLayer.TileType.ROCK: + rocks.append(coord) layer.place_rocks(cristals, RockLayer.TileType.CRISTAL) layer.place_rocks(rocks, RockLayer.TileType.ROCK) @@ -169,30 +217,27 @@ func get_generated_rock_type(coord : Vector2i) -> RockLayer.TileType: func generate_ground(layer : GroundLayer): var coords : Array[Vector2i] = [] - for x in range(0, Region.CHUNK_TILE_SIZE): - for y in range(0,Region.CHUNK_TILE_SIZE): - coords.append(Vector2i(x,y)) + for coord in all_tiles: + coords.append(coord) layer.place_ground(coords) func generate_decontamination(layer : DecontaminationLayer): var decontamination_tiles : Array[Vector2i] = [] - for x in range(0, Region.CHUNK_TILE_SIZE): - for y in range(0, Region.CHUNK_TILE_SIZE): - var coord = Vector2i(x,y) - var tile_value : float = ( - 1. if chunk_coord.distance_to(Vector2i.ZERO) > MAX_DECONTAMINATION_DISTANCE - else get_tile_value_from_noise(coord, decontamination_noise_image) + for coord in all_tiles: + var tile_value : float = ( + 1. if chunk_coord.distance_to(Vector2i.ZERO) > MAX_DECONTAMINATION_DISTANCE + else get_tile_value_from_noise(coord, decontamination_noise_image) + ) + var saved_diff : TilesDiffData.TileDiff = region_data.decontamination_tiles_data.get_tile_diff_for_local_coord(coord, chunk_coord) + if ( + ( + (tile_value < region_data.decontamination_threshold) + or saved_diff == TilesDiffData.TileDiff.PRESENT ) - var saved_diff : TilesDiffData.TileDiff = region_data.decontamination_tiles_data.get_tile_diff_for_local_coord(coord, chunk_coord) - if ( - ( - (tile_value < region_data.decontamination_threshold) - or saved_diff == TilesDiffData.TileDiff.PRESENT - ) - and saved_diff != TilesDiffData.TileDiff.ABSENT - ): - decontamination_tiles.append(Vector2i(x,y)) + and saved_diff != TilesDiffData.TileDiff.ABSENT + ): + decontamination_tiles.append(coord) layer.place_decontaminations( decontamination_tiles, diff --git a/stages/terrain/region/scripts/region.gd b/stages/terrain/region/scripts/region.gd index 27b12d4..0ee1ab5 100644 --- a/stages/terrain/region/scripts/region.gd +++ b/stages/terrain/region/scripts/region.gd @@ -225,19 +225,14 @@ func pass_day(): data.end_pass_day() save() -func get_chunk_for_coord(tiles_coord : Vector2i) -> Chunk: - var chunk_coord = Vector2i( - floori(float(tiles_coord.x)/Region.CHUNK_TILE_SIZE), - floori(float(tiles_coord.y)/Region.CHUNK_TILE_SIZE), - ) - - var id = generated_chunks.find_custom( - func (c: Chunk): return c.chunk_coord.x == chunk_coord.x and c.chunk_coord.y == chunk_coord.y - ) - - if id == -1 or not generated_chunks[id].is_generated: - return null - return generated_chunks[id] +func get_chunk_for_coord(tile_coord : Vector2i) -> Chunk: + for chunk in generated_chunks: + if chunk.is_generated: + var local_coord = TilesDiffData.get_local_coord(tile_coord, chunk.chunk_coord) + if chunk.is_tile_in_chunk(local_coord): + print(chunk.chunk_coord) + return chunk + return null func is_coords_decontaminated(tiles_coords : Array[Vector2i]): for coord in tiles_coords: diff --git a/stages/terrain/region/scripts/tile_map_layers/region_layer.gd b/stages/terrain/region/scripts/tile_map_layers/region_layer.gd index f5b12d3..6ed871b 100644 --- a/stages/terrain/region/scripts/tile_map_layers/region_layer.gd +++ b/stages/terrain/region/scripts/tile_map_layers/region_layer.gd @@ -42,17 +42,8 @@ func place_terrain_cells( tile_terrain_set : int = 0, tile_terrain : int = 0 ): - var valid_coords : Array[Vector2i] = coords.filter(is_coord_valid) set_cells_terrain_connect( - valid_coords, + coords, tile_terrain_set, tile_terrain - ) - -func is_coord_valid(coord : Vector2i) -> bool: - return ( - coord.x >= 0 - and coord.y >= 0 - and coord.x < Region.CHUNK_TILE_SIZE - and coord.y < Region.CHUNK_TILE_SIZE ) \ No newline at end of file diff --git a/stages/terrain/region/scripts/tiles_diff_data.gd b/stages/terrain/region/scripts/tiles_diff_data.gd index 30b7497..8b2c879 100644 --- a/stages/terrain/region/scripts/tiles_diff_data.gd +++ b/stages/terrain/region/scripts/tiles_diff_data.gd @@ -1,3 +1,4 @@ +@tool extends Resource class_name TilesDiffData diff --git a/stages/terrain/region/test_chunk.tscn b/stages/terrain/region/test_chunk.tscn index 0ce0b33..3614f55 100644 --- a/stages/terrain/region/test_chunk.tscn +++ b/stages/terrain/region/test_chunk.tscn @@ -1,14 +1,26 @@ [gd_scene format=3 uid="uid://dtfuxosn6s0cr"] [ext_resource type="Script" uid="uid://d2ixbaa2uqlv4" path="res://stages/terrain/region/scripts/chunk.gd" id="1_mhr83"] +[ext_resource type="Script" uid="uid://dy6d4rmdu6gh0" path="res://stages/terrain/region/scripts/tiles_diff_data.gd" id="2_ct7cr"] [ext_resource type="Script" uid="uid://bgbbce45hjv3d" path="res://entities/scripts/entity_data.gd" id="2_tiw8g"] [ext_resource type="Script" uid="uid://da6j333qs7wse" path="res://entities/plants/scripts/plant_data.gd" id="3_ct7cr"] [ext_resource type="Script" uid="uid://cx30nvq8b34lj" path="res://stages/terrain/region/scripts/region_data.gd" id="4_0rtv3"] +[sub_resource type="Resource" id="Resource_0rtv3"] +script = ExtResource("2_ct7cr") +metadata/_custom_type_script = "uid://dy6d4rmdu6gh0" + +[sub_resource type="Resource" id="Resource_ame7t"] +script = ExtResource("2_ct7cr") +metadata/_custom_type_script = "uid://dy6d4rmdu6gh0" + [sub_resource type="Resource" id="Resource_tiw8g"] script = ExtResource("4_0rtv3") +region_seed = 2 rock_threshold = 0.5 decontamination_threshold = 0.5 +rock_tiles_data = SubResource("Resource_ame7t") +decontamination_tiles_data = SubResource("Resource_0rtv3") metadata/_custom_type_script = "uid://cx30nvq8b34lj" [node name="TestChunk" type="Node2D" unique_id=990498648] @@ -24,3 +36,17 @@ script = ExtResource("1_mhr83") region_data = SubResource("Resource_tiw8g") chunk_coord = Vector2i(1, 0) metadata/_custom_type_script = "uid://d2ixbaa2uqlv4" + +[node name="Chunk3" type="Node2D" parent="." unique_id=1505202284] +position = Vector2(0, 1280) +script = ExtResource("1_mhr83") +region_data = SubResource("Resource_tiw8g") +chunk_coord = Vector2i(0, 1) +metadata/_custom_type_script = "uid://d2ixbaa2uqlv4" + +[node name="Chunk4" type="Node2D" parent="." unique_id=774217732] +position = Vector2(1280, 1280) +script = ExtResource("1_mhr83") +region_data = SubResource("Resource_tiw8g") +chunk_coord = Vector2i(1, 1) +metadata/_custom_type_script = "uid://d2ixbaa2uqlv4"