170 lines
4.3 KiB
GDScript
170 lines
4.3 KiB
GDScript
extends CanvasLayer
|
|
## Handles displaying debug info.
|
|
|
|
signal mode_changed(mode: Mode)
|
|
|
|
enum Mode { DISABLED, PERFORMANCE, FULL }
|
|
|
|
var mode: Mode = Mode.FULL
|
|
|
|
var _text_to_draw: Dictionary = {}
|
|
var _events_to_draw: Dictionary = {}
|
|
|
|
var _label1_text: String = ""
|
|
var _label2_text: String = ""
|
|
var _label3_text: String = ""
|
|
|
|
@onready var _label1: RichTextLabel = $Control/LabelContainer1/Label1
|
|
@onready var _label2: RichTextLabel = $Control/LabelContainer2/Label2
|
|
@onready var _label3: RichTextLabel = $Control/LabelContainer3/Label3
|
|
@onready var _label4: RichTextLabel = $Control/LabelContainer4/Label4
|
|
|
|
|
|
func _ready() -> void:
|
|
assert(_label1, str(self) + ": _label1 missing!")
|
|
assert(_label2, str(self) + ": _label2 missing!")
|
|
assert(_label3, str(self) + ": _label2 missing!")
|
|
assert(_label4, str(self) + ": _label2 missing!")
|
|
# enabled = OS.has_feature("editor")
|
|
_update_visibility()
|
|
mode_changed.emit(mode)
|
|
|
|
func _process(_delta: float) -> void:
|
|
call_deferred(&"_process_text_labels")
|
|
|
|
func _unhandled_input(event: InputEvent) -> void:
|
|
if event.is_action_pressed("toggle_debug"):
|
|
mode = wrapi(mode + 1, 0, Mode.size()) as Mode
|
|
_update_visibility()
|
|
mode_changed.emit(mode)
|
|
|
|
|
|
func show_debug() -> bool:
|
|
return mode == Mode.FULL
|
|
|
|
|
|
func text(key: String, value: Variant, label_index: int = 1) -> void:
|
|
if not show_debug():
|
|
return
|
|
|
|
_text_to_draw[key] = {"value": value, "label_index": label_index}
|
|
|
|
|
|
func add_event(key: String) -> void:
|
|
_events_to_draw[key] = {"frame": -9999, "args": []}
|
|
|
|
|
|
func event_emitted(key: String, args: Array[Variant] = []) -> void:
|
|
if not show_debug():
|
|
return
|
|
|
|
_events_to_draw[key] = {"frame": Engine.get_physics_frames(), "args": args}
|
|
|
|
|
|
func _update_visibility() -> void:
|
|
visible = mode != Mode.DISABLED
|
|
|
|
|
|
func _append_text(key: String, value: Variant, label_index: int) -> void:
|
|
var line_text := str(value)
|
|
|
|
if value is int:
|
|
line_text = (" " if value >= 0 else "") + line_text
|
|
if (value as int) > 0:
|
|
line_text = "[color=sky_blue]%s[/color]" % line_text
|
|
elif (value as int) < 0:
|
|
line_text = "[color=salmon]%s[/color]" % line_text
|
|
|
|
elif value is float:
|
|
line_text = (" " if value >= 0 else "") + "%.6f" % value
|
|
if value > 0:
|
|
line_text = "[color=sky_blue]%s[/color]" % line_text
|
|
elif value < 0:
|
|
line_text = "[color=salmon]%s[/color]" % line_text
|
|
|
|
elif value is bool:
|
|
if value:
|
|
line_text = "[color=sky_blue]%s[/color]" % line_text
|
|
else:
|
|
line_text = "[color=salmon]%s[/color]" % line_text
|
|
|
|
elif value is Vector3:
|
|
line_text = (
|
|
"(%s, %s, %s)"
|
|
% [
|
|
(" " if value.x >= 0 else "") + ("%.6f" % value.x),
|
|
(" " if value.y >= 0 else "") + ("%.6f" % value.y),
|
|
(" " if value.z >= 0 else "") + ("%.6f" % value.z),
|
|
]
|
|
)
|
|
|
|
elif value is Vector2:
|
|
line_text = (
|
|
"(%s, %s)"
|
|
% [
|
|
(" " if value.x >= 0 else "") + ("%.6f" % value.x),
|
|
(" " if value.y >= 0 else "") + ("%.6f" % value.y),
|
|
]
|
|
)
|
|
|
|
line_text = "%s: %s\n" % [key, line_text]
|
|
|
|
if label_index == 2:
|
|
_label2_text += line_text
|
|
else:
|
|
_label1_text += line_text
|
|
|
|
|
|
func _append_event(key: String, frame: int, args: Array[Variant]) -> void:
|
|
var line_text := key
|
|
|
|
if args.size() > 0:
|
|
line_text += "(%s)" % ", ".join(args.map(str))
|
|
|
|
var physics_frame := Engine.get_physics_frames()
|
|
var color := Color.SALMON.lerp(
|
|
Color.WHITE, clampf(float(physics_frame - frame) / 30.0, 0, 1)
|
|
)
|
|
if physics_frame - frame < 5:
|
|
color = Color.SKY_BLUE
|
|
|
|
line_text = "[color=#%s]%s[/color]\n" % [color.to_html(), line_text]
|
|
|
|
_label3_text += line_text
|
|
|
|
|
|
func _set_label_texts() -> void:
|
|
_label1.text = _label1_text
|
|
_label2.text = _label2_text
|
|
_label3.text = _label3_text
|
|
|
|
|
|
func _process_text_labels() -> void:
|
|
if mode != Mode.DISABLED:
|
|
_label1_text = ""
|
|
_label2_text = ""
|
|
_label3_text = ""
|
|
|
|
_append_text("fps", Engine.get_frames_per_second() as int, 0)
|
|
_append_text("gpu", RenderingServer.get_video_adapter_name(), 0)
|
|
_append_text(
|
|
"resolution",
|
|
Vector2i(get_viewport().size * get_viewport().scaling_3d_scale as Vector2),
|
|
0
|
|
)
|
|
|
|
if mode == Mode.PERFORMANCE:
|
|
_set_label_texts()
|
|
return
|
|
|
|
if mode == Mode.FULL:
|
|
for k: String in _text_to_draw.keys():
|
|
var v: Dictionary = _text_to_draw[k]
|
|
_append_text(k, v["value"] as Variant, v["label_index"] as int)
|
|
|
|
for k: String in _events_to_draw.keys():
|
|
var v: Dictionary = _events_to_draw[k]
|
|
_append_event(k, v["frame"] as int, v["args"] as Array[Variant])
|
|
|
|
_set_label_texts()
|