Newer
Older
cg / sources / model.cpp
#include "model.h"

#include <string>

Model::Model() {
	drawMe = true;
}

Model::Model(vector<Poly*> & _faces) {
	for (std::vector<Poly*>::size_type i = 0 ; i < _faces.size(); i++ ) {
		faces.push_back(_faces.at(i));
	}

	Vec c = calcCenter();
	setCenter(c);
	drawMe = true;
}

Model::~Model() {
}

void Model::setCenter(Vec* c) {
	for (std::vector<Poly*>::size_type i = 0 ; i < faces.size(); i++ ) {
		faces.at(i)->setCenter(c);
	}
}

void Model::setCenter(Vec& c) {  
	for (std::vector<Poly*>::size_type i = 0 ; i < faces.size(); i++ ) {
		faces.at(i)->setCenter(c);
	}
}

void Model::setMaterial(Color ambient, Color specular) {
  Material m = Material(ambient, specular);
	for (std::vector<Poly*>::size_type i = 0 ; i < faces.size(); i++ ) {
		faces.at(i)->setMaterial(m);
	}  
}

Vec Model::calcCenter() {
	Vec s(0,0,0);

	if ( faces.size() == 0 ) {
		return s;
	}

	for ( std::vector<Poly*>::size_type i = 0; i < faces.size(); i++ ) {
		s = s + faces.at(i)->calcCenter();
	}

	return s / (float)faces.size();
}

void Model::rotate(Vec rot) {
	for (std::vector<Poly*>::size_type i = 0 ; i < faces.size(); i++ ) {
		faces.at(i)->rotate(rot);
	}
}

void Model::draw() {
	if ( drawMe ) {
		for (std::vector<Poly*>::size_type i = 0 ; i < faces.size(); i++ ) {
			faces.at(i)->draw();
		}
	}
}

void Model::addFace(Poly* face) {
	faces.push_back(face);
}

int Model::numFaces() {
	return faces.size();
}

void Model::vardump(std::string whitespace) {
	printf("%sModel(%d faces)\n",
		whitespace.c_str(), faces.size());

	for (std::vector<Poly*>::size_type i = 0 ; i < faces.size(); i++ ) {
		faces.at(i)->vardump(whitespace+"	");
	}
}

void Model::setDelta(float d) {
	delta = d;

	for (std::vector<Poly*>::size_type i = 0 ; i < faces.size(); i++ ) {
		faces.at(i)->setDelta(d);
	}
}

float Model::getDelta() {
	return delta;
}

void Model::showNormals() {
	for (std::vector<Poly*>::size_type i = 0 ; i < faces.size(); i++ ) {
		faces.at(i)->showNormals();
	}
}

void Model::hideNormals() {
	for (std::vector<Poly*>::size_type i = 0 ; i < faces.size(); i++ ) {
		faces.at(i)->hideNormals();
	}
}

Model* Model::clone() {
	Model* nm = new Model();

	for (std::vector<Poly*>::size_type i = 0 ; i < faces.size(); i++ ) {
		nm->addFace(faces.at(i)->clone());
	}

	nm->setCenter(position);
	nm->setDelta(delta);

	return nm;
}

void Model::setColor(Color* c) {
	for (std::vector<Poly*>::size_type i = 0 ; i < faces.size(); i++ ) {
		faces.at(i)->setColor(c);
	}
}

void Model::show() {
	drawMe = true;
}

void Model::hide() {
	drawMe = false;
}

void Model::translate(Vec d) {
	for (std::vector<Poly*>::size_type i = 0 ; i < faces.size(); i++ ) {
		faces.at(i)->translate(d);
	}
}

void Model::scale(float f) {
	for (std::vector<Poly*>::size_type i = 0 ; i < faces.size(); i++ ) {
		faces.at(i)->scale(f);
	}
}

void Model::setPosition(Vec p) {
	for (std::vector<Poly*>::size_type i = 0 ; i < faces.size(); i++ ) {
		faces.at(i)->setPosition(p);
	}
}

void Model::setPosition(Vec* p) {
	for (std::vector<Poly*>::size_type i = 0 ; i < faces.size(); i++ ) {
		faces.at(i)->setPosition(p);
	}
}