/// <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));
 }
示例#2
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));
 }
示例#3
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));
        }
示例#5
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);
        }
示例#6
0
        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));
 }
示例#8
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);
 }
示例#10
0
        /// <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);
        }