factory-expansion/logic/world/chunk/chunk_drawing.gd

68 lines
2.3 KiB
GDScript

extends Node2D
@export var world : World
@export var camera : WorldCamera
@export var chunk_shader : Shader
var chunk_textures : Dictionary[Chunk, Sprite2D]
func _draw():
var camera_chunk = world.tile_pos_to_chunk_pos(Vector2i(camera.position / TileGlobals.tile_size / 2))
var camera_size : Vector2 = camera.get_camera_rect().size / TileGlobals.chunk_size / TileGlobals.tile_size / 2
var adjusted_size : Vector2i = Vector2i(ceil(camera_size.x) + 2, ceil(camera_size.y) + 2)
var generation_radius = maxi(adjusted_size.x, adjusted_size.y)
for y in range(camera_chunk.y - generation_radius, camera_chunk.y + generation_radius):
for x in range(camera_chunk.x - generation_radius, camera_chunk.x + generation_radius):
draw_chunk(world.get_chunk_at(camera_chunk + Vector2i(x,y)))
func draw_chunk(chunk : Chunk) -> void:
var x : int = 0
var y : int = 0
var offset : Vector2 = chunk.position * TileGlobals.chunk_size * TileGlobals.tile_size
if not chunk_textures.has(chunk):
var new_sprite2d : Sprite2D = Sprite2D.new()
new_sprite2d.texture = preload("res://resources/items/textures/blank_tile.png")
new_sprite2d.position = offset
new_sprite2d.scale = Vector2(
TileGlobals.chunk_size,
TileGlobals.chunk_size
)
var new_shader_material : ShaderMaterial = ShaderMaterial.new()
new_shader_material.shader = chunk_shader
new_sprite2d.material = new_shader_material
new_sprite2d.material.set_shader_parameter("tile_size", TileGlobals.tile_size)
new_sprite2d.material.set_shader_parameter("tile_count", len(TileGlobals.tile_definitions))
new_sprite2d.material.set_shader_parameter("tile_texture", TileGlobals.tile_atlas)
var item_array : Array[int]
for iy in range(TileGlobals.chunk_size):
for ix in range(TileGlobals.chunk_size):
item_array.append(0)
for item_pos in chunk.items.keys():
item_array[item_pos.y*TileGlobals.chunk_size+item_pos.x] = chunk.items[item_pos].id
new_sprite2d.material.set_shader_parameter("item_texture", ItemGlobals.item_atlas)
new_sprite2d.material.set_shader_parameter("tiles", chunk.tiles)
new_sprite2d.material.set_shader_parameter("items", item_array)
new_sprite2d.texture_repeat = CanvasItem.TEXTURE_REPEAT_ENABLED
chunk_textures[chunk] = new_sprite2d
add_child(new_sprite2d)
func _process(delta: float) -> void:
queue_redraw()