diff --git a/CameraTools/CTAtmosphericAudioController.cs b/CameraTools/CTAtmosphericAudioController.cs index 70fd86dd..658710c8 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 || !vessel.loaded || !vessel.isActiveAndEnabled) { 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); } } 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() 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 b7ba2429..00235cca 100644 --- a/CameraTools/CamTools.cs +++ b/CameraTools/CamTools.cs @@ -1,9 +1,11 @@ -using System; -using System.Collections; +using KSP.UI.Screens; using System.Collections.Generic; -using UnityEngine; +using System.Linq; +using System.Text; using System.Reflection; -using KSP.UI.Screens; +using System; +using UnityEngine; + namespace CameraTools { [KSPAddon(KSPAddon.Startup.Flight, false)] @@ -34,10 +36,16 @@ public class CamTools : MonoBehaviour Type bdVesselSpawnerType = null; object bdVesselSpawnerInstance = null; FieldInfo bdVesselsSpawningField = null; + [CTPersistantField] public bool DEBUG = false; + [CTPersistantField] public bool DEBUG2 = false; + + string message; + bool vesselSwitched = false; #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]"; @@ -74,6 +82,15 @@ 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; + List> debug2Messages = new List>(); + void Debug2Log(string m) => debug2Messages.Add(new Tuple(Time.time, m)); + #endregion #region Revert/Reset @@ -82,7 +99,7 @@ public class CamTools : MonoBehaviour bool hasSavedRotation = false; Quaternion savedRotation; bool temporaryRevert = false; - Vector3 lastVesselPosition = Vector3.zero; + bool wasActiveBeforeModeChange = false; Vector3 lastTargetPosition = Vector3.zero; bool hasTarget = false; bool hasDied = false; @@ -95,6 +112,7 @@ public class CamTools : MonoBehaviour //retaining position and rotation after vessel destruction GameObject deathCam; Vector3 deathCamVelocity; + Vector3d floatingKrakenAdjustment = Vector3d.zero; // Position adjustment for Floating origin and Krakensbane velocity changes. Vector3 resetPositionFix;//fixes position movement after setting and resetting camera public delegate void ResetCTools(); public static event ResetCTools OnResetCTools; @@ -124,11 +142,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; @@ -159,11 +180,12 @@ public class CamTools : MonoBehaviour Vector3 manualPosition = Vector3.zero; [CTPersistantField] public float freeMoveSpeed = 10; string guiFreeMoveSpeed = "10"; + float freeMoveSpeedRaw; [CTPersistantField] public float keyZoomSpeed = 1; string guiKeyZoomSpeed = "1"; + float zoomSpeedRaw; float zoomFactor = 1; [CTPersistantField] public float zoomExp = 1; - [CTPersistantField] public bool enableKeypad = false; [CTPersistantField] public float maxRelV = 2500; #endregion @@ -233,7 +255,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"); @@ -257,12 +278,69 @@ void Start() bdWmUnderAttackField = GetUnderAttackField(); GameEvents.onVesselChange.Add(SwitchToVessel); GameEvents.onVesselWillDestroy.Add(CurrentVesselWillDestroy); + GameEvents.OnCameraChange.Add(CameraModeChange); + TimingManager.FixedUpdateAdd(TimingManager.TimingStage.BetterLateThanNever, KrakensbaneCorrection); // Perform our Krakensbane corrections after KSP's floating origin/Krakensbane corrections have run. + + cStyle = new GUIStyle(HighLogic.Skin.label); + cStyle.fontStyle = UnityEngine.FontStyle.Bold; + cStyle.fontSize = 18; + 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); + + freeMoveSpeedRaw = Mathf.Log10(freeMoveSpeed); + zoomSpeedRaw = Mathf.Log10(keyZoomSpeed); } void OnDestroy() { GameEvents.onVesselChange.Remove(SwitchToVessel); GameEvents.onVesselWillDestroy.Remove(CurrentVesselWillDestroy); + GameEvents.OnCameraChange.Remove(CameraModeChange); + TimingManager.FixedUpdateRemove(TimingManager.TimingStage.FlightIntegrator, KrakensbaneCorrection); + 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 KrakensbaneCorrection() + { + if (cameraToolActive) + { + // Compensate for floating origin and Krakensbane velocity shifts. + // FIXME the floatingKrakenAdjustment works for almost all warp cases. However, there is a region for each body (e.g., for Kerbin it's 70km-100km) where the Krakensbane velocity frame is different than what it ought to be when in LOW warp mode, which causes an offset. + floatingKrakenAdjustment = TimeWarp.WarpMode == TimeWarp.Modes.LOW ? (vessel.Velocity() - Krakensbane.GetFrameVelocity()) * TimeWarp.fixedDeltaTime - FloatingOrigin.Offset : -FloatingOrigin.Offset; + cameraParent.transform.position += floatingKrakenAdjustment; + switch (toolMode) + { + case ToolModes.DogfightCamera: + dogfightLastTargetPosition += floatingKrakenAdjustment; + break; + // FIXME Add in other tool mode corrections. + } + } } void Update() @@ -334,6 +412,19 @@ 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; + + if (cameraToolActive) + { + 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); + if (DEBUG) DebugLog(message); + cameraToolActive = false; + RevertCamera(); + } + } if (hasDied && cameraToolActive) return; // Do nothing until we have an active vessel. @@ -342,12 +433,7 @@ void FixedUpdate() vessel = FlightGlobals.ActiveVessel; } - if (vessel != null) - { - lastVesselPosition = vessel.transform.position; - } - - if (autoEnableForBDA && !autoEnableOverriden) + if (autoEnableForBDA && !autoEnableOverriden && (toolMode != ToolModes.Pathing || (selectedPathIndex >= 0 && currentPath.keyframeCount > 0))) { AutoEnableForBDA(); } @@ -360,6 +446,15 @@ void FixedUpdate() break; case ToolModes.DogfightCamera: UpdateDogfightCamera(); + if (dogfightTarget && dogfightTarget.isActiveVessel) + { + dogfightTarget = null; + if (cameraToolActive) + { + if (DEBUG) Debug.Log("[CameraTools]: Reverting because dogfightTarget is null"); + RevertCamera(); + } + } break; case ToolModes.Pathing: UpdatePathingCam(); @@ -375,19 +470,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() @@ -395,54 +477,84 @@ 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; - flightCamera.transform.parent = deathCam.transform; - flightCamera.DeactivateUpdate(); - flightCamera.transform.localPosition = Vector3.zero; - flightCamera.transform.localRotation = Quaternion.identity; + deathCam.transform.position += deathCamVelocity * TimeWarp.deltaTime;// + floatingKrakenAdjustment; + deathCamVelocity *= 0.95f; + 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 + 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 (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) + { + case ToolModes.DogfightCamera: + if (hasBDAI && useBDAutoTarget) + { + 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; + } + } + StartDogfightCamera(); + break; + case ToolModes.StationaryCamera: + StartStationaryCamera(); + break; + case ToolModes.Pathing: + StartPathingCam(); + PlayPathingCam(); + break; + } } } private void cameraActivate() { + if (DEBUG) { Debug.Log("[CameraTools]: Activating camera."); DebugLog("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 +568,7 @@ void StartDogfightCamera() Debug.Log("[CameraTools]: No active vessel."); return; } + if (DEBUG) { Debug.Log("[CameraTools]: Starting dogfight camera."); DebugLog("Starting dogfight camera"); } if (!dogfightTarget) { @@ -479,13 +592,17 @@ void StartDogfightCamera() 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) + { + 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 +620,7 @@ void UpdateDogfightCamera() { if (!vessel || (!dogfightTarget && !dogfightLastTarget && !dogfightVelocityChase)) { - Debug.Log("[CameraTools]: Reverting during UpdateDogfightCamera()"); + if (DEBUG) { Debug.Log("[CameraTools]: Reverting during UpdateDogfightCamera"); } RevertCamera(); return; } @@ -512,36 +629,66 @@ void UpdateDogfightCamera() { dogfightLastTarget = true; dogfightLastTargetPosition = dogfightTarget.CoM; - dogfightLastTargetVelocity = dogfightTarget.rb_velocity; + dogfightLastTargetVelocity = dogfightTarget.Velocity(); } else if (dogfightLastTarget) { - dogfightLastTargetPosition += dogfightLastTargetVelocity * Time.fixedDeltaTime; + dogfightLastTargetPosition += dogfightLastTargetVelocity * TimeWarp.fixedDeltaTime; } cameraParent.transform.position = vessel.CoM; if (dogfightVelocityChase) { - if (vessel.srfSpeed > 1) + if (vessel.Speed() > 1) { - dogfightLastTargetPosition = vessel.CoM + (vessel.srf_velocity.normalized * 5000); + dogfightLastTargetPosition = vessel.CoM + vessel.Velocity().normalized * 5000; } else { - dogfightLastTargetPosition = vessel.CoM + (vessel.ReferenceTransform.up * 5000); + dogfightLastTargetPosition = vessel.CoM + vessel.ReferenceTransform.up * 5000; } } - 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; // FIXME This is changing when in high warp mode. Also, check this when suborbital (not changing). + 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); + if (DEBUG2) + { + debug2Messages.Clear(); + Debug2Log("situation: " + vessel.situation); + Debug2Log("speed: " + vessel.Speed().ToString("0.0") + ", vel: " + vessel.Velocity().ToString("0.0")); + Debug2Log("chase: " + dogfightVelocityChase + ", floatKrakenAdjust: " + floatingKrakenAdjustment.ToString("0.0")); + Debug2Log("offsetDirection: " + offsetDirection.ToString("0.00")); + Debug2Log("target offset: " + ((vessel.CoM - dogfightLastTargetPosition).normalized * dogfightDistance).ToString("0.0")); + Debug2Log("xOff: " + (dogfightOffsetX * offsetDirection).ToString("0.0")); + Debug2Log("yOff: " + (dogfightOffsetY * dogfightCameraRollUp).ToString("0.0")); + Debug2Log("camPos: " + camPos.ToString("0.0") + ", floating origin offset: " + FloatingOrigin.Offset.ToString("0.0")); + Debug2Log("camPos - vessel.CoM: " + (camPos - vessel.CoM).ToString("0.0")); + Debug2Log("localCamPos: " + localCamPos.ToString("0.0") + ", " + flightCamera.transform.localPosition.ToString("0.0")); + Debug2Log("offset from vessel CoM: " + (flightCamera.transform.position - vessel.CoM).ToString("0.0")); + Debug2Log("vel: " + vessel.Velocity().ToString("0.0") + ", Kraken velocity: " + Krakensbane.GetFrameVelocity().ToString("0.0") + ", ΔKv: " + Krakensbane.GetLastCorrection().ToString("0.0")); + Debug2Log("warp mode: " + TimeWarp.WarpMode + ", warp factor: " + TimeWarp.CurrentRate); + Debug2Log("camParentPos - flightCamPos: " + (cameraParent.transform.position - flightCamera.transform.position).ToString("0.0")); + } //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); @@ -662,6 +809,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(); @@ -670,7 +823,6 @@ void UpdateDogfightCamera() if (dogfightTarget != dogfightPrevTarget) { - //RevertCamera(); StartDogfightCamera(); } } @@ -681,6 +833,12 @@ void StartStationaryCamera() { if (FlightGlobals.ActiveVessel != null) { + if (DEBUG) + { + message = "Starting stationary camera."; + Debug.Log("[CameraTools]: " + message); + DebugLog(message); + } hasDied = false; vessel = FlightGlobals.ActiveVessel; cameraUp = -FlightGlobals.getGeeForceAtPosition(vessel.GetWorldPos3D()).normalized; @@ -689,13 +847,17 @@ 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) + { + 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 +958,6 @@ void StartStationaryCamera() SetDoppler(true); AddAtmoAudioControllers(true); - } else { @@ -847,11 +1008,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) { @@ -864,7 +1025,7 @@ void UpdateStationaryCamera() { camVelocity = (initialVelocity - vessel.srf_velocity); } - flightCamera.transform.position += camVelocity * Time.fixedDeltaTime; + flightCamera.transform.position += camVelocity * TimeWarp.fixedDeltaTime; } } @@ -981,6 +1142,19 @@ void UpdateStationaryCamera() #region Pathing Camera void StartPathingCam() { + 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)) @@ -1198,14 +1372,22 @@ void ViewKeyframe(int index) void PlayPathingCam() { + if (DEBUG) + { + message = "Playing pathing camera."; + Debug.Log("[CameraTools]: " + message); + DebugLog(message); + } 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,7 +1579,23 @@ void ResetDoppler() #region Revert/Reset void SwitchToVessel(Vessel v) { + if (v == null) + { + RevertCamera(); + return; + } + if (DEBUG) + { + message = "Switching to vessel " + v.vesselName; + Debug.Log("[CameraTools]: " + message); + 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 @@ -1416,6 +1614,12 @@ void SwitchToVessel(Vessel v) 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; } } @@ -1456,31 +1660,18 @@ void SwitchToVessel(Vessel v) } } - if (toolMode == ToolModes.DogfightCamera) - { - StartCoroutine(ResetDogfightCamRoutine()); - } + vesselSwitched = true; } } - IEnumerator ResetDogfightCamRoutine() + public void RevertCamera() { - yield return new WaitForEndOfFrame(); - - RevertCamera(); - if (hasBDAI && useBDAutoTarget) + if (DEBUG) { - Vessel newAITarget = GetAITargetedVessel(); - if (newAITarget) - { - dogfightTarget = newAITarget; - } + message = "Reverting camera."; + Debug.Log("[CameraTools]: " + message); + DebugLog(message); } - StartDogfightCamera(); - } - - public void RevertCamera() - { posCounter = 0; if (cameraToolActive) @@ -1501,9 +1692,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 @@ -1584,6 +1778,27 @@ 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); + } + } + } + if (DEBUG2) + { + if (debug2Messages.Count > 0) + { + GUI.Label(new Rect(Screen.width - 650, 100, 600, 400), string.Join("\n", debug2Messages.Select(m => m.Item1.ToString("0.000") + " " + m.Item2))); + } + } } void GuiWindow(int windowID) @@ -1616,16 +1831,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++; @@ -1635,7 +1849,8 @@ void GuiWindow(int windowID) { GUI.Label(new Rect(leftIndent, contentTop + (line * entryHeight), contentWidth / 2, entryHeight), "Autozoom Margin: "); line++; - autoZoomMargin = (int)(GUI.HorizontalSlider(new Rect(leftIndent, contentTop + ((line) * entryHeight), contentWidth - 45, entryHeight), autoZoomMargin, 0, 50) * 2) / 2f; + autoZoomMargin = GUI.HorizontalSlider(new Rect(leftIndent, contentTop + ((line) * entryHeight), contentWidth - 45, entryHeight), autoZoomMargin, 0, 50); + if (!enableKeypad) autoZoomMargin = Mathf.RoundToInt(autoZoomMargin * 2f) / 2f; GUI.Label(new Rect(leftIndent + contentWidth - 40, contentTop + ((line - 0.15f) * entryHeight), 40, entryHeight), autoZoomMargin.ToString("0.0"), leftLabel); } else @@ -1844,24 +2059,31 @@ void GuiWindow(int windowID) line++; GUI.Label(new Rect(leftIndent, contentTop + (line * entryHeight), contentWidth / 2, entryHeight), "Distance: " + dogfightDistance.ToString("0.0")); line++; - dogfightDistance = (int)(GUI.HorizontalSlider(new Rect(leftIndent, contentTop + (line * entryHeight), contentWidth, entryHeight), dogfightDistance, 1, 100) * 2) / 2f; + dogfightDistance = GUI.HorizontalSlider(new Rect(leftIndent, contentTop + (line * entryHeight), contentWidth, entryHeight), dogfightDistance, 1, 100); + if (!enableKeypad) dogfightDistance = Mathf.RoundToInt(dogfightDistance * 2f) / 2f; line += 1.5f; GUI.Label(new Rect(leftIndent, contentTop + (line * entryHeight), contentWidth, entryHeight), "Offset:"); line++; GUI.Label(new Rect(leftIndent, contentTop + (line * entryHeight), 15, entryHeight), "X: "); - dogfightOffsetX = (int)(GUI.HorizontalSlider(new Rect(leftIndent + 15, contentTop + (line * entryHeight) + 6, contentWidth - 45, entryHeight), dogfightOffsetX, -dogfightMaxOffset, dogfightMaxOffset) * 2) / 2f; + dogfightOffsetX = GUI.HorizontalSlider(new Rect(leftIndent + 15, contentTop + (line * entryHeight) + 6, contentWidth - 45, entryHeight), dogfightOffsetX, -dogfightMaxOffset, dogfightMaxOffset); + if (!enableKeypad) dogfightOffsetX = Mathf.RoundToInt(dogfightOffsetX * 2f) / 2f; GUI.Label(new Rect(leftIndent + contentWidth - 25, contentTop + (line * entryHeight), 25, entryHeight), dogfightOffsetX.ToString("0.0")); line++; GUI.Label(new Rect(leftIndent, contentTop + (line * entryHeight), 15, entryHeight), "Y: "); - dogfightOffsetY = (int)(GUI.HorizontalSlider(new Rect(leftIndent + 15, contentTop + (line * entryHeight) + 6, contentWidth - 45, entryHeight), dogfightOffsetY, -dogfightMaxOffset, dogfightMaxOffset) * 2) / 2f; + dogfightOffsetY = GUI.HorizontalSlider(new Rect(leftIndent + 15, contentTop + (line * entryHeight) + 6, contentWidth - 45, entryHeight), dogfightOffsetY, -dogfightMaxOffset, dogfightMaxOffset); + if (!enableKeypad) dogfightOffsetY = Mathf.RoundToInt(dogfightOffsetY * 2f) / 2f; GUI.Label(new Rect(leftIndent + contentWidth - 25, contentTop + (line * entryHeight), 25, entryHeight), dogfightOffsetY.ToString("0.0")); line += 1.5f; 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; + dogfightLerp = Mathf.RoundToInt(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 = Mathf.RoundToInt(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) { @@ -1953,22 +2175,16 @@ void GuiWindow(int windowID) line++; GUI.Label(new Rect(leftIndent, contentTop + (line * entryHeight), contentWidth / 2, entryHeight), "Move Speed:"); - guiFreeMoveSpeed = GUI.TextField(new Rect(leftIndent + contentWidth / 2, contentTop + (line * entryHeight), contentWidth / 2, entryHeight), guiFreeMoveSpeed); - if (float.TryParse(guiFreeMoveSpeed, out parseResult)) - { - freeMoveSpeed = Mathf.Abs(parseResult); - guiFreeMoveSpeed = freeMoveSpeed.ToString(); - } + freeMoveSpeedRaw = Mathf.RoundToInt(GUI.HorizontalSlider(new Rect(leftIndent + contentWidth / 2f - 30, contentTop + (line * entryHeight) + 6, contentWidth / 2f, entryHeight), freeMoveSpeedRaw, -1f, 2f) * 20f) / 20f; + freeMoveSpeed = Mathf.Pow(10f, freeMoveSpeedRaw); + GUI.Label(new Rect(leftIndent + contentWidth - 25f, contentTop + (line * entryHeight), 25, entryHeight), freeMoveSpeed.ToString("F")); line++; GUI.Label(new Rect(leftIndent, contentTop + (line * entryHeight), contentWidth / 2, entryHeight), "Zoom Speed:"); - guiKeyZoomSpeed = GUI.TextField(new Rect(leftIndent + contentWidth / 2, contentTop + (line * entryHeight), contentWidth / 2, entryHeight), guiKeyZoomSpeed); - if (float.TryParse(guiKeyZoomSpeed, out parseResult)) - { - keyZoomSpeed = Mathf.Abs(parseResult); - guiKeyZoomSpeed = keyZoomSpeed.ToString(); - } + zoomSpeedRaw = Mathf.RoundToInt(GUI.HorizontalSlider(new Rect(leftIndent + contentWidth / 2f - 30, contentTop + (line * entryHeight) + 6, contentWidth / 2f, entryHeight), zoomSpeedRaw, -2f, 1f) * 20f) / 20f; + keyZoomSpeed = Mathf.Pow(10f, zoomSpeedRaw); + GUI.Label(new Rect(leftIndent + contentWidth - 25f, contentTop + (line * entryHeight), 25, entryHeight), keyZoomSpeed.ToString("F")); } else { @@ -2245,6 +2461,12 @@ void CurrentVesselWillDestroy(Vessel v) hasDied = true; diedTime = Time.time; + 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(); @@ -2280,16 +2502,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) @@ -2655,6 +2867,9 @@ void Load() { availablePaths.Add(CameraPath.Load(node)); } + freeMoveSpeedRaw = Mathf.Log10(freeMoveSpeed); + zoomSpeedRaw = Mathf.Log10(keyZoomSpeed); + if (DEBUG) { Debug.Log("[CameraTools]: Verbose debugging enabled."); } } #endregion } 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 @@ -