From c9d01a0cfdd8c39d9e27ff29e6fc13adee296258 Mon Sep 17 00:00:00 2001 From: Eugene Sandulenko Date: Fri, 23 Sep 2016 09:58:00 +0200 Subject: FULLPIPE: Made object sorting stable. This removes flicker in many scenes --- engines/fullpipe/scene.cpp | 12 ++++++++++++ engines/fullpipe/utils.h | 3 ++- 2 files changed, 14 insertions(+), 1 deletion(-) diff --git a/engines/fullpipe/scene.cpp b/engines/fullpipe/scene.cpp index 1d693fcebd..9e44449158 100644 --- a/engines/fullpipe/scene.cpp +++ b/engines/fullpipe/scene.cpp @@ -469,10 +469,18 @@ bool Scene::compareObjPriority(const void *p1, const void *p2) { if (((const GameObject *)p1)->_priority > ((const GameObject *)p2)->_priority) return true; + if (((const GameObject *)p1)->_priority == ((const GameObject *)p2)->_priority) + if (((const GameObject *)p1)->_cnum > ((const GameObject *)p2)->_cnum) + return true; + return false; } void Scene::objectList_sortByPriority(Common::Array &list, bool skipFirst) { + // Ensure the sort is stable + for (uint i = 0; i < list.size(); i++) + list[i]->_cnum = i; + if (skipFirst) { Common::Array::iterator s = list.begin(); @@ -485,6 +493,10 @@ void Scene::objectList_sortByPriority(Common::Array &list, bo } void Scene::objectList_sortByPriority(Common::Array &list, bool skipFirst) { + // Ensure the sort is stable + for (uint i = 0; i < list.size(); i++) + list[i]->_cnum = i; + if (skipFirst) { Common::Array::iterator s = list.begin(); diff --git a/engines/fullpipe/utils.h b/engines/fullpipe/utils.h index 41a54f4ce7..2f9b75c07f 100644 --- a/engines/fullpipe/utils.h +++ b/engines/fullpipe/utils.h @@ -110,8 +110,9 @@ enum ObjType { class CObject { public: ObjType _objtype; + uint _cnum; - CObject() : _objtype(kObjTypeDefault) {} + CObject() : _objtype(kObjTypeDefault), _cnum(0) {} virtual bool load(MfcArchive &in) { return true; } virtual void save(MfcArchive &out) { error("Not implemented for obj type: %d", _objtype); } virtual ~CObject() {} -- cgit v1.2.3