void KeyFrameController::AddKeyframe(float time, Quaternion quaternion){
	setRotation_Type(RT_QUATERNION);
	if (RotationTimes.size() == 0 || time >= RotationTimes[RotationTimes.size() - 1]) //no previous data
	{
		RotationTimes.push_back(time);
		qRotationData.push_back(quaternion);
	}
	else //insert
	{
		std::vector<float>::iterator it1 = RotationTimes.begin();
		std::vector<Quaternion>::iterator it2 = qRotationData.begin();
		while (time>*it1 && it1 != RotationTimes.end())
		{
			it1++;
			it2++;
		}
		RotationTimes.insert(it1 - 1, time);
		qRotationData.insert(it2 - 1, quaternion);
	}
	//set active range when apply
	if (RotationTimes.size() >= 4){
		//set active range
		setActiveLength(RotationTimes[1], RotationTimes[RotationTimes.size() - 2]);
	}
}
void KeyFrameController::AddKeyframe(float time, Fixed_Angle fixed_angles){
	setRotation_Type(RT_FIXED);
	if (RotationTimes.size() == 0) //no previous data
	{
		RotationTimes.push_back(time);
		RotationData.push_back(fixed_angles);
	}
	else if (time >= translationTimes[translationTimes.size() - 1]){
		RotationTimes.push_back(time);
		RotationData.push_back(fixed_angles);
	}
	else //insert
	{
		std::vector<float>::iterator it1 = RotationTimes.begin();
		std::vector<Fixed_Angle>::iterator it2 = RotationData.begin();
		while (time>*it1 && it1 != RotationTimes.end())
		{
			it1++;
			it2++;
		}
		RotationTimes.insert(it1 - 1, time);
		RotationData.insert(it2 - 1, fixed_angles);
	}
	//set active range when apply
	if (RotationTimes.size() >= 4){
		//set active range
		setActiveLength(RotationTimes[1], RotationTimes[RotationTimes.size() - 2]);
	}

}
void RDPanelButton::reset()
{
    if(button_length[button_hook_mode]>0) {
        setActiveLength(button_length[button_hook_mode]);
    }
    else {
        setActiveLength(button_length[0]);
    }
    button_start_time=QTime();
    button_end_time=QTime();
    setColor(button_default_color);
    if(button_cart!=0) {
        WriteKeycap(-1);
    }
    setDeck(-1);
    button_play_deck=NULL;
}
void KeyFrameController::AddKeyframe(float time, Vec3f position, Fixed_Angle fixed_angles){
	setRotation_Type(RT_FIXED);
	////handling translation
	//if (translationTimes.size() == 0){    //no previous data
	//	translationTimes.push_back(time);
	//	TransitionData.push_back(position);
	//}
	//else if (time>=translationTimes[translationTimes.size() - 1]) // extend active frame
	//{
	//	translationTimes.push_back(time);
	//	TransitionData.push_back(position);
	//}
	//else{// insert frame in the middle
	//	std::vector<float>::iterator it1 = translationTimes.begin();
	//	std::vector<Vec3f>::iterator it2=TransitionData.begin();
	//	while (time>*it1)
	//	{
	//		it1++;
	//		it2++;
	//	}
	//	translationTimes.insert(it1 - 1, time);
	//	TransitionData.insert(it2-1,position);
	//}


	//handling rotation
	if (RotationTimes.size() == 0) //no previous data
	{
		RotationTimes.push_back(time);
		RotationData.push_back(fixed_angles);
	}
	else if (time>=translationTimes[translationTimes.size() - 1]){
		RotationTimes.push_back(time);
		RotationData.push_back(fixed_angles);
	}
	else //insert
	{
		std::vector<float>::iterator it1 = RotationTimes.begin();
		std::vector<Fixed_Angle>::iterator it2 = RotationData.begin();
		while (time>*it1 && it1 != RotationTimes.end())
		{
			it1++;
			it2++;
		}
		RotationTimes.insert(it1 - 1, time);
		RotationData.insert(it2 - 1, fixed_angles);
	}
	//set active range when apply
	if (translationTimes.size() >= 4){
		//set active range
		setActiveLength(translationTimes[1], translationTimes[translationTimes.size() - 2]);
	}
}
void KeyFrameController::AddKeyframe(float time, Vec3f position, Quaternion quaternion){
	setRotation_Type(RT_QUATERNION);
	quaternion.normalize();
	//handling translation
	if (translationTimes.size() == 0){    //no previous data
		translationTimes.push_back(time);
		TransitionData.push_back(position);
	}
	else if (time>=translationTimes[translationTimes.size()-1]) // extend active frame
	{
		translationTimes.push_back(time);
		TransitionData.push_back(position);
	}
	else{// insert frame in the middle
		std::vector<float>::iterator it1=translationTimes.begin();
		std::vector<Vec3f>::iterator it2=TransitionData.begin();
		while (time>*it1&&it1!=translationTimes.end())
		{
			it1++;
			it2++;
		}
		translationTimes.insert(it1 - 1, time);
		TransitionData.insert(it2-1,position);
	}


	//handling rotation
	if (RotationTimes.size() == 0 || time>=translationTimes[translationTimes.size() - 1]) //no previous data
	{
		RotationTimes.push_back(time);
		qRotationData.push_back(quaternion);
	}
	else //insert
	{
		std::vector<float>::iterator it1 = RotationTimes.begin();
		std::vector<Quaternion>::iterator it2=qRotationData.begin();
		while (time>*it1 && it1!=RotationTimes.end())
		{
			it1++;
			it2++;
		}
		RotationTimes.insert(it1 - 1, time);
		qRotationData.insert(it2 - 1, quaternion);
	}
	//set active range when apply
	if (translationTimes.size()>=4){
		//set active range
		setActiveLength(translationTimes[1], translationTimes[translationTimes.size() - 2]);
	}
}