#include "../include/Mesh.h" #include #include #include #ifdef _WIN32 #define NOMINMAX //Stop errors with std::max #include #endif #include #include #include #include #include #include //#include "util.h" typedef double real_t; ///@brief is a point inside a box bool ptInBox(const CompFab::Vec3 & mn, const CompFab::Vec3 mx, const CompFab::Vec3 & x) { for(int dim = 0 ;dim<3;dim++){ if(x[dim] mx[dim]){ return false; } } return true; } void makeCube(Mesh & m, const CompFab::Vec3 & mn, const CompFab::Vec3 mx) { CompFab::Vec3 ss = mx -mn; m=UNIT_CUBE; for(unsigned int ii = 0;ii&_v, const std::vector&_t):v(_v),t(_t) { compute_norm(); } Mesh::Mesh(const CompFab::Vec3 * _v, const CompFab::Vec3i * _t) { v.assign(_v,_v+8); t.assign(_t,_t+12); compute_norm(); } Mesh::~Mesh() { } void Mesh::save(std::ostream & out, std::vector * vert) { std::string vTok("v"); std::string fTok("f"); std::string texTok("vt"); char bslash='/'; std::string tok; if(vert==0){ vert = &v; } for(size_t ii=0;iisize();ii++){ out<0){ for(size_t ii=0;ii>tok; if(tok==vTok) { CompFab::Vec3 vec; ss>>vec[0]>>vec[1]>>vec[2]; v.push_back(vec); } else if(tok==fTok) { bool hasTexture = false; if (line.find(bslash) != std::string::npos) { std::replace(line.begin(), line.end(), bslash, space); hasTexture = true; } std::stringstream facess(line); facess>>tok; std::vector vidx; std::vector texIdx; int x; while(facess>>x){ vidx.push_back(x); if(hasTexture){ facess>>x; texIdx.push_back(x); } } texIdx.resize(vidx.size()); for(int ii = 0;ii<(int)vidx.size()-2;ii++){ CompFab::Vec3i trig, textureId; trig[0] = vidx[0]-1; textureId[0] = texIdx[0]-1; for (int jj = 1; jj < 3; jj++) { trig[jj] = vidx[ii+jj]-1; textureId[jj] = texIdx[ii+jj]-1; } t.push_back(trig); texId.push_back(textureId); } } else if(tok==texTok) { CompFab::Vec2f texcoord; ss>>texcoord[0]; ss>>texcoord[1]; tex.push_back(texcoord); } } std::cout<<"Num Triangles: "<< t.size()<<"\n"; } void Mesh::read_ply(std::istream & f) { std::string line; std::string vertLine("element vertex"); std::string faceLine("element face"); std::string texLine("property float s"); std::string endHeaderLine("end_header"); while(true) { std::getline(f,line); if(std::string::npos!=line.find(vertLine)) { break; } } std::string token; std::stringstream ss(line); ss>>token>>token; int nvert; ss>>nvert; bool hasTex=false; while(true) { std::getline(f,line); if(std::string::npos!=line.find(faceLine)) { break; } if(std::string::npos!=line.find(texLine)) { hasTex=true; } } std::stringstream ss1(line); ss1>>token>>token; int nface; ss1>>nface; while(true) { std::getline(f,line); if(std::string::npos!=line.find(endHeaderLine)) { break; } } v.resize(nvert); t.resize(nface); if(hasTex) { tex.resize(nvert); } for (int ii =0; ii>v[ii][jj]; } if(hasTex) { for (int jj=0; jj<2; jj++) { f>>tex[ii][jj]; } tex[ii][1]=1-tex[ii][1];; } } for (int ii =0; ii>nidx; for (int jj=0; jj<3; jj++) { f>>t[ii][jj]; } } } void Mesh::save_obj(const char * filename) { std::ofstream out(filename); if(!out.good()){ std::cout<<"cannot open output file"<=(int)n.size() || t[ii][jj]<0){ std::cout< > & adjMat) { if(adjMat.size()==m.t.size()) { return; } std::vector >trigList; trigList.resize(m.v.size()); for (unsigned int ii=0; ii& v, CompFab::Vec3 & mn, CompFab::Vec3 & mx) { mn = v[0]; mx = v[0]; for(unsigned int ii = 1 ;iimx[dim]){ mx[dim] = v[ii][dim]; } } } }