public virtual void Open(bool open) { if (IvaGameObject != null) { if (IvaGameObjectRenderer != null) { IvaGameObjectRenderer.enabled = open; } } HideOnOpen(open); FreeIva.SetRenderQueues(FreeIva.CurrentPart); if (Collider != null) { Collider.Enable(!open); } if (open) { if (HatchOpenSound != null && HatchOpenSound.audio != null) { HatchOpenSound.audio.Play(); } } else { if (HatchCloseSound != null && HatchCloseSound.audio != null) { HatchCloseSound.audio.Play(); } } }
/* Didn't work. Caused slowdown. * public void SetRenderQueues(Part activePart) * { * SortedList<float, Part> partRanges = new SortedList<float, Part>(); * foreach (Part p in FlightGlobals.ActiveVessel.Parts) * { * if (p.internalModel == null) continue; * partRanges.Add(Vector3.Distance(p.collider.bounds.center, activePart.collider.bounds.center), p); * } * * int queue = 2000; * foreach (var pr in partRanges) * { * if (pr.Value.internalModel == null) continue; * Renderer[] renderers = pr.Value.internalModel.GetComponentsInChildren<Renderer>(); * foreach (var r in renderers) * { * foreach (var m in r.materials) * { * m.renderQueue = queue; * if (queue == 2000) queue--; * queue--; * } * } * } * }*/ public static void ChangeMesh(GameObject original) { try { string modelPath = "FreeIva/Models/HatchMask"; Debug.Log("#Changing mesh"); GameObject hatchMask = GameDatabase.Instance.GetModel(modelPath); if (hatchMask != null) { MeshFilter mfC = original.GetComponent <MeshFilter>(); MeshFilter mfM = hatchMask.GetComponent <MeshFilter>(); Mesh m = FreeIva.Instantiate(mfM.mesh) as Mesh; mfC.mesh = m; Debug.Log("#Changed mesh"); } else { Debug.LogError("[Free IVA] HatchMask.dae not found at " + modelPath); } } catch (Exception ex) { Debug.LogError("[Free IVA] Error Loading mesh: " + ex.Message + ", " + ex.StackTrace); } }
public void Update() { if (CameraManager.Instance.currentCameraMode != CameraManager.CameraMode.IVA) { if (_lastCameraMode == CameraManager.CameraMode.IVA) { // Switching away from IVA. //InputLockManager.RemoveControlLock("FreeIVA"); // Return the kerbal to its original seat. TargetedSeat = ActiveKerbal.seat; Buckle(); } } else { // In IVA. if (_lastCameraMode != CameraManager.CameraMode.IVA) { // Switching to IVA. FreeIva.EnableInternals(); SetCameraToSeat(); InternalCollider.HideAllColliders(); } GetInput(); } _lastCameraMode = CameraManager.Instance.currentCameraMode; }
public void Update() { if (CameraManager.Instance.currentCameraMode != CameraManager.CameraMode.IVA) { if (_lastCameraMode == CameraManager.CameraMode.IVA) // Switching away from IVA. { InputLockManager.RemoveControlLock("FreeIVA"); // Return the kerbal to its original seat. TargetedSeat = ActiveKerbal.seat; if (!buckled) { Buckle(); } } } else { // In IVA. if (_lastCameraMode != CameraManager.CameraMode.IVA) { // Switching to IVA. FreeIva.EnableInternals(); UpdateActiveKerbal();//false); SetCameraToSeat(); InternalCollider.HideAllColliders(); } // Check if we're changing crew member using the 'V' key. if (GameSettings.CAMERA_NEXT.GetKeyDown()) { _changingCurrentIvaCrew = true; } else { if (_changingCurrentIvaCrew) { UpdateActiveKerbal();//false); _changingCurrentIvaCrew = false; } } // TODO: Doesn't get mouse input when in FixedUpdate. // Split this out to flags set in Update and acted upon in FixedUpdate. GetInput(); /*FreeIva.InitialPart.Events.Clear(); * if (_transferStart != 0 && Planetarium.GetUniversalTime() > (0.25 + _transferStart)) * { * FlightGlobals.ActiveVessel.SpawnCrew(); * GameEvents.onVesselChange.Fire(FlightGlobals.ActiveVessel); * InternalCamera.Instance.transform.parent = ActiveKerbal.KerbalRef.eyeTransform; * _transferStart = 0; * }*/ } _lastCameraMode = CameraManager.Instance.currentCameraMode; }
private static void mainGUI(int windowID) { GUILayout.BeginVertical(); FreeIva.Gui(); GUILayout.EndVertical(); GUI.DragWindow(); }
//public override void Open(bool open) public void Open(bool open) { if (open && _isLocked) { ScreenMessages.PostScreenMessage("Hatch is locked", 1f, ScreenMessageStyle.LOWER_CENTER); return; } if (IvaGameObject != null) { Renderer r = IvaGameObject.GetComponentCached <Renderer>(ref depthMaskRenderer); if (r != null) { r.enabled = open; } } AnimationState animationState = unlockAnimation[openAnimationName]; if (open ^ animationState.speed > 0) { animationState.speed = -animationState.speed; } if (animationState.speed > 0) { animationState.normalizedTime = 0f; } else { animationState.normalizedTime = 1f; } unlockAnimation.clip = animationState.clip; // This animation player could be used for multiple clips. unlockAnimation.enabled = true; unlockAnimation.wrapMode = WrapMode.Once; unlockAnimation.Play(); FreeIva.SetRenderQueues(FreeIva.CurrentPart); if (open) { HatchOpenSound.audio.Play(); } else { HatchCloseSound.audio.Play(); } _isOpen = !_isOpen; }
public static void ChangeHelmetMesh(GameObject original, Part p) { //http://forum.kerbalspaceprogram.com/threads/87562-Changing-the-EVA-Kerbal-model/page4 try { string modelPath = "FreeIva/Models/TestSphere"; Debug.Log("#Changing helmet mesh"); GameObject testSphere = GameDatabase.Instance.GetModel(modelPath); if (testSphere != null) { MeshFilter mfC = original.GetComponent <MeshFilter>(); MeshFilter mfM = null; foreach (ProtoCrewMember c in p.protoModuleCrew) { if (c.KerbalRef.headTransform != null) { mfM = c.KerbalRef.headTransform.GetComponentInChildren <MeshFilter>(); /*MeshFilter[] mfs = c.KerbalRef.headTransform.GetComponentsInChildren<MeshFilter>(); * foreach (var mf in mfs) * { * Debug.Log(mf); * mfM = mf; * break; * }*/ } if (mfM != null) { break; } } Mesh m = FreeIva.Instantiate(mfM.mesh) as Mesh; mfC.mesh = m; Debug.Log("#Changed mesh"); } else { Debug.LogError("[Free IVA] TestSphere.dae not found at " + modelPath); } } catch (Exception ex) { Debug.LogError("[Free IVA] Error Loading mesh: " + ex.Message + ", " + ex.StackTrace); } }
public void Unbuckle() { _previousPos = Vector3.zero; FreeIva.EnableInternals(); UpdateActiveKerbal(); FreeIva.InitialPart = FreeIva.CurrentPart; OriginalSeat = ActiveKerbal.seat; HideCurrentKerbal(true); // InternalSpace.Instance is the InternalCamera's parent normally. InternalCamera.Instance.transform.parent = KerbalCollider.transform; InputLockManager.SetControlLock(ControlTypes.ALL_SHIP_CONTROLS, "FreeIVA"); //ActiveKerbal.flightLog.AddEntry("Unbuckled"); ScreenMessages.PostScreenMessage("Unbuckled", 1f, ScreenMessageStyle.LOWER_CENTER); KerbalCollider.collider.enabled = true; buckled = false; }
public override void Open(bool open) { if (ClosedRenderer != null) { ClosedRenderer.enabled = !open; } else { Debug.Log("# ClosedRenderer was null"); } if (OpenRenderer != null) { OpenRenderer.enabled = open; } else { Debug.Log("# OpenRenderer was null"); } HideOnOpen(open); FreeIva.SetRenderQueues(FreeIva.CurrentPart); if (Collider != null) { Collider.Enable(!open); } if (open) { if (HatchOpenSound != null && HatchOpenSound.audio != null) { HatchOpenSound.audio.Play(); } } else { if (HatchCloseSound != null && HatchCloseSound.audio != null) { HatchCloseSound.audio.Play(); } } }
public void Activate(bool activate) { IsActive = !IsActive; AnimationState animationState = Animation[AnimationName]; if (IsActive ^ animationState.speed > 0) { animationState.speed = -animationState.speed; } if (animationState.speed > 0) { animationState.normalizedTime = 0f; } else { animationState.normalizedTime = 1f; } Animation.clip = animationState.clip; // This animation player could be used for multiple clips. Animation.enabled = true; Animation.wrapMode = WrapMode.Once; Animation.Play(); FreeIva.SetRenderQueues(FreeIva.CurrentPart); if (IsActive) { if (ActivateSound != null && ActivateSound.audio != null) { ActivateSound.audio.Play(); } } else { if (DeactivateSound != null && DeactivateSound.audio != null) { DeactivateSound.audio.Play(); } } }
private void UpdateActiveKerbal()//bool nextKerbal) TODO !!! { ActiveKerbal = CameraManager.Instance.IVACameraActiveKerbal.protoCrewMember; if (ActiveKerbal.KerbalRef != null && ActiveKerbal.KerbalRef.InPart != null) { FreeIva.UpdateCurrentPart(ActiveKerbal.KerbalRef.InPart); } return; // TODO !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! Test if the above (new to 1.1) is working, if so delete the below). /*try * { * // TODO: Find a way of detecting a viewpoint switch ('V' in IVA). * List<ProtoCrewMember> vesselCrew = FlightGlobals.fetch.activeVessel.GetVesselCrew(); * * // TODO: There has to be a better way of doing this. * // Attempt to find the active crew member by searching for the one with the hidden head. * foreach (ProtoCrewMember c in vesselCrew) * { * if (nextKerbal && c == ActiveKerbal) * continue; * if (c.KerbalRef.headTransform != null) * { * Renderer[] rs = c.KerbalRef.headTransform.GetComponentsInChildren<Renderer>(); * if (rs.Length > 0 && !rs[0].isVisible) // Normally the left eye * { * Debug.Log("Updating active kerbal from " + (ActiveKerbal == null ? "null" : ActiveKerbal.name) + " to " + c.name); * ActiveKerbal = c; * if (ActiveKerbal.KerbalRef != null && ActiveKerbal.KerbalRef.InPart != null) * FreeIva.UpdateCurrentPart(ActiveKerbal.KerbalRef.InPart); * break; * } * } * } * } * catch (Exception ex) * { * Debug.LogError("[FreeIVA] Error updating active kerbal: " + ex.Message + ", " + ex.StackTrace); * }*/ }
//private bool _reseatingCrew = false; public void Buckle() { if (TargetedSeat == null) { return; } Debug.Log(ActiveKerbal.name + " is entering seat " + TargetedSeat.transform.name + " in part " + FreeIva.CurrentPart); //InitialPart.RemoveCrewmember(ActiveKerbal); // Don't do this on unbuckle or we lose the InternalCamera. /*TargetedSeat.part.AddCrewmemberAt(ActiveKerbal, TargetedSeatIndex); * CurrentPart.SpawnCrew();*/ HideCurrentKerbal(false); if (FreeIva.InitialPart != FreeIva.CurrentPart) { GameEvents.onCrewTransferred.Fire(new GameEvents.HostedFromToAction <ProtoCrewMember, Part>(ActiveKerbal, FreeIva.InitialPart, FreeIva.CurrentPart)); GameEvents.onVesselChange.Fire(FlightGlobals.ActiveVessel); /*InitialPart.SpawnCrew(); * CurrentPart.SpawnCrew(); * InitialPart.RegisterCrew(); * CurrentPart.RegisterCrew(); * FlightGlobals.ActiveVessel.SpawnCrew();*/ } //_reseatingCrew = true; FreeIva.EnableInternals(); KerbalCollider.collider.enabled = false; // InternalSpace.Instance is the InternalCamera's parent normally. InternalCamera.Instance.transform.parent = InternalSpace.Instance.transform; InputLockManager.RemoveControlLock("FreeIVA"); //ActiveKerbal.flightLog.AddEntry("Buckled"); ScreenMessages.PostScreenMessage("Buckled", 1f, ScreenMessageStyle.LOWER_CENTER); buckled = true; }
//Transform _internalCameraParent = null; public void Unbuckle() { _previousPos = Vector3.zero; FreeIva.EnableInternals(); UpdateActiveKerbal(); FreeIva.InitialPart = FreeIva.CurrentPart; OriginalSeat = ActiveKerbal.seat; HideCurrentKerbal(true); KerbalIva.transform.position = InternalCamera.Instance.transform.position; // The Kerbal's eye transform is the InternalCamera's parent normally, not InternalSpace.Instance as previously thought. InternalCamera.Instance.transform.parent = KerbalIva.transform; InputLockManager.SetControlLock(ControlTypes.ALL_SHIP_CONTROLS, "FreeIVA"); //ActiveKerbal.flightLog.AddEntry("Unbuckled"); ScreenMessages.PostScreenMessage("Unbuckled", 1f, ScreenMessageStyle.LOWER_CENTER); KerbalIva.GetComponentCached <Collider>(ref KerbalCollider).enabled = true; buckled = false; InitialiseFpsControls(); DisablePartHighlighting(true); }
public void Open(bool open) { IvaGameObject.renderer.enabled = open; MeshRenderer[] meshRenderers = Part.internalModel.GetComponentsInChildren <MeshRenderer>(); foreach (var hideProp in HideWhenOpen) { foreach (MeshRenderer mr in meshRenderers) { if (mr.name.Equals(hideProp.Value) && mr.transform != null) { float error = Vector3.Distance(mr.transform.position, hideProp.Key); if (error < 0.15) { Debug.Log("# Toggling " + mr.name); mr.enabled = !open; break; } } } } FreeIva.SetRenderQueues(FreeIva.CurrentPart); if (Collider != null) { Collider.Enable(!open); } if (open) { HatchOpenSound.audio.Play(); } else { HatchCloseSound.audio.Play(); } }