//
// Copyright (C) 2004 Tanguy Fautré.
// For conditions of distribution and use,
// see copyright notice in tri_stripper.h
//
//////////////////////////////////////////////////////////////////////
// SVN: $Id: types.h 86 2005-06-08 17:47:27Z gpsnoopy $
//////////////////////////////////////////////////////////////////////

#ifndef TRI_STRIPPER_HEADER_GUARD_TYPES_H
#define TRI_STRIPPER_HEADER_GUARD_TYPES_H




namespace triangle_stripper {

	namespace detail {




class triangle
{
public:
	triangle() { }
	triangle(index A, index B, index C)
		: m_A(A), m_B(B), m_C(C), m_StripID(0) { }

	void ResetStripID()							{ m_StripID = 0; }
	void SetStripID(size_t StripID)				{ m_StripID = StripID; }	
	size_t StripID() const						{ return m_StripID; }

	index A() const								{ return m_A; }
	index B() const								{ return m_B; }
	index C() const								{ return m_C; }
	
private:
	index	m_A;
	index	m_B;
	index	m_C;

	size_t	m_StripID;
};



class triangle_edge
{
public:
	triangle_edge(index A, index B)
		: m_A(A), m_B(B) { }

	index A() const								{ return m_A; }
	index B() const								{ return m_B; }

	bool operator == (const triangle_edge & Right) const {
		return ((A() == Right.A()) && (B() == Right.B()));
	}

private:
	index	m_A;
	index	m_B;
};



enum triangle_order { ABC, BCA, CAB };



class strip
{
public:
	strip()
		: m_Start(0), m_Order(ABC), m_Size(0) { }

	strip(size_t Start, triangle_order Order, size_t Size)
		: m_Start(Start), m_Order(Order), m_Size(Size) { }

	size_t Start() const						{ return m_Start; }
	triangle_order Order() const				{ return m_Order; }
	size_t Size() const							{ return m_Size; }

private:
	size_t			m_Start;
	triangle_order	m_Order;
	size_t			m_Size;
};




	} // namespace detail

} // namespace triangle_stripper




#endif // TRI_STRIPPER_HEADER_GUARD_TYPES_H
