using System.Diagnostics; using Godot; using ImGuiNET; using Quadratic.Carto.MathExt; namespace Quadratic.Carto.Craft; /// /// Krakensbane manages the position of its direct descendants, to ensure the /// focused vessel is not too far from the origin. /// /// /// The name Krakensbane is a legacy of the original KSP module which does the /// same thing, i.e. preventing floating point errors from causing the vessel /// to be thrown into deep space. /// public sealed partial class Krakensbane : Node3D { [Export] public Node3D? FocusedVessel { get; set; } const float maxDistance = 500.0f; DVector3 originPosition = DVector3.Zero; public override void _PhysicsProcess(double delta) { Debug.Assert( FocusedVessel == null || FocusedVessel.GetParent() == this, "Focused vessel must be a direct descendant of Krakensbane" ); if (FocusedVessel == null) { return; } var vesselPosition = FocusedVessel.Transform.Origin; var vesselDistance = vesselPosition.Length(); if (vesselDistance > maxDistance) { // Reset the vessel's position to the origin // TODO: save the total offset; we don't yet have a double-precision vector3 var applyTransform = Transform3D.Identity.Translated(-vesselPosition); int n_children = GetChildCount(); for (int i = 0; i < n_children; i++) { var child = GetChild(i); child.Transform = applyTransform * child.Transform; } originPosition += vesselPosition.AsVim().AsDouble(); } } public override void _Process(double delta) { ImGui.Begin("Krakensbane"); ImGui.Text($"Origin: {originPosition}"); ImGui.End(); } }