bool PtexViewer::loadFile(std::string filename, int face) { Ptex::String ptexError; PtexPtr<PtexTexture> r(PtexTexture::open(filename.c_str(), ptexError, true)); _quads = true; if (!r) { fprintf(stderr,"%s\n",ptexError.c_str()); return false; } if (face>=r->numFaces()) { std::cerr << "Invalid face ID requested" << std::endl; return false; } removeSceneData(); _numFaces = r->numFaces(); _typeStr = Ptex::DataTypeName(r->dataType()); _quads = r->meshType()==Ptex::mt_quad; _mode3d = false; _envCube = false; if (_enable3D && r->numFaces()==6 && face<0) { // Test for environment cube case _envCube = true; int adjfaces[6][4] = { { 3, 5, 2, 4 }, // px { 3, 4, 2, 5 }, // nx { 4, 0, 5, 1 }, // py { 5, 0, 4, 1 }, // ny { 3, 0, 2, 1 }, // pz { 3, 1, 2, 0 } // nz }; int fi = 0; while (fi<6 && _envCube) { const Ptex::FaceInfo& f = r->getFaceInfo(fi); for (int v=0; v<4; v++) if (f.adjfaces[v]!=adjfaces[fi][v]) _envCube = false; fi++; } } if (_envCube) { // Construct environment cube geometry float cubeVerts[8][3] = { {-1,-1,-1}, {1,-1,-1}, {1,-1, 1}, {-1,-1, 1}, {-1, 1,-1}, {1, 1,-1}, {1, 1, 1}, {-1, 1, 1} }; int cubeInds[6][4] = { {2,1,5,6}, {0,3,7,4}, {7,6,5,4}, {0,1,2,3}, {3,2,6,7}, {1,0,4,5} }; for (int i=0; i<8; i++) _geometry.addVertex(cubeVerts[i]); for (int fi=0; fi<6; fi++) { const Ptex::FaceInfo& f = r->getFaceInfo(fi); polygon q; for (int v=0; v<4; v++) q.indices[v] = cubeInds[fi][v]; q.ures = f.res.u(); q.vres = f.res.v(); _geometry.addFace(q); } _mode3d = true; } else { if (_enable3D) _mode3d = _geometry.loadFromMetaData(r); if (_geometry.empty()) _geometry.makeFlatGeom(r); for (int fi=0; fi<r->numFaces(); fi++) { polygon* q = _geometry.getFace(fi); if (!q) continue; const Ptex::FaceInfo& f = r->getFaceInfo(fi); q->ures = f.res.u(); q->vres = f.res.v(); } } _geometry.makePages(r); computeBounds(); return true; }