#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) { printf("model scale: %f\n", 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); } }