From a775865ed95f253961039201cfcf5b5052d9959f Mon Sep 17 00:00:00 2001 From: Rob Kelly Date: Mon, 29 Sep 2025 15:36:35 -0600 Subject: [PATCH] Added debug HUD --- src/player/debug_hud.gd | 26 +++++++++ src/player/debug_hud.gd.uid | 1 + src/player/player.tscn | 104 ++++++++++++++++++++++++++++++++++-- 3 files changed, 126 insertions(+), 5 deletions(-) create mode 100644 src/player/debug_hud.gd create mode 100644 src/player/debug_hud.gd.uid diff --git a/src/player/debug_hud.gd b/src/player/debug_hud.gd new file mode 100644 index 0000000..47ce69d --- /dev/null +++ b/src/player/debug_hud.gd @@ -0,0 +1,26 @@ +extends CanvasLayer + +const FPS_SAMPLES := 4 + +@export var player: Player + +var _delta_samples: Array[float] = [] + +@onready var fps_label: Label = %FPSLabel +@onready var player_position_label: Label = %PlayerPositionLabel +@onready var player_velocity_label: Label = %PlayerVelocityLabel +@onready var player_speed_label: Label = %PlayerSpeedLabel + + +func _process(delta: float) -> void: + player_position_label.text = str(player.global_position) + player_velocity_label.text = str(player.velocity) + player_speed_label.text = "%.3f" % player.velocity.length() + + # Average FPS across window + _delta_samples.push_front(delta) + if _delta_samples.size() > FPS_SAMPLES: + _delta_samples.pop_back() + var sum_delta: float = _delta_samples.reduce(func(a: float, b: float) -> float: return a + b) + var avg_delta := sum_delta / _delta_samples.size() + fps_label.text = "%.1f" % (1 / avg_delta) diff --git a/src/player/debug_hud.gd.uid b/src/player/debug_hud.gd.uid new file mode 100644 index 0000000..45c23f8 --- /dev/null +++ b/src/player/debug_hud.gd.uid @@ -0,0 +1 @@ +uid://dao84umfatnid diff --git a/src/player/player.tscn b/src/player/player.tscn index 7b376e9..6bf5b24 100644 --- a/src/player/player.tscn +++ b/src/player/player.tscn @@ -1,17 +1,21 @@ -[gd_scene load_steps=12 format=3 uid="uid://dtbulshrxetes"] +[gd_scene load_steps=17 format=3 uid="uid://dtbulshrxetes"] [ext_resource type="Script" uid="uid://bihaf1xlwpkdo" path="res://src/player/player.gd" id="1_5f2sf"] -[ext_resource type="Script" uid="uid://f3kssctvn2bo" path="res://src/player/camera_controller.gd" id="1_mf2ua"] +[ext_resource type="Script" uid="uid://f3kssctvn2bo" path="res://src/player/camera/camera_controller.gd" id="1_mf2ua"] [ext_resource type="Script" uid="uid://csjccrhj5wnx7" path="res://addons/phantom_camera/scripts/phantom_camera/phantom_camera_3d.gd" id="1_rxibo"] [ext_resource type="Script" uid="uid://8umksf8e80fw" path="res://addons/phantom_camera/scripts/resources/tween_resource.gd" id="2_mf2ua"] -[ext_resource type="Script" uid="uid://032jyhgkb2rv" path="res://src/player/mouselook_controller.gd" id="4_244u8"] +[ext_resource type="Script" uid="uid://buq2c8inefgdl" path="res://src/player/camera/strafe_bank_effect.gd" id="3_x42xx"] +[ext_resource type="Script" uid="uid://032jyhgkb2rv" path="res://src/player/camera/mouselook_controller.gd" id="4_244u8"] [ext_resource type="Script" uid="uid://c0nxcunx0fo4r" path="res://src/player/movement_controller.gd" id="6_jiejy"] [ext_resource type="Script" uid="uid://d11erhxna68vd" path="res://src/player/player_input_controller.gd" id="7_o822w"] +[ext_resource type="Script" uid="uid://dao84umfatnid" path="res://src/player/debug_hud.gd" id="9_l271a"] [sub_resource type="CapsuleShape3D" id="CapsuleShape3D_qnmj6"] [sub_resource type="CapsuleMesh" id="CapsuleMesh_4anbu"] +[sub_resource type="Curve" id="Curve_x42xx"] + [sub_resource type="Resource" id="Resource_244u8"] script = ExtResource("2_mf2ua") duration = 0.4 @@ -22,6 +26,13 @@ ease = 0 radius = 0.1 height = 1.0 +[sub_resource type="SystemFont" id="SystemFont_x42xx"] +font_names = PackedStringArray("Monospace") + +[sub_resource type="Theme" id="Theme_l271a"] +default_font = SubResource("SystemFont_x42xx") +Label/constants/outline_size = 4 + [node name="Player" type="CharacterBody3D"] collision_layer = 3 script = ExtResource("1_5f2sf") @@ -40,14 +51,19 @@ transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.5, 0) script = ExtResource("1_mf2ua") yaw_root = NodePath("../..") -[node name="PhantomCamera3D" type="Node3D" parent="CameraOffset/CameraController"] +[node name="StrafeBankEffect" type="Node3D" parent="CameraOffset/CameraController" node_paths=PackedStringArray("character")] +script = ExtResource("3_x42xx") +character = NodePath("../../..") +pitch_curve = SubResource("Curve_x42xx") + +[node name="PhantomCamera3D" type="Node3D" parent="CameraOffset/CameraController/StrafeBankEffect"] script = ExtResource("1_rxibo") priority = 1 tween_resource = SubResource("Resource_244u8") noise_emitter_layer = 1 metadata/_custom_type_script = "uid://csjccrhj5wnx7" -[node name="MeshInstance3D" type="MeshInstance3D" parent="CameraOffset/CameraController/PhantomCamera3D"] +[node name="MeshInstance3D" type="MeshInstance3D" parent="CameraOffset/CameraController/StrafeBankEffect/PhantomCamera3D"] transform = Transform3D(1, 0, 0, 0, -4.371139e-08, -1, 0, 1, -4.371139e-08, 0, 0, -0.45) gi_mode = 0 mesh = SubResource("CapsuleMesh_o822w") @@ -63,3 +79,81 @@ metadata/_custom_type_script = "uid://c0nxcunx0fo4r" [node name="PlayerInputController" type="Node" parent="MovementController"] script = ExtResource("7_o822w") metadata/_custom_type_script = "uid://d11erhxna68vd" + +[node name="DebugHUD" type="CanvasLayer" parent="." node_paths=PackedStringArray("player")] +script = ExtResource("9_l271a") +player = NodePath("..") + +[node name="Control" type="Control" parent="DebugHUD"] +layout_mode = 3 +anchors_preset = 15 +anchor_right = 1.0 +anchor_bottom = 1.0 +grow_horizontal = 2 +grow_vertical = 2 +mouse_filter = 2 +theme = SubResource("Theme_l271a") + +[node name="MarginContainer" type="MarginContainer" parent="DebugHUD/Control"] +layout_mode = 1 +offset_right = 40.0 +offset_bottom = 40.0 +theme_override_constants/margin_left = 64 +theme_override_constants/margin_top = 64 +theme_override_constants/margin_right = 64 +theme_override_constants/margin_bottom = 64 + +[node name="VBoxContainer" type="VBoxContainer" parent="DebugHUD/Control/MarginContainer"] +layout_mode = 2 + +[node name="HBoxContainer" type="HBoxContainer" parent="DebugHUD/Control/MarginContainer/VBoxContainer"] +layout_mode = 2 + +[node name="Label" type="Label" parent="DebugHUD/Control/MarginContainer/VBoxContainer/HBoxContainer"] +layout_mode = 2 +text = "FPS: " + +[node name="FPSLabel" type="Label" parent="DebugHUD/Control/MarginContainer/VBoxContainer/HBoxContainer"] +unique_name_in_owner = true +layout_mode = 2 +text = "0" + +[node name="HBoxContainer2" type="HBoxContainer" parent="DebugHUD/Control/MarginContainer/VBoxContainer"] +layout_mode = 2 + +[node name="Label" type="Label" parent="DebugHUD/Control/MarginContainer/VBoxContainer/HBoxContainer2"] +layout_mode = 2 +text = "PLAYER POSITION: " + +[node name="PlayerPositionLabel" type="Label" parent="DebugHUD/Control/MarginContainer/VBoxContainer/HBoxContainer2"] +unique_name_in_owner = true +layout_mode = 2 +text = "[0.0, 0.0, 0.0]" + +[node name="HBoxContainer3" type="HBoxContainer" parent="DebugHUD/Control/MarginContainer/VBoxContainer"] +layout_mode = 2 + +[node name="Label" type="Label" parent="DebugHUD/Control/MarginContainer/VBoxContainer/HBoxContainer3"] +layout_mode = 2 +text = "PLAYER VELOCITY: " + +[node name="PlayerVelocityLabel" type="Label" parent="DebugHUD/Control/MarginContainer/VBoxContainer/HBoxContainer3"] +unique_name_in_owner = true +layout_mode = 2 +text = "[0.0, 0.0, 0.0]" + +[node name="HBoxContainer4" type="HBoxContainer" parent="DebugHUD/Control/MarginContainer/VBoxContainer"] +layout_mode = 2 + +[node name="Label" type="Label" parent="DebugHUD/Control/MarginContainer/VBoxContainer/HBoxContainer4"] +layout_mode = 2 +text = "PLAYER SPEED: " + +[node name="PlayerSpeedLabel" type="Label" parent="DebugHUD/Control/MarginContainer/VBoxContainer/HBoxContainer4"] +unique_name_in_owner = true +layout_mode = 2 +text = "0.0" + +[node name="Label2" type="Label" parent="DebugHUD/Control/MarginContainer/VBoxContainer/HBoxContainer4"] +layout_mode = 2 +text = "m/s"