[String zerlegen] Gibt's das auch in hübsch?



  • Hallo,

    ich arbeite gerade an einem Loader für .obj 3D-Models. In der Datei sind Polygone in der Form "Vertexindex/Texcoordindex/Normalenindex" abgelegt, z.B.:

    f 106/1/1 108/2/2 271/3/3
    

    Dazu habe ich mir gestern folgenden Code zum Laden zusammengefrickelt:
    (Der Einfachheit halber beschränke ich mich bei den Models auf Dreiecke)

    else if(linetype == "f")				//the line contains face data
    			{
    				//each face is specified by a triplet of vertex-, texcoord- and normal-indices
    				//seperated by a single slash
    				//i.e. 10/200/3
    				std::string vertexstring;
    
    				for(int ii=0; ii<=2; ii++)
    				{
    					Vertex vertex;
    
    					linestream >> vertexstring; //linestream ist ein istringstream, der mit der aktuellen Dateizeile gefüttert wird
    
    					//seperate data by '/'
    					std::string::size_type slashpos = vertexstring.find_first_of("/");
    
    					//read vertex index
    					std::istringstream vertex_stream(vertexstring.substr(0, slashpos ));
    
    					vertex_stream >> vertex.v_index;
    					vertex_stream.clear();
    
    					//read texcoord index
    					std::string::size_type slashpos2 = vertexstring.find_first_of("/", slashpos + 1);
    
    					vertex_stream.str(vertexstring.substr(slashpos + 1 , slashpos2 - slashpos - 1 )); 
    
    					vertex_stream >> vertex.uv_index;
    					vertex_stream.clear();
    
    					//read normal index 
    					vertex_stream.str(vertexstring.substr(slashpos2 + 1, vertexstring.length() - 1 ));
    
    					vertex_stream >> vertex.n_index;
    
    					m_faces.push_back(vertex);
    				}
    
    			}
    

    Wie man unschwer erkennen kann, ist das Ganze nicht besonders lesbar und durch das häufige String-Kopieren wahrscheinlich auch nicht sonderlich performant.
    Hat jemand eine Idee wie man das schöner und schneller gestalten könnte?

    Grüße

    Martin




Anmelden zum Antworten