about summary refs log tree commit diff stats
path: root/VERSION
Commit message (Expand)AuthorAgeFilesLines
* Released v0.10.6Star Rauchenberger2024-07-161-1/+1
* Released v0.10.5Star Rauchenberger2024-07-121-1/+1
* Released v0.10.4Star Rauchenberger2024-07-011-1/+1
* Released v0.10.3Star Rauchenberger2024-06-101-1/+1
* Released v0.10.2Star Rauchenberger2024-06-091-1/+1
* Released v0.10.1Star Rauchenberger2024-06-081-1/+1
* Released v0.10.0Star Rauchenberger2024-06-061-1/+1
* Released v0.9.2Star Rauchenberger2024-06-041-1/+1
* Released v0.9.1Star Rauchenberger2024-05-151-1/+1
* Released v0.9.0Star Rauchenberger2024-04-221-1/+1
* Released v0.8.0Star Rauchenberger2024-04-031-1/+1
* Released v0.7.1Star Rauchenberger2024-04-011-1/+1
* Released v0.7.0Star Rauchenberger2024-04-011-1/+1
* Released v0.6.6Star Rauchenberger2024-03-071-1/+1
* Released v0.6.5Star Rauchenberger2024-02-181-1/+1
* Released v0.6.4Star Rauchenberger2024-01-271-1/+1
* Released v0.6.3Star Rauchenberger2024-01-191-1/+1
* Released v0.6.2Star Rauchenberger2024-01-121-1/+1
* Released v0.6.1Star Rauchenberger2023-11-281-1/+1
* Released v0.6.0Star Rauchenberger2023-11-171-1/+1
* Released v0.5.7Star Rauchenberger2023-11-101-1/+1
* Released v0.5.6Star Rauchenberger2023-11-101-1/+1
* Released v0.5.5Star Rauchenberger2023-11-091-1/+1
* Added VERSION fileStar Rauchenberger2023-10-191-0/+1
} /* Literal.String */ .highlight .na { color: #336699 } /* Name.Attribute */ .highlight .nb { color: #003388 } /* Name.Builtin */ .highlight .nc { color: #bb0066; font-weight: bold } /* Name.Class */ .highlight .no { color: #003366; font-weight: bold } /* Name.Constant */ .highlight .nd { color: #555555 } /* Name.Decorator */ .highlight .ne { color: #bb0066; font-weight: bold } /* Name.Exception */ .highlight .nf { color: #0066bb; font-weight: bold } /* Name.Function */ .highlight .nl { color: #336699; font-style: italic } /* Name.Label */ .highlight .nn { color: #bb0066; font-weight: bold } /* Name.Namespace */ .highlight .py { color: #336699; font-weight: bold } /* Name.Property */ .highlight .nt { color: #bb0066; font-weight: bold } /* Name.Tag */ .highlight .nv { color: #336699 } /* Name.Variable */ .highlight .ow { color: #008800 } /* Operator.Word */ .highlight .w { color: #bbbbbb } /* Text.Whitespace */ .highlight .mb { color: #0000DD; font-weight: bold } /* Literal.Number.Bin */ .highlight .mf { color: #0000DD; font-weight: bold } /* Literal.Number.Float */ .highlight .mh { color: #0000DD; font-weight: bold } /* Literal.Number.Hex */ .highlight .mi { color: #0000DD; font-weight: bold } /* Literal.Number.Integer */ .highlight .mo { color: #0000DD; font-weight: bold } /* Literal.Number.Oct */ .highlight .sa { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Affix */ .highlight .sb { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Backtick */ .highlight .sc { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Char */ .highlight .dl { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Delimiter */ .highlight .sd { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Doc */ .highlight .s2 { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Double */ .highlight .se { color: #0044dd; background-color: #fff0f0 } /* Literal.String.Escape */ .highlight .sh { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Heredoc */ .highlight .si { color: #3333bb; background-color: #fff0f0 } /* Literal.String.Interpol */ .highlight .sx { color: #22bb22; background-color: #f0fff0 } /* Literal.String.Other */ .highlight .sr { color: #008800; background-color: #fff0ff } /* Literal.String.Regex */ .highlight .s1 { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Single */ .highlight .ss { color: #aa6600; background-color: #fff0f0 } /* Literal.String.Symbol */ .highlight .bp { color: #003388 } /* Name.Builtin.Pseudo */ .highlight .fm { color: #0066bb; font-weight: bold } /* Name.Function.Magic */ .highlight .vc { color: #336699 } /* Name.Variable.Class */ .highlight .vg { color: #dd7700 } /* Name.Variable.Global */ .highlight .vi { color: #3333bb } /* Name.Variable.Instance */ .highlight .vm { color: #336699 } /* Name.Variable.Magic */ .highlight .il { color: #0000DD; font-weight: bold } /* Literal.Number.Integer.Long */
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)