X-Git-Url: https://git.mxchange.org/?a=blobdiff_plain;f=simgear%2Fio%2Fsg_binobj.cxx;h=994f3dbe643018e016a83768c48343d15a35c0df;hb=201cb61f842ef50a19438e3872ba22e588fa1afc;hp=f511164064fc5f0d3bafb39ce71e548baa50da3a;hpb=49a23fdc2e8463f98e54b4d6a2c6a7dcf398ee9d;p=simgear.git diff --git a/simgear/io/sg_binobj.cxx b/simgear/io/sg_binobj.cxx index f5111640..994f3dbe 100644 --- a/simgear/io/sg_binobj.cxx +++ b/simgear/io/sg_binobj.cxx @@ -423,10 +423,11 @@ bool SGBinObject::read_bin( const string& file ) { } 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 ); @@ -721,6 +722,26 @@ bool SGBinObject::write_bin( const string& base, const string& name, 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; @@ -752,9 +773,16 @@ bool SGBinObject::write_bin_file(const SGPath& file) cout << "tex coords = " << texcoords.size() << endl; version = 10; + 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)) { + (texcoords.size() < 0xffff) && + shortMaterialsRanges) { version = 7; // use smaller indices if possible }