public void CalculatePositionProgressions(TextFxAnimationManager anim_manager,
		                                          LetterAnimation letter_animation,
		                                          ref float[] letter_progressions,
		                                          LetterSetup[] letters,
		                                          int num_progressions,
		                                          ActionPositionVector3Progression offset_prog,
		                                          bool variableActive = true)
		{

//			if (Progression == CURVE_OPTION_INDEX) {
//				if(m_is_offset_from_last)
//				{
//					m_value_state = PROGRESSION_VALUE_STATE.OFFSET_FROM_REFERENCE;
//					m_offset_progression = offset_prog.GetOffsetReference();
//				}
//				else
//					m_value_state = PROGRESSION_VALUE_STATE.UNIQUE;
//
//				m_values = new Vector3[num_progressions];
//
//				float baseYOffset = letters[0].BaseVerticesCenter.y - letters[0].BaseVerticesBL.y;
//				Vector3 firstLetterCenter = letters[0].BaseVerticesCenter;
//
//				for(int idx=0; idx < letter_progressions.Length; idx++)
//				{
//					m_values[idx] += m_bezier_curve.GetCurvePoint(letter_progressions[idx], yOffset : baseYOffset + (letters[idx].BaseVerticesCenter.y - firstLetterCenter.y));
//				}
//			}
//			else
//			{
				CalculateProgressions(num_progressions, offset_prog, variableActive);
//			}

			if(Progression == CURVE_OPTION_INDEX || (m_value_state == PROGRESSION_VALUE_STATE.REFERENCE ? GetOffsetReference().GetPositionVector3Prog(letter_animation.LetterActions).m_force_position_override : m_force_position_override))
			{
				Vector3 base_offset = Vector3.zero;

				if(m_values.Length == 1)
				{
					base_offset = m_values[0];
					m_values = new Vector3[letters.Length];
				}

				// Remove the base positioning offset for each letter
				for(int letter_idx =0; letter_idx < letters.Length; letter_idx++)
				{
					m_values[letter_idx] += base_offset;
					m_values[letter_idx] -= letters[letter_idx].BaseVerticesCenter / anim_manager.AnimationInterface.MovementScale;
				}
			}
		}
		public ActionPositionVector3Progression CloneThis()
		{
			ActionPositionVector3Progression progression = new ActionPositionVector3Progression(Vector3.zero);
			
			progression.m_progression_idx = Progression;
			progression.m_ease_type = m_ease_type;
			progression.m_from = m_from;
			progression.m_to = m_to;
			progression.m_to_to = m_to_to;
			progression.m_to_to_bool = m_to_to_bool;
			progression.m_is_offset_from_last = m_is_offset_from_last;
			progression.m_unique_randoms = m_unique_randoms;
			progression.m_force_position_override = m_force_position_override;
			progression.m_override_animate_per_option = m_override_animate_per_option;
			progression.m_animate_per = m_animate_per;
			progression.m_ease_curve_per_axis = m_ease_curve_per_axis;
			progression.m_custom_ease_curve = new AnimationCurve(m_custom_ease_curve.keys);
			progression.m_custom_ease_curve_y = new AnimationCurve(m_custom_ease_curve_y.keys);
			progression.m_custom_ease_curve_z = new AnimationCurve(m_custom_ease_curve_z.keys);
			progression.m_bezier_curve = new TextFxBezierCurve(progression.m_bezier_curve);
			
			return progression;
		}