void readMaterials(ObjFile* file, FILE* f) { rewind(f); char line[MAX_STRING_LENGTH]; char* tline; // first material is a default material initMaterial(&file->materials[0]); file->numMaterials = 1; while (NULL != fgets(line, MAX_STRING_LENGTH, f)) { tline = trimBeginning(line); char name[MAX_STRING_LENGTH]; // read in the material name if (strstr(tline, "newmtl") == tline) { file->numMaterials++; // initialize the new material initMaterial(&file->materials[file->numMaterials - 1]); // copy the name from the tline if (sscanf(tline, "newmtl %s", name) == 1) { strcpy(file->materials[file->numMaterials - 1].name, name); } } // read in ambient if (strstr(tline, "Ka") == tline) { ObjVector3F ambient; int n = sscanf( tline, "Ka %f %f %f", &ambient.x, &ambient.y, &ambient.z ); if (n == 3) { file->materials[file->numMaterials - 1].ambient = ambient; } } // read diffuse if (strstr(tline, "Kd") == tline) { ObjVector3F diffuse; int n = sscanf( tline, "Kd %f %f %f", &diffuse.x, &diffuse.y, &diffuse.z ); if (n == 3) { file->materials[file->numMaterials - 1].diffuse = diffuse; } } // read specular if (strstr(tline, "Ks") == tline) { ObjVector3F specular; int n = sscanf( tline, "Ks %f %f %f", &specular.x, &specular.y, &specular.z ); if (n == 3) { file->materials[file->numMaterials - 1].specular = specular; } } // read shininess if (strstr(tline, "Ns") == tline) { float shininess; if (sscanf(tline, "Ns %f", &shininess) == 1) { file->materials[file->numMaterials - 1].shininess = shininess; } } // read ambient tex if (strstr(tline, "map_Ka") == tline) { char name[MAX_STRING_LENGTH]; if (sscanf(tline, "map_Ka %s", name) == 1) { strcpy( file->materials[file->numMaterials - 1].ambientTex, name ); } } // read diffuse tex if (strstr(tline, "map_Kd") == tline) { char name[MAX_STRING_LENGTH]; if (sscanf(tline, "map_Kd %s", name) == 1) { strcpy( file->materials[file->numMaterials - 1].diffuseTex, name ); } } // read specular tex if (strstr(tline, "map_Ks") == tline) { char name[MAX_STRING_LENGTH]; if (sscanf(tline, "map_Ks %s", name) == 1) { strcpy( file->materials[file->numMaterials - 1].specularTex, name ); } } } }
std::string& trim(std::string& inputString) { trimEnd(inputString); trimBeginning(inputString); return inputString; }