/********************************************************************
 * File: Model.cpp
 * Author: Keith Schwarz (htiek@cs.stanford.edu)
 *
 * Implementation of the Model class.
 */
#include "Model.h"
using namespace std;

/* Constructor sets the model's name. */
Copper3D::Model::Model(const string& name) {
	mName = name;
}

/* Destructor does nothing. */
Copper3D::Model::~Model() {
}

/* Query number of points or triangles. */
size_t Copper3D::Model::numPoints() const {
	return mPoints.size();
}
size_t Copper3D::Model::numTriangles() const {
	return mTriangles.size();
}

/* Query for elements at particular points. */
Vector<3> Copper3D::Model::point(size_t index) const {
	return mPoints.at(index);
}
Copper3D::Triangle Copper3D::Model::triangle(size_t index) const {
	return mTriangles.at(index);
}

/* Name lookup. */
string Copper3D::Model::name() const {
	return mName;
}

/* Iterator support. */
Copper3D::Model::point_iterator Copper3D::Model::point_begin() const {
	return mPoints.begin();
}
Copper3D::Model::point_iterator Copper3D::Model::point_end() const {
	return mPoints.end();
}
Copper3D::Model::triangle_iterator Copper3D::Model::triangle_begin() const {
	return mTriangles.begin();
}
Copper3D::Model::triangle_iterator Copper3D::Model::triangle_end() const {
	return mTriangles.end();
}

/* Add points or triangles. */
size_t Copper3D::Model::addTriangle(const Triangle& triangle) {
	mTriangles.push_back(triangle);
	return numTriangles() - 1;
}

size_t Copper3D::Model::addPoint(const Vector<3>& pt) {
	mPoints.push_back(pt);
	return numPoints() - 1;
}

/* Factory function. */
Copper3D::Model* Copper3D::Model::New(const string& name) {
	return new Model(name);
}
