#pragma once

#include <vector>



namespace lib_geo
{


//! 基本ポリゴン
class BaseFace
{
public:
	BaseFace(void)
		: m_MatIdx(-1)
	{}

	void ClearAdjBuffer(void);

	//! 頂点数を取得する.
	size_t NumVertices(void) const;
	//! 三角化したときの三角形の枚数を取得する.
	size_t NumTriangles(void) const;

	// 位置以外の要素を持っているか確認する.
	bool HasNormal(void) const;
	bool HasUV(void) const;

	//! 要素数に異常が無いか検証する
	bool VerifyElementCounts(void) const;

	bool HasValidMatIdx(void) const { return m_MatIdx != -1; }

	void CopySubTriangle(BaseFace& f, int lvid0, int lvid1, int lvid2) const;

	void FlipIndexBuf(void);

public:
	std::vector<int>  m_VertIds; //!< 頂点インデックス
	std::vector<int>  m_NormIds; //!< 頂点にバインドされた法線インデックス
	std::vector<int>  m_UVIds;   //!< 頂点にバインドされたUVインデックス

	std::vector<int>  m_AdjEids;

	int               m_MatIdx;  //!< ポリゴンの個別マテリアルインデックス. 未指定 => -1
};


class SubfaceIdx
{
public:
	SubfaceIdx(void) :
		fid(-1),
		subface(-1)
	{
	}
	SubfaceIdx(int fid_, int subface_) :
		fid(fid_),
		subface(subface_)
	{
	}

	void Set(int fid_, int subface_)
	{
		fid = fid_;
		subface = subface_;
	}

	void Reset(void)
	{
		fid = -1;
		subface = -1;
	}

	bool IsValid(void) const
	{
		return (fid != -1 && subface != -1);
	}

public:
	int fid;
	int subface;
};


}
