#if !defined ATS_BOID_H
#define ATS_BOID_H

#include <iostream>
#include "ats_point.h"
#include "ats_leaf.h"
#include "ats_BoidGroup.h"
#include "ats_BoundingFrame.h"
#include <vector>

namespace ats
{
	// バードロイドの各個体 --------------------------------------------------
	class Boid : public Leaf3DD
	{
	private:
		Boid(const Boid& boid);        // コピー禁止
		Boid& operator=(const Boid&); // コピー禁止

	protected:
		// 見えない壁（Boidの動く範囲）
		static double m_box_left, m_box_right, m_box_top,
		              m_box_bottom, m_box_front,m_box_back;
		static double m_box_max, m_box_min;
		BoidGroup* m_parent; // 親（所属するグループ）
		Point3D m_center;    // 現在地
		Point3D m_muki;      // 向き(別に単位ベクトルって訳じゃなく、ルーズ)
		double  m_speed;     // 個体のスピード
		Boid*   m_near;      // ニアミスしそうな兄弟
		int     m_tail_num;  // 尾数
		std::vector<Point3D> m_tail;      // 尾
		std::vector<Point3D>::iterator m_tail_itr;

	public:
		// 引数 : 範囲、範囲、尻尾数、スピード
		Boid(int max = 5, int max2 = 2, int tail_num = 1, double speed = 1);
		virtual ~Boid();
		//static  void SetBox(double, double, double, double, double, double);
		virtual void Draw() = 0; // 描画関数
		virtual void UpdateTime(double time); // 時間更新
		virtual void SetNear(Boid*);
		virtual Boid* GetNear() const;
		virtual bool IsNear() const;
		virtual void SetParent(BoidGroup*);
		virtual BoidGroup* GetParent() const;
		virtual bool IsParent() const; // どっかに所属してる？
		virtual Point3D GetCenter() const;
		virtual void SetCenter(const Point3D&);
		virtual Point3D GetMuki() const;
		virtual void SetMuki(const Point3D&);
		virtual void SetTailNumber(const int);
		virtual int GetTailNumber() const;
		virtual void SetSpeed(const double);
		virtual double GetSpeed() const;
		virtual Point3D GetTailPoint(int) const; // 尻尾の座標ゲット
	};
}
#endif // ATS_BOID_H
