bool loadMeshSTL(Mesh* mesh, const char* filename, FMatrix3x3& matrix) { FILE* f = fopen(filename, "r"); char buffer[6]; if (f == nullptr) return false; if (fread(buffer, 5, 1, f) != 1) { fclose(f); return false; } fclose(f); buffer[5] = '\0'; if (stringcasecompare(buffer, "solid") == 0) { bool load_success = loadMeshSTL_ascii(mesh, filename, matrix); if (!load_success) return false; // This logic is used to handle the case where the file starts with // "solid" but is a binary file. if (mesh->faces.size() < 1) { mesh->clear(); return loadMeshSTL_binary(mesh, filename, matrix); } return true; } return loadMeshSTL_binary(mesh, filename, matrix); }
bool loadMeshSTL(Mesh* mesh, const char* filename, FMatrix3x3& matrix) { FILE* f = fopen(filename, "r"); if (f == nullptr) { return false; } //Skip any whitespace at the beginning of the file. unsigned long long num_whitespace = 0; //Number of whitespace characters. unsigned char whitespace; if (fread(&whitespace, 1, 1, f) != 1) { fclose(f); return false; } while(isspace(whitespace)) { num_whitespace++; if (fread(&whitespace, 1, 1, f) != 1) { fclose(f); return false; } } fseek(f, num_whitespace, SEEK_SET); //Seek to the place after all whitespace (we may have just read too far). char buffer[6]; if (fread(buffer, 5, 1, f) != 1) { fclose(f); return false; } fclose(f); buffer[5] = '\0'; if (stringcasecompare(buffer, "solid") == 0) { bool load_success = loadMeshSTL_ascii(mesh, filename, matrix); if (!load_success) return false; // This logic is used to handle the case where the file starts with // "solid" but is a binary file. if (mesh->faces.size() < 1) { mesh->clear(); return loadMeshSTL_binary(mesh, filename, matrix); } return true; } return loadMeshSTL_binary(mesh, filename, matrix); }