extends CanvasLayer
var player
var drawer
var sprite
var label
var cell_left
var cell_top
var cell_right
var cell_bottom
var cell_width
var cell_height
var center_x_min
var center_x_max
var center_y_min
var center_y_max
func _ready():
player = get_tree().get_root().get_node("scene/player")
var svc = PanelContainer.new()
svc.anchor_left = 1.0
svc.anchor_top = 1.0
svc.anchor_right = 1.0
svc.anchor_bottom = 1.0
svc.offset_left = -320.0
svc.offset_top = -320.0
svc.offset_right = -64.0
svc.offset_bottom = -64.0
svc.clip_contents = true
add_child(svc)
var background_color = Color.WHITE
var world_env = get_tree().get_root().get_node("scene/WorldEnvironment")
if world_env != null and world_env.environment != null:
if world_env.environment.background_mode == Environment.BG_COLOR:
background_color = world_env.environment.background_color
elif (
world_env.environment.background_mode == Environment.BG_SKY
and world_env.environment.sky != null
and world_env.environment.sky.sky_material != null
):
var sky = world_env.environment.sky.sky_material
if sky is PhysicalSkyMaterial:
background_color = sky.ground_color
elif sky is ProceduralSkyMaterial:
background_color = sky.sky_top_color
var stylebox = StyleBoxFlat.new()
stylebox.bg_color = Color(background_color, 0.6)
svc.add_theme_stylebox_override("panel", stylebox)
drawer = Node2D.new()
svc.add_child(drawer)
var gridmap = get_tree().get_root().get_node("scene/GridMap")
if gridmap == null:
visible = false
return
cell_left = 0
cell_top = 0
cell_right = 0
cell_bottom = 0
for pos in gridmap.get_used_cells():
if pos.x < cell_left:
cell_left = pos.x
if pos.x > cell_right:
cell_right = pos.x
if pos.z < cell_top:
cell_top = pos.z
if pos.z > cell_bottom:
cell_bottom = pos.z
cell_width = cell_right - cell_left + 1
cell_height = cell_bottom - cell_top + 1
var rendered = _renderMap(gridmap)
var image_texture = ImageTexture.create_from_image(rendered)
sprite = Sprite2D.new()
sprite.texture = image_texture
sprite.texture_filter = CanvasItem.TEXTURE_FILTER_NEAREST
sprite.scale = Vector2(2, 2)
sprite.centered = false
drawer.add_child(sprite)
label = Label.new()
label.theme = preload("res://assets/themes/baseUI.tres")
label.add_theme_font_size_override("font_size", 32)
label.text = "@"
drawer.add_child(label)
#var local_tl = gridmap.map_to_local(Vector3i(cell_left, 0, cell_top))
#var global_tl = gridmap.to_global(local_tl)
#var local_br = gridmap.map_to_local(Vector3i(cell_right, 0, cell_bottom))
#var global_br = gridmap.to_global(local_br)
center_x_min = 0
center_x_max = cell_width - 128
center_y_min = 0
center_y_max = cell_height - 128
if center_x_max < center_x_min:
center_x_min = (center_x_min + center_x_max) / 2
center_x_max = center_x_min
if center_y_max < center_y_min:
center_y_min = (center_y_min + center_y_max) / 2
center_y_max = center_y_min
func _process(_delta):
if visible == false:
return
drawer.position.x = clamp(player.position.x - cell_left - 64, center_x_min, center_x_max) * -2
drawer.position.y = clamp(player.position.z - cell_top - 64, center_y_min, center_y_max) * -2
label.position.x = (player.position.x - cell_left) * 2 - 16
label.position.y = (player.position.z - cell_top) * 2 - 16
func _renderMap(gridmap):
var heights = {}
var rendered = Image.create_empty(cell_width, cell_height, false, Image.FORMAT_RGBA8)
rendered.fill(Color.TRANSPARENT)
var meshes_node = get_tree().get_root().get_node("scene/Meshes")
if meshes_node != null:
_renderMeshNode(gridmap, meshes_node, rendered)
for pos in gridmap.get_used_cells():
var in_plane = Vector2i(pos.x, pos.z)
if in_plane in heights and heights[in_plane] > pos.y:
continue
heights[in_plane] = pos.y
var cell_item = gridmap.get_cell_item(pos)
var mesh = gridmap.mesh_library.get_item_mesh(cell_item)
var material = mesh.surface_get_material(0)
var color = material.albedo_color
rendered.set_pixel(pos.x - cell_left, pos.z - cell_top, color)
return rendered
func _renderMeshNode(gridmap, mesh, rendered):
if mesh is MeshInstance3D:
var local_tl = gridmap.map_to_local(Vector3i(cell_left, 0, cell_top))
var global_tl = gridmap.to_global(local_tl)
var mesh_material = mesh.get_surface_override_material(0)
if mesh_material != null:
var mesh_color = mesh_material.albedo_color
for y in range(
max(mesh.position.z - mesh.scale.z / 2 - global_tl.z, 0),
min(mesh.position.z + mesh.scale.z / 2 - global_tl.z, cell_height)
):
for x in range(
max(mesh.position.x - mesh.scale.x / 2 - global_tl.x, 0),
min(mesh.position.x + mesh.scale.x / 2 - global_tl.x, cell_width)
):
rendered.set_pixel(x, y, mesh_color)
for child in mesh.get_children():
_renderMeshNode(gridmap, child, rendered)