} else {
// close the file before we return
gzclose(fp);
-
+ SG_LOG( SG_EVENT, SG_ALERT,
+ "ERROR: " << file << "has bad header");
return false;
}
-
+
// read creation time
unsigned int foo_calendar_time;
sgReadUInt( fp, &foo_calendar_time );
//cout << "Total objects to read = " << nobjects << endl;
if ( sgReadError() ) {
- cout << "We detected an error while reading the file header" << endl;
+ cout << "Error while reading header of file " << file << "(.gz)" << endl;
return false;
}
}
if ( sgReadError() ) {
- cout << "We detected an error while reading object:" << i << endl;
+ cout << "Error while reading object:" << i << " in file " << file << "(.gz)" << endl;
return false;
}
}
gzclose(fp);
if ( sgReadError() ) {
- cout << "We detected an error while reading the file." << endl;
+ cout << "Error while reading file " << file << "(.gz)" << endl;
return false;
}
return write_bin_file(file);
}
+static unsigned int max_object_size( const string_list& materials )
+{
+ unsigned int max_size = 0;
+
+ for (unsigned int start=0; start < materials.size();) {
+ string m = materials[start];
+ unsigned int end = start + 1;
+ // find range of objects with identical material, calc its size
+ for (; (end < materials.size()) && (m == materials[end]); ++end) {}
+
+ unsigned int cur_size = end - start;
+ max_size = std::max(max_size, cur_size);
+ start = end;
+ }
+
+ return max_size;
+}
+
+const unsigned int VERSION_7_MATERIAL_LIMIT = 0x7fff;
+
bool SGBinObject::write_bin_file(const SGPath& file)
{
int i;
cout << "tex coords = " << texcoords.size() << endl;
version = 10;
- if (wgs84_nodes.size() < 0xffff) {
+ bool shortMaterialsRanges =
+ (max_object_size(pt_materials) < VERSION_7_MATERIAL_LIMIT) &&
+ (max_object_size(fan_materials) < VERSION_7_MATERIAL_LIMIT) &&
+ (max_object_size(strip_materials) < VERSION_7_MATERIAL_LIMIT) &&
+ (max_object_size(tri_materials) < VERSION_7_MATERIAL_LIMIT);
+
+ if ((wgs84_nodes.size() < 0xffff) &&
+ (normals.size() < 0xffff) &&
+ (texcoords.size() < 0xffff) &&
+ shortMaterialsRanges) {
version = 7; // use smaller indices if possible
}
gzclose(fp);
if ( sgWriteError() ) {
- cout << "We detected an error while writing the file." << endl;
+ cout << "Error while writing file " << file.str() << endl;
return false;
}
fclose(fp);
string command = "gzip --force --best " + file.str();
- system(command.c_str());
+ int err = system(command.c_str());
+ if (err)
+ {
+ cout << "ERROR: gzip " << file.str() << " failed!" << endl;
+ }
- return true;
+ return (err == 0);
}
void SGBinObject::read_properties(gzFile fp, int nproperties)