Add 'parse.cpp'

main
sigonasr2 1 year ago
parent 4b2a9db74e
commit a3a3142bdd
  1. 111
      parse.cpp

@ -0,0 +1,111 @@
```cpp
void parse(const char* filename, std::vector<vec3d> &vBuffer, std::vector<vec2d> &tBuffer, std::vector<subMesh> &meshList) {
std::ifstream file(filename);
if (!file) {
return;
}
parse(file, vBuffer, tBuffer, meshList);
}
void parse(std::istream& file, std::vector<vec3d> &vBuffer, std::vector<vec2d> &tBuffer, std::vector<subMesh> &meshList) {
std::string mtlPath;
std::string line;
subMesh currMesh;
while (std::getline(file, line)) {
std::stringstream ss(line);
//reads until white space
ss.unsetf(std::ios_base::skipws);
ss >> std::ws;
// If the line is empty
if (ss.eof()) {
continue;
}
if (ss.peek() == '#') {
// Comment line in file
continue;
}
std::string keyword;
ss >> keyword;
//In the case of a vertex coordinate
if (keyword == "v") {
vec3d v;
ss >> std::ws >> v.x >> std::ws >> v.y >> std::ws >> v.z >> std::ws;
vBuffer.push_back(v);
}
//In the case of a texture coordinate
else if (keyword == "vt") {
vec2d t;
ss >> std::ws >> t.u >> std::ws >> t.v >> std::ws;
//t.u = 1.0f - t.u;
//t.v = 1.0f - t.v;
tBuffer.push_back(t);
}
//In the case of a face
else if (keyword == "f") {
triangle currFace;
std::vector<std::string> parts;
std::vector<int> vertIndices;
std::vector<int> texIndices;
while (!ss.eof()) {
//Read each section is as a part of a list
int pointcount = 0;
std::string part;
ss >> std::ws >> part >> std::ws;
parts.push_back(part);
for (unsigned int i = 0; i < parts.size(); i++) {
int vert;
int tex;
std::stringstream partSS(parts[i]);
partSS >> vert;
if (!partSS.eof() && (partSS.peek() == '/')) {
char slash1;
partSS >> slash1;
partSS >> tex;
currFace.texs[pointcount] = tex;
currFace.texs[pointcount] = currFace.texs[pointcount] - 1;
}
currFace.verts[pointcount++] = vert;
currFace.verts[pointcount - 1] = currFace.verts[pointcount - 1] - 1;
}
}
currMesh.triGroup.push_back(currFace);
}
else if (keyword == "o") {
if (currMesh.name.empty()) {
ss >> std::ws >> currMesh.name;
}
else {
meshList.push_back(currMesh);
currMesh = {};
ss >> std::ws >> currMesh.name;
}
}
else if (keyword == "mtllib") {
mtlPath = line.substr(7);
}
else if (keyword == "usemtl") {
std::string material;
ss >> std::ws >> material;
getTexturePath(material, mtlPath, currMesh);
}
}
meshList.push_back(currMesh);
}
```
Loading…
Cancel
Save