public float CalculateSmoothTangent(int index, int component)
{
AnimationCurve curve = this.GetCurve(component);
if (curve.length < 2)
{
return 0f;
}
if (index <= 0)
{
return this.CalculateLinearTangent(curve[0], curve[1], component);
}
if (index >= (curve.length - 1))
{
return this.CalculateLinearTangent(curve[curve.length - 1], curve[curve.length - 2], component);
}
Keyframe keyframe = curve[index - 1];
float time = keyframe.time;
Keyframe keyframe2 = curve[index];
float num3 = keyframe2.time;
Keyframe keyframe3 = curve[index + 1];
float num4 = keyframe3.time;
Vector3 euler = this.EvaluateEulerCurvesDirectly(time);
Vector3 vector2 = this.EvaluateEulerCurvesDirectly(num3);
Vector3 vector3 = this.EvaluateEulerCurvesDirectly(num4);
Quaternion quaternion = Quaternion.Euler(euler);
Quaternion quaternion2 = Quaternion.Euler(vector2);
Quaternion quaternion3 = Quaternion.Euler(vector3);
if (((((quaternion.x * quaternion2.x) + (quaternion.y * quaternion2.y)) + (quaternion.z * quaternion2.z)) + (quaternion.w * quaternion2.w)) < 0f)
{
quaternion = new Quaternion(-quaternion.x, -quaternion.y, -quaternion.z, -quaternion.w);
}
if (((((quaternion3.x * quaternion2.x) + (quaternion3.y * quaternion2.y)) + (quaternion3.z * quaternion2.z)) + (quaternion3.w * quaternion2.w)) < 0f)
{
quaternion3 = new Quaternion(-quaternion3.x, -quaternion3.y, -quaternion3.z, -quaternion3.w);
}
Quaternion quaternion4 = new Quaternion();
float dx = num3 - time;
float num6 = num4 - num3;
for (int i = 0; i < 4; i++)
{
float dy = quaternion2[i] - quaternion[i];
float num9 = quaternion3[i] - quaternion2[i];
float num10 = SafeDeltaDivide(dy, dx);
float num11 = SafeDeltaDivide(num9, num6);
quaternion4[i] = (0.5f * num10) + (0.5f * num11);
}
float num12 = Mathf.Abs((float) (num4 - time)) * 0.01f;
Quaternion q = new Quaternion(quaternion2.x - (quaternion4.x * num12), quaternion2.y - (quaternion4.y * num12), quaternion2.z - (quaternion4.z * num12), quaternion2.w - (quaternion4.w * num12));
Quaternion quaternion6 = new Quaternion(quaternion2.x + (quaternion4.x * num12), quaternion2.y + (quaternion4.y * num12), quaternion2.z + (quaternion4.z * num12), quaternion2.w + (quaternion4.w * num12));
Vector3 eulerFromQuaternion = GetEulerFromQuaternion(q, vector2);
Vector3 vector6 = (Vector3) ((GetEulerFromQuaternion(quaternion6, vector2) - eulerFromQuaternion) / (num12 * 2f));
return vector6[component];
}