/// <summary>Create a blend between 2 virtual cameras, taking into account /// any existing active blend.</summary> protected CinemachineBlend CreateBlend( ICinemachineCamera camA, ICinemachineCamera camB, CinemachineBlendDefinition blendDef, CinemachineBlend activeBlend) { if (blendDef.BlendCurve == null || blendDef.m_Time <= 0 || (camA == null && camB == null)) { return(null); } if (activeBlend != null) { if (activeBlend.Uses(camB)) { camA = new StaticPointVirtualCamera(activeBlend.State, "Mid-Blend"); } else { camA = new BlendSourceVirtualCamera(activeBlend); } } else if (camA == null) { camA = new StaticPointVirtualCamera(State, "(none)"); } return(new CinemachineBlend(camA, camB, blendDef.BlendCurve, blendDef.m_Time, 0)); }
/// <summary>Create a blend between 2 virtual cameras, taking into account /// any existing active blend, with special case handling if the new blend is /// effectively an undo of the current blend</summary> /// <param name="camA">Outgoing virtual camera</param> /// <param name="camB">Incoming virtual camera</param> /// <param name="blendDef">Definition of the blend to create</param> /// <param name="activeBlend">The current active blend</param> /// <returns>The new blend</returns> protected CinemachineBlend CreateBlend( ICinemachineCamera camA, ICinemachineCamera camB, CinemachineBlendDefinition blendDef, CinemachineBlend activeBlend) { if (blendDef.BlendCurve == null || blendDef.BlendTime <= 0 || (camA == null && camB == null)) { return(null); } if (activeBlend != null) { // Special case: if backing out of a blend-in-progress // with the same blend in reverse, adjust the belnd time if (activeBlend.CamA == camB && activeBlend.CamB == camA && activeBlend.Duration <= blendDef.BlendTime) { blendDef.m_Time = activeBlend.TimeInBlend; } camA = new BlendSourceVirtualCamera(activeBlend); } else if (camA == null) { camA = new StaticPointVirtualCamera(State, "(none)"); } return(new CinemachineBlend( camA, camB, blendDef.BlendCurve, blendDef.BlendTime, 0)); }
/// <summary>Does the blend use a specific <see cref="ICinemachineCamera"/>?</summary> /// <param name="cam">The camera to test</param> /// <returns>True if the camera is involved in the blend</returns> public bool Uses(ICinemachineCamera cam) { if (cam == CamA || cam == CamB) return true; BlendSourceVirtualCamera b = CamA as BlendSourceVirtualCamera; if (b != null && b.Blend.Uses(cam)) return true; b = CamB as BlendSourceVirtualCamera; if (b != null && b.Blend.Uses(cam)) return true; return false; }
public bool Uses(ICinemachineCamera cam) { if (cam == this.CamA || cam == this.CamB) { return(true); } BlendSourceVirtualCamera blendSourceVirtualCamera = this.CamA as BlendSourceVirtualCamera; if (blendSourceVirtualCamera != null && blendSourceVirtualCamera.Blend.Uses(cam)) { return(true); } blendSourceVirtualCamera = (this.CamB as BlendSourceVirtualCamera); return(blendSourceVirtualCamera != null && blendSourceVirtualCamera.Blend.Uses(cam)); }
/// <summary>Does the blend use a specific <see cref="ICinemachineCamera"/>?</summary> /// <param name="cam">The camera to test</param> /// <returns>True if the camera is involved in the blend</returns> public bool Uses(ICinemachineCamera cam) { if (cam == CamA || cam == CamB) { return(true); } BlendSourceVirtualCamera b = CamA as BlendSourceVirtualCamera; if (b != null && b.Blend.Uses(cam)) { return(true); } b = CamB as BlendSourceVirtualCamera; if (b != null && b.Blend.Uses(cam)) { return(true); } return(false); }
static ICinemachineCamera DeepCamBFromBlend(CinemachineBlend blend) { ICinemachineCamera vcam = blend.CamB; while (vcam != null) { if (!vcam.IsValid) { return(null); // deleted! } BlendSourceVirtualCamera bs = vcam as BlendSourceVirtualCamera; if (bs == null) { break; } vcam = bs.Blend.CamB; } return(vcam); }
private CinemachineBlend CreateBlend( ICinemachineCamera camA, ICinemachineCamera camB, CinemachineBlendDefinition blend, CinemachineBlend activeBlend, float deltaTime) { if (blend.BlendCurve == null || blend.m_Time <= 0 || (camA == null && camB == null)) { return(null); } if (activeBlend != null) { camA = new BlendSourceVirtualCamera(activeBlend, deltaTime); } else if (camA == null) { camA = new StaticPointVirtualCamera(State, "(none)"); } return(new CinemachineBlend(camA, camB, blend.BlendCurve, blend.m_Time, 0)); }
/// <summary> /// Create a blend from one ICinemachineCamera to another, /// or to/from a point, if we can't do anything else /// </summary> private CinemachineBlend CreateBlend( ICinemachineCamera camA, ICinemachineCamera camB, CinemachineBlendDefinition blendDef, CinemachineBlend activeBlend, float deltaTime) { if (blendDef.BlendCurve == null || blendDef.m_Time <= 0 || (camA == null && camB == null)) { return(null); } if (activeBlend != null) { camA = new BlendSourceVirtualCamera(activeBlend, deltaTime); } else if (camA == null) { // Blend from the current camera position CameraState state = CameraState.Default; state.RawPosition = transform.position; state.RawOrientation = transform.rotation; state.Lens = LensSettings.FromCamera(OutputCamera); camA = new StaticPointVirtualCamera(state, "(none)"); } return(new CinemachineBlend(camA, camB, blendDef.BlendCurve, blendDef.m_Time, 0)); }
internal int SetCameraOverride(int overrideId, ICinemachineCamera camA, ICinemachineCamera camB, float weightB, float deltaTime) { if (overrideId < 0) { int num = this.mNextOverrideId; this.mNextOverrideId = num + 1; overrideId = num; } CinemachineBrain.OverrideStackFrame overrideFrame = this.GetOverrideFrame(overrideId); overrideFrame.camera = null; overrideFrame.deltaTime = deltaTime; overrideFrame.timeOfOverride = Time.realtimeSinceStartup; if (camA != null || camB != null) { if (weightB <= 0.0001f) { overrideFrame.blend = null; if (camA != null) { overrideFrame.camera = camA; } } else if (weightB >= 0.9999f) { overrideFrame.blend = null; if (camB != null) { overrideFrame.camera = camB; } } else { if (camB == null) { ICinemachineCamera cinemachineCamera = camB; camB = camA; camA = cinemachineCamera; weightB = 1f - weightB; } if (camA == null) { CinemachineBrain.OverrideStackFrame nextActiveFrame = this.GetNextActiveFrame(overrideId); if (nextActiveFrame.blend != null) { camA = new BlendSourceVirtualCamera(nextActiveFrame.blend, deltaTime); } else { camA = ((nextActiveFrame.camera != null) ? nextActiveFrame.camera : camB); } } if (overrideFrame.blend == null) { overrideFrame.blend = new CinemachineBlend(camA, camB, AnimationCurve.Linear(0f, 0f, 1f, 1f), 1f, weightB); } overrideFrame.blend.CamA = camA; overrideFrame.blend.CamB = camB; overrideFrame.blend.TimeInBlend = weightB; overrideFrame.camera = camB; } } return(overrideId); }
/// <summary> /// This API is specifically for Timeline. Do not use it. /// Override the current camera and current blend. This setting will trump /// any in-game logic that sets virtual camera priorities and Enabled states. /// This is the main API for the timeline. /// </summary> /// <param name="overrideId">Id to represent a specific client. An internal /// stack is maintained, with the most recent non-empty override taking precenence. /// This id must be > 0. If you pass -1, a new id will be created, and returned. /// Use that id for subsequent calls. Don't forget to /// call ReleaseCameraOverride after all overriding is finished, to /// free the OverideStack resources.</param> /// <param name="camA"> The camera to set, corresponding to weight=0</param> /// <param name="camB"> The camera to set, corresponding to weight=1</param> /// <param name="weightB">The blend weight. 0=camA, 1=camB</param> /// <param name="deltaTime">override for deltaTime. Should be Time.FixedDelta for /// time-based calculations to be included, -1 otherwise</param> /// <returns>The oiverride ID. Don't forget to call ReleaseCameraOverride /// after all overriding is finished, to free the OverideStack resources.</returns> internal int SetCameraOverride( int overrideId, ICinemachineCamera camA, ICinemachineCamera camB, float weightB, float deltaTime) { //UnityEngine.Profiling.Profiler.BeginSample("CinemachineBrain.SetCameraOverride"); if (overrideId < 0) { overrideId = mNextOverrideId++; } OverrideStackFrame ovr = GetOverrideFrame(overrideId); ovr.camera = null; ovr.deltaTime = deltaTime; ovr.timeOfOverride = Time.realtimeSinceStartup; if (camA != null || camB != null) { if (weightB <= UnityVectorExtensions.Epsilon) { ovr.blend = null; if (camA != null) { ovr.camera = camA; // no blend } } else if (weightB >= (1f - UnityVectorExtensions.Epsilon)) { ovr.blend = null; if (camB != null) { ovr.camera = camB; // no blend } } else { // We have a blend. If one of the supplied cameras is null, // we use the current active virtual camera (blending in/out of game logic), // If we do have a null camera, make sure it's the 'from' camera. // Timeline does not distinguish between from and to cams, but we do. if (camB == null) { // Swap them ICinemachineCamera c = camB; camB = camA; camA = c; weightB = 1f - weightB; } // Are we blending with something in progress? if (camA == null) { OverrideStackFrame frame = GetNextActiveFrame(overrideId); if (frame.blend != null) { camA = new BlendSourceVirtualCamera(frame.blend, deltaTime); } else { camA = frame.camera != null ? frame.camera : camB; } } // Create the override blend if (ovr.blend == null) { ovr.blend = new CinemachineBlend( camA, camB, AnimationCurve.Linear(0, 0, 1, 1), 1, weightB); } ovr.blend.CamA = camA; ovr.blend.CamB = camB; ovr.blend.TimeInBlend = weightB; ovr.camera = camB; } } //UnityEngine.Profiling.Profiler.EndSample(); return(overrideId); }