46 lines
1.5 KiB
GDScript
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
|