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;
}
}
}
}