Using DebugDraw3D for in-editor relay network visualization
All checks were successful
linting & formatting / build (push) Successful in 23s

This commit is contained in:
Rob Kelly 2025-07-12 14:09:41 -06:00
parent 06820d19ee
commit af575477cf
6 changed files with 14 additions and 74 deletions

View File

@ -1,23 +0,0 @@
@tool
class_name EditorArrow extends MeshInstance3D
const SCALE_BUFFER := 0.1
@export var target: Node3D
var cached_target_position: Vector3
var cached_position: Vector3
func _process(_delta: float) -> void:
if (
is_instance_valid(target)
and (global_position != cached_position or target.global_position != cached_target_position)
):
var up := global_basis.y
if up.cross(target.global_position).length_squared() < 0.001:
up = global_basis.x
look_at(target.global_position, up)
scale.z = max(0.001, global_position.distance_to(target.global_position) - SCALE_BUFFER)
cached_target_position = target.global_position
cached_position = global_position

View File

@ -1 +0,0 @@
uid://civv6xocvw6gp

View File

@ -1,12 +0,0 @@
@tool
class_name EditorArrow extends MeshInstance3D
@export var target: Node3D
func _process(_delta: float) -> void:
if is_instance_valid(target):
look_at(target.global_position, global_basis.y)
scale.z = global_position.distance_to(target.global_position)
else:
queue_free()

View File

@ -1,14 +0,0 @@
[gd_scene load_steps=4 format=3 uid="uid://ghdsr1b4hpr8"]
[ext_resource type="ArrayMesh" uid="uid://bgrutdse8bl8b" path="res://assets/props/arrow/arrow.obj" id="1_a3lat"]
[ext_resource type="Script" uid="uid://civv6xocvw6gp" path="res://src/util/editor_arrow/editor_arrow.gd" id="2_yk3bx"]
[sub_resource type="StandardMaterial3D" id="StandardMaterial3D_yk3bx"]
transparency = 1
shading_mode = 0
albedo_color = Color(0, 1, 1, 0.501961)
[node name="EditorArrow" type="MeshInstance3D"]
mesh = ExtResource("1_a3lat")
surface_material_override/0 = SubResource("StandardMaterial3D_yk3bx")
script = ExtResource("2_yk3bx")

View File

@ -11,24 +11,21 @@ signal pulsed
const MAX_RUMBLE := 0.01 const MAX_RUMBLE := 0.01
const MAX_QUAKE := 0.2 const MAX_QUAKE := 0.2
const EDITOR_ARROW_COLOR := Color.CYAN
const EDITOR_ARROW_SIZE := 0.05
@export_category("Editor Tools") @export_category("Editor Tools")
@export var quick_connect_to: SignalNode: @export var quick_connect_to: SignalNode:
set = _editor_connect set = _editor_connect
@export_category("Game Scenes")
@export var editor_arrow_scene: PackedScene
var _busy := false var _busy := false
var _editor_arrows: Dictionary[SignalNode, EditorArrow] = {}
@onready var rumbler_3d: Rumbler3D = %Rumbler3D @onready var rumbler_3d: Rumbler3D = %Rumbler3D
@onready var quaker: Quaker = %Quaker @onready var quaker: Quaker = %Quaker
@onready var animation_player: AnimationPlayer = %AnimationPlayer @onready var animation_player: AnimationPlayer = %AnimationPlayer
@onready var trigger_delay: Timer = %TriggerDelay @onready var trigger_delay: Timer = %TriggerDelay
@onready var pulse_delay: Timer = %PulseDelay @onready var pulse_delay: Timer = %PulseDelay
@onready var editor_connections: Node3D = %EditorConnections
## Trigger this relay. ## Trigger this relay.
@ -97,15 +94,13 @@ func _process(delta: float) -> void:
# Check connections # Check connections
for conn: Dictionary in triggered.get_connections(): for conn: Dictionary in triggered.get_connections():
var callable: Callable = conn.get("callable") var callable: Callable = conn.get("callable")
if callable and callable.get_object() is SignalNode: if callable:
var target: SignalNode = callable.get_object() var target := callable.get_object() as SignalNode
if target != self and not target in _editor_arrows: if target and target != self:
var instance: EditorArrow = editor_arrow_scene.instantiate() DebugDraw3D.draw_arrow(
instance.target = target global_position,
editor_connections.add_child(instance) target.global_position.move_toward(global_position, 0.1),
_editor_arrows[target] = instance EDITOR_ARROW_COLOR,
EDITOR_ARROW_SIZE,
for target: SignalNode in _editor_arrows.keys(): true
if not is_instance_valid(target): )
_editor_arrows[target].queue_free()
_editor_arrows.erase(target)

View File

@ -1,8 +1,7 @@
[gd_scene load_steps=13 format=3 uid="uid://bttust5ohud8e"] [gd_scene load_steps=12 format=3 uid="uid://bttust5ohud8e"]
[ext_resource type="Script" uid="uid://1oup50bp0pwd" path="res://src/world/mechanics/relay/gunk_relay.gd" id="1_rdv5j"] [ext_resource type="Script" uid="uid://1oup50bp0pwd" path="res://src/world/mechanics/relay/gunk_relay.gd" id="1_rdv5j"]
[ext_resource type="Script" uid="uid://bukihqt1lybnx" path="res://src/util/frame_skipper.gd" id="2_ipm58"] [ext_resource type="Script" uid="uid://bukihqt1lybnx" path="res://src/util/frame_skipper.gd" id="2_ipm58"]
[ext_resource type="PackedScene" uid="uid://ghdsr1b4hpr8" path="res://src/util/editor_arrow/editor_arrow.tscn" id="2_nfkbq"]
[ext_resource type="Script" uid="uid://b274q7uvn0cvp" path="res://src/ui/rumbler_3d.gd" id="3_mb114"] [ext_resource type="Script" uid="uid://b274q7uvn0cvp" path="res://src/ui/rumbler_3d.gd" id="3_mb114"]
[ext_resource type="Script" uid="uid://ccs67guidw4w4" path="res://src/ui/quaker.gd" id="5_peqs8"] [ext_resource type="Script" uid="uid://ccs67guidw4w4" path="res://src/ui/quaker.gd" id="5_peqs8"]
@ -115,7 +114,6 @@ _data = {
collision_layer = 36 collision_layer = 36
collision_mask = 0 collision_mask = 0
script = ExtResource("1_rdv5j") script = ExtResource("1_rdv5j")
editor_arrow_scene = ExtResource("2_nfkbq")
value = 800.0 value = 800.0
splatter_scale = 0.2 splatter_scale = 0.2
@ -160,8 +158,5 @@ libraries = {
} }
speed_scale = 4.0 speed_scale = 4.0
[node name="EditorConnections" type="Node3D" parent="."]
unique_name_in_owner = true
[connection signal="timeout" from="TriggerDelay" to="." method="_on_trigger_delay_timeout"] [connection signal="timeout" from="TriggerDelay" to="." method="_on_trigger_delay_timeout"]
[connection signal="timeout" from="PulseDelay" to="." method="_on_pulse_delay_timeout"] [connection signal="timeout" from="PulseDelay" to="." method="_on_pulse_delay_timeout"]