#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);
}
}