Add 'parse.cpp'
This commit is contained in:
parent
4b2a9db74e
commit
a3a3142bdd
111
parse.cpp
Normal file
111
parse.cpp
Normal file
@ -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…
x
Reference in New Issue
Block a user