projektluzid/addons/vizpath/utilities/viz_triangle.gd
2025-06-07 19:10:56 +02:00

46 lines
1.5 KiB
GDScript

extends RefCounted
class_name VizTriangle
var leg_right : Vector3
var leg_left : Vector3
var leg_fwd : Vector3
var bend_right : Vector3
var bend_left : Vector3
var distance : float
var fwd_side : float
func update(dir : Vector3, join_point : Vector3, binormal : Vector3, p_width : float, p_bend_lip : float, bend_normal : Vector3, bend_side : float, curve_side : float):
var half_width := p_width / 2.0
if bend_side == 0:
leg_left = join_point - half_width * binormal - p_bend_lip * dir
leg_right = join_point + half_width * binormal - p_bend_lip * dir
bend_left = leg_left
bend_right = leg_right
distance = 0.0
else:
var cos_theta := dir.dot(bend_side * bend_normal)
var sin_theta := sqrt(1-cos_theta*cos_theta)
var width := half_width / sin_theta
var lip_distance := p_bend_lip / sin_theta
var bend_width = width * cos_theta
leg_left = join_point - half_width * binormal - bend_width * dir - lip_distance * dir
leg_right = join_point + half_width * binormal - bend_width * dir - lip_distance * dir
leg_fwd = join_point - curve_side * bend_side * half_width * binormal + bend_width * dir - lip_distance * dir
distance = bend_width * 2.0
if bend_side * curve_side < 0:
bend_left = leg_left
bend_right = leg_fwd
fwd_side = 1.0
else:
bend_left = leg_fwd
bend_right = leg_right
fwd_side = 0.0
func get_fwd_side():
return fwd_side
func get_leg_mid() -> Vector3:
return leg_left - (leg_left - leg_right) / 2.0
func get_bend_mid() -> Vector3:
return bend_left - (bend_left - bend_right) / 2.0