2025-07-22 12:35:20 +00:00
|
|
|
extends Control
|
|
|
|
@export var MouseOverlay: Node
|
2025-07-23 11:05:53 +00:00
|
|
|
@onready var Cam = get_viewport().get_camera_3d()
|
2025-07-22 12:35:20 +00:00
|
|
|
|
|
|
|
|
|
|
|
# Called when the node enters the scene tree for the first time.
|
|
|
|
func _ready() -> void:
|
|
|
|
if !OS.is_debug_build():
|
|
|
|
self.queue_free()
|
2025-07-23 11:05:53 +00:00
|
|
|
|
|
|
|
|
|
|
|
class Line:
|
|
|
|
var Start:Vector3
|
|
|
|
var End:Vector3
|
|
|
|
var LineColor:Color
|
|
|
|
var time
|
|
|
|
|
|
|
|
|
|
|
|
func _init(Start:Vector3, End:Vector3, LineColor, time):
|
|
|
|
self.Start = Start
|
|
|
|
self.End = End
|
|
|
|
self.LineColor = LineColor
|
|
|
|
self.time = time
|
|
|
|
|
|
|
|
var Lines = []
|
|
|
|
var RemovedLine = false
|
|
|
|
|
|
|
|
|
|
|
|
func _process(delta):
|
|
|
|
for i in range(len(Lines)):
|
|
|
|
Lines[i].time -= delta
|
|
|
|
|
|
|
|
if (len(Lines) > 0 || RemovedLine):
|
|
|
|
queue_redraw() #Calls _draw
|
|
|
|
RemovedLine = false
|
|
|
|
|
|
|
|
|
|
|
|
func _draw():
|
|
|
|
|
|
|
|
for i in range(len(Lines)):
|
|
|
|
if Lines[i].Start.length() == 0:return
|
|
|
|
var ScreenPointStart = Cam.unproject_position(Lines[i].Start)
|
|
|
|
var ScreenPointEnd = Cam.unproject_position(Lines[i].End)
|
|
|
|
|
|
|
|
#Dont draw line if either start or end is considered behind the camera
|
|
|
|
#this causes the line to not be drawn sometimes but avoids a bug where the
|
|
|
|
#line is drawn incorrectly
|
|
|
|
if (Cam.is_position_behind(Lines[i].Start) ||
|
|
|
|
Cam.is_position_behind(Lines[i].End)):
|
|
|
|
continue
|
|
|
|
|
|
|
|
draw_line(ScreenPointStart, ScreenPointEnd, Lines[i].LineColor)
|
|
|
|
|
|
|
|
#Remove lines that have timed out
|
|
|
|
var i = Lines.size() - 1
|
|
|
|
while (i >= 0):
|
|
|
|
if (Lines[i].time < 0.0):
|
|
|
|
Lines.remove_at(i)
|
|
|
|
RemovedLine = true
|
|
|
|
|
|
|
|
i -= 1
|
|
|
|
|
|
|
|
|
|
|
|
## start point, end point, color, time (optional)
|
|
|
|
func DrawLine(Start, End, time = 0.0, LineColor = Color(1.0, 0.0, 0.0, 1.0)):
|
|
|
|
Lines.append(Line.new(Start, End, LineColor, time))
|
|
|
|
|
|
|
|
|
|
|
|
## start point, velocity (direction and magnitude), color, time (optional)
|
|
|
|
func DrawRay(Start, Ray, time = 0.0, LineColor = Color(1.0, 0.0, 0.0, 1.0)):
|
|
|
|
Lines.append(Line.new(Start, Start + Ray, LineColor, time))
|
|
|
|
|
|
|
|
|
|
|
|
## start point, half extents (float), color, time (optional)
|
|
|
|
func DrawCube(Center, HalfExtents, time = 0.0, LineColor = Color(1.0, 0.0, 0.0, 1.0)):
|
|
|
|
#Start at the 'top left'
|
|
|
|
var LinePointStart = Center
|
|
|
|
LinePointStart.x -= HalfExtents
|
|
|
|
LinePointStart.y += HalfExtents
|
|
|
|
LinePointStart.z -= HalfExtents
|
|
|
|
|
|
|
|
#Draw top square
|
|
|
|
var LinePointEnd = LinePointStart + Vector3(0, 0, HalfExtents * 2.0)
|
|
|
|
DrawLine(LinePointStart, LinePointEnd, LineColor, time);
|
|
|
|
LinePointStart = LinePointEnd
|
|
|
|
LinePointEnd = LinePointStart + Vector3(HalfExtents * 2.0, 0, 0)
|
|
|
|
DrawLine(LinePointStart, LinePointEnd, LineColor, time);
|
|
|
|
LinePointStart = LinePointEnd
|
|
|
|
LinePointEnd = LinePointStart + Vector3(0, 0, -HalfExtents * 2.0)
|
|
|
|
DrawLine(LinePointStart, LinePointEnd, LineColor, time);
|
|
|
|
LinePointStart = LinePointEnd
|
|
|
|
LinePointEnd = LinePointStart + Vector3(-HalfExtents * 2.0, 0, 0)
|
|
|
|
DrawLine(LinePointStart, LinePointEnd, LineColor, time);
|
|
|
|
|
|
|
|
#Draw bottom square
|
|
|
|
LinePointStart = LinePointEnd + Vector3(0, -HalfExtents * 2.0, 0)
|
|
|
|
LinePointEnd = LinePointStart + Vector3(0, 0, HalfExtents * 2.0)
|
|
|
|
DrawLine(LinePointStart, LinePointEnd, LineColor, time);
|
|
|
|
LinePointStart = LinePointEnd
|
|
|
|
LinePointEnd = LinePointStart + Vector3(HalfExtents * 2.0, 0, 0)
|
|
|
|
DrawLine(LinePointStart, LinePointEnd, LineColor, time);
|
|
|
|
LinePointStart = LinePointEnd
|
|
|
|
LinePointEnd = LinePointStart + Vector3(0, 0, -HalfExtents * 2.0)
|
|
|
|
DrawLine(LinePointStart, LinePointEnd, LineColor, time);
|
|
|
|
LinePointStart = LinePointEnd
|
|
|
|
LinePointEnd = LinePointStart + Vector3(-HalfExtents * 2.0, 0, 0)
|
|
|
|
DrawLine(LinePointStart, LinePointEnd, LineColor, time);
|
|
|
|
|
|
|
|
#Draw vertical lines
|
|
|
|
LinePointStart = LinePointEnd
|
|
|
|
DrawRay(LinePointStart, Vector3(0, HalfExtents * 2.0, 0), LineColor, time)
|
|
|
|
LinePointStart += Vector3(0, 0, HalfExtents * 2.0)
|
|
|
|
DrawRay(LinePointStart, Vector3(0, HalfExtents * 2.0, 0), LineColor, time)
|
|
|
|
LinePointStart += Vector3(HalfExtents * 2.0, 0, 0)
|
|
|
|
DrawRay(LinePointStart, Vector3(0, HalfExtents * 2.0, 0), LineColor, time)
|
|
|
|
LinePointStart += Vector3(0, 0, -HalfExtents * 2.0)
|
|
|
|
DrawRay(LinePointStart, Vector3(0, HalfExtents * 2.0, 0), LineColor, time)
|