#ifndef  __JBXL_FACET_BASE_H_
#define  __JBXL_FACET_BASE_H_


/**
3D Facet用基本データ

*/


#include <vector>
#include <algorithm>

#include "Vector.h"
#include "Rotation.h"
#include "buffer.h"




namespace  jbxl {



class  FacetBaseData;
class  TriPolyData;





//////////////////////////////////////////////////////////////////////////////////////
//
// Facet Base Data (インデックス化されたデータ)
//

class  FacetBaseData
{
public:
	int		num_index;				///< インデックスの数．(index の要素数）
	int     num_data;				///< データ数．（vertex, normal, texcrd の要素数）
	int 	vcount;					///< ポリゴンの頂点数．通常は3 

	int*    index;					///< インデックスデータ
	Vector<double>* vertex;			///< 頂点データ
	Vector<double>* normal;			///< 法線ベクトル
	UVMap<double>*  texcrd;			///< テクスチャマップ

public:
	FacetBaseData(int idx=0, int num=0) { init(idx, num);}
    virtual ~FacetBaseData(void) {}	

	void  init(int idx=0, int num=0);
	void  free(void);
	bool  getm(void);
	void  dup(FacetBaseData a);

public:
	void  execScale(Vector<double> scale);
	void  execShift(Vector<double> shift);
	void  execRotate(Quaternion quat);
};



//FacetBaseData* joinFacetBaseData(FacetBaseData*& first, FacetBaseData*& next);

inline void  freeFacetBaseData(FacetBaseData*& facet) { if(facet!=NULL){ facet->free(); delete facet; facet = NULL;}}





//////////////////////////////////////////////////////////////////////////////////////
//
//  Triangle Polygon Data
//

class  TriPolyData
{
public:
	int 			facetNum;		///< 面番号
	bool			has_normal;		///< 配列データの場合，一番最初のデータが値を持っていれば十分である．
	bool			has_texcrd;		///< 配列データの場合，一番最初のデータが値を持っていれば十分である．

	Vector<double> 	vertex[3];
	Vector<double> 	normal[3];
	UVMap<double>  	texcrd[3];

public:
	TriPolyData(void) { init();}
    virtual ~TriPolyData(void) {}	

	void  init(void);
	void  free(void) { init();}
	void  dup(TriPolyData a);

public:
	void  execScale(Vector<double> scale);
	void  execShift(Vector<double> shift);
	void  execRotate(Quaternion quat);
};



TriPolyData* dupTriPolyData(TriPolyData* data, int num);
TriPolyData* joinTriPolyData(TriPolyData*& first, int num_f, TriPolyData*& next, int num_n);

inline void  freeTriPolyData(TriPolyData*& tridata) { if(tridata!=NULL){ tridata->free(); delete tridata; tridata = NULL;}}
void  freeTriPolyData(TriPolyData*& tridata, int n);





}		// namespace

#endif

