Fix non-determinism in XGL importer output due to std::multimap value ordering not guaranteed < C++11.

One step closer to a fully reproducible regression test suite.
pull/513/head
Alexander Gessler 2015-03-26 22:45:00 +01:00 committed by Alexander Gessler
parent 14324c60cf
commit 8666b614c6
2 changed files with 17 additions and 0 deletions

View File

@ -431,6 +431,12 @@ aiNode* XGLImporter::ReadObject(TempScope& scope, bool skipFirst, const char* cl
throw; throw;
} }
// FIX: since we used std::multimap<> to keep meshes by id, mesh order now depends on the behaviour
// of the multimap implementation with respect to the ordering of entries with same values.
// C++11 gives the guarantee that it uses insertion order, before it is implementation-specific.
// Sort by material id to always guarantee a deterministic result.
std::sort(meshes.begin(), meshes.end(), SortMeshByMaterialId(scope));
// link meshes to node // link meshes to node
nd->mNumMeshes = static_cast<unsigned int>(meshes.size()); nd->mNumMeshes = static_cast<unsigned int>(meshes.size());
if (nd->mNumMeshes) { if (nd->mNumMeshes) {

View File

@ -86,6 +86,7 @@ protected:
private: private:
struct TempScope struct TempScope
{ {
TempScope() TempScope()
@ -122,6 +123,16 @@ private:
aiLight* light; aiLight* light;
}; };
struct SortMeshByMaterialId {
SortMeshByMaterialId(const TempScope& scope) : scope(scope) {}
bool operator()(unsigned int a, unsigned int b) const {
return scope.meshes_linear[a]->mMaterialIndex < scope.meshes_linear[b]->mMaterialIndex;
};
const TempScope& scope;
};
struct TempMesh struct TempMesh
{ {
std::map<unsigned int, aiVector3D> points; std::map<unsigned int, aiVector3D> points;