public void CalculateProgressions(int num_progressions, ActionColorProgression offset_prog, bool variableActive = true)
		{
			if(!variableActive)
			{
				SetValueReference(offset_prog);
				return;
			}
			else 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;
			
			
			// Initialise the array of values. Array of only one if all progressions share the same constant value.
			m_values = new VertexColour[Progression == (int) ValueProgression.Eased || Progression == (int) ValueProgression.EasedCustom || Progression == (int) ValueProgression.Random ? num_progressions : 1];
			
			// Calculate progression values
			if(Progression == (int) ValueProgression.Random)
			{
				for(int idx=0; idx < num_progressions; idx++)
				{
					m_values[idx] = ValueFrom.Add(ValueTo.Sub(ValueFrom).Multiply(UnityEngine.Random.value));
				}
			}
			else if(Progression == (int) ValueProgression.Eased)
			{
				float progression;
				
				for(int idx=0; idx < num_progressions; idx++)
				{
					progression = num_progressions == 1 ? 0 : (float)idx / ((float)num_progressions - 1f);
				
					if(m_to_to_bool)
					{
						if(progression  <= 0.5f)
						{
							m_values[idx] = ValueFrom.Add((ValueTo.Sub(ValueFrom)).Multiply(EasingManager.GetEaseProgress(m_ease_type, progression/0.5f)));
						}
						else
						{
							progression -= 0.5f;
							m_values[idx] = ValueTo.Add((ValueThen.Sub(ValueTo)).Multiply(EasingManager.GetEaseProgress(m_ease_type, progression/0.5f)));
						}
					}
					else
					{
						m_values[idx] = ValueFrom.Add((ValueTo.Sub(ValueFrom)).Multiply(EasingManager.GetEaseProgress(m_ease_type, progression)));
					}
				}
			}
			else if(Progression == (int) ValueProgression.EasedCustom)
			{
				float progression;
				
				for(int idx=0; idx < num_progressions; idx++)
				{
					progression = num_progressions == 1 ? 0 : (float)idx / ((float)num_progressions - 1f);
					
					m_values[idx] = ValueFrom.Add((ValueTo.Sub(ValueFrom)).Multiply(m_custom_ease_curve.Evaluate(progression)));
				}
			}
			else if(Progression == (int) ValueProgression.Constant)
			{
				for(int idx=0; idx < m_values.Length; idx++)
				{
					m_values[idx] = ValueFrom;
				}
			}
		}
		public void SetValueReference(ActionVector3Progression progression)
		{
			m_value_state = PROGRESSION_VALUE_STATE.REFERENCE;
			m_offset_progression = progression.ReferenceData;
		}
		public virtual void CalculateProgressions(int num_progressions,
		                                          ActionVector3Progression offset_prog,
		                                          bool variableActive = true)
		{
			if(!variableActive)
			{
				SetValueReference(offset_prog);
				return;
			}
			else if(m_is_offset_from_last && offset_prog != null)
			{
				m_value_state = PROGRESSION_VALUE_STATE.OFFSET_FROM_REFERENCE;
				m_offset_progression = offset_prog.GetOffsetReference();
			}
			else
				m_value_state = PROGRESSION_VALUE_STATE.UNIQUE;

			// Initialise the array of values. Array of only one if all progressions share the same constant value.
			m_values = new Vector3[Progression == (int) ValueProgression.Eased || Progression == (int) ValueProgression.EasedCustom || Progression == (int) ValueProgression.Random ? num_progressions : 1];

			// Calculate progression values
			if(Progression == (int) ValueProgression.Random)
			{
				for(int idx=0; idx < num_progressions; idx++)
				{
					m_values[idx] = new Vector3(m_from.x + (m_to.x - m_from.x) * UnityEngine.Random.value, m_from.y + (m_to.y - m_from.y) * UnityEngine.Random.value, m_from.z + (m_to.z - m_from.z) * UnityEngine.Random.value);
				}
			}
			else if(Progression == (int) ValueProgression.Eased)
			{
				float progression;
				
				for(int idx=0; idx < num_progressions; idx++)
				{
					progression = num_progressions == 1 ? 0 : (float)idx / ((float)num_progressions - 1f);
					
					if(m_to_to_bool)
					{
						if(progression <= 0.5f)
						{
							m_values[idx] = m_from + (m_to - m_from) * EasingManager.GetEaseProgress(m_ease_type, progression/0.5f);
						}
						else
						{
							progression -= 0.5f;
							m_values[idx] = m_to + (m_to_to - m_to) * EasingManager.GetEaseProgress(EasingManager.GetEaseTypeOpposite(m_ease_type), progression/0.5f);
						}
					}
					else
					{
						m_values[idx] = m_from + (m_to - m_from) * EasingManager.GetEaseProgress(m_ease_type, progression);
					}
				}
				
			}
			else if(Progression == (int) ValueProgression.EasedCustom)
			{
				float progression;
				
				for(int idx=0; idx < num_progressions; idx++)
				{
					progression = num_progressions == 1 ? 0 : (float)idx / ((float)num_progressions - 1f);
					
					if(m_ease_curve_per_axis)
					{
						m_values[idx].x = m_from.x + (m_to.x - m_from.x) * m_custom_ease_curve.Evaluate(progression);
						m_values[idx].y = m_from.y + (m_to.y - m_from.y) * m_custom_ease_curve_y.Evaluate(progression);
						m_values[idx].z = m_from.z + (m_to.z - m_from.z) * m_custom_ease_curve_z.Evaluate(progression);
					}
					else
						m_values[idx] = m_from + (m_to - m_from) * m_custom_ease_curve.Evaluate(progression);
				}
			}
			else if(Progression == (int) ValueProgression.Constant)
			{
				for(int idx=0; idx < m_values.Length; idx++)
				{
					m_values[idx] = m_from;
				}
			}
		}