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

86 lines
2.8 KiB
GDScript

extends RefCounted
class_name VizSegment
var _simple_leg : VizSimpleLeg = null
var _compound_leg : VizCompoundLeg = null
func _init(p_begin : VisualizationSpot, p_end : VisualizationSpot, p_width : float, p_bend_lip : float):
_simple_leg = VizSimpleLeg.new(p_begin, p_end, p_width, p_bend_lip)
if _simple_leg.is_invalid():
_compound_leg = VizCompoundLeg.new(p_begin, p_end, p_width, p_bend_lip)
func is_invalid() -> bool:
if _simple_leg.is_invalid():
if _compound_leg.is_invalid():
return true
return false
func get_error() -> String:
if _simple_leg.is_invalid():
if _compound_leg.is_invalid():
return _compound_leg.get_error()
return _simple_leg.get_error()
return ""
func get_begin() -> VisualizationSpot:
if not _simple_leg.is_invalid():
return _simple_leg.get_begin()
return _compound_leg.get_begin()
func get_begin_ray() -> Vector3:
if not _simple_leg.is_invalid():
return _simple_leg.get_begin_ray()
return _compound_leg.get_begin_ray()
func get_begin_binormal() -> Vector3:
if not _simple_leg.is_invalid():
return _simple_leg.get_begin_ray().cross(_simple_leg.get_begin().normal)
return _compound_leg.get_begin_ray().cross(_compound_leg.get_begin().normal)
func adjust_begin(distance : float):
if not _simple_leg.is_invalid():
_simple_leg.adjust_begin(distance)
if _simple_leg.is_invalid():
_compound_leg = VizCompoundLeg.new(_simple_leg.get_begin(), _simple_leg.get_end(), _simple_leg._width, _simple_leg._bend_lip)
else:
_compound_leg.adjust_begin(distance)
func get_end() -> VisualizationSpot:
if not _simple_leg.is_invalid():
return _simple_leg.get_end()
return _compound_leg.get_end()
func get_end_ray() -> Vector3:
if not _simple_leg.is_invalid():
return _simple_leg.get_end_ray()
return _compound_leg.get_end_ray()
func get_end_binormal() -> Vector3:
if not _simple_leg.is_invalid():
return _simple_leg.get_end_ray().cross(_simple_leg.get_end().normal)
return _compound_leg.get_end_ray().cross(_compound_leg.get_end().normal)
func adjust_end(distance : float):
if not _simple_leg.is_invalid():
_simple_leg.adjust_end(distance)
if _simple_leg.is_invalid():
_compound_leg = VizCompoundLeg.new(_simple_leg.get_begin(), _simple_leg.get_end(), _simple_leg._width, _simple_leg._bend_lip)
else:
_compound_leg.adjust_end(distance)
func update_mesh(mesh_instance : MeshInstance3D, u : float, segs : int, sharpness : float, mat : Material) -> float:
if _simple_leg.is_invalid():
if _compound_leg.is_invalid():
return u
u = _compound_leg.update_mesh(mesh_instance, u, segs, sharpness, mat)
else:
u = _simple_leg.update_mesh(mesh_instance, u, segs, sharpness, mat)
return u
func _to_string():
if not _simple_leg.is_invalid():
return _simple_leg._to_string()
if not _compound_leg.is_invalid():
return _compound_leg._to_string()
return "invalid segment"