#include "ats_LTailBoid.h"
#include <GL/glut.h>

// 識別子が長すぎるワーニングを無効
#pragma warning (disable : 4786)

using namespace ats;
using namespace std;

LTailBoid::LTailBoid(int max, int max2, int tail_num)
: Boid<LTailBoid>(max,max2, tail_num)
{
	
}

LTailBoid::~LTailBoid()
{

}

void LTailBoid::Draw()
{
	// 方向を足す
	Point3D tmp((m_muki.GetNormal() *0.1) + m_center);
	double color = 1.0;
	double step = color / m_tail_num;

	// とりあえず、ラインで描画する
	// 描画するのは位置から方向(速度は無視)
	glDisable(GL_LIGHTING);
	glBegin(GL_LINES);
		glColor3f(0,0,0);
		glVertex3d(tmp.X(), tmp.Y(), tmp.Z());
		glColor3d(1, 1, 1);
		glVertex3d(m_center.X(), m_center.Y(), m_center.Z());
		vector<Point3D>::iterator itr = m_tail_itr;
		for(int i=0; i < m_tail_num; i++){
			if(++itr == m_tail.end()){ // イテレータを移動
				itr = m_tail.begin();
			}
			color -= step;
			glColor3f(color, color, color);
			glVertex3d(itr->X(), itr->Y(), itr->Z());
		}
	glEnd();
	glEnable(GL_LIGHTING);
}

void LTailBoid::UpdateTime(double time)
{
	using namespace std;

	bool crush_flag = false;
	// そのまま
	//if(m_parent != 0 && m_near != 0){
	// Nearはしょる
	if(m_parent != 0){
		// 次の方向 = 中央への方向 + 現在の方向 + 群れの方向
		// 向き = 群への協調 + 自分の慣性 + ニアミスを避ける。
		//Point3D go_parent(m_parent->Center() - m_center);
		//Point3D not_crush(m_center - m_near->m_center);

		// 中心へ ＋ 群への協調 ＋ 慣性 ＋ 衝突回避
		// OK m_muki = ((m_parent->Center()-m_center)*0.03 + m_parent->Muki()*0.03 + m_muki*0.95 + m_near->GetMuki()*0.01);
		// Nearをはしょってないやつ
		m_muki = ((m_parent->Center()-m_center)*0.23 + m_parent->Muki()*0.023 + m_muki*1.5);// + m_near->GetMuki()*0.01);
		// Nearをはしょったやつ
		//m_muki = ((m_parent->Center()-m_center)*0.05 + m_parent->Muki()*0.08 + m_muki*1.1);
		m_muki.Normalize() *= m_speed;

		// ボックスの外側にあって
		if(m_center.X() > m_box_max || m_center.X() < m_box_min ||
		   m_center.Y() > m_box_max || m_center.Y() < m_box_min ||
		   m_center.Z() > m_box_max || m_center.Z() < m_box_min)
		{
			m_center *= 0.98; // ちょっと中心に寄せてやってから
			m_muki *= -0.5; // 方向反転
		}
		else {
			m_muki += (Point<double>(rand()%10-5,rand()%10-5,rand()%10-5)).Normalize()*0.057;
			//m_muki.Normalize();
		}

		// 前の位置を保存
		*m_tail_itr = m_center;
		if(m_tail_itr == m_tail.begin()){ // イテレータを逆向きに移動
			m_tail_itr = m_tail.end();
			m_tail_itr--;
		} else {
			m_tail_itr--;
		}
		m_center += m_muki * 0.03;
	}
}

