void parseObjFile(const char* objPath, std::vector<glm::vec3>& vertices, std::vector<glm::vec2>& texcoords, std::vector<glm::vec3>& normals, std::vector<GLuint>& vertIndices, std::vector<GLuint>& texIndices, std::vector<GLuint>& normIndices) { #if (defined USE_FSCANF || defined USE_FGETS) GLchar buf[BUFSIZE]; FILE* fp; // in Win/VS2010, position from ftell after fopen in text mode // is not accurate (due to translation of newlines) if ((NULL == objPath) || (NULL == (fp = fopen(objPath, "rb")))) { return; } #ifdef USE_FSCANF while (EOF != fscanf(fp, "%s", buf)) { #else // USE_FGETS while (NULL != fgets(buf, sizeof(buf), fp)) { #endif #else // USE_GETLINE GLchar* buf; std::string str; std::ifstream fp(objPath); if (!fp.is_open()) { return; } while (fp.good()) { std::getline(fp, str); #endif GLint res = 0; #ifdef USE_GETLINE buf = (GLchar*)str.c_str(); #endif switch (buf[0]) { case 'v': #if (defined USE_FGETS || defined USE_GETLINE) if (' ' == buf[1]) { #else // USE_FSCANF if (1 == strlen(buf)) { #endif glm::vec3 vert; #if (defined USE_FGETS || defined USE_GETLINE) res = sscanf(buf, "v %f %f %f", #else // USE_FSCANF res = fscanf(fp, "%f %f %f\n", #endif &vert.x, &vert.y, &vert.z); if (DIM3 != res) { fprintf(stderr, "Incorrect vert matches on sscanf\n"); } vertices.push_back(vert); } else if ('t' == buf[1]) { glm::vec2 tex; #if (defined USE_FGETS || defined USE_GETLINE) res = sscanf(buf, "vt %f %f", #else // USE_FSCANF res = fscanf(fp, "%f %f\n", #endif &tex.x, &tex.y); if (DIM2 != res) { fprintf(stderr, "Incorrect tex matches on sscanf\n"); } texcoords.push_back(tex); } else if ('n' == buf[1]) { glm::vec3 norm; #if (defined USE_FGETS || defined USE_GETLINE) res = sscanf(buf, "vn %f %f %f", #else // USE_FSCANF res = fscanf(fp, "%f %f %f\n", #endif &norm.x, &norm.y, &norm.z); if (DIM3 != res) { fprintf(stderr, "Incorrect norm matches on sscanf\n"); } normals.push_back(norm); } break; case 'f': GLuint vertsIdx[VERTS_FACE], normsIdx[VERTS_FACE], texIdx[VERTS_FACE] = { 1, 1, 1 }; #if (defined USE_FGETS || defined USE_GETLINE) res = sscanf(buf, "f %d/%d/%d %d/%d/%d %d/%d/%d", #else // USE_FSCANF // ensure fopen with binary NOT text mode for Win/VS2010 long posPtr = ftell(fp); // get current stream pos res = fscanf(fp, "%d/%d/%d %d/%d/%d %d/%d/%d\n", #endif &vertsIdx[0], &texIdx[0], &normsIdx[0], &vertsIdx[1], &texIdx[1], &normsIdx[1], &vertsIdx[2], &texIdx[2], &normsIdx[2]); if (RES_VertTexNorm != res) { #if (defined USE_FGETS || defined USE_GETLINE) res = sscanf(buf, "f %d//%d %d//%d %d//%d", #else // USE_FSCANF fseek(fp, posPtr, SEEK_SET); // reset stream pos res = fscanf(fp, "%d//%d %d//%d %d//%d\n", #endif &vertsIdx[0], &normsIdx[0], &vertsIdx[1], &normsIdx[1], &vertsIdx[2], &normsIdx[2]); }