#pragma once
#include <string>

using namespace std;

class PosGeometry
{
public:
	PosGeometry(void);

	/*
	 * Sets the name of this Geometry (globally unique!)
	 * @param name: the name
	 */
	virtual void setName(string name) = 0;

	/*
	 * Gets the name of this Geometry
	 * @return the name
	 */
	virtual string getName(void) = 0;

	/*
	 * Sets the axis aligned bounding box for this Geometry
	 * @param boundingBoxMin: float[3]
	 * @param boundingBoxMax: float[3]
	 */
	virtual void setBoundingBox(float* boundingBoxMin, float* boundingBoxMax) = 0;

	/*
	 * Sets the bounding sphere for this Geometry
	 * @param boundingSphereCenter: float[3]
	 * @param boundingSphereRadius: The radius of the sphere
	 */
	virtual void setBoundingSphere(float* boundingSphereCenter, float boundingSphereRadius) = 0;

	/*
	 * Informs you whether there will be tangents or not
	 * will be called before the first addVertex call
	 * @param hasTangents: true if there'll be tangents
	 */
	virtual void setHasTangents(bool hasTangents) = 0;

	/*
	 * Informs you whether there will be binormals or not
	 * will be called before the first addVertex call
	 * @param hasBinormals: true if there'll be binormals
	 */
	virtual void setHasBinormals(bool hasBinormals) = 0;

	/*
	 * Sets the number of Texture Coordinate sets and their dimensions
	 * will be called before the first addVertex call
	 * @param numTexcoordSets: specifies how many texture coordinate sets this Geometry has
	 * @param dimensions:	int[numTexcoordSets], specifies how many dimensions (normally
	 *						2 or 3, but may not be limited to that) each texture coordinate
	 *						set has. NULL if numTexcoordSets is 0
	 */
	virtual void setTextureDimensions(int numTexcoordSets, int* dimensions) = 0;

	/*
	 * Sets the number of vertices in this Geometry
	 * will be called right before the first call to addVertex, use this to reserve space in
	 * vectors etc.
	 * @param numVertices: The number of vertices of this Geometry.
	 */
	virtual void setNumVertices(int numVertices) = 0;

	/*
	 * Adds a Vertex to the current Geometry. Vertices are given in Triangle-List format.
	 * Expect setHasTangents, setHasBinormals, setTextureDimensions and setNumVertices to be called before the
	 * first call to this method.
	 * @param position:		float[3], specifying this vertex's position
	 * @param normal:		float[3], specifying this vertex's normal
	 * @param tangent:		float[3], specifying this vertex's tangent (might be NULL)
	 * @param binormal:		float[3], specifying this vertex's binormal (might be NULL)
	 * @param texcoords:	float[texcoord_set][dimension_of_this_set], specifying this vertex's texcoords (might be NULL)
	 */
	virtual void addVertex(float* position, float* normal, float* tangent, float* binormal, float** texcoords) = 0;

	virtual ~PosGeometry(void);
};
