/*
 * ***** BEGIN GPL LICENSE BLOCK *****
 *
 * This program is free software; you can redistribute it and/or
 * modify it under the terms of the GNU General Public License
 * as published by the Free Software Foundation; either version 2
 * of the License, or (at your option) any later version.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with this program; if not, write to the Free Software Foundation,
 * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
 *
 * ***** END GPL LICENSE BLOCK *****
 */

#ifndef __FREESTYLE_TRIANGLE_REP_H__
#define __FREESTYLE_TRIANGLE_REP_H__

/** \file blender/freestyle/intern/scene_graph/TriangleRep.h
 *  \ingroup freestyle
 *  \brief Class to define the represenation of a triangle
 *  \author Stephane Grabli
 *  \date 16/12/2002
 */

//! inherits from class Rep 
#include "Rep.h"

namespace Freestyle {

/*! Base class for all lines objects */
class TriangleRep : public Rep
{
public:
	/*! Line description style */
	enum TRIANGLE_STYLE {
		FILL,
		LINES,
	};

private:
	TRIANGLE_STYLE _Style;
	Vec3r _vertices[3];
	Vec3r _colors[3];

public:
	inline TriangleRep() : Rep()
	{
		_Style = FILL;
	}

	/*! Builds a triangle from 3 vertices
	 *  v0
	 *    first vertex
	 *  v1
	 *    second vertex
	 *  v2
	 *    third vertex
	 */
	inline TriangleRep(const Vec3r& v0, const Vec3r& v1, const Vec3r& v2) : Rep()
	{
		_vertices[0] = v0;
		_vertices[1] = v1;
		_vertices[2] = v2;
		_Style = FILL;
	}

	inline TriangleRep(const Vec3r& v0, const Vec3r& c0, const Vec3r& v1, const Vec3r& c1,
	                   const Vec3r& v2, const Vec3r& c2)
	: Rep()
	{
		_vertices[0] = v0;
		_vertices[1] = v1;
		_vertices[2] = v2;
		_colors[0] = c0;
		_colors[1] = c1;
		_colors[2] = c2;
		_Style = FILL;
	}

	virtual ~TriangleRep() {}

	/*! accessors */
	inline const TRIANGLE_STYLE style() const
	{
		return _Style;
	}

	inline const Vec3r& vertex(int index) const
	{
		return _vertices[index];
	}

	inline const Vec3r& color(int index) const
	{
		return _colors[index];
	}

	/*! modifiers */
	inline void setStyle(const TRIANGLE_STYLE iStyle)
	{
		_Style = iStyle;
	}

	inline void setVertex(int index, const Vec3r& iVertex)
	{
		_vertices[index] = iVertex;
	}

	inline void setColor(int index, const Vec3r& iColor)
	{
		_colors[index] = iColor;
	}

	inline void setVertices(const Vec3r& v0, const Vec3r& v1, const Vec3r& v2)
	{
		_vertices[0] = v0;
		_vertices[1] = v1;
		_vertices[2] = v2;
	}

	inline void setColors(const Vec3r& c0, const Vec3r& c1, const Vec3r& c2)
	{
		_colors[0] = c0;
		_colors[1] = c1;
		_colors[2] = c2;
	}

	/*! Accept the corresponding visitor */
	virtual void accept(SceneVisitor& v)
	{
		Rep::accept(v);
		v.visitTriangleRep(*this);
	}

	/*! Computes the triangle bounding box.*/
	virtual void ComputeBBox();
};

} /* namespace Freestyle */

#endif  // __FREESTYLE_TRIANGLE_REP_H__
