summaryrefslogtreecommitdiff
path: root/gfx/models/obj_loader.h
blob: 2fe3d356da60a2dee921999e7f1b3e4dd461e2dd (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
#ifndef OBJ_LOADER_H_INCLUDED
#define OBJ_LOADER_H_INCLUDED

#include <filesystem>
#include <glm/glm.hpp>
#include <string>
#include <vector>

struct OBJIndex {
	unsigned int vertexIndex;
	unsigned int uvIndex;
	unsigned int normalIndex;

	bool
	operator<(const OBJIndex & r) const
	{
		return vertexIndex < r.vertexIndex;
	}
};

class IndexedModel {
public:
	std::vector<glm::vec3> positions;
	std::vector<glm::vec2> texCoords;
	std::vector<glm::vec3> normals;
	std::vector<unsigned int> indices;

	void CalcNormals();
};

class OBJModel {
public:
	std::vector<OBJIndex> OBJIndices;
	std::vector<glm::vec3> vertices;
	std::vector<glm::vec2> uvs;
	std::vector<glm::vec3> normals;
	bool hasUVs;
	bool hasNormals;

	explicit OBJModel(const std::filesystem::path & fileName);

	IndexedModel ToIndexedModel();

private:
	unsigned int FindLastVertexIndex(
			const std::vector<OBJIndex *> & indexLookup, const OBJIndex * currentIndex, const IndexedModel & result);
	void CreateOBJFace(const std::string & line);
	static glm::vec2 ParseOBJVec2(const std::string & line);
	static glm::vec3 ParseOBJVec3(const std::string & line);
	static OBJIndex ParseOBJIndex(const std::string & token, bool * hasUVs, bool * hasNormals);
};

#endif // OBJ_LOADER_H_INCLUDED