public override void OnDestroy()
        {
            // Dirty cleanup. I m spending too much time on this already
            if (comSphere == null)
            {
                return;
            }

            comSphere.Destroy();
            comSphere = null;

            podSrfVelocityArrow.Destroy();
            podSrfVelocityArrow = null;
            comSrfVelocityArrow.Destroy();
            comSrfVelocityArrow = null;

            podObtVelocityArrow.Destroy();
            podObtVelocityArrow = null;
            comObtVelocityArrow.Destroy();
            comObtVelocityArrow = null;

            forwardArrow.Destroy();
            forwardArrow = null;
            avgForwardArrow.Destroy();
            avgForwardArrow = null;

            requestedAttitudeArrow.Destroy();
            requestedAttitudeArrow = null;

            debugArrow.Destroy();
            debugArrow = null;
        }
        public override void OnDestroy()
        {
            // Dirty cleanup. I m spending too much time on this already
            if (comSphere == null)
                return;

            comSphere.Destroy();
            comSphere = null;

            podSrfVelocityArrow.Destroy();
            podSrfVelocityArrow = null;
            comSrfVelocityArrow.Destroy();
            comSrfVelocityArrow = null;

            podObtVelocityArrow.Destroy();
            podObtVelocityArrow = null;
            comObtVelocityArrow.Destroy();
            comObtVelocityArrow = null;

            forwardArrow.Destroy();
            forwardArrow = null;
            avgForwardArrow.Destroy();
            avgForwardArrow = null;

            requestedAttitudeArrow.Destroy();
            requestedAttitudeArrow = null;

            debugArrow.Destroy();
            debugArrow = null;

            debugArrow2.Destroy();
            debugArrow2 = null;
        }
        // TODO : I should probably use an array and an enum to lower code dup ...
        public override void OnUpdate()
        {
            if (vessel != FlightGlobals.ActiveVessel)
                return;

            if (comSphere == null)
            {
                comSphere = new DebugIcoSphere(XKCDColors.BloodRed, true);

                podSrfVelocityArrow = new DebugArrow(Color.yellow);
                comSrfVelocityArrow = new DebugArrow(Color.green);

                podObtVelocityArrow = new DebugArrow(Color.red);
                comObtVelocityArrow = new DebugArrow(XKCDColors.Orange);

                forwardArrow = new DebugArrow(XKCDColors.NavyBlue);
                avgForwardArrow = new DebugArrow(Color.blue);

                requestedAttitudeArrow = new DebugArrow(Color.gray);

                debugArrow = new DebugArrow(XKCDColors.Fuchsia);
            }

            Vector3d instantCoM = vessel.CoM + (vesselState.orbitalVelocity - Krakensbane.GetFrameVelocity() - vessel.orbit.GetRotFrameVel(vessel.orbit.referenceBody).xzy) * Time.fixedDeltaTime;

            Vector3 arrowPos = displayAtCoM
                ? instantCoM
                : (Vector3d)vessel.ReferenceTransform.position;

            comSphere.State(comSphereActive);
            if (comSphereActive)
            {
                comSphere.Set(instantCoM);
                comSphere.SetRadius((float)comSphereRadius.val);
            }

            podSrfVelocityArrow.State(podSrfVelocityArrowActive);
            if (podSrfVelocityArrowActive)
            {
                podSrfVelocityArrow.Set(arrowPos, vessel.srf_velocity);
                podSrfVelocityArrow.SetLength((float)arrowsLength.val);
                podSrfVelocityArrow.SeeThrough(seeThrough);
            }

            comSrfVelocityArrow.State(comSrfVelocityArrowActive && MechJebModuleAttitudeController.useCoMVelocity);
            if (comSrfVelocityArrowActive)
            {
                comSrfVelocityArrow.Set(arrowPos, vesselState.surfaceVelocity);
                comSrfVelocityArrow.SetLength((float)arrowsLength.val);
                comSrfVelocityArrow.SeeThrough(seeThrough);
            }

            podObtVelocityArrow.State(podObtVelocityArrowActive);
            if (podObtVelocityArrowActive)
            {
                podObtVelocityArrow.Set(arrowPos, vessel.obt_velocity);
                podObtVelocityArrow.SetLength((float)arrowsLength.val);
                podObtVelocityArrow.SeeThrough(seeThrough);
            }

            comObtVelocityArrow.State(comObtVelocityArrowActive && MechJebModuleAttitudeController.useCoMVelocity);
            if (comObtVelocityArrowActive)
            {
                comObtVelocityArrow.Set(arrowPos, vesselState.orbitalVelocity);
                comObtVelocityArrow.SetLength((float)arrowsLength.val);
                comObtVelocityArrow.SeeThrough(seeThrough);
            }

            forwardArrow.State(forwardArrowActive);
            if (forwardArrowActive)
            {
                forwardArrow.Set(arrowPos, vessel.GetTransform().up);
                forwardArrow.SetLength((float)arrowsLength.val);
                forwardArrow.SeeThrough(seeThrough);
            }

            avgForwardArrow.State(avgForwardArrowActive);
            if (avgForwardArrowActive)
            {
                avgForwardArrow.Set(arrowPos, vesselState.forward);
                avgForwardArrow.SetLength((float)arrowsLength.val);
                avgForwardArrow.SeeThrough(seeThrough);
            }

            requestedAttitudeArrow.State(requestedAttitudeArrowActive && core.attitude.enabled);
            if (requestedAttitudeArrowActive && core.attitude.enabled)
            {
                requestedAttitudeArrow.Set(arrowPos, core.attitude.RequestedAttitude);
                requestedAttitudeArrow.SetLength((float)arrowsLength.val);
                requestedAttitudeArrow.SeeThrough(seeThrough);
            }

            debugArrow.State(debugArrowActive);
            if (debugArrowActive)
            {
                debugArrow.Set((Vector3d)vessel.ReferenceTransform.position, debugVector);
                debugArrow.SetLength((float)debugVector.magnitude);
                debugArrow.SeeThrough(seeThrough);
            }
        }
        // TODO : I should probably use an array and an enum to lower code dup ...
        public override void OnUpdate()
        {
            if (vessel != FlightGlobals.ActiveVessel)
            {
                return;
            }

            if (comSphere == null)
            {
                comSphere = new DebugIcoSphere(XKCDColors.BloodRed, true);

                colSphere = new DebugIcoSphere(XKCDColors.Teal, true);
                cotSphere = new DebugIcoSphere(XKCDColors.PurplePink, true);

                srfVelocityArrow = new DebugArrow(Color.green);
                obtVelocityArrow = new DebugArrow(Color.red);

                dotArrow = new DebugArrow(XKCDColors.PurplePink);

                forwardArrow = new DebugArrow(XKCDColors.ElectricBlue);
                //avgForwardArrow = new DebugArrow(Color.blue);

                requestedAttitudeArrow = new DebugArrow(Color.gray);

                debugArrow  = new DebugArrow(XKCDColors.Fuchsia);
                debugArrow2 = new DebugArrow(XKCDColors.LightBlue);
            }


            var      frameVel   = (vesselState.orbitalVelocity - Krakensbane.GetFrameVelocity() - vessel.orbit.GetRotFrameVel(vessel.orbit.referenceBody).xzy) * Time.fixedDeltaTime;
            Vector3d instantCoM = vesselState.CoM + frameVel;

            Vector3 arrowPos = displayAtCoM
                ? instantCoM
                : (Vector3d)vessel.ReferenceTransform.position;

            comSphere.State(comSphereActive && core.ShowGui);
            if (comSphereActive)
            {
                comSphere.Set(instantCoM);
                comSphere.SetRadius((float)comSphereRadius.val);
            }

            colSphere.State(colSphereActive && vesselState.CoLScalar > 0 && core.ShowGui);
            if (colSphereActive)
            {
                colSphere.Set(vesselState.CoL + frameVel);
                colSphere.SetRadius((float)comSphereRadius.val);
            }

            cotSphere.State(cotSphereActive && vesselState.CoTScalar > 0 && core.ShowGui);
            if (cotSphereActive)
            {
                cotSphere.Set(vesselState.CoT + frameVel);
                cotSphere.SetRadius((float)comSphereRadius.val);
            }

            srfVelocityArrow.State(srfVelocityArrowActive && core.ShowGui);
            if (srfVelocityArrowActive)
            {
                srfVelocityArrow.Set(arrowPos, vessel.srf_velocity);
                srfVelocityArrow.SetLength((float)arrowsLength.val);
                srfVelocityArrow.SeeThrough(seeThrough);
            }

            obtVelocityArrow.State(obtVelocityArrowActive && core.ShowGui);
            if (obtVelocityArrowActive)
            {
                obtVelocityArrow.Set(arrowPos, vessel.obt_velocity);
                obtVelocityArrow.SetLength((float)arrowsLength.val);
                obtVelocityArrow.SeeThrough(seeThrough);
            }

            dotArrow.State(dotArrowActive && vesselState.thrustCurrent > 0 && core.ShowGui);
            if (dotArrowActive)
            {
                dotArrow.Set(vesselState.CoT + frameVel, vesselState.DoT);
                dotArrow.SetLength((float)Math.Log10(vesselState.thrustCurrent + 1));
                dotArrow.SeeThrough(seeThrough);
            }

            forwardArrow.State(forwardArrowActive && core.ShowGui);
            if (forwardArrowActive)
            {
                forwardArrow.Set(arrowPos, vessel.GetTransform().up);
                forwardArrow.SetLength((float)arrowsLength.val);
                forwardArrow.SeeThrough(seeThrough);
            }

            /*
             * avgForwardArrow.State(avgForwardArrowActive && core.ShowGui);
             * if (avgForwardArrowActive)
             * {
             *  avgForwardArrow.Set(arrowPos, vesselState.forward);
             *  avgForwardArrow.SetLength((float)arrowsLength.val);
             *  avgForwardArrow.SeeThrough(seeThrough);
             * }
             */

            requestedAttitudeArrow.State(requestedAttitudeArrowActive && core.attitude.enabled && core.ShowGui);
            if (requestedAttitudeArrowActive && core.attitude.enabled)
            {
                requestedAttitudeArrow.Set(arrowPos, core.attitude.RequestedAttitude);
                requestedAttitudeArrow.SetLength((float)arrowsLength.val);
                requestedAttitudeArrow.SeeThrough(seeThrough);
            }

            debugArrow.State(debugArrowActive && core.ShowGui);
            if (debugArrowActive)
            {
                debugArrow.Set(vessel.ReferenceTransform.position, debugVector);
                debugArrow.SetLength((float)debugVector.magnitude);
                debugArrow.SeeThrough(seeThrough);
            }

            debugArrow2.State(debugArrow2Active && core.ShowGui);
            if (debugArrow2Active)
            {
                //debugArrow2.Set(vessel.ReferenceTransform.position, debugVector2);
                //
                //debugArrow2.SetLength((float)debugVector2.magnitude);
                //debugArrow2.SeeThrough(seeThrough);

                var vector3d = vesselState.CoL - instantCoM + frameVel;
                debugArrow2.Set(instantCoM, vector3d);

                debugArrow2.SetLength((float)vector3d.magnitude);
                debugArrow2.SeeThrough(seeThrough);
            }
        }
        // TODO : I should probably use an array and an enum to lower code dup ...
        public override void OnUpdate()
        {
            if (vessel != FlightGlobals.ActiveVessel)
            {
                return;
            }

            if (comSphere == null)
            {
                comSphere = new DebugIcoSphere(XKCDColors.BloodRed, true);

                podSrfVelocityArrow = new DebugArrow(Color.yellow);
                comSrfVelocityArrow = new DebugArrow(Color.green);

                podObtVelocityArrow = new DebugArrow(Color.red);
                comObtVelocityArrow = new DebugArrow(XKCDColors.Orange);

                forwardArrow    = new DebugArrow(XKCDColors.NavyBlue);
                avgForwardArrow = new DebugArrow(Color.blue);

                requestedAttitudeArrow = new DebugArrow(Color.gray);

                debugArrow = new DebugArrow(XKCDColors.Fuchsia);
            }


            Vector3d instantCoM = vessel.CoM + (vesselState.orbitalVelocity - Krakensbane.GetFrameVelocity() - vessel.orbit.GetRotFrameVel(vessel.orbit.referenceBody).xzy) * Time.fixedDeltaTime;

            Vector3 arrowPos = displayAtCoM
                ? instantCoM
                : (Vector3d)vessel.ReferenceTransform.position;

            comSphere.State(comSphereActive);
            if (comSphereActive)
            {
                comSphere.Set(instantCoM);
                comSphere.SetRadius((float)comSphereRadius.val);
            }

            podSrfVelocityArrow.State(podSrfVelocityArrowActive);
            if (podSrfVelocityArrowActive)
            {
                podSrfVelocityArrow.Set(arrowPos, vessel.srf_velocity);
                podSrfVelocityArrow.SetLength((float)arrowsLength.val);
                podSrfVelocityArrow.SeeThrough(seeThrough);
            }

            comSrfVelocityArrow.State(comSrfVelocityArrowActive && MechJebModuleAttitudeController.useCoMVelocity);
            if (comSrfVelocityArrowActive)
            {
                comSrfVelocityArrow.Set(arrowPos, vesselState.surfaceVelocity);
                comSrfVelocityArrow.SetLength((float)arrowsLength.val);
                comSrfVelocityArrow.SeeThrough(seeThrough);
            }

            podObtVelocityArrow.State(podObtVelocityArrowActive);
            if (podObtVelocityArrowActive)
            {
                podObtVelocityArrow.Set(arrowPos, vessel.obt_velocity);
                podObtVelocityArrow.SetLength((float)arrowsLength.val);
                podObtVelocityArrow.SeeThrough(seeThrough);
            }

            comObtVelocityArrow.State(comObtVelocityArrowActive && MechJebModuleAttitudeController.useCoMVelocity);
            if (comObtVelocityArrowActive)
            {
                comObtVelocityArrow.Set(arrowPos, vesselState.orbitalVelocity);
                comObtVelocityArrow.SetLength((float)arrowsLength.val);
                comObtVelocityArrow.SeeThrough(seeThrough);
            }

            forwardArrow.State(forwardArrowActive);
            if (forwardArrowActive)
            {
                forwardArrow.Set(arrowPos, vessel.GetTransform().up);
                forwardArrow.SetLength((float)arrowsLength.val);
                forwardArrow.SeeThrough(seeThrough);
            }

            avgForwardArrow.State(avgForwardArrowActive);
            if (avgForwardArrowActive)
            {
                avgForwardArrow.Set(arrowPos, vesselState.forward);
                avgForwardArrow.SetLength((float)arrowsLength.val);
                avgForwardArrow.SeeThrough(seeThrough);
            }

            requestedAttitudeArrow.State(requestedAttitudeArrowActive && core.attitude.enabled);
            if (requestedAttitudeArrowActive && core.attitude.enabled)
            {
                requestedAttitudeArrow.Set(arrowPos, core.attitude.RequestedAttitude);
                requestedAttitudeArrow.SetLength((float)arrowsLength.val);
                requestedAttitudeArrow.SeeThrough(seeThrough);
            }

            debugArrow.State(debugArrowActive);
            if (debugArrowActive)
            {
                debugArrow.Set((Vector3d)vessel.ReferenceTransform.position, debugVector);
                debugArrow.SetLength((float)debugVector.magnitude);
                debugArrow.SeeThrough(seeThrough);
            }
        }
        // TODO : I should probably use an array and an enum to lower code dup ...
        public override void OnUpdate()
        {
            if (vessel != FlightGlobals.ActiveVessel)
                return;

            if (comSphere == null)
            {
                comSphere = new DebugIcoSphere(XKCDColors.BloodRed, true);

                colSphere = new DebugIcoSphere(XKCDColors.Teal, true);
                cotSphere = new DebugIcoSphere(XKCDColors.PurplePink, true);

                podSrfVelocityArrow = new DebugArrow(Color.yellow);
                comSrfVelocityArrow = new DebugArrow(Color.green);

                podObtVelocityArrow = new DebugArrow(Color.red);
                comObtVelocityArrow = new DebugArrow(XKCDColors.Orange);

                dotArrow        = new DebugArrow(XKCDColors.PurplePink);
                dotInstantArrow = new DebugArrow(XKCDColors.Pink);

                forwardArrow = new DebugArrow(XKCDColors.ElectricBlue);
                avgForwardArrow = new DebugArrow(Color.blue);

                requestedAttitudeArrow = new DebugArrow(Color.gray);

                debugArrow = new DebugArrow(XKCDColors.Fuchsia);
                debugArrow2 = new DebugArrow(XKCDColors.LightBlue);
            }


            var frameVel = (vesselState.orbitalVelocity - Krakensbane.GetFrameVelocity() - vessel.orbit.GetRotFrameVel(vessel.orbit.referenceBody).xzy) * Time.fixedDeltaTime;
            Vector3d instantCoM = vesselState.CoM + frameVel;

            Vector3 arrowPos = displayAtCoM
                ? instantCoM
                : (Vector3d)vessel.ReferenceTransform.position;

            comSphere.State(comSphereActive);
            if (comSphereActive)
            {
                comSphere.Set(instantCoM);
                comSphere.SetRadius((float)comSphereRadius.val);
            }

            colSphere.State(colSphereActive && vesselState.CoLScalar > 0);
            if (colSphereActive)
            {
                colSphere.Set(vesselState.CoL + frameVel);
                colSphere.SetRadius((float)comSphereRadius.val);
            }

            cotSphere.State(cotSphereActive && vesselState.CoTScalar > 0);
            if (cotSphereActive)
            {
                cotSphere.Set(vesselState.CoT + frameVel);
                cotSphere.SetRadius((float)comSphereRadius.val);
            }

            podSrfVelocityArrow.State(podSrfVelocityArrowActive);
            if (podSrfVelocityArrowActive)
            {
                podSrfVelocityArrow.Set(arrowPos, vessel.srf_velocity);
                podSrfVelocityArrow.SetLength((float)arrowsLength.val);
                podSrfVelocityArrow.SeeThrough(seeThrough);
            }

            comSrfVelocityArrow.State(comSrfVelocityArrowActive && MechJebModuleAttitudeController.useCoMVelocity);
            if (comSrfVelocityArrowActive)
            {
                comSrfVelocityArrow.Set(arrowPos, vesselState.surfaceVelocity);
                comSrfVelocityArrow.SetLength((float)arrowsLength.val);
                comSrfVelocityArrow.SeeThrough(seeThrough);
            }

            podObtVelocityArrow.State(podObtVelocityArrowActive);
            if (podObtVelocityArrowActive)
            {
                podObtVelocityArrow.Set(arrowPos, vessel.obt_velocity);
                podObtVelocityArrow.SetLength((float)arrowsLength.val);
                podObtVelocityArrow.SeeThrough(seeThrough);
            }

            comObtVelocityArrow.State(comObtVelocityArrowActive && MechJebModuleAttitudeController.useCoMVelocity);
            if (comObtVelocityArrowActive)
            {
                comObtVelocityArrow.Set(arrowPos, vesselState.orbitalVelocity);
                comObtVelocityArrow.SetLength((float)arrowsLength.val);
                comObtVelocityArrow.SeeThrough(seeThrough);
            }
            
            dotArrow.State(dotArrowActive && vesselState.thrustCurrent > 0);
            if (dotArrowActive)
            {
                dotArrow.Set(vesselState.CoT + frameVel, vesselState.DoT);
                dotArrow.SetLength((float)Math.Log10(vesselState.thrustCurrent + 1));
                dotArrow.SeeThrough(seeThrough);
            }

            dotInstantArrow.State(dotInstantArrowActive && vesselState.thrustCurrent > 0);
            if (dotInstantArrowActive)
            {
                dotInstantArrow.Set(vesselState.CoT+ frameVel, vesselState.DoTInstant);
                dotInstantArrow.SetLength((float) Math.Log10(vesselState.thrustCurrent + 1));
                dotInstantArrow.SeeThrough(seeThrough);
            }
            
            forwardArrow.State(forwardArrowActive);
            if (forwardArrowActive)
            {
                forwardArrow.Set(arrowPos, vessel.GetTransform().up);
                forwardArrow.SetLength((float)arrowsLength.val);
                forwardArrow.SeeThrough(seeThrough);
            }

            avgForwardArrow.State(avgForwardArrowActive);
            if (avgForwardArrowActive)
            {
                avgForwardArrow.Set(arrowPos, vesselState.forward);
                avgForwardArrow.SetLength((float)arrowsLength.val);
                avgForwardArrow.SeeThrough(seeThrough);
            }

            requestedAttitudeArrow.State(requestedAttitudeArrowActive && core.attitude.enabled);
            if (requestedAttitudeArrowActive && core.attitude.enabled)
            {
                requestedAttitudeArrow.Set(arrowPos, core.attitude.RequestedAttitude);
                requestedAttitudeArrow.SetLength((float)arrowsLength.val);
                requestedAttitudeArrow.SeeThrough(seeThrough);
            }

            debugArrow.State(debugArrowActive);
            if (debugArrowActive)
            {
                debugArrow.Set(vessel.ReferenceTransform.position, debugVector);
                debugArrow.SetLength((float)debugVector.magnitude);
                debugArrow.SeeThrough(seeThrough);
            }

            debugArrow2.State(debugArrow2Active);
            if (debugArrow2Active)
            {

                //debugArrow2.Set(vessel.ReferenceTransform.position, debugVector2);
                //
                //debugArrow2.SetLength((float)debugVector2.magnitude);
                //debugArrow2.SeeThrough(seeThrough);

                var vector3d =  vesselState.CoL - instantCoM + frameVel;
                debugArrow2.Set(instantCoM, vector3d);

                debugArrow2.SetLength((float)vector3d.magnitude);
                debugArrow2.SeeThrough(seeThrough);



            }
        }