#include "model.h"
#include <string>
Model::Model() {
rotation = new Vec(0,0,0);
position = new Vec(0,0,0);
}
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);
rotation = new Vec(0,0,0);
}
Model::~Model() {
delete position;
delete rotation;
}
void Model::setCenter(Vec* c) {
position = c->clone();
for (std::vector<Poly*>::size_type i = 0 ; i < faces.size(); i++ ) {
faces.at(i)->setCenter(position);
}
}
void Model::setCenter(Vec& c) {
position = c.clone();
for (std::vector<Poly*>::size_type i = 0 ; i < faces.size(); i++ ) {
faces.at(i)->setCenter(c);
}
}
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) {
rotation->add((Vec)rot);
for (std::vector<Poly*>::size_type i = 0 ; i < faces.size(); i++ ) {
faces.at(i)->rotate(rot);
}
}
void Model::draw() {
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, center: [%f, %f, %f], rotation: [%f, %f, %f])\n",
whitespace.c_str(), faces.size(), position->x(), position->y(), position->z(),
rotation->x(), rotation->y(), rotation->z());
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;
}