Update obj.cpp
This commit is contained in:
@@ -27,14 +27,12 @@ class SkeletalVertex : public Vertex {
|
||||
};
|
||||
|
||||
class Model {
|
||||
private:
|
||||
void loadOBJ(const std::string& filename);
|
||||
void load(const std::string& file);
|
||||
protected:
|
||||
void load(const std::string& file);
|
||||
void loadOBJ(const std::string& filename);
|
||||
std::vector<Vertex> vertices;
|
||||
std::vector<uint> indices;
|
||||
std::vector<TextureInformation> textureInfo;
|
||||
void mapFaces(const FaceIndices& facedata, const std::vector<Vector3>& positions, const std::vector<Vector2>& uvs);
|
||||
public:
|
||||
ModelType type;
|
||||
const std::vector<Vertex>& getVertices();
|
||||
@@ -48,5 +46,5 @@ class SkeletalModel : public Model {
|
||||
protected:
|
||||
std::vector<SkeletalVertex> vertices;
|
||||
public:
|
||||
std::vector<SkeletalVertex>& getSkeletalertices();
|
||||
std::vector<SkeletalVertex>& getSkeletalVertices();
|
||||
};
|
76
src/obj.cpp
76
src/obj.cpp
@@ -1,71 +1,49 @@
|
||||
#include <iostream>
|
||||
#include <types/model.h>
|
||||
|
||||
Vector3 ParseVertexCoordinatesFromOBJ(std::istringstream& stream) {
|
||||
float x, y, z;
|
||||
stream >> x >> y >> z;
|
||||
return {x,y,z};
|
||||
}
|
||||
|
||||
Vector2 ParseVertexTextureCoordinatesFromOBJ(std::istringstream& stream) {
|
||||
float u, v;
|
||||
stream >> u >> v;
|
||||
return {u,v};
|
||||
}
|
||||
|
||||
FaceIndices ParseFaceIndicesFromOBJ(std::istringstream& stream) {
|
||||
FaceIndices face{};
|
||||
char slash;
|
||||
for (int i = 0; i < 3; ++i) {
|
||||
unsigned int vI;
|
||||
unsigned int tCI;
|
||||
|
||||
stream >> vI >> slash >> tCI;
|
||||
|
||||
face.vertexIndex[i] = vI;
|
||||
face.texCoordIndex[i] = tCI;
|
||||
|
||||
// Shift vertexindex by 1
|
||||
face.vertexIndex[i]--;
|
||||
// shift texcoordindex by 1
|
||||
face.texCoordIndex[i]--;
|
||||
}
|
||||
return face;
|
||||
}
|
||||
void Model::loadOBJ(const std::string& filename) {
|
||||
std::ifstream file(filename);
|
||||
if (!file.is_open())
|
||||
std::cerr << filename << " not found." << std::endl;
|
||||
|
||||
//if (!file.is_open())
|
||||
std::vector<Vector3> positions;
|
||||
std::vector<Vector2> uvs;
|
||||
TextureInformation tInfo = {};
|
||||
std::string line;
|
||||
|
||||
// First: We read every (unique) vertex entry and textureCoord entry from the file.
|
||||
// Then: Use Face data to map the bulk data into correct locations.
|
||||
|
||||
// TODO: Check the assumption that we can **always** read all "v", "vt" etc. tokens first,
|
||||
// allowing us to perform a second-pass to reconstruct faces?
|
||||
|
||||
while (std::getline(file, line)) {
|
||||
std::istringstream stream(line);
|
||||
std::string prefix;
|
||||
stream >> prefix;
|
||||
|
||||
|
||||
if (prefix == "v") {
|
||||
auto result = ParseVertexCoordinatesFromOBJ(stream);
|
||||
positions.emplace_back(result);
|
||||
float x, y, z;
|
||||
stream >> x >> y >> z;
|
||||
positions.emplace_back(x, y, z);
|
||||
} else if (prefix == "vt") {
|
||||
auto result = ParseVertexTextureCoordinatesFromOBJ(stream);
|
||||
uvs.emplace_back(result);
|
||||
float u, v;
|
||||
stream >> u >> v;
|
||||
uvs.emplace_back(u, v);
|
||||
} else if (prefix == "f") {
|
||||
auto result = ParseFaceIndicesFromOBJ(stream);
|
||||
mapFaces(result, positions, uvs);
|
||||
unsigned int vertexIndex[3], texCoordIndex[3];
|
||||
char slash;
|
||||
for (int i = 0; i < 3; ++i) {
|
||||
stream >> vertexIndex[i] >> slash >> texCoordIndex[i];
|
||||
vertexIndex[i]--;
|
||||
texCoordIndex[i]--;
|
||||
}
|
||||
|
||||
for (int i = 0; i < 3; ++i) {
|
||||
Vertex vertex;
|
||||
Vector2 textureCoordinate;
|
||||
vertex = positions[vertexIndex[i]];
|
||||
textureCoordinate = uvs[texCoordIndex[i]];
|
||||
|
||||
vertices.push_back(vertex);
|
||||
tInfo.textureCoordinates.push_back(textureCoordinate);
|
||||
indices.push_back(static_cast<unsigned int>(indices.size()));
|
||||
}
|
||||
}
|
||||
}
|
||||
textureInfo.push_back(tInfo);
|
||||
file.close();
|
||||
textureInfo.push_back({"", uvs});
|
||||
};
|
||||
|
||||
// map face of model to positions and texture coords
|
||||
|
@@ -21,6 +21,6 @@ Model::Model(const std::string &file) {
|
||||
load(file);
|
||||
}
|
||||
|
||||
std::vector<SkeletalVertex> &SkeletalModel::getSkeletalertices() {
|
||||
std::vector<SkeletalVertex>& SkeletalModel::getSkeletalVertices() {
|
||||
return vertices;
|
||||
}
|
||||
|
Reference in New Issue
Block a user