Ejemplo n.º 1
0
        void LateUpdate()
        {
            if (vessel.isActiveVessel && counter < 2) // hack
            {
                counter++;
                camera.CameraActive = false;
            }
            else if (vessel.isActiveVessel && FirstPerson)
            {
                camera.CameraActive = true;
                switch (mode)
                {
                case CameraMode.GROUND:
                    camera.UpdateCameraGround();
                    break;

                case CameraMode.SPACE:
                    camera.UpdateCameraSpace();
                    break;

                case CameraMode.LADDER:
                    camera.UpdateCameraLadder();
                    break;
                }

                if (navball == null)
                {
                    navball = FindObjectOfType <KSP.UI.Screens.Flight.NavBall>();
                }

                System.Diagnostics.Debug.Assert(navball != null, "navball != null");

                CelestialBody mainBody = FlightGlobals.currentMainBody;

                if (mainBody == null || navball == null || navball.navBall == null) // apparently this can happen during vessel switching
                {
                    return;
                }

                Vector3 position = vessel.transform.position;

                navball.navBall.rotation = Quaternion.Inverse(camera.target_quaternion) * Quaternion.LookRotation(
                    Vector3.ProjectOnPlane(
                        mainBody.position + (mainBody.transform.up * (float)mainBody.Radius) - position,
                        (position - mainBody.position).normalized
                        ).normalized,
                    (position - mainBody.position).normalized);
            }
            else
            {
                camera.CameraActive = false;
            }
        }
Ejemplo n.º 2
0
        void Imgr_fpCameraManager_OnEnterFirstPerson(KerbalEVA eva)
        {
            if (navball_ == null)
            {
                navball_ = (KSP.UI.Screens.Flight.NavBall)MonoBehaviour.FindObjectOfType(typeof(KSP.UI.Screens.Flight.NavBall));
            }

            //When deboarding a seat, the reference transform is set to the kerbal's part.
            //If you have not deboarded a seat, it is empty.
            //This is to make it always consistent.
            eva.vessel.SetReferenceTransform(eva.part);
        }
Ejemplo n.º 3
0
            private void LateUpdate()
            {
                if (map_renderer_ == null) {
                  map_renderer_ =
                  PlanetariumCamera.Camera.gameObject.AddComponent<RenderingActions>();
                  map_renderer_.post_render = RenderTrajectories;
                }

                if (galaxy_cube_rotator_ == null) {
                  galaxy_cube_rotator_ = ScaledCamera.Instance.galaxyCamera.gameObject
                                 .AddComponent<RenderingActions>();
                  galaxy_cube_rotator_.pre_cull = RotateGalaxyCube;
                }

                // Orient the celestial bodies.
                if (PluginRunning()) {
                  foreach (var body in FlightGlobals.Bodies) {
                body.scaledBody.transform.rotation =
                (UnityEngine.QuaternionD)plugin_.CelestialRotation(
                body.flightGlobalsIndex);
                  }
                }

                override_rsas_target_ = false;
                Vessel active_vessel = FlightGlobals.ActiveVessel;
                if (active_vessel != null &&
                !FlightGlobals.ActiveVessel.isEVA) {
                  if (navball_ == null) {
                navball_ = (KSP.UI.Screens.Flight.NavBall)FindObjectOfType(
                       typeof(KSP.UI.Screens.Flight.NavBall));
                  }
                  var navball_material =
                  navball_.navBall.GetComponent<UnityEngine.Renderer>().material;

                  if (compass_navball_texture_ == null) {
                compass_navball_texture_ = navball_material.GetTexture("_MainTexture");
                  }

                  Action<UnityEngine.Texture> set_navball_texture = (texture) =>
                  navball_material.SetTexture("_MainTexture", texture);

                  if (navball_changed_) {
                // Texture the ball.
                navball_changed_ = false;
                // TODO(egg): switch over all frame types and have more navball textures
                // when more frames are available.
                if (!fix_navball_in_plotting_frame_ || !PluginRunning()) {
                  set_navball_texture(compass_navball_texture_);
                } else if (plotting_frame_selector_.get().frame_type ==
                   ReferenceFrameSelector.FrameType.BODY_CENTRED_NON_ROTATING) {
                  set_navball_texture(inertial_navball_texture_);
                } else {
                  set_navball_texture(barycentric_navball_texture_);
                }
                  }

                  // Orient the ball.
                  if (PluginRunning() && fix_navball_in_plotting_frame_) {
                navball_.navBall.rotation =
                (UnityEngine.QuaternionD)navball_.attitudeGymbal *  // sic.
                (UnityEngine.QuaternionD)plugin_.NavballOrientation(
                (XYZ)Planetarium.fetch.Sun.position,
                (XYZ)(Vector3d)active_vessel.ReferenceTransform.position);
                  }

                  if (PluginRunning() &&
                  has_active_vessel_in_space() &&
                  plugin_.HasVessel(active_vessel.id.ToString()) &&
                  FlightGlobals.speedDisplayMode ==
                  FlightGlobals.SpeedDisplayModes.Orbit) {
                KSP.UI.Screens.Flight.SpeedDisplay speed_display =
                KSP.UI.Screens.Flight.SpeedDisplay.Instance;
                if (speed_display?.textTitle != null &&
                speed_display?.textSpeed != null) {
                  speed_display.textTitle.text =
                  plotting_frame_selector_.get().ShortName();
                  speed_display.textSpeed.text =
                  ((Vector3d)plugin_.VesselVelocity(active_vessel.id.ToString()))
                  .magnitude.ToString("F1") + "m/s";
                }

                // Orient the Frenet trihedron.
                Vector3d prograde =
                (Vector3d)plugin_.VesselTangent(active_vessel.id.ToString());
                Vector3d radial =
                (Vector3d)plugin_.VesselNormal(active_vessel.id.ToString());
                // Yes, the astrodynamicist's normal is the mathematician's binormal.
                // Don't ask.
                Vector3d normal =
                (Vector3d)plugin_.VesselBinormal(active_vessel.id.ToString());

                SetNavballVector(navball_.progradeVector, prograde);
                SetNavballVector(navball_.radialInVector, radial);
                SetNavballVector(navball_.normalVector, normal);
                SetNavballVector(navball_.retrogradeVector, -prograde);
                SetNavballVector(navball_.radialOutVector, -radial);
                SetNavballVector(navball_.antiNormalVector, -normal);

                // Make the autopilot target our Frenet trihedron.
                if (active_vessel.OnAutopilotUpdate.GetInvocationList()[0] !=
                (Delegate)(FlightInputCallback)OverrideRSASTarget) {
                  Log.Info("Prepending RSAS override");
                  active_vessel.OnAutopilotUpdate =
                  (FlightInputCallback)Delegate.Combine(
                  new FlightInputCallback(OverrideRSASTarget),
                  active_vessel.OnAutopilotUpdate);
                }
                if (active_vessel.Autopilot.Enabled) {
                  override_rsas_target_ = true;
                  switch (active_vessel.Autopilot.Mode) {
                case VesselAutopilot.AutopilotMode.Prograde:
                  rsas_target_ = prograde;
                  break;
                case VesselAutopilot.AutopilotMode.Retrograde:
                  rsas_target_ = -prograde;
                  break;
                case VesselAutopilot.AutopilotMode.RadialIn:
                  rsas_target_ = radial;
                  break;
                case VesselAutopilot.AutopilotMode.RadialOut:
                  rsas_target_ = -radial;
                  break;
                case VesselAutopilot.AutopilotMode.Normal:
                  rsas_target_ = normal;
                  break;
                case VesselAutopilot.AutopilotMode.Antinormal:
                  rsas_target_ = -normal;
                  break;
                default:
                  override_rsas_target_ = false;
                  break;
                  }
                }
                  }
                }
            }
Ejemplo n.º 4
0
        void evt_OnLateUpdate(object sender, EventArgs none)
        {
            if (!imgr.fpCameraManager.isFirstPerson)
            {
                return;
            }

            if (navball_ == null)
            {
                navball_ = (KSP.UI.Screens.Flight.NavBall)MonoBehaviour.FindObjectOfType(typeof(KSP.UI.Screens.Flight.NavBall));
            }

            Vessel activeVessel = FlightGlobals.ActiveVessel;

            if (activeVessel == null)
            {
                return;
            }

            CelestialBody currentMainBody = FlightGlobals.currentMainBody;

            //NOTE: Kerbal parts seem to be facing towards the sky.
            Quaternion offsetGymbal;
            Part       referencepart = activeVessel.GetReferenceTransformPart();

            if ((referencepart == null) ||
                (referencepart == imgr.fpCameraManager.currentfpeva.part))
            {
                offsetGymbal = Quaternion.AngleAxis(90f, Vector3.right);
            }
            else
            {
                offsetGymbal = Quaternion.Euler(new Vector3(0.0f, 0.0f, 0.0f));
            }

            Quaternion attitudeGymbal = offsetGymbal * Quaternion.Inverse(navball_.target.rotation);
            Quaternion relativeGymbal = attitudeGymbal * Quaternion.LookRotation(Vector3.ProjectOnPlane((Vector3)(currentMainBody.position + (Vector3d)currentMainBody.transform.up * currentMainBody.Radius - navball_.target.position), (Vector3)(navball_.target.position - currentMainBody.position).normalized).normalized, (Vector3)(navball_.target.position - currentMainBody.position).normalized);

            navball_.navBall.rotation = relativeGymbal;

            if (navball_.progradeVector.gameObject.activeSelf)
            {
                navball_.progradeVector.gameObject.SetActive(false);
            }
            if (navball_.retrogradeVector.gameObject.activeSelf)
            {
                navball_.retrogradeVector.gameObject.SetActive(false);
            }
            if (navball_.progradeWaypoint.gameObject.activeSelf)
            {
                navball_.progradeWaypoint.gameObject.SetActive(false);
            }
            if (navball_.retrogradeWaypoint.gameObject.activeSelf)
            {
                navball_.retrogradeWaypoint.gameObject.SetActive(false);
            }

            if (navball_.radialInVector.gameObject.activeSelf)
            {
                navball_.radialInVector.gameObject.SetActive(false);
            }
            if (navball_.radialOutVector.gameObject.activeSelf)
            {
                navball_.radialOutVector.gameObject.SetActive(false);
            }
            if (navball_.normalVector.gameObject.activeSelf)
            {
                navball_.normalVector.gameObject.SetActive(false);
            }
            if (navball_.antiNormalVector.gameObject.activeSelf)
            {
                navball_.antiNormalVector.gameObject.SetActive(false);
            }

            Vector3 displayVelocity = Vector3.zero;

            switch (FlightGlobals.speedDisplayMode)
            {
            case FlightGlobals.SpeedDisplayModes.Orbit:
                displayVelocity = (Vector3)FlightGlobals.ship_obtVelocity;
                break;

            case FlightGlobals.SpeedDisplayModes.Surface:
                displayVelocity = (Vector3)FlightGlobals.ship_srfVelocity;
                break;

            case FlightGlobals.SpeedDisplayModes.Target:
                displayVelocity = (Vector3)FlightGlobals.ship_tgtVelocity;
                break;
            }
            float displaySpeed = displayVelocity.magnitude;

            if (displaySpeed == 0.0f)
            {
                displaySpeed = 1E-06f;
            }
            Vector3 displayVelDir = displayVelocity / displaySpeed;

            navball_.progradeVector.localPosition = attitudeGymbal * displayVelDir * navball_.VectorUnitScale;
            navball_.progradeVector.gameObject.SetActive((double)displaySpeed > (double)navball_.VectorVelocityThreshold && (double)navball_.progradeVector.transform.localPosition.z >= (double)navball_.VectorUnitCutoff);

            navball_.retrogradeVector.localPosition = attitudeGymbal * -displayVelDir * navball_.VectorUnitScale;
            navball_.retrogradeVector.gameObject.SetActive((double)displaySpeed > (double)navball_.VectorVelocityThreshold && (double)navball_.retrogradeVector.transform.localPosition.z > (double)navball_.VectorUnitCutoff);

            if (FlightGlobals.fetch.vesselTargetDirection != Vector3.zero)
            {
                navball_.progradeWaypoint.localPosition = attitudeGymbal * FlightGlobals.fetch.vesselTargetDirection * navball_.VectorUnitScale;
            }
            navball_.progradeWaypoint.gameObject.SetActive(FlightGlobals.fetch.vesselTargetTransform != null && (double)navball_.progradeWaypoint.transform.localPosition.z >= (double)navball_.VectorUnitCutoff);

            if (FlightGlobals.fetch.vesselTargetDirection != Vector3.zero)
            {
                navball_.retrogradeWaypoint.localPosition = attitudeGymbal * -FlightGlobals.fetch.vesselTargetDirection * navball_.VectorUnitScale;
            }
            navball_.retrogradeWaypoint.gameObject.SetActive(FlightGlobals.fetch.vesselTargetTransform != null && (double)navball_.retrogradeWaypoint.transform.localPosition.z > (double)navball_.VectorUnitCutoff);

            SetVectorAlphaTint(navball_.progradeVector);
            SetVectorAlphaTint(navball_.retrogradeVector);
            SetVectorAlphaTint(navball_.progradeWaypoint);
            SetVectorAlphaTint(navball_.retrogradeWaypoint);

            if (activeVessel.orbit != null && activeVessel.orbit.referenceBody != null && FlightGlobals.speedDisplayMode == FlightGlobals.SpeedDisplayModes.Orbit)
            {
                Vector3 wCoM   = activeVessel.CurrentCoM;
                Vector3 obtVel = (Vector3)activeVessel.orbit.GetVel();
                Vector3 cbPos  = (Vector3)activeVessel.mainBody.position;
                Vector3 radial = Vector3.ProjectOnPlane((wCoM - cbPos).normalized, obtVel).normalized;
                Vector3 normal = Vector3.Cross(radial, obtVel.normalized);
                radial = attitudeGymbal * radial * navball_.VectorUnitScale;
                normal = attitudeGymbal * normal * navball_.VectorUnitScale;

                navball_.antiNormalVector.localPosition = normal;
                navball_.normalVector.localPosition     = -normal;
                navball_.antiNormalVector.gameObject.SetActive((double)normal.z > (double)navball_.VectorUnitCutoff);
                navball_.normalVector.gameObject.SetActive((double)normal.z < -(double)navball_.VectorUnitCutoff);

                SetVectorAlphaTint(navball_.antiNormalVector);
                SetVectorAlphaTint(navball_.normalVector);

                navball_.radialInVector.localPosition  = -radial;
                navball_.radialOutVector.localPosition = radial;
                navball_.radialInVector.gameObject.SetActive((double)radial.z < -(double)navball_.VectorUnitCutoff);
                navball_.radialOutVector.gameObject.SetActive((double)radial.z > (double)navball_.VectorUnitCutoff);

                SetVectorAlphaTint(navball_.radialInVector);
                SetVectorAlphaTint(navball_.radialOutVector);
            }

            navball_.headingText.text = Quaternion.Inverse(relativeGymbal).eulerAngles.y.ToString("000") + "°";
        }