aboutsummaryrefslogtreecommitdiff
path: root/client
diff options
context:
space:
mode:
authornokoe <nokoe@mailbox.org>2025-04-07 16:29:11 +0200
committernokoe <nokoe@mailbox.org>2025-04-07 16:29:11 +0200
commita51e4f60fcc03649529349227bbe2b28395eebc7 (patch)
treea3da5ce2b00837df98257d8f093b85ac99bf3c2b /client
parent48a7a20e0f1595cd6e46c8c5136863ed56d5ef2b (diff)
downloadhurrycurry-a51e4f60fcc03649529349227bbe2b28395eebc7.tar
hurrycurry-a51e4f60fcc03649529349227bbe2b28395eebc7.tar.bz2
hurrycurry-a51e4f60fcc03649529349227bbe2b28395eebc7.tar.zst
fix #240; fix #241
Diffstat (limited to 'client')
-rw-r--r--client/map/map.gd4
-rw-r--r--client/map/tiles/floor_mesher.gd22
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()