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/map | |
| parent | 48a7a20e0f1595cd6e46c8c5136863ed56d5ef2b (diff) | |
| download | hurrycurry-a51e4f60fcc03649529349227bbe2b28395eebc7.tar hurrycurry-a51e4f60fcc03649529349227bbe2b28395eebc7.tar.bz2 hurrycurry-a51e4f60fcc03649529349227bbe2b28395eebc7.tar.zst | |
fix #240; fix #241
Diffstat (limited to 'client/map')
| -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() | 
