Problème avec std::stringstream pour lire un fichier OBJ
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:
1 2 3 4 5 6
|
while (!ss.eof())
{
ss >> buf;
...
} |
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
Donc si vous avez une idée j'achète.
Code:
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);
} |