From 40e70a362dc600a4e5f988523f514feac4ab0166 Mon Sep 17 00:00:00 2001 From: Brett Ryland Date: Fri, 19 Feb 2021 17:47:50 +0100 Subject: [PATCH 01/15] Fix occassional NRE from other things crashing. --- CameraTools/CTPartAudioController.cs | 24 ++++++++++++------------ 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/CameraTools/CTPartAudioController.cs b/CameraTools/CTPartAudioController.cs index 93fe5175..28c51bf6 100644 --- a/CameraTools/CTPartAudioController.cs +++ b/CameraTools/CTPartAudioController.cs @@ -27,7 +27,7 @@ void Awake() void Start() { - if(!audioSource) + if (!audioSource) { Destroy(this); return; @@ -38,18 +38,18 @@ void Start() origRolloffMode = audioSource.rolloffMode; audioSource.rolloffMode = AudioRolloffMode.Logarithmic; audioSource.spatialBlend = 1; - + } void FixedUpdate() { - if(!audioSource) + if (!audioSource) { Destroy(this); return; } - if(!part || !vessel) + if (!part || !vessel || !FlightCamera.fetch) { Destroy(this); return; @@ -66,25 +66,25 @@ void FixedUpdate() lagAudioFactor = Mathf.Clamp(lagAudioFactor * lagAudioFactor * lagAudioFactor, 0, 4); lagAudioFactor += srfSpeed / 230; - float waveFrontFactor = ((3.67f * angleToCam)/srfSpeed); + float waveFrontFactor = ((3.67f * angleToCam) / srfSpeed); waveFrontFactor = Mathf.Clamp(waveFrontFactor * waveFrontFactor * waveFrontFactor, 0, 2); - if(vessel.srfSpeed > CamTools.speedOfSound) + if (vessel.srfSpeed > CamTools.speedOfSound) { - waveFrontFactor = (srfSpeed / (angleToCam) < 3.67f) ? waveFrontFactor + ((srfSpeed/(float)CamTools.speedOfSound)*waveFrontFactor): 0; + waveFrontFactor = (srfSpeed / (angleToCam) < 3.67f) ? waveFrontFactor + ((srfSpeed / (float)CamTools.speedOfSound) * waveFrontFactor) : 0; } lagAudioFactor *= waveFrontFactor; - - audioSource.minDistance = Mathf.Lerp(origMinDist, modMinDist * lagAudioFactor, Mathf.Clamp01((float)vessel.srfSpeed/30)); - audioSource.maxDistance = Mathf.Lerp(origMaxDist,Mathf.Clamp(modMaxDist * lagAudioFactor, audioSource.minDistance, 16000), Mathf.Clamp01((float)vessel.srfSpeed/30)); - + + audioSource.minDistance = Mathf.Lerp(origMinDist, modMinDist * lagAudioFactor, Mathf.Clamp01((float)vessel.srfSpeed / 30)); + audioSource.maxDistance = Mathf.Lerp(origMaxDist, Mathf.Clamp(modMaxDist * lagAudioFactor, audioSource.minDistance, 16000), Mathf.Clamp01((float)vessel.srfSpeed / 30)); + } void OnDestroy() { CamTools.OnResetCTools -= OnResetCTools; - + } void OnResetCTools() From ee7d4661508186d17101afa1a923d3552cb0e9cb Mon Sep 17 00:00:00 2001 From: Brett Ryland Date: Sun, 21 Feb 2021 00:45:54 +0100 Subject: [PATCH 02/15] Fix 'Only custom filters can be played.' warnings due to AudioSource having 'playOnAwake' enabled by default in Unity. --- CameraTools/CTAtmosphericAudioController.cs | 66 ++++++++++----------- 1 file changed, 33 insertions(+), 33 deletions(-) diff --git a/CameraTools/CTAtmosphericAudioController.cs b/CameraTools/CTAtmosphericAudioController.cs index 70fd86dd..7bdd0ccf 100644 --- a/CameraTools/CTAtmosphericAudioController.cs +++ b/CameraTools/CTAtmosphericAudioController.cs @@ -17,49 +17,53 @@ public class CTAtmosphericAudioController : MonoBehaviour void Awake() { vessel = GetComponent(); - windAudioSource = gameObject.AddComponent(); + + windAudioSource = new GameObject().AddComponent(); windAudioSource.minDistance = 10; windAudioSource.maxDistance = 10000; windAudioSource.dopplerLevel = .35f; windAudioSource.spatialBlend = 1; AudioClip windclip = GameDatabase.Instance.GetAudioClip("CameraTools/Sounds/windloop"); - if(!windclip) + if (!windclip) { - Destroy (this); + Destroy(this); return; } windAudioSource.clip = windclip; + windAudioSource.transform.parent = vessel.transform; - windHowlAudioSource = gameObject.AddComponent(); + windHowlAudioSource = new GameObject().AddComponent(); windHowlAudioSource.minDistance = 10; windHowlAudioSource.maxDistance = 7000; windHowlAudioSource.dopplerLevel = .5f; windHowlAudioSource.pitch = 0.25f; windHowlAudioSource.clip = GameDatabase.Instance.GetAudioClip("CameraTools/Sounds/windhowl"); windHowlAudioSource.spatialBlend = 1; + windHowlAudioSource.transform.parent = vessel.transform; - windTearAudioSource = gameObject.AddComponent(); + windTearAudioSource = new GameObject().AddComponent(); windTearAudioSource.minDistance = 10; windTearAudioSource.maxDistance = 5000; windTearAudioSource.dopplerLevel = 0.45f; windTearAudioSource.pitch = 0.65f; windTearAudioSource.clip = GameDatabase.Instance.GetAudioClip("CameraTools/Sounds/windtear"); windTearAudioSource.spatialBlend = 1; + windTearAudioSource.transform.parent = vessel.transform; sonicBoomSource = new GameObject().AddComponent(); - sonicBoomSource.transform.parent = vessel.transform; sonicBoomSource.transform.localPosition = Vector3.zero; sonicBoomSource.minDistance = 50; sonicBoomSource.maxDistance = 20000; sonicBoomSource.dopplerLevel = 0; sonicBoomSource.clip = GameDatabase.Instance.GetAudioClip("CameraTools/Sounds/sonicBoom"); - sonicBoomSource.volume = Mathf.Clamp01(vessel.GetTotalMass()/4f); + sonicBoomSource.volume = Mathf.Clamp01(vessel.GetTotalMass() / 4f); sonicBoomSource.Stop(); sonicBoomSource.spatialBlend = 1; + sonicBoomSource.transform.parent = vessel.transform; float angleToCam = Vector3.Angle(vessel.srf_velocity, FlightCamera.fetch.mainCamera.transform.position - vessel.transform.position); angleToCam = Mathf.Clamp(angleToCam, 1, 180); - if(vessel.srfSpeed / (angleToCam) < 3.67f) + if (vessel.srfSpeed / (angleToCam) < 3.67f) { playedBoom = true; } @@ -70,32 +74,32 @@ void Awake() void FixedUpdate() { - if(!vessel) + if (!vessel) { return; } - if(Time.timeScale > 0 && vessel.dynamicPressurekPa > 0) + if (Time.timeScale > 0 && vessel.dynamicPressurekPa > 0) { float srfSpeed = (float)vessel.srfSpeed; srfSpeed = Mathf.Min(srfSpeed, 550f); float angleToCam = Vector3.Angle(vessel.srf_velocity, FlightCamera.fetch.mainCamera.transform.position - vessel.transform.position); angleToCam = Mathf.Clamp(angleToCam, 1, 180); - + float lagAudioFactor = (75000 / (Vector3.Distance(vessel.transform.position, FlightCamera.fetch.mainCamera.transform.position) * srfSpeed * angleToCam / 90)); lagAudioFactor = Mathf.Clamp(lagAudioFactor * lagAudioFactor * lagAudioFactor, 0, 4); lagAudioFactor += srfSpeed / 230; - float waveFrontFactor = ((3.67f * angleToCam)/srfSpeed); + float waveFrontFactor = ((3.67f * angleToCam) / srfSpeed); waveFrontFactor = Mathf.Clamp(waveFrontFactor * waveFrontFactor * waveFrontFactor, 0, 2); - if(vessel.srfSpeed > CamTools.speedOfSound) + if (vessel.srfSpeed > CamTools.speedOfSound) { - waveFrontFactor = (srfSpeed / (angleToCam) < 3.67f) ? waveFrontFactor + ((srfSpeed/(float)CamTools.speedOfSound)*waveFrontFactor) : 0; - if(waveFrontFactor > 0) + waveFrontFactor = (srfSpeed / (angleToCam) < 3.67f) ? waveFrontFactor + ((srfSpeed / (float)CamTools.speedOfSound) * waveFrontFactor) : 0; + if (waveFrontFactor > 0) { - if(!playedBoom) + if (!playedBoom) { sonicBoomSource.transform.position = vessel.transform.position + (-vessel.srf_velocity); sonicBoomSource.PlayOneShot(sonicBoomSource.clip); @@ -107,7 +111,7 @@ void FixedUpdate() } } - else if(CamTools.speedOfSound / (angleToCam) < 3.67f) + else if (CamTools.speedOfSound / (angleToCam) < 3.67f) { playedBoom = true; } @@ -117,10 +121,10 @@ void FixedUpdate() float sqrAccel = (float)vessel.acceleration.sqrMagnitude; //windloop - if(!windAudioSource.isPlaying) + if (!windAudioSource.isPlaying) { windAudioSource.Play(); - //Debug.Log("[CameraTools]: vessel dynamic pressure: " + vessel.dynamicPressurekPa); + Debug.Log("[CameraTools]: vessel dynamic pressure: " + vessel.dynamicPressurekPa); } float pressureFactor = Mathf.Clamp01((float)vessel.dynamicPressurekPa / 50f); float massFactor = Mathf.Clamp01(vessel.GetTotalMass() / 60f); @@ -129,7 +133,7 @@ void FixedUpdate() //windhowl - if(!windHowlAudioSource.isPlaying) + if (!windHowlAudioSource.isPlaying) { windHowlAudioSource.Play(); } @@ -139,7 +143,7 @@ void FixedUpdate() windHowlAudioSource.maxDistance = Mathf.Clamp(lagAudioFactor * 2500, windTearAudioSource.minDistance, 16000); //windtear - if(!windTearAudioSource.isPlaying) + if (!windTearAudioSource.isPlaying) { windTearAudioSource.Play(); } @@ -150,21 +154,21 @@ void FixedUpdate() windTearAudioSource.minDistance = lagAudioFactor * 1; windTearAudioSource.maxDistance = Mathf.Clamp(lagAudioFactor * 2500, windTearAudioSource.minDistance, 16000); - + } else { - if(windAudioSource.isPlaying) + if (windAudioSource.isPlaying) { windAudioSource.Stop(); } - if(windHowlAudioSource.isPlaying) + if (windHowlAudioSource.isPlaying) { windHowlAudioSource.Stop(); } - if(windTearAudioSource.isPlaying) + if (windTearAudioSource.isPlaying) { windTearAudioSource.Stop(); } @@ -173,19 +177,15 @@ void FixedUpdate() void OnDestroy() { - if(sonicBoomSource) - { - Destroy(sonicBoomSource.gameObject); - } + if (sonicBoomSource) Destroy(sonicBoomSource.gameObject); + if (windAudioSource) Destroy(windAudioSource.gameObject); + if (windHowlAudioSource) Destroy(windHowlAudioSource.gameObject); + if (windTearAudioSource) Destroy(windTearAudioSource.gameObject); CamTools.OnResetCTools -= OnResetCTools; } void OnResetCTools() { - Destroy(windAudioSource); - Destroy(windHowlAudioSource); - Destroy(windTearAudioSource); - Destroy(this); } } From 5fe312440521a8b2e73d77797a215a5cb72feb8d Mon Sep 17 00:00:00 2001 From: Brett Ryland Date: Mon, 22 Feb 2021 19:42:28 +0100 Subject: [PATCH 03/15] Comment out debugging info. --- CameraTools/CTAtmosphericAudioController.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CameraTools/CTAtmosphericAudioController.cs b/CameraTools/CTAtmosphericAudioController.cs index 7bdd0ccf..f72dfa5c 100644 --- a/CameraTools/CTAtmosphericAudioController.cs +++ b/CameraTools/CTAtmosphericAudioController.cs @@ -124,7 +124,7 @@ void FixedUpdate() if (!windAudioSource.isPlaying) { windAudioSource.Play(); - Debug.Log("[CameraTools]: vessel dynamic pressure: " + vessel.dynamicPressurekPa); + // Debug.Log("[CameraTools]: vessel dynamic pressure: " + vessel.dynamicPressurekPa); } float pressureFactor = Mathf.Clamp01((float)vessel.dynamicPressurekPa / 50f); float massFactor = Mathf.Clamp01(vessel.GetTotalMass() / 60f); From 8e18361c1daaba669780e7f87244676b5c839987 Mon Sep 17 00:00:00 2001 From: Brett Ryland Date: Thu, 4 Mar 2021 21:18:23 +0100 Subject: [PATCH 04/15] Smoother transitions and avoid jitter when switching targets and vessels. --- CameraTools/CamTools.cs | 216 ++++++++++++++++++++++++---------------- 1 file changed, 128 insertions(+), 88 deletions(-) diff --git a/CameraTools/CamTools.cs b/CameraTools/CamTools.cs index b7ba2429..7715d4bd 100644 --- a/CameraTools/CamTools.cs +++ b/CameraTools/CamTools.cs @@ -34,6 +34,8 @@ public class CamTools : MonoBehaviour Type bdVesselSpawnerType = null; object bdVesselSpawnerInstance = null; FieldInfo bdVesselsSpawningField = null; + [CTPersistantField] public bool DEBUG = false; + bool vesselSwitched = false; #region Input [CTPersistantField] public string cameraKey = "home"; @@ -98,6 +100,8 @@ public class CamTools : MonoBehaviour Vector3 resetPositionFix;//fixes position movement after setting and resetting camera public delegate void ResetCTools(); public static event ResetCTools OnResetCTools; + double noDogfightTargetDelay = 5; + double noDogfightTargetTimer = -1; #endregion #region Recording @@ -347,7 +351,7 @@ void FixedUpdate() lastVesselPosition = vessel.transform.position; } - if (autoEnableForBDA && !autoEnableOverriden) + if (autoEnableForBDA && !autoEnableOverriden && (toolMode != ToolModes.Pathing || (selectedPathIndex >= 0 && currentPath.keyframeCount > 0))) { AutoEnableForBDA(); } @@ -360,6 +364,15 @@ void FixedUpdate() break; case ToolModes.DogfightCamera: UpdateDogfightCamera(); + if (noDogfightTargetTimer < 0 && dogfightTarget && dogfightTarget.isActiveVessel) + { + dogfightTarget = null; + if (cameraToolActive) + { + Debug.Log("[CameraTools]: Reverting because dogfightTarget is null"); + RevertCamera(); + } + } break; case ToolModes.Pathing: UpdatePathingCam(); @@ -375,19 +388,6 @@ void FixedUpdate() zoomFactor = Mathf.Exp(zoomExp) / Mathf.Exp(1); } } - - if (toolMode == ToolModes.DogfightCamera) - { - if (dogfightTarget && dogfightTarget.isActiveVessel) - { - dogfightTarget = null; - if (cameraToolActive) - { - Debug.Log("[CameraTools]: Reverting because dogfightTarget is null"); - RevertCamera(); - } - } - } } void LateUpdate() @@ -403,46 +403,57 @@ void LateUpdate() flightCamera.transform.localPosition = Vector3.zero; flightCamera.transform.localRotation = Quaternion.identity; } - else + else if (!vesselSwitched) { deathCam.transform.position = flightCamera.transform.position; deathCam.transform.rotation = flightCamera.transform.rotation; } + if (vesselSwitched) // We perform this here instead of waiting for the next frame to avoid a flicker of the camera being switched. + { + vesselSwitched = false; + switch (toolMode) + { + case ToolModes.DogfightCamera: + if (hasBDAI && useBDAutoTarget) + { + Vessel newAITarget = GetAITargetedVessel(); + if (newAITarget) + { + dogfightTarget = newAITarget; + } + } + StartDogfightCamera(); + break; + case ToolModes.StationaryCamera: + StartStationaryCamera(); + break; + case ToolModes.Pathing: + StartPathingCam(); + PlayPathingCam(); + break; + } + } } private void cameraActivate() { + if (DEBUG) Debug.Log("[CameraTools]: Activating camera."); + if (!cameraToolActive) + { + SaveOriginalCamera(); + } + deathCam.transform.position = flightCamera.transform.position; + deathCam.transform.rotation = flightCamera.transform.rotation; if (toolMode == ToolModes.StationaryCamera) { - if (!cameraToolActive) - { - SaveOriginalCamera(); - StartStationaryCamera(); - } - else - { - //RevertCamera(); - StartStationaryCamera(); - } + StartStationaryCamera(); } else if (toolMode == ToolModes.DogfightCamera) { - if (!cameraToolActive) - { - SaveOriginalCamera(); - StartDogfightCamera(); - } - else - { - StartDogfightCamera(); - } + StartDogfightCamera(); } else if (toolMode == ToolModes.Pathing) { - if (!cameraToolActive) - { - SaveOriginalCamera(); - } StartPathingCam(); PlayPathingCam(); } @@ -456,6 +467,7 @@ void StartDogfightCamera() Debug.Log("[CameraTools]: No active vessel."); return; } + if (DEBUG) Debug.Log("[CameraTools]: Starting dogfight camera."); if (!dogfightTarget) { @@ -476,16 +488,22 @@ void StartDogfightCamera() dogfightPrevTarget = dogfightTarget; hasDied = false; + noDogfightTargetTimer = -1; vessel = FlightGlobals.ActiveVessel; cameraUp = -FlightGlobals.getGeeForceAtPosition(vessel.CoM).normalized; - cameraParent.transform.position = deathCam.transform.position; // First update the cameraParent to the last deathCam configuration - cameraParent.transform.rotation = deathCam.transform.rotation; - flightCamera.SetTargetNone(); - flightCamera.transform.parent = cameraParent.transform; - flightCamera.DeactivateUpdate(); - cameraParent.transform.position = vessel.transform.position; // Then adjust the flightCamera for the new parent. - flightCamera.transform.localRotation = Quaternion.identity; + if (flightCamera.transform.parent != cameraParent.transform) + { + if (DEBUG) Debug.Log("[CameraTools]: Resetting flightCamera parent."); + cameraParent.transform.position = deathCam.transform.position; // First update the cameraParent to the last deathCam configuration + cameraParent.transform.rotation = deathCam.transform.rotation; + flightCamera.SetTargetNone(); + flightCamera.transform.parent = cameraParent.transform; + flightCamera.DeactivateUpdate(); + cameraParent.transform.position = vessel.CoM; // Then adjust the flightCamera for the new parent. + flightCamera.transform.localPosition = cameraParent.transform.InverseTransformPoint(deathCam.transform.position); + flightCamera.transform.localRotation = Quaternion.identity; + } cameraToolActive = true; @@ -503,7 +521,7 @@ void UpdateDogfightCamera() { if (!vessel || (!dogfightTarget && !dogfightLastTarget && !dogfightVelocityChase)) { - Debug.Log("[CameraTools]: Reverting during UpdateDogfightCamera()"); + Debug.Log("[CameraTools]: Reverting during UpdateDogfightCamera"); RevertCamera(); return; } @@ -670,8 +688,23 @@ void UpdateDogfightCamera() if (dogfightTarget != dogfightPrevTarget) { - //RevertCamera(); - StartDogfightCamera(); + if (false && dogfightTarget == null) // WIP + { + if (noDogfightTargetTimer < 0) + { + noDogfightTargetTimer = Time.time; + Debug.Log("[CameraTools]: Dogfight target is null, waiting briefly before restarting dogfight camera."); + } + if (noDogfightTargetTimer > 0 && Time.time - noDogfightTargetTimer > noDogfightTargetDelay) + { + Debug.Log("[CameraTools]: Finished waiting. Re-starting dogfight camera."); + StartDogfightCamera(); + } + } + else + { + StartDogfightCamera(); + } } } #endregion @@ -681,6 +714,7 @@ void StartStationaryCamera() { if (FlightGlobals.ActiveVessel != null) { + if (DEBUG) Debug.Log("[CameraTools]: Starting stationary camera."); hasDied = false; vessel = FlightGlobals.ActiveVessel; cameraUp = -FlightGlobals.getGeeForceAtPosition(vessel.GetWorldPos3D()).normalized; @@ -689,13 +723,18 @@ void StartStationaryCamera() cameraUp = Vector3.up; } - cameraParent.transform.position = deathCam.transform.position; // First update the cameraParent to the last deathCam configuration - cameraParent.transform.rotation = deathCam.transform.rotation; - flightCamera.SetTargetNone(); - flightCamera.transform.parent = cameraParent.transform; - flightCamera.DeactivateUpdate(); - cameraParent.transform.position = vessel.transform.position; // Then adjust the flightCamera for the new parent. - flightCamera.transform.localRotation = Quaternion.identity; + if (flightCamera.transform.parent != cameraParent.transform) + { + if (DEBUG) Debug.Log("[CameraTools]: Resetting flightCamera parent."); + cameraParent.transform.position = deathCam.transform.position; // First update the cameraParent to the last deathCam configuration + cameraParent.transform.rotation = deathCam.transform.rotation; + flightCamera.SetTargetNone(); + flightCamera.transform.parent = cameraParent.transform; + flightCamera.DeactivateUpdate(); + cameraParent.transform.position = vessel.CoM; // Then adjust the flightCamera for the new parent. + flightCamera.transform.localPosition = cameraParent.transform.InverseTransformPoint(deathCam.transform.position); + flightCamera.transform.localRotation = Quaternion.identity; + } manualPosition = Vector3.zero; if (randomMode) @@ -796,7 +835,6 @@ void StartStationaryCamera() SetDoppler(true); AddAtmoAudioControllers(true); - } else { @@ -981,6 +1019,13 @@ void UpdateStationaryCamera() #region Pathing Camera void StartPathingCam() { + if (DEBUG) Debug.Log("[CameraTools]: Starting pathing camera."); + if (selectedPathIndex < 0 || currentPath.keyframeCount <= 0) + { + if (DEBUG) Debug.Log("[CameraTools]: Unable to start pathing camera due to no valid paths."); + RevertCamera(); + return; + } vessel = FlightGlobals.ActiveVessel; cameraUp = -FlightGlobals.getGeeForceAtPosition(vessel.GetWorldPos3D()).normalized; if (FlightCamera.fetch.mode == FlightCamera.Modes.ORBITAL || (FlightCamera.fetch.mode == FlightCamera.Modes.AUTO && FlightCamera.GetAutoModeForVessel(vessel) == FlightCamera.Modes.ORBITAL)) @@ -1198,14 +1243,17 @@ void ViewKeyframe(int index) void PlayPathingCam() { + if (DEBUG) Debug.Log("[CameraTools]: Playing pathing camera."); if (selectedPathIndex < 0) { + if (DEBUG) Debug.Log("[CameraTools]: selectedPathIndex < 0, reverting."); RevertCamera(); return; } if (currentPath.keyframeCount <= 0) { + if (DEBUG) Debug.Log("[CameraTools]: keyframeCount <= 0, reverting."); RevertCamera(); return; } @@ -1397,6 +1445,12 @@ void ResetDoppler() #region Revert/Reset void SwitchToVessel(Vessel v) { + if (v == null) + { + RevertCamera(); + return; + } + if (DEBUG) Debug.Log("[CameraTools]: Switching to vessel " + v.vesselName); vessel = v; CheckForBDAI(v); @@ -1456,31 +1510,13 @@ void SwitchToVessel(Vessel v) } } - if (toolMode == ToolModes.DogfightCamera) - { - StartCoroutine(ResetDogfightCamRoutine()); - } + vesselSwitched = true; } } - IEnumerator ResetDogfightCamRoutine() - { - yield return new WaitForEndOfFrame(); - - RevertCamera(); - if (hasBDAI && useBDAutoTarget) - { - Vessel newAITarget = GetAITargetedVessel(); - if (newAITarget) - { - dogfightTarget = newAITarget; - } - } - StartDogfightCamera(); - } - public void RevertCamera() { + if (DEBUG) Debug.Log("[CameraTools]: Reverting camera."); posCounter = 0; if (cameraToolActive) @@ -1501,9 +1537,12 @@ public void RevertCamera() { flightCamera.SetTarget(FlightGlobals.ActiveVessel.transform, FlightCamera.TargetMode.Vessel); } - flightCamera.transform.parent = origParent; - flightCamera.transform.position = origPosition; - flightCamera.transform.rotation = origRotation; + if (cameraToolActive) + { + flightCamera.transform.parent = origParent; + flightCamera.transform.position = origPosition; + flightCamera.transform.rotation = origRotation; + } if (HighLogic.LoadedSceneIsFlight) flightCamera.mainCamera.nearClipPlane = origNearClip; else @@ -1616,16 +1655,15 @@ void GuiWindow(int windowID) //tool mode switcher GUI.Label(new Rect(leftIndent, contentTop + (line * entryHeight), contentWidth, entryHeight), "Tool: " + toolMode.ToString(), leftLabelBold); line++; - if (!cameraToolActive) + if (GUI.Button(new Rect(leftIndent, contentTop + (line * entryHeight), 25, entryHeight - 2), "<")) { - if (GUI.Button(new Rect(leftIndent, contentTop + (line * entryHeight), 25, entryHeight - 2), "<")) - { - CycleToolMode(false); - } - if (GUI.Button(new Rect(leftIndent + 25 + 4, contentTop + (line * entryHeight), 25, entryHeight - 2), ">")) - { - CycleToolMode(true); - } + CycleToolMode(false); + cameraActivate(); + } + if (GUI.Button(new Rect(leftIndent + 25 + 4, contentTop + (line * entryHeight), 25, entryHeight - 2), ">")) + { + CycleToolMode(true); + cameraActivate(); } line++; line++; @@ -2245,6 +2283,7 @@ void CurrentVesselWillDestroy(Vessel v) hasDied = true; diedTime = Time.time; + if (DEBUG) Debug.Log("[CameraTools]: Activating death camera."); // Something borks the camera position/rotation when the target/parent is set to none/null. This fixes that. deathCamVelocity = (vessel.radarAltitude > 10d ? vessel.srf_velocity : Vector3d.zero) / 2f; // Track the explosion a bit. flightCamera.SetTargetNone(); @@ -2655,6 +2694,7 @@ void Load() { availablePaths.Add(CameraPath.Load(node)); } + if (DEBUG) Debug.Log("[CameraTools]: Verbose debugging enabled."); } #endregion } From c84ca0dd25c3a6dbe68b3290b83f9f2b924992a1 Mon Sep 17 00:00:00 2001 From: Brett Ryland Date: Thu, 4 Mar 2021 22:57:48 +0100 Subject: [PATCH 05/15] Remove noDogfightTargetTimer as it doesn't seem to trigger now. --- CameraTools/CamTools.cs | 23 ++--------------------- 1 file changed, 2 insertions(+), 21 deletions(-) diff --git a/CameraTools/CamTools.cs b/CameraTools/CamTools.cs index 7715d4bd..89a6e5b6 100644 --- a/CameraTools/CamTools.cs +++ b/CameraTools/CamTools.cs @@ -100,8 +100,6 @@ public class CamTools : MonoBehaviour Vector3 resetPositionFix;//fixes position movement after setting and resetting camera public delegate void ResetCTools(); public static event ResetCTools OnResetCTools; - double noDogfightTargetDelay = 5; - double noDogfightTargetTimer = -1; #endregion #region Recording @@ -364,7 +362,7 @@ void FixedUpdate() break; case ToolModes.DogfightCamera: UpdateDogfightCamera(); - if (noDogfightTargetTimer < 0 && dogfightTarget && dogfightTarget.isActiveVessel) + if (dogfightTarget && dogfightTarget.isActiveVessel) { dogfightTarget = null; if (cameraToolActive) @@ -488,7 +486,6 @@ void StartDogfightCamera() dogfightPrevTarget = dogfightTarget; hasDied = false; - noDogfightTargetTimer = -1; vessel = FlightGlobals.ActiveVessel; cameraUp = -FlightGlobals.getGeeForceAtPosition(vessel.CoM).normalized; @@ -688,23 +685,7 @@ void UpdateDogfightCamera() if (dogfightTarget != dogfightPrevTarget) { - if (false && dogfightTarget == null) // WIP - { - if (noDogfightTargetTimer < 0) - { - noDogfightTargetTimer = Time.time; - Debug.Log("[CameraTools]: Dogfight target is null, waiting briefly before restarting dogfight camera."); - } - if (noDogfightTargetTimer > 0 && Time.time - noDogfightTargetTimer > noDogfightTargetDelay) - { - Debug.Log("[CameraTools]: Finished waiting. Re-starting dogfight camera."); - StartDogfightCamera(); - } - } - else - { - StartDogfightCamera(); - } + StartDogfightCamera(); } } #endregion From f9e33db301cb4a58dfac99995d0da51732b817dc Mon Sep 17 00:00:00 2001 From: Brett Ryland Date: Wed, 10 Mar 2021 21:23:45 +0100 Subject: [PATCH 06/15] Reduce flickering by compensating for floating origin changes. Add on-screen debugging. --- CameraTools/CamTools.cs | 127 ++++++++++++++++++++++++++++++---------- 1 file changed, 96 insertions(+), 31 deletions(-) diff --git a/CameraTools/CamTools.cs b/CameraTools/CamTools.cs index 89a6e5b6..6bed691e 100644 --- a/CameraTools/CamTools.cs +++ b/CameraTools/CamTools.cs @@ -4,6 +4,8 @@ using UnityEngine; using System.Reflection; using KSP.UI.Screens; +using System.Linq; + namespace CameraTools { [KSPAddon(KSPAddon.Startup.Flight, false)] @@ -35,6 +37,7 @@ public class CamTools : MonoBehaviour object bdVesselSpawnerInstance = null; FieldInfo bdVesselsSpawningField = null; [CTPersistantField] public bool DEBUG = false; + string message; bool vesselSwitched = false; #region Input @@ -76,6 +79,13 @@ public class CamTools : MonoBehaviour string guiOffsetUp = "5"; [CTPersistantField] public bool useOrbital = false; [CTPersistantField] public bool targetCoM = false; + List> debugMessages = new List>(); + void DebugLog(string m) => debugMessages.Add(new Tuple(Time.time, m)); + Rect cShadowRect = new Rect(Screen.width * 3 / 5, 100, Screen.width / 3 - 50, 100); + Rect cDebugRect = new Rect(Screen.width * 3 / 5 + 2, 100 + 2, Screen.width / 3 - 50, 100); + GUIStyle cStyle; + GUIStyle cShadowStyle; + #endregion #region Revert/Reset @@ -84,7 +94,6 @@ public class CamTools : MonoBehaviour bool hasSavedRotation = false; Quaternion savedRotation; bool temporaryRevert = false; - Vector3 lastVesselPosition = Vector3.zero; Vector3 lastTargetPosition = Vector3.zero; bool hasTarget = false; bool hasDied = false; @@ -235,7 +244,6 @@ void Start() GameEvents.onShowUI.Add(GameUIEnable); //GameEvents.onGamePause.Add (PostDeathRevert); GameEvents.OnVesselRecoveryRequested.Add(PostDeathRevert); - GameEvents.onFloatingOriginShift.Add(OnFloatingOriginShift); GameEvents.onGameSceneLoadRequested.Add(PostDeathRevert); cameraParent = new GameObject("StationaryCameraParent"); @@ -259,6 +267,16 @@ void Start() bdWmUnderAttackField = GetUnderAttackField(); GameEvents.onVesselChange.Add(SwitchToVessel); GameEvents.onVesselWillDestroy.Add(CurrentVesselWillDestroy); + + cStyle = new GUIStyle(HighLogic.Skin.label); + cStyle.fontStyle = UnityEngine.FontStyle.Bold; + cStyle.fontSize = 22; + cStyle.alignment = TextAnchor.UpperLeft; + cShadowStyle = new GUIStyle(cStyle); + cShadowRect = new Rect(cDebugRect); + cShadowRect.x += 2; + cShadowRect.y += 2; + cShadowStyle.normal.textColor = new Color(0, 0, 0, 0.75f); } void OnDestroy() @@ -332,21 +350,27 @@ void Update() } } + Vector3 lastCamVesselΔ = Vector3.zero; void FixedUpdate() { // Note: we have to perform the camera adjustments during FixedUpdate to avoid jitter in the Lerps in the camera position and rotation due to inconsistent numbers of physics updates per frame. if (!FlightGlobals.ready) return; - if (hasDied && cameraToolActive) return; // Do nothing until we have an active vessel. + flightCamera.transform.position -= FloatingOrigin.Offset; // This fixed the floating origin shifts. (Vessel positions are updated by KSP automatically, but not other position vectors.) + // I am uncertain whether there are any other Kraken velocity corrections that need to be applied. - if (FlightGlobals.ActiveVessel != null && (vessel == null || vessel != FlightGlobals.ActiveVessel)) + if (DEBUG && FloatingOrigin.fetch.offset.sqrMagnitude > 0.2f || Krakensbane.GetLastCorrection().sqrMagnitude > 100f) { - vessel = FlightGlobals.ActiveVessel; + var message = "FloatingOrigin offset Δ: " + FloatingOrigin.Offset.magnitude.ToString("0.00") + ", Krakensbane velocity Δ: " + Krakensbane.GetLastCorrection().magnitude.ToString("0.0") + ", " + (dogfightTarget != null) + ", " + dogfightLastTarget + ", " + dogfightVelocityChase + ", Δ: " + (vessel.CoM - flightCamera.transform.position).magnitude.ToString("0.00") + ", Δ': " + lastCamVesselΔ.magnitude.ToString("0.00"); + Debug.Log("[CameraTools]: " + message); + DebugLog(message); } - if (vessel != null) + if (hasDied && cameraToolActive) return; // Do nothing until we have an active vessel. + + if (FlightGlobals.ActiveVessel != null && (vessel == null || vessel != FlightGlobals.ActiveVessel)) { - lastVesselPosition = vessel.transform.position; + vessel = FlightGlobals.ActiveVessel; } if (autoEnableForBDA && !autoEnableOverriden && (toolMode != ToolModes.Pathing || (selectedPathIndex >= 0 && currentPath.keyframeCount > 0))) @@ -367,7 +391,7 @@ void FixedUpdate() dogfightTarget = null; if (cameraToolActive) { - Debug.Log("[CameraTools]: Reverting because dogfightTarget is null"); + if (DEBUG) Debug.Log("[CameraTools]: Reverting because dogfightTarget is null"); RevertCamera(); } } @@ -386,6 +410,7 @@ void FixedUpdate() zoomFactor = Mathf.Exp(zoomExp) / Mathf.Exp(1); } } + lastCamVesselΔ = vessel.CoM - flightCamera.transform.position; } void LateUpdate() @@ -435,7 +460,7 @@ void LateUpdate() private void cameraActivate() { - if (DEBUG) Debug.Log("[CameraTools]: Activating camera."); + if (DEBUG) { Debug.Log("[CameraTools]: Activating camera."); DebugLog("Activating camera"); } if (!cameraToolActive) { SaveOriginalCamera(); @@ -465,7 +490,7 @@ void StartDogfightCamera() Debug.Log("[CameraTools]: No active vessel."); return; } - if (DEBUG) Debug.Log("[CameraTools]: Starting dogfight camera."); + if (DEBUG) { Debug.Log("[CameraTools]: Starting dogfight camera."); DebugLog("Starting dogfight camera"); } if (!dogfightTarget) { @@ -491,7 +516,6 @@ void StartDogfightCamera() if (flightCamera.transform.parent != cameraParent.transform) { - if (DEBUG) Debug.Log("[CameraTools]: Resetting flightCamera parent."); cameraParent.transform.position = deathCam.transform.position; // First update the cameraParent to the last deathCam configuration cameraParent.transform.rotation = deathCam.transform.rotation; flightCamera.SetTargetNone(); @@ -518,7 +542,7 @@ void UpdateDogfightCamera() { if (!vessel || (!dogfightTarget && !dogfightLastTarget && !dogfightVelocityChase)) { - Debug.Log("[CameraTools]: Reverting during UpdateDogfightCamera"); + if (DEBUG) { Debug.Log("[CameraTools]: Reverting during UpdateDogfightCamera"); } RevertCamera(); return; } @@ -531,7 +555,8 @@ void UpdateDogfightCamera() } else if (dogfightLastTarget) { - dogfightLastTargetPosition += dogfightLastTargetVelocity * Time.fixedDeltaTime; + dogfightLastTargetVelocity += Krakensbane.GetLastCorrection(); + dogfightLastTargetPosition += dogfightLastTargetVelocity * Time.fixedDeltaTime - FloatingOrigin.Offset; } cameraParent.transform.position = vessel.CoM; @@ -677,6 +702,12 @@ void UpdateDogfightCamera() Vessel newAITarget = GetAITargetedVessel(); if (newAITarget) { + if (DEBUG && dogfightTarget != newAITarget) + { + message = "Switching dogfight target to " + newAITarget.vesselName + (dogfightTarget != null ? " from " + dogfightTarget.vesselName : ""); + Debug.Log("[CameraTools]: " + message); + DebugLog(message); + } dogfightTarget = newAITarget; } targetUpdateTime = Planetarium.GetUniversalTime(); @@ -695,7 +726,12 @@ void StartStationaryCamera() { if (FlightGlobals.ActiveVessel != null) { - if (DEBUG) Debug.Log("[CameraTools]: Starting stationary camera."); + if (DEBUG) + { + message = "Starting stationary camera."; + Debug.Log("[CameraTools]: " + message); + DebugLog(message); + } hasDied = false; vessel = FlightGlobals.ActiveVessel; cameraUp = -FlightGlobals.getGeeForceAtPosition(vessel.GetWorldPos3D()).normalized; @@ -706,7 +742,6 @@ void StartStationaryCamera() if (flightCamera.transform.parent != cameraParent.transform) { - if (DEBUG) Debug.Log("[CameraTools]: Resetting flightCamera parent."); cameraParent.transform.position = deathCam.transform.position; // First update the cameraParent to the last deathCam configuration cameraParent.transform.rotation = deathCam.transform.rotation; flightCamera.SetTargetNone(); @@ -1000,13 +1035,19 @@ void UpdateStationaryCamera() #region Pathing Camera void StartPathingCam() { - if (DEBUG) Debug.Log("[CameraTools]: Starting pathing camera."); if (selectedPathIndex < 0 || currentPath.keyframeCount <= 0) { if (DEBUG) Debug.Log("[CameraTools]: Unable to start pathing camera due to no valid paths."); RevertCamera(); return; } + if (DEBUG) + { + message = "Starting pathing camera."; + Debug.Log("[CameraTools]: " + message); + DebugLog(message); + } + hasDied = false; vessel = FlightGlobals.ActiveVessel; cameraUp = -FlightGlobals.getGeeForceAtPosition(vessel.GetWorldPos3D()).normalized; if (FlightCamera.fetch.mode == FlightCamera.Modes.ORBITAL || (FlightCamera.fetch.mode == FlightCamera.Modes.AUTO && FlightCamera.GetAutoModeForVessel(vessel) == FlightCamera.Modes.ORBITAL)) @@ -1224,7 +1265,12 @@ void ViewKeyframe(int index) void PlayPathingCam() { - if (DEBUG) Debug.Log("[CameraTools]: Playing pathing camera."); + if (DEBUG) + { + message = "Playing pathing camera."; + Debug.Log("[CameraTools]: " + message); + DebugLog(message); + } if (selectedPathIndex < 0) { if (DEBUG) Debug.Log("[CameraTools]: selectedPathIndex < 0, reverting."); @@ -1431,7 +1477,12 @@ void SwitchToVessel(Vessel v) RevertCamera(); return; } - if (DEBUG) Debug.Log("[CameraTools]: Switching to vessel " + v.vesselName); + if (DEBUG) + { + message = "Switching to vessel " + v.vesselName; + Debug.Log("[CameraTools]: " + message); + DebugLog(message); + } vessel = v; CheckForBDAI(v); @@ -1497,7 +1548,12 @@ void SwitchToVessel(Vessel v) public void RevertCamera() { - if (DEBUG) Debug.Log("[CameraTools]: Reverting camera."); + if (DEBUG) + { + message = "Reverting camera."; + Debug.Log("[CameraTools]: " + message); + DebugLog(message); + } posCounter = 0; if (cameraToolActive) @@ -1604,6 +1660,20 @@ void OnGUI() PathSelectorWindow(); } } + if (DEBUG) + { + if (debugMessages.Count > 0) + { + var now = Time.time; + debugMessages = debugMessages.Where(m => now - m.Item1 < 5f).ToList(); + if (debugMessages.Count > 0) + { + var messages = string.Join("\n", debugMessages.Select(m => m.Item1.ToString("0.000") + " " + m.Item2)); + GUI.Label(cShadowRect, messages, cShadowStyle); + GUI.Label(cDebugRect, messages, cStyle); + } + } + } } void GuiWindow(int windowID) @@ -2264,7 +2334,12 @@ void CurrentVesselWillDestroy(Vessel v) hasDied = true; diedTime = Time.time; - if (DEBUG) Debug.Log("[CameraTools]: Activating death camera."); + if (DEBUG) + { + message = "Activating death camera."; + Debug.Log("[CameraTools]: " + message); + DebugLog(message); + } // Something borks the camera position/rotation when the target/parent is set to none/null. This fixes that. deathCamVelocity = (vessel.radarAltitude > 10d ? vessel.srf_velocity : Vector3d.zero) / 2f; // Track the explosion a bit. flightCamera.SetTargetNone(); @@ -2300,16 +2375,6 @@ Vector3 GetPosFromMouse() else return Vector3.zero; } - void OnFloatingOriginShift(Vector3d offset, Vector3d data1) - { - /* - Debug.LogWarning ("[CameraTools]: ======Floating origin shifted.======"); - Debug.LogWarning ("[CameraTools]: ======Passed offset: "+offset+"======"); - Debug.LogWarning ("[CameraTools]: ======FloatingOrigin offset: "+FloatingOrigin.fetch.offset+"======"); - Debug.LogWarning("[CameraTools]: ========Floating Origin threshold: "+FloatingOrigin.fetch.threshold+"=========="); - */ - } - void UpdateLoadedVessels() { if (loadedVessels == null) @@ -2675,7 +2740,7 @@ void Load() { availablePaths.Add(CameraPath.Load(node)); } - if (DEBUG) Debug.Log("[CameraTools]: Verbose debugging enabled."); + if (DEBUG) { Debug.Log("[CameraTools]: Verbose debugging enabled."); } } #endregion } From 37b32627c119fe169e7fed6fdd640b2c998dc82a Mon Sep 17 00:00:00 2001 From: Brett Ryland Date: Wed, 10 Mar 2021 23:56:51 +0100 Subject: [PATCH 07/15] Correct grouping of debugging checks. --- CameraTools/CamTools.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CameraTools/CamTools.cs b/CameraTools/CamTools.cs index 6bed691e..d7cbf85c 100644 --- a/CameraTools/CamTools.cs +++ b/CameraTools/CamTools.cs @@ -359,7 +359,7 @@ void FixedUpdate() flightCamera.transform.position -= FloatingOrigin.Offset; // This fixed the floating origin shifts. (Vessel positions are updated by KSP automatically, but not other position vectors.) // I am uncertain whether there are any other Kraken velocity corrections that need to be applied. - if (DEBUG && FloatingOrigin.fetch.offset.sqrMagnitude > 0.2f || Krakensbane.GetLastCorrection().sqrMagnitude > 100f) + if (DEBUG && (FloatingOrigin.fetch.offset.sqrMagnitude > 0.2f || Krakensbane.GetLastCorrection().sqrMagnitude > 100f)) { var message = "FloatingOrigin offset Δ: " + FloatingOrigin.Offset.magnitude.ToString("0.00") + ", Krakensbane velocity Δ: " + Krakensbane.GetLastCorrection().magnitude.ToString("0.0") + ", " + (dogfightTarget != null) + ", " + dogfightLastTarget + ", " + dogfightVelocityChase + ", Δ: " + (vessel.CoM - flightCamera.transform.position).magnitude.ToString("0.00") + ", Δ': " + lastCamVesselΔ.magnitude.ToString("0.00"); Debug.Log("[CameraTools]: " + message); From 37693e2256b49564e0eed3e82fdcdcde967bc52d Mon Sep 17 00:00:00 2001 From: Brett Ryland Date: Wed, 10 Mar 2021 23:57:35 +0100 Subject: [PATCH 08/15] Fix NRE in atmospheric audio when vessel is destroyed. --- CameraTools/CTAtmosphericAudioController.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CameraTools/CTAtmosphericAudioController.cs b/CameraTools/CTAtmosphericAudioController.cs index f72dfa5c..658710c8 100644 --- a/CameraTools/CTAtmosphericAudioController.cs +++ b/CameraTools/CTAtmosphericAudioController.cs @@ -74,7 +74,7 @@ void Awake() void FixedUpdate() { - if (!vessel) + if (!vessel || !vessel.loaded || !vessel.isActiveAndEnabled) { return; } From 8e065ac64ea4d16cb1de6d4257592adf84c61ea9 Mon Sep 17 00:00:00 2001 From: Brett Ryland Date: Tue, 16 Mar 2021 15:16:34 +0100 Subject: [PATCH 09/15] Add roll parameter to dogfight camera. --- CameraTools/CamTools.cs | 38 +++++++++++++++++++++++++++++--------- 1 file changed, 29 insertions(+), 9 deletions(-) diff --git a/CameraTools/CamTools.cs b/CameraTools/CamTools.cs index d7cbf85c..79cf39c3 100644 --- a/CameraTools/CamTools.cs +++ b/CameraTools/CamTools.cs @@ -135,11 +135,14 @@ public class CamTools : MonoBehaviour #region Dogfight Camera Fields Vessel dogfightPrevTarget; Vessel dogfightTarget; - [CTPersistantField] public float dogfightDistance = 30; - [CTPersistantField] public float dogfightOffsetX = 10; - [CTPersistantField] public float dogfightOffsetY = 4; + [CTPersistantField] public float dogfightDistance = 30f; + [CTPersistantField] public float dogfightOffsetX = 10f; + [CTPersistantField] public float dogfightOffsetY = 4f; float dogfightMaxOffset = 50; [CTPersistantField] public float dogfightLerp = 0.2f; + [CTPersistantField] public float dogfightRoll = 0f; + Quaternion dogfightCameraRoll = Quaternion.identity; + Vector3 dogfightCameraRollUp = Vector3.up; [CTPersistantField] public float autoZoomMargin = 20; List loadedVessels; bool showingVesselList = false; @@ -357,7 +360,7 @@ void FixedUpdate() if (!FlightGlobals.ready) return; flightCamera.transform.position -= FloatingOrigin.Offset; // This fixed the floating origin shifts. (Vessel positions are updated by KSP automatically, but not other position vectors.) - // I am uncertain whether there are any other Kraken velocity corrections that need to be applied. + // I am uncertain whether there are any other Kraken velocity corrections that need to be applied. if (DEBUG && (FloatingOrigin.fetch.offset.sqrMagnitude > 0.2f || Krakensbane.GetLastCorrection().sqrMagnitude > 100f)) { @@ -421,6 +424,7 @@ void LateUpdate() // Something else keeps trying to steal the camera after the vessel has died, so we need to keep overriding it. flightCamera.SetTargetNone(); deathCam.transform.position += deathCamVelocity * Time.deltaTime; + deathCamVelocity *= 0.95f; flightCamera.transform.parent = deathCam.transform; flightCamera.DeactivateUpdate(); flightCamera.transform.localPosition = Vector3.zero; @@ -573,15 +577,27 @@ void UpdateDogfightCamera() } } - Vector3 offsetDirection = Vector3.Cross(cameraUp, dogfightLastTargetPosition - vessel.CoM).normalized; - Vector3 camPos = vessel.CoM + ((vessel.CoM - dogfightLastTargetPosition).normalized * dogfightDistance) + (dogfightOffsetX * offsetDirection) + (dogfightOffsetY * cameraUp); + //roll + if (dogfightRoll > 0) + { + var vesselRollTarget = Quaternion.RotateTowards(Quaternion.identity, Quaternion.FromToRotation(cameraUp, -vessel.ReferenceTransform.forward), dogfightRoll * Vector3.Angle(cameraUp, -vessel.ReferenceTransform.forward)); + dogfightCameraRoll = Quaternion.Lerp(dogfightCameraRoll, vesselRollTarget, dogfightLerp); + dogfightCameraRollUp = dogfightCameraRoll * cameraUp; + } + else + { + dogfightCameraRollUp = cameraUp; + } + + Vector3 offsetDirection = Vector3.Cross(dogfightCameraRollUp, dogfightLastTargetPosition - vessel.CoM).normalized; + Vector3 camPos = vessel.CoM + ((vessel.CoM - dogfightLastTargetPosition).normalized * dogfightDistance) + (dogfightOffsetX * offsetDirection) + (dogfightOffsetY * dogfightCameraRollUp); Vector3 localCamPos = cameraParent.transform.InverseTransformPoint(camPos); flightCamera.transform.localPosition = Vector3.Lerp(flightCamera.transform.localPosition, localCamPos, dogfightLerp); //rotation - Quaternion vesselLook = Quaternion.LookRotation(vessel.CoM - flightCamera.transform.position, cameraUp); - Quaternion targetLook = Quaternion.LookRotation(dogfightLastTargetPosition - flightCamera.transform.position, cameraUp); + Quaternion vesselLook = Quaternion.LookRotation(vessel.CoM - flightCamera.transform.position, dogfightCameraRollUp); + Quaternion targetLook = Quaternion.LookRotation(dogfightLastTargetPosition - flightCamera.transform.position, dogfightCameraRollUp); Quaternion camRot = Quaternion.Lerp(vesselLook, targetLook, 0.5f); flightCamera.transform.rotation = Quaternion.Lerp(flightCamera.transform.rotation, camRot, dogfightLerp); @@ -1950,7 +1966,11 @@ void GuiWindow(int windowID) GUI.Label(new Rect(leftIndent, contentTop + (line * entryHeight), 30, entryHeight), "Lerp: "); dogfightLerp = (int)GUI.HorizontalSlider(new Rect(leftIndent + 30, contentTop + (line * entryHeight) + 6, contentWidth - 60, entryHeight), dogfightLerp * 100f, 1f, 50f) / 100f; GUI.Label(new Rect(leftIndent + contentWidth - 25, contentTop + (line * entryHeight), 25, entryHeight), dogfightLerp.ToString("0.00")); - line += 1f; + line++; + GUI.Label(new Rect(leftIndent, contentTop + (line * entryHeight), 30, entryHeight), "Roll: "); + dogfightRoll = (int)GUI.HorizontalSlider(new Rect(leftIndent + 30, contentTop + (line * entryHeight) + 6, contentWidth - 60, entryHeight), dogfightRoll * 20f, 0f, 20f) / 20f; + GUI.Label(new Rect(leftIndent + contentWidth - 25, contentTop + (line * entryHeight), 25, entryHeight), dogfightRoll.ToString("0.00")); + line++; } else if (toolMode == ToolModes.Pathing) { From bf50d485e673fd0a5ac81e6c23fd872bab82238c Mon Sep 17 00:00:00 2001 From: Brett Ryland Date: Tue, 16 Mar 2021 15:33:09 +0100 Subject: [PATCH 10/15] Update changelog and bump version number. --- .../GameData/CameraTools/CameraTools.version | 14 +++++++------- .../GameData/CameraTools/Changelog.txt | 9 +++++++++ 2 files changed, 16 insertions(+), 7 deletions(-) diff --git a/CameraTools/Distribution/GameData/CameraTools/CameraTools.version b/CameraTools/Distribution/GameData/CameraTools/CameraTools.version index 13ea1933..838003bf 100644 --- a/CameraTools/Distribution/GameData/CameraTools/CameraTools.version +++ b/CameraTools/Distribution/GameData/CameraTools/CameraTools.version @@ -1,18 +1,18 @@ { "NAME": "CameraTools", - "URL": "https://raw.githubusercontent.com/jrodrigv/CameraTools/master/CameraTools/Distribution/GameData/CameraTools/CameraTools.version", - "DOWNLOAD": "https://github.com/jrodrigv/CameraTools/releases/tag/v1.14.0", - "CHANGE_LOG_URL": "https://github.com/jrodrigv/CameraTools/blob/master/CameraTools/Distribution/GameData/CameraTools/Changelog.txt", + "URL": "https://raw.githubusercontent.com/BrettRyland/CameraTools/master/CameraTools/Distribution/GameData/CameraTools/CameraTools.version", + "DOWNLOAD": "https://github.com/BrettRyland/CameraTools", + "CHANGE_LOG_URL": "https://github.com/BrettRyland/CameraTools/blob/master/CameraTools/Distribution/GameData/CameraTools/Changelog.txt", "VERSION": { "MAJOR": 1, - "MINOR": 14, + "MINOR": 15, "PATCH": 0, "BUILD": 0 }, "KSP_VERSION": { "MAJOR": 1, - "MINOR": 9, - "PATCH": 0 + "MINOR": 11, + "PATCH": 1 }, "KSP_VERSION_MIN": { "MAJOR": 1, @@ -21,7 +21,7 @@ }, "KSP_VERSION_MAX": { "MAJOR": 1, - "MINOR": 9, + "MINOR": 11, "PATCH": 99 } } diff --git a/CameraTools/Distribution/GameData/CameraTools/Changelog.txt b/CameraTools/Distribution/GameData/CameraTools/Changelog.txt index 60b71ed2..93b892ae 100644 --- a/CameraTools/Distribution/GameData/CameraTools/Changelog.txt +++ b/CameraTools/Distribution/GameData/CameraTools/Changelog.txt @@ -1,3 +1,12 @@ +v1.15.0 +- A bunch of bugfixes. +- Save settings properly. +- Death camera: when in dogfight mode, temporarily follow the explosion when the followed plane gets destroyed. +- Adjustable lerp (interpolation) rate for dogfight mode. +- Adjustable roll amount (based on the followed craft) for dogfight mode. +- Smoother transitions into dogfight mode. +- Auto-enable for BDArmory. + v1.14.0 - Compatibility with KSP 1.9.x From 7a067d70c71b00e052ebc7825898a2eb3d7f9c47 Mon Sep 17 00:00:00 2001 From: Brett Ryland Date: Thu, 25 Mar 2021 10:15:49 +0100 Subject: [PATCH 11/15] Fix missing config file load/save bug. --- CameraTools/CTPersistantFIeld.cs | 27 +++++++++++++++++++-------- CameraTools/CamTools.cs | 1 + 2 files changed, 20 insertions(+), 8 deletions(-) diff --git a/CameraTools/CTPersistantFIeld.cs b/CameraTools/CTPersistantFIeld.cs index f2bdbd74..53a01501 100644 --- a/CameraTools/CTPersistantFIeld.cs +++ b/CameraTools/CTPersistantFIeld.cs @@ -12,6 +12,12 @@ public CTPersistantField() { } public static void Save() { ConfigNode fileNode = ConfigNode.Load(settingsURL); + if (fileNode == null) + fileNode = new ConfigNode(); + + if (!fileNode.HasNode("CToolsSettings")) + fileNode.AddNode("CToolsSettings"); + ConfigNode settings = fileNode.GetNode("CToolsSettings"); foreach (var field in typeof(CamTools).GetFields()) @@ -28,19 +34,24 @@ public static void Save() public static void Load() { ConfigNode fileNode = ConfigNode.Load(settingsURL); - ConfigNode settings = fileNode.GetNode("CToolsSettings"); + if (fileNode == null) return; // No config file. - foreach (var field in typeof(CamTools).GetFields()) + if (fileNode.HasNode("CToolsSettings")) { - if (field == null) continue; - if (!field.IsDefined(typeof(CTPersistantField), false)) continue; + ConfigNode settings = fileNode.GetNode("CToolsSettings"); - if (settings.HasValue(field.Name)) + foreach (var field in typeof(CamTools).GetFields()) { - object parsedValue = ParseValue(field.FieldType, settings.GetValue(field.Name)); - if (parsedValue != null) + if (field == null) continue; + if (!field.IsDefined(typeof(CTPersistantField), false)) continue; + + if (settings.HasValue(field.Name)) { - field.SetValue(CamTools.fetch, parsedValue); + object parsedValue = ParseValue(field.FieldType, settings.GetValue(field.Name)); + if (parsedValue != null) + { + field.SetValue(CamTools.fetch, parsedValue); + } } } } diff --git a/CameraTools/CamTools.cs b/CameraTools/CamTools.cs index 79cf39c3..ddbddd4c 100644 --- a/CameraTools/CamTools.cs +++ b/CameraTools/CamTools.cs @@ -286,6 +286,7 @@ void OnDestroy() { GameEvents.onVesselChange.Remove(SwitchToVessel); GameEvents.onVesselWillDestroy.Remove(CurrentVesselWillDestroy); + Save(); } void Update() From 7449ca255d883a13100f085bab82ee92eafe5f6b Mon Sep 17 00:00:00 2001 From: Brett Ryland Date: Thu, 25 Mar 2021 10:17:36 +0100 Subject: [PATCH 12/15] Update changelog and version number. --- .../Distribution/GameData/CameraTools/CameraTools.version | 4 ++-- CameraTools/Distribution/GameData/CameraTools/Changelog.txt | 5 +++++ CameraTools/Properties/AssemblyInfo.cs | 4 ++-- 3 files changed, 9 insertions(+), 4 deletions(-) diff --git a/CameraTools/Distribution/GameData/CameraTools/CameraTools.version b/CameraTools/Distribution/GameData/CameraTools/CameraTools.version index 838003bf..10e3c750 100644 --- a/CameraTools/Distribution/GameData/CameraTools/CameraTools.version +++ b/CameraTools/Distribution/GameData/CameraTools/CameraTools.version @@ -6,13 +6,13 @@ "VERSION": { "MAJOR": 1, "MINOR": 15, - "PATCH": 0, + "PATCH": 1, "BUILD": 0 }, "KSP_VERSION": { "MAJOR": 1, "MINOR": 11, - "PATCH": 1 + "PATCH": 0 }, "KSP_VERSION_MIN": { "MAJOR": 1, diff --git a/CameraTools/Distribution/GameData/CameraTools/Changelog.txt b/CameraTools/Distribution/GameData/CameraTools/Changelog.txt index 93b892ae..ea2e3d69 100644 --- a/CameraTools/Distribution/GameData/CameraTools/Changelog.txt +++ b/CameraTools/Distribution/GameData/CameraTools/Changelog.txt @@ -1,3 +1,8 @@ +v1.15.1 +Bugfixes: + - Fix missing config file load/save bug. + - Update all version numbers properly. + v1.15.0 - A bunch of bugfixes. - Save settings properly. diff --git a/CameraTools/Properties/AssemblyInfo.cs b/CameraTools/Properties/AssemblyInfo.cs index 579bef46..d09734e7 100644 --- a/CameraTools/Properties/AssemblyInfo.cs +++ b/CameraTools/Properties/AssemblyInfo.cs @@ -28,5 +28,5 @@ // Build Number // Revision // -[assembly: AssemblyVersion( "1.14.0" )] -[assembly: AssemblyFileVersion( "1.14.0.0" )] +[assembly: AssemblyVersion( "1.15.1" )] +[assembly: AssemblyFileVersion( "1.15.1.0" )] From 28398c9905271ca15563b3c022dba1b89a497641 Mon Sep 17 00:00:00 2001 From: Brett Ryland Date: Thu, 1 Apr 2021 23:41:25 +0200 Subject: [PATCH 13/15] Don't touch camera when we're not in control of it. Use TimeWarp instead of Time for velocity calculations. Allow switching into and out of IVA and Map modes without breaking. --- CameraTools/CamTools.cs | 139 +++++++++++++----- CameraTools/CameraTools.csproj | 10 +- .../GameData/CameraTools/CameraTools.version | 2 +- .../GameData/CameraTools/Changelog.txt | 8 +- CameraTools/Properties/AssemblyInfo.cs | 4 +- CameraTools/VesselExtensions.cs | 47 ++++++ 6 files changed, 162 insertions(+), 48 deletions(-) create mode 100644 CameraTools/VesselExtensions.cs diff --git a/CameraTools/CamTools.cs b/CameraTools/CamTools.cs index ddbddd4c..57377b34 100644 --- a/CameraTools/CamTools.cs +++ b/CameraTools/CamTools.cs @@ -1,10 +1,9 @@ -using System; -using System.Collections; -using System.Collections.Generic; -using UnityEngine; -using System.Reflection; using KSP.UI.Screens; +using System.Collections.Generic; using System.Linq; +using System.Reflection; +using System; +using UnityEngine; namespace CameraTools { @@ -43,6 +42,7 @@ public class CamTools : MonoBehaviour #region Input [CTPersistantField] public string cameraKey = "home"; [CTPersistantField] public string revertKey = "end"; + [CTPersistantField] public bool enableKeypad = false; string fmUpKey = "[7]"; string fmDownKey = "[1]"; string fmForwardKey = "[8]"; @@ -94,6 +94,7 @@ public class CamTools : MonoBehaviour bool hasSavedRotation = false; Quaternion savedRotation; bool temporaryRevert = false; + bool wasActiveBeforeModeChange = false; Vector3 lastTargetPosition = Vector3.zero; bool hasTarget = false; bool hasDied = false; @@ -177,7 +178,6 @@ public class CamTools : MonoBehaviour string guiKeyZoomSpeed = "1"; float zoomFactor = 1; [CTPersistantField] public float zoomExp = 1; - [CTPersistantField] public bool enableKeypad = false; [CTPersistantField] public float maxRelV = 2500; #endregion @@ -270,6 +270,7 @@ void Start() bdWmUnderAttackField = GetUnderAttackField(); GameEvents.onVesselChange.Add(SwitchToVessel); GameEvents.onVesselWillDestroy.Add(CurrentVesselWillDestroy); + GameEvents.OnCameraChange.Add(CameraModeChange); cStyle = new GUIStyle(HighLogic.Skin.label); cStyle.fontStyle = UnityEngine.FontStyle.Bold; @@ -286,9 +287,31 @@ void OnDestroy() { GameEvents.onVesselChange.Remove(SwitchToVessel); GameEvents.onVesselWillDestroy.Remove(CurrentVesselWillDestroy); + GameEvents.OnCameraChange.Remove(CameraModeChange); Save(); } + void CameraModeChange(CameraManager.CameraMode mode) + { + if (mode != CameraManager.CameraMode.Flight && CameraManager.Instance.previousCameraMode == CameraManager.CameraMode.Flight) + { + wasActiveBeforeModeChange = cameraToolActive; + cameraToolActive = false; + } + else if (mode == CameraManager.CameraMode.Flight) + { + if (wasActiveBeforeModeChange && !autoEnableOverriden) + { + Debug.Log("[CameraTools]: Camera mode changed to " + mode + ", reactivating " + toolMode + "."); + cameraToolActive = true; + RevertCamera(); + flightCamera.transform.position = deathCam.transform.position; + flightCamera.transform.rotation = deathCam.transform.rotation; + cameraActivate(); + } + } + } + void Update() { if (!isRecordingInput) @@ -359,15 +382,24 @@ void FixedUpdate() { // Note: we have to perform the camera adjustments during FixedUpdate to avoid jitter in the Lerps in the camera position and rotation due to inconsistent numbers of physics updates per frame. if (!FlightGlobals.ready) return; + if (CameraManager.Instance.currentCameraMode != CameraManager.CameraMode.Flight) return; - flightCamera.transform.position -= FloatingOrigin.Offset; // This fixed the floating origin shifts. (Vessel positions are updated by KSP automatically, but not other position vectors.) - // I am uncertain whether there are any other Kraken velocity corrections that need to be applied. - - if (DEBUG && (FloatingOrigin.fetch.offset.sqrMagnitude > 0.2f || Krakensbane.GetLastCorrection().sqrMagnitude > 100f)) + if (cameraToolActive) { - var message = "FloatingOrigin offset Δ: " + FloatingOrigin.Offset.magnitude.ToString("0.00") + ", Krakensbane velocity Δ: " + Krakensbane.GetLastCorrection().magnitude.ToString("0.0") + ", " + (dogfightTarget != null) + ", " + dogfightLastTarget + ", " + dogfightVelocityChase + ", Δ: " + (vessel.CoM - flightCamera.transform.position).magnitude.ToString("0.00") + ", Δ': " + lastCamVesselΔ.magnitude.ToString("0.00"); - Debug.Log("[CameraTools]: " + message); - DebugLog(message); + if ((!hasDied && flightCamera.transform.parent != cameraParent.transform) || (hasDied && flightCamera.transform.parent != deathCam.transform)) + { + message = "Someone has stolen the camera parent! Abort!"; + Debug.Log("[CameraTools]: " + message); DebugLog(message); + cameraToolActive = false; + RevertCamera(); + } + + // if (DEBUG && (FloatingOrigin.fetch.offset.sqrMagnitude > 10f || Krakensbane.GetLastCorrection().sqrMagnitude > 100f)) + // { + // var message = "FloatingOrigin offset Δ: " + FloatingOrigin.Offset.magnitude.ToString("0.00") + ", Krakensbane velocity Δ: " + Krakensbane.GetLastCorrection().magnitude.ToString("0.0") + ", " + (dogfightTarget != null) + ", " + dogfightLastTarget + ", " + dogfightVelocityChase + ", Δ: " + (vessel.CoM - flightCamera.transform.position).magnitude.ToString("0.00") + ", Δ': " + lastCamVesselΔ.magnitude.ToString("0.00"); + // Debug.Log("[CameraTools]: " + message); + // DebugLog(message); + // } } if (hasDied && cameraToolActive) return; // Do nothing until we have an active vessel. @@ -414,7 +446,7 @@ void FixedUpdate() zoomFactor = Mathf.Exp(zoomExp) / Mathf.Exp(1); } } - lastCamVesselΔ = vessel.CoM - flightCamera.transform.position; + if (DEBUG) lastCamVesselΔ = vessel.CoM - flightCamera.transform.position; } void LateUpdate() @@ -422,21 +454,33 @@ void LateUpdate() UpdateCameraShake(); // Update camera shake each frame so that it dies down. if (hasDied && cameraToolActive) { - // Something else keeps trying to steal the camera after the vessel has died, so we need to keep overriding it. - flightCamera.SetTargetNone(); - deathCam.transform.position += deathCamVelocity * Time.deltaTime; + deathCam.transform.position += deathCamVelocity * TimeWarp.deltaTime; deathCamVelocity *= 0.95f; - flightCamera.transform.parent = deathCam.transform; - flightCamera.DeactivateUpdate(); - flightCamera.transform.localPosition = Vector3.zero; - flightCamera.transform.localRotation = Quaternion.identity; + if (flightCamera.transform.parent != deathCam.transform) // Something else keeps trying to steal the camera after the vessel has died, so we need to keep overriding it. + { + flightCamera.SetTargetNone(); + flightCamera.transform.parent = deathCam.transform; + flightCamera.DeactivateUpdate(); + flightCamera.transform.localPosition = Vector3.zero; + flightCamera.transform.localRotation = Quaternion.identity; + } } else if (!vesselSwitched) { - deathCam.transform.position = flightCamera.transform.position; - deathCam.transform.rotation = flightCamera.transform.rotation; + switch (CameraManager.Instance.currentCameraMode) + { + case CameraManager.CameraMode.IVA: + var IVACamera = CameraManager.GetCurrentCamera(); + deathCam.transform.position = IVACamera.transform.position; + deathCam.transform.rotation = IVACamera.transform.rotation; + break; + case CameraManager.CameraMode.Flight: + deathCam.transform.position = flightCamera.transform.position; + deathCam.transform.rotation = flightCamera.transform.rotation; + break; + } } - if (vesselSwitched) // We perform this here instead of waiting for the next frame to avoid a flicker of the camera being switched. + if (cameraToolActive && vesselSwitched) // We perform this here instead of waiting for the next frame to avoid a flicker of the camera being switched. { vesselSwitched = false; switch (toolMode) @@ -517,7 +561,7 @@ void StartDogfightCamera() hasDied = false; vessel = FlightGlobals.ActiveVessel; - cameraUp = -FlightGlobals.getGeeForceAtPosition(vessel.CoM).normalized; + cameraUp = -FlightGlobals.getGeeForceAtPosition(vessel.CoM - FloatingOrigin.Offset).normalized; if (flightCamera.transform.parent != cameraParent.transform) { @@ -526,7 +570,7 @@ void StartDogfightCamera() flightCamera.SetTargetNone(); flightCamera.transform.parent = cameraParent.transform; flightCamera.DeactivateUpdate(); - cameraParent.transform.position = vessel.CoM; // Then adjust the flightCamera for the new parent. + cameraParent.transform.position = vessel.CoM - FloatingOrigin.Offset; // Then adjust the flightCamera for the new parent. flightCamera.transform.localPosition = cameraParent.transform.InverseTransformPoint(deathCam.transform.position); flightCamera.transform.localRotation = Quaternion.identity; } @@ -543,6 +587,8 @@ void StartDogfightCamera() AddAtmoAudioControllers(false); } + Vector3 debugCameraPos = Vector3.zero; + Quaternion debugCameraRot = Quaternion.identity; void UpdateDogfightCamera() { if (!vessel || (!dogfightTarget && !dogfightLastTarget && !dogfightVelocityChase)) @@ -552,29 +598,30 @@ void UpdateDogfightCamera() return; } + var vesselCoM = vessel.CoM - FloatingOrigin.Offset; // vessel.CoM hasn't been updated for floating origin shifts yet. if (dogfightTarget) { dogfightLastTarget = true; - dogfightLastTargetPosition = dogfightTarget.CoM; + dogfightLastTargetPosition = dogfightTarget.CoM - FloatingOrigin.Offset; dogfightLastTargetVelocity = dogfightTarget.rb_velocity; } else if (dogfightLastTarget) { dogfightLastTargetVelocity += Krakensbane.GetLastCorrection(); - dogfightLastTargetPosition += dogfightLastTargetVelocity * Time.fixedDeltaTime - FloatingOrigin.Offset; + dogfightLastTargetPosition += dogfightLastTargetVelocity * TimeWarp.fixedDeltaTime - FloatingOrigin.Offset; } - cameraParent.transform.position = vessel.CoM; + cameraParent.transform.position = vesselCoM; if (dogfightVelocityChase) { - if (vessel.srfSpeed > 1) + if (vessel.speed > 1) { - dogfightLastTargetPosition = vessel.CoM + (vessel.srf_velocity.normalized * 5000); + dogfightLastTargetPosition = vesselCoM + vessel.Velocity().normalized * 5000; } else { - dogfightLastTargetPosition = vessel.CoM + (vessel.ReferenceTransform.up * 5000); + dogfightLastTargetPosition = vesselCoM + vessel.ReferenceTransform.up * 5000; } } @@ -590,14 +637,23 @@ void UpdateDogfightCamera() dogfightCameraRollUp = cameraUp; } - Vector3 offsetDirection = Vector3.Cross(dogfightCameraRollUp, dogfightLastTargetPosition - vessel.CoM).normalized; - Vector3 camPos = vessel.CoM + ((vessel.CoM - dogfightLastTargetPosition).normalized * dogfightDistance) + (dogfightOffsetX * offsetDirection) + (dogfightOffsetY * dogfightCameraRollUp); + Vector3 offsetDirection = Vector3.Cross(dogfightCameraRollUp, dogfightLastTargetPosition - vesselCoM).normalized; + Vector3 camPos = vesselCoM + ((vesselCoM - dogfightLastTargetPosition).normalized * dogfightDistance) + (dogfightOffsetX * offsetDirection) + (dogfightOffsetY * dogfightCameraRollUp); Vector3 localCamPos = cameraParent.transform.InverseTransformPoint(camPos); flightCamera.transform.localPosition = Vector3.Lerp(flightCamera.transform.localPosition, localCamPos, dogfightLerp); + // if (DEBUG) + // { + // debugMessages.Clear(); + // DebugLog("localCamPos: " + localCamPos.ToString("0.0") + ", " + flightCamera.transform.localPosition.ToString("0.0")); + // DebugLog("offset from vessel CoM: " + (flightCamera.transform.position - vesselCoM).ToString("0.0")); + // DebugLog("camPos: " + camPos.ToString("0.0") + ", floating origin offset: " + FloatingOrigin.Offset.ToString("0.0")); + // DebugLog("camPos - vesselCoM: " + (camPos - vesselCoM).ToString("0.0")); + // DebugLog("vel: " + vessel.Velocity().ToString("0.0") + ", Kraken velocity: " + Krakensbane.GetFrameVelocity().ToString("0.0") + ", ΔKv: " + Krakensbane.GetLastCorrection().ToString("0.0")); + // } //rotation - Quaternion vesselLook = Quaternion.LookRotation(vessel.CoM - flightCamera.transform.position, dogfightCameraRollUp); + Quaternion vesselLook = Quaternion.LookRotation(vesselCoM - flightCamera.transform.position, dogfightCameraRollUp); Quaternion targetLook = Quaternion.LookRotation(dogfightLastTargetPosition - flightCamera.transform.position, dogfightCameraRollUp); Quaternion camRot = Quaternion.Lerp(vesselLook, targetLook, 0.5f); flightCamera.transform.rotation = Quaternion.Lerp(flightCamera.transform.rotation, camRot, dogfightLerp); @@ -612,7 +668,7 @@ void UpdateDogfightCamera() } else { - float angle = Vector3.Angle(dogfightLastTargetPosition - flightCamera.transform.position, vessel.CoM - flightCamera.transform.position); + float angle = Vector3.Angle(dogfightLastTargetPosition - flightCamera.transform.position, vesselCoM - flightCamera.transform.position); targetFoV = Mathf.Clamp(angle + autoZoomMargin, 0.1f, 60f); } manualFOV = targetFoV; @@ -918,11 +974,11 @@ void UpdateStationaryCamera() if (referenceMode == ReferenceModes.Surface) { - flightCamera.transform.position -= Time.fixedDeltaTime * Mathf.Clamp((float)vessel.srf_velocity.magnitude, 0, maxRelV) * vessel.srf_velocity.normalized; + flightCamera.transform.position -= TimeWarp.fixedDeltaTime * Mathf.Clamp((float)vessel.srf_velocity.magnitude, 0, maxRelV) * vessel.srf_velocity.normalized; } else if (referenceMode == ReferenceModes.Orbit) { - flightCamera.transform.position -= Time.fixedDeltaTime * Mathf.Clamp((float)vessel.obt_velocity.magnitude, 0, maxRelV) * vessel.obt_velocity.normalized; + flightCamera.transform.position -= TimeWarp.fixedDeltaTime * Mathf.Clamp((float)vessel.obt_velocity.magnitude, 0, maxRelV) * vessel.obt_velocity.normalized; } else if (referenceMode == ReferenceModes.InitialVelocity) { @@ -935,7 +991,7 @@ void UpdateStationaryCamera() { camVelocity = (initialVelocity - vessel.srf_velocity); } - flightCamera.transform.position += camVelocity * Time.fixedDeltaTime; + flightCamera.transform.position += camVelocity * TimeWarp.fixedDeltaTime; } } @@ -1501,6 +1557,11 @@ void SwitchToVessel(Vessel v) DebugLog(message); } vessel = v; + // Switch to a usable camera mode if necessary. + if (CameraManager.Instance.currentCameraMode == CameraManager.CameraMode.IVA) + { + CameraManager.Instance.SetCameraFlight(); + } CheckForBDAI(v); // reactivate camera if it was reverted diff --git a/CameraTools/CameraTools.csproj b/CameraTools/CameraTools.csproj index 31bdcabc..53d7eb32 100644 --- a/CameraTools/CameraTools.csproj +++ b/CameraTools/CameraTools.csproj @@ -62,18 +62,19 @@ - - - - + + + + + @@ -316,7 +317,6 @@ -