UnityEditor.TransitionPreview.ResampleTransition C# (CSharp) Method

ResampleTransition() private method

private ResampleTransition ( AnimatorStateTransition transition, AvatarMask layerMask, TransitionInfo info, Animator previewObject ) : void
transition UnityEditor.Animations.AnimatorStateTransition
layerMask UnityEditor.Animations.AvatarMask
info TransitionInfo
previewObject UnityEngine.Animator
return void
        private void ResampleTransition(AnimatorStateTransition transition, AvatarMask layerMask, TransitionInfo info, Animator previewObject)
        {
            this.m_IsResampling = true;
            this.m_MustResample = false;
            this.m_ValidTransition = true;
            bool flag = this.m_RefTransition != transition;
            this.m_RefTransition = transition;
            this.m_RefTransitionInfo = info;
            this.m_LayerMask = layerMask;
            if (this.m_AvatarPreview != null)
            {
                this.m_AvatarPreview.OnDestroy();
                this.m_AvatarPreview = null;
            }
            this.ClearController();
            Motion motion = this.m_RefSrcState.motion;
            this.Init(previewObject, (motion == null) ? this.m_RefDstState.motion : motion);
            if (this.m_Controller == null)
            {
                this.m_IsResampling = false;
            }
            else
            {
                this.m_AvatarPreview.Animator.allowConstantClipSamplingOptimization = false;
                this.m_StateMachine.defaultState = this.m_DstState;
                this.m_Transition.mute = true;
                AnimatorController.SetAnimatorController(this.m_AvatarPreview.Animator, this.m_Controller);
                this.m_AvatarPreview.Animator.Update(1E-05f);
                this.WriteParametersInController();
                this.m_AvatarPreview.Animator.SetLayerWeight(this.m_LayerIndex, 1f);
                float length = this.m_AvatarPreview.Animator.GetCurrentAnimatorStateInfo(this.m_LayerIndex).length;
                this.m_StateMachine.defaultState = this.m_SrcState;
                this.m_Transition.mute = false;
                AnimatorController.SetAnimatorController(this.m_AvatarPreview.Animator, this.m_Controller);
                this.m_AvatarPreview.Animator.Update(1E-05f);
                this.WriteParametersInController();
                this.m_AvatarPreview.Animator.SetLayerWeight(this.m_LayerIndex, 1f);
                float num2 = this.m_AvatarPreview.Animator.GetCurrentAnimatorStateInfo(this.m_LayerIndex).length;
                if (this.m_LayerIndex > 0)
                {
                    this.m_AvatarPreview.Animator.stabilizeFeet = false;
                }
                float num3 = ((num2 * this.m_RefTransition.exitTime) + (this.m_Transition.duration * (!this.m_RefTransition.hasFixedDuration ? num2 : 1f))) + length;
                if (num3 > 2000f)
                {
                    Debug.LogWarning("Transition duration is longer than 2000 second, Disabling previewer.");
                    this.m_ValidTransition = false;
                    this.m_IsResampling = false;
                }
                else
                {
                    float num4 = (this.m_RefTransition.exitTime <= 0f) ? num2 : (num2 * this.m_RefTransition.exitTime);
                    float a = (num4 <= 0f) ? 0.03333334f : Mathf.Min(Mathf.Max((float) (num4 / 300f), (float) 0.03333334f), num4 / 5f);
                    float num6 = (length <= 0f) ? 0.03333334f : Mathf.Min(Mathf.Max((float) (length / 300f), (float) 0.03333334f), length / 5f);
                    a = Mathf.Max(a, num3 / 600f);
                    num6 = Mathf.Max(num6, num3 / 600f);
                    float deltaTime = a;
                    float num8 = 0f;
                    bool flag2 = false;
                    bool flag3 = false;
                    bool flag4 = false;
                    this.m_AvatarPreview.Animator.StartRecording(-1);
                    this.m_LeftStateWeightA = 0f;
                    this.m_LeftStateTimeA = 0f;
                    this.m_AvatarPreview.Animator.Update(0f);
                    while (!flag4 && (num8 < num3))
                    {
                        this.m_AvatarPreview.Animator.Update(deltaTime);
                        AnimatorStateInfo currentAnimatorStateInfo = this.m_AvatarPreview.Animator.GetCurrentAnimatorStateInfo(this.m_LayerIndex);
                        num8 += deltaTime;
                        if (!flag2)
                        {
                            this.m_LeftStateWeightA = this.m_LeftStateWeightB = currentAnimatorStateInfo.normalizedTime;
                            this.m_LeftStateTimeA = this.m_LeftStateTimeB = num8;
                            flag2 = true;
                        }
                        if (flag3 && (num8 >= num3))
                        {
                            flag4 = true;
                        }
                        if (!flag3 && currentAnimatorStateInfo.IsName(this.m_DstState.name))
                        {
                            this.m_RightStateWeightA = currentAnimatorStateInfo.normalizedTime;
                            this.m_RightStateTimeA = num8;
                            flag3 = true;
                        }
                        if (!flag3)
                        {
                            this.m_LeftStateWeightB = currentAnimatorStateInfo.normalizedTime;
                            this.m_LeftStateTimeB = num8;
                        }
                        if (flag3)
                        {
                            this.m_RightStateWeightB = currentAnimatorStateInfo.normalizedTime;
                            this.m_RightStateTimeB = num8;
                        }
                        if (this.m_AvatarPreview.Animator.IsInTransition(this.m_LayerIndex))
                        {
                            deltaTime = num6;
                        }
                    }
                    float num10 = num8;
                    this.m_AvatarPreview.Animator.StopRecording();
                    if (Mathf.Approximately(this.m_LeftStateWeightB, this.m_LeftStateWeightA) || Mathf.Approximately(this.m_RightStateWeightB, this.m_RightStateWeightA))
                    {
                        Debug.LogWarning("Difference in effective length between states is too big. Transition preview will be disabled.");
                        this.m_ValidTransition = false;
                        this.m_IsResampling = false;
                    }
                    else
                    {
                        float num11 = (this.m_LeftStateTimeB - this.m_LeftStateTimeA) / (this.m_LeftStateWeightB - this.m_LeftStateWeightA);
                        float num12 = (this.m_RightStateTimeB - this.m_RightStateTimeA) / (this.m_RightStateWeightB - this.m_RightStateWeightA);
                        if (this.m_MustSampleMotions)
                        {
                            this.m_MustSampleMotions = false;
                            this.m_SrcPivotList.Clear();
                            this.m_DstPivotList.Clear();
                            deltaTime = num6;
                            this.m_StateMachine.defaultState = this.m_DstState;
                            this.m_Transition.mute = true;
                            AnimatorController.SetAnimatorController(this.m_AvatarPreview.Animator, this.m_Controller);
                            this.m_AvatarPreview.Animator.Update(0f);
                            this.m_AvatarPreview.Animator.SetLayerWeight(this.m_LayerIndex, 1f);
                            this.m_AvatarPreview.Animator.Update(1E-07f);
                            this.WriteParametersInController();
                            for (num8 = 0f; num8 <= num12; num8 += deltaTime * 2f)
                            {
                                Timeline.PivotSample item = new Timeline.PivotSample {
                                    m_Time = num8,
                                    m_Weight = this.m_AvatarPreview.Animator.pivotWeight
                                };
                                this.m_DstPivotList.Add(item);
                                this.m_AvatarPreview.Animator.Update(deltaTime * 2f);
                            }
                            deltaTime = a;
                            this.m_StateMachine.defaultState = this.m_SrcState;
                            this.m_Transition.mute = true;
                            AnimatorController.SetAnimatorController(this.m_AvatarPreview.Animator, this.m_Controller);
                            this.m_AvatarPreview.Animator.Update(1E-07f);
                            this.WriteParametersInController();
                            this.m_AvatarPreview.Animator.SetLayerWeight(this.m_LayerIndex, 1f);
                            for (num8 = 0f; num8 <= num11; num8 += deltaTime * 2f)
                            {
                                Timeline.PivotSample sample2 = new Timeline.PivotSample {
                                    m_Time = num8,
                                    m_Weight = this.m_AvatarPreview.Animator.pivotWeight
                                };
                                this.m_SrcPivotList.Add(sample2);
                                this.m_AvatarPreview.Animator.Update(deltaTime * 2f);
                            }
                            this.m_Transition.mute = false;
                            AnimatorController.SetAnimatorController(this.m_AvatarPreview.Animator, this.m_Controller);
                            this.m_AvatarPreview.Animator.Update(1E-07f);
                            this.WriteParametersInController();
                        }
                        this.m_Timeline.StopTime = this.m_AvatarPreview.timeControl.stopTime = num10;
                        this.m_AvatarPreview.timeControl.currentTime = this.m_Timeline.Time;
                        if (flag)
                        {
                            float num9;
                            this.m_AvatarPreview.timeControl.currentTime = num9 = this.m_AvatarPreview.timeControl.startTime = 0f;
                            this.m_Timeline.StartTime = num9;
                            this.m_Timeline.Time = num9;
                            this.m_Timeline.ResetRange();
                        }
                        this.m_AvatarPreview.Animator.StartPlayback();
                        this.m_IsResampling = false;
                    }
                }
            }
        }