diff options
author | nokoe <nokoe@mailbox.org> | 2025-04-07 16:29:11 +0200 |
---|---|---|
committer | nokoe <nokoe@mailbox.org> | 2025-04-07 16:29:11 +0200 |
commit | a51e4f60fcc03649529349227bbe2b28395eebc7 (patch) | |
tree | a3da5ce2b00837df98257d8f093b85ac99bf3c2b /client | |
parent | 48a7a20e0f1595cd6e46c8c5136863ed56d5ef2b (diff) | |
download | hurrycurry-a51e4f60fcc03649529349227bbe2b28395eebc7.tar hurrycurry-a51e4f60fcc03649529349227bbe2b28395eebc7.tar.bz2 hurrycurry-a51e4f60fcc03649529349227bbe2b28395eebc7.tar.zst |
fix #240; fix #241
Diffstat (limited to 'client')
-rw-r--r-- | client/map/map.gd | 4 | ||||
-rw-r--r-- | client/map/tiles/floor_mesher.gd | 22 |
2 files changed, 16 insertions, 10 deletions
diff --git a/client/map/map.gd b/client/map/map.gd index 10bb1bd1..2b8dd651 100644 --- a/client/map/map.gd +++ b/client/map/map.gd @@ -21,7 +21,7 @@ extends Node3D var tile_by_pos: Dictionary = {} var autobake = false var currently_baked = false -var floor_mesher = FloorMesher.new() +var floor_mesher := FloorMesher.new() var floor_node := MeshInstance3D.new() func get_tile_name(pos: Vector2i): @@ -34,6 +34,7 @@ func get_tile_instance(pos: Vector2i) -> Tile: else: return null func set_tile(pos: Vector2i, name_: String, neighbors: Array = [null,null,null,null]) -> Tile: + clear_tile(pos) var tile = TileFactory.produce(name_, pos, neighbors, floor_mesher) add_child(tile) tile.position = Vector3(pos.x, 0, pos.y) @@ -47,6 +48,7 @@ func clear_tile(pos: Vector2i): tile_by_pos.erase(str(pos)) tile.name += "_queued_free" tile.queue_free() + floor_mesher.remove_tile(pos) @onready var voxelgi: VoxelGI = $VoxelGI diff --git a/client/map/tiles/floor_mesher.gd b/client/map/tiles/floor_mesher.gd index 182425a5..d3a66c89 100644 --- a/client/map/tiles/floor_mesher.gd +++ b/client/map/tiles/floor_mesher.gd @@ -31,21 +31,25 @@ var tiles: Dictionary func add_tile(pos: Vector2i): tiles[str(pos)] = pos +func remove_tile(pos: Vector2i): + tiles.erase(str(pos)) + func flush() -> ArrayMesh: + var tiles_queue = tiles.duplicate() var st := SurfaceTool.new() st.begin(Mesh.PRIMITIVE_TRIANGLES) - while not tiles.is_empty(): - var key: String = tiles.keys()[0] - var tile_position: Vector2i = tiles[key] + while not tiles_queue.is_empty(): + var key: String = tiles_queue.keys()[0] + var tile_position: Vector2i = tiles_queue[key] var shift := Vector2i.ZERO # move the origin of the rectangle to the upper left corner while true: - #if tiles.has(str(tile_position + shift + Vector2i.UP + Vector2i.LEFT)): + #if tiles_queue.has(str(tile_position + shift + Vector2i.UP + Vector2i.LEFT)): # shift += Vector2i.UP + Vector2i.LEFT - if tiles.has(str(tile_position + shift + Vector2i.UP)): + if tiles_queue.has(str(tile_position + shift + Vector2i.UP)): shift += Vector2i.UP - elif tiles.has(str(tile_position + shift + Vector2i.LEFT)): + elif tiles_queue.has(str(tile_position + shift + Vector2i.LEFT)): shift += Vector2i.LEFT else: break @@ -54,14 +58,14 @@ func flush() -> ArrayMesh: var rectangle := Vector2i.ONE # go down as long as possible - while tiles.has(str(rectangle_origin + Vector2i(0, rectangle.y))): + while tiles_queue.has(str(rectangle_origin + Vector2i(0, rectangle.y))): rectangle.y += 1 # try to go right as long as possible by checking if whole columns are long enough while true: var column_possible := true for i in range(0, rectangle.y): - column_possible = tiles.has(str(rectangle_origin + Vector2i(rectangle.x, i))) + column_possible = tiles_queue.has(str(rectangle_origin + Vector2i(rectangle.x, i))) if not column_possible: break if column_possible: rectangle.x += 1 @@ -102,5 +106,5 @@ func flush() -> ArrayMesh: # remove the rectangle from the "queue" for x in range(rectangle_origin.x, rectangle_origin.x + rectangle.x): for y in range(rectangle_origin.y, rectangle_origin.y + rectangle.y): - tiles.erase(str(Vector2i(x, y))) + tiles_queue.erase(str(Vector2i(x, y))) return st.commit() |