Bonjour
Je travaille actuellement sur un loader de fichier OBJ et j'ai un petit souci lors de la lecture des lignes concernant la description des faces.
Une ligne décrivant une face est composée comme suit :
Je charge ma ligne dans mon stringstream comme décrit dans la parti le code puis je boucle tant que je n'ai pas atteins la fin de celui-ci
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 f 1/1/1 2/2/2 3/3/3
Et le problème c'est que je passe 4 fois dans le while alors que ne devrais y passer que 3 fois : une fois pour '1/1/1', une autre pour '2/2/2' et une dernière pour '3/3/3'. Cependant je me retrouve avec 2 fois le contenu de '3/3/3' dans mon 'buf'. Pour le moment je sors de ma boucle avec le
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6 while (!ss.eof()) { ss >> buf; ... }
Donc si vous avez une idée j'achète.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3 if (i > 2) break;
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94 MeshPtr OBJMeshLoader::createMesh(const std::string& fileName) { std::ifstream file; file.open(fileName.c_str(), std::ifstream::in); if (!file) return MeshPtr(); Mesh* mesh = OPG_NEW Mesh(); std::vector<Vector3> verticesBuffer; std::vector<Vector3> normalsBuffer; std::vector<Vector2> UVsBuffer; std::string line; std::string code; std::map<MeshVertex::IndexType, MeshVertex> meshIndexMap; SubMeshPtr currentSubMesh(OPG_NEW SubMesh()); while (std::getline(file, line)) { std::stringstream ss(line); ss >> code; if (code == "mtllib") // material { std::string mtl; readMaterial(mtl, ss); } else if (code == "v") // vertex { Vector3 vertex; readVector3(vertex, ss); verticesBuffer.push_back(vertex); } else if (code == "vn") // vertex normal { Vector3 normal; readVector3(normal, ss); normalsBuffer.push_back(normal); _useNormals = true; } else if (code == "vt") // vertex texture { Vector2 uv; readUV(uv, ss); UVsBuffer.push_back(uv); _useUVs = true; } else if (code == "f") // face { MeshVertex v; int i = 0; std::string buf; while (!ss.eof()) { if (i>2) break; ss >> buf; MeshVertex::IndexType idx[3]; readFace(buf, idx); if (idx[0] != -1) v.position = verticesBuffer[idx[0]]; if (idx[1] != -1) v.uv = UVsBuffer[idx[1]]; if (idx[2] != -1) v.normal = normalsBuffer[idx[2]]; std::map<MeshVertex::IndexType, MeshVertex>::const_iterator it = meshIndexMap.find(idx[0]); if (it == meshIndexMap.end()) { currentSubMesh->vertices.push_back(v); meshIndexMap[idx[0]] = v; } currentSubMesh->indices.push_back(idx[0]); i++; buf.clear(); } } } file.close(); mesh->addSubMesh(currentSubMesh); return MeshPtr(mesh); }
Partager