void P3DImporter::importData( Scene* scene ) { importMaterials(); importMeshes( scene ); importCameras( scene ); }
void ModelOBJ::importGeometryFirstPass(FILE *pFile) { m_hasTextureCoords = false; m_hasNormals = false; m_numberOfVertexCoords = 0; m_numberOfTextureCoords = 0; m_numberOfNormals = 0; m_numberOfTriangles = 0; int v = 0; int vt = 0; int vn = 0; char buffer[256] = {0}; std::string name; while (fscanf(pFile, "%s", buffer) != EOF) { switch (buffer[0]) { case 'f': // v, v//vn, v/vt, v/vt/vn. fscanf(pFile, "%s", buffer); if (strstr(buffer, "//")) // v//vn { sscanf(buffer, "%d//%d", &v, &vn); fscanf(pFile, "%d//%d", &v, &vn); fscanf(pFile, "%d//%d", &v, &vn); ++m_numberOfTriangles; while (fscanf(pFile, "%d//%d", &v, &vn) > 0) ++m_numberOfTriangles; } else if (sscanf(buffer, "%d/%d/%d", &v, &vt, &vn) == 3) // v/vt/vn { fscanf(pFile, "%d/%d/%d", &v, &vt, &vn); fscanf(pFile, "%d/%d/%d", &v, &vt, &vn); ++m_numberOfTriangles; while (fscanf(pFile, "%d/%d/%d", &v, &vt, &vn) > 0) ++m_numberOfTriangles; } else if (sscanf(buffer, "%d/%d", &v, &vt) == 2) // v/vt { fscanf(pFile, "%d/%d", &v, &vt); fscanf(pFile, "%d/%d", &v, &vt); ++m_numberOfTriangles; while (fscanf(pFile, "%d/%d", &v, &vt) > 0) ++m_numberOfTriangles; } else // v { fscanf(pFile, "%d", &v); fscanf(pFile, "%d", &v); ++m_numberOfTriangles; while (fscanf(pFile, "%d", &v) > 0) ++m_numberOfTriangles; } break; case 'm': // mtllib fgets(buffer, sizeof(buffer), pFile); sscanf(buffer, "%s %s", buffer, buffer); name = m_directoryPath; name += buffer; importMaterials(name.c_str()); break; case 'v': // v, vt, or vn switch (buffer[1]) { case '\0': fgets(buffer, sizeof(buffer), pFile); ++m_numberOfVertexCoords; break; case 'n': fgets(buffer, sizeof(buffer), pFile); ++m_numberOfNormals; break; case 't': fgets(buffer, sizeof(buffer), pFile); ++m_numberOfTextureCoords; default: break; } break; default: fgets(buffer, sizeof(buffer), pFile); break; } } m_hasPositions = m_numberOfVertexCoords > 0; m_hasNormals = m_numberOfNormals > 0; m_hasTextureCoords = m_numberOfTextureCoords > 0; // Allocate memory for the OBJ model data. m_vertexCoords.resize(m_numberOfVertexCoords * 3); m_textureCoords.resize(m_numberOfTextureCoords * 2); m_normals.resize(m_numberOfNormals * 3); m_indexBuffer.resize(m_numberOfTriangles * 3); m_attributeBuffer.resize(m_numberOfTriangles); // Define a default material if no materials were loaded. if (m_numberOfMaterials == 0) { Material defaultMaterial = { 0.2f, 0.2f, 0.2f, 1.0f, 0.8f, 0.8f, 0.8f, 1.0f, 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f, std::string("default"), std::string(), std::string() }; m_materials.push_back(defaultMaterial); m_materialCache[defaultMaterial.name] = 0; } }