[Scummvm-git-logs] scummvm master -> 7da0f705fca4c11ce096aeb879519bc2af87a52d

aquadran noreply at scummvm.org
Wed Oct 23 15:35:19 UTC 2024


This automated email contains information about 1 new commit which have been
pushed to the 'scummvm' repo located at https://github.com/scummvm/scummvm .

Summary:
7da0f705fc WINTERMUTE: Synced with original code regarding sorting


Commit: 7da0f705fca4c11ce096aeb879519bc2af87a52d
    https://github.com/scummvm/scummvm/commit/7da0f705fca4c11ce096aeb879519bc2af87a52d
Author: Paweł Kołodziejski (aquadran at gmail.com)
Date: 2024-10-23T17:35:13+02:00

Commit Message:
WINTERMUTE: Synced with original code regarding sorting

Changed paths:
    engines/wintermute/ad/ad_scene.cpp
    engines/wintermute/ad/ad_scene.h
    engines/wintermute/ad/ad_scene_geometry.cpp
    engines/wintermute/ad/ad_scene_geometry.h
    engines/wintermute/base/base_surface_storage.cpp
    engines/wintermute/base/base_surface_storage.h
    engines/wintermute/base/particles/part_emitter.cpp
    engines/wintermute/base/particles/part_emitter.h


diff --git a/engines/wintermute/ad/ad_scene.cpp b/engines/wintermute/ad/ad_scene.cpp
index 26d20551b6b..9178d204de2 100644
--- a/engines/wintermute/ad/ad_scene.cpp
+++ b/engines/wintermute/ad/ad_scene.cpp
@@ -1377,7 +1377,7 @@ bool AdScene::updateFreeObjects() {
 //////////////////////////////////////////////////////////////////////////
 bool AdScene::displayRegionContent(AdRegion *region, bool display3DOnly) {
 	AdGame *adGame = (AdGame *)_gameRef;
-	Common::Array<AdObject *> objects;
+	BaseArray<AdObject *> objects;
 	AdObject *obj;
 
 	// global objects
@@ -1397,7 +1397,7 @@ bool AdScene::displayRegionContent(AdRegion *region, bool display3DOnly) {
 	}
 
 	// sort by _posY
-	Common::sort(objects.begin(), objects.end(), AdScene::compareObjs);
+	qsort(objects.data(), objects.size(), sizeof(AdObject *), AdScene::compareObjs);
 
 	// display them
 	for (uint32 i = 0; i < objects.size(); i++) {
@@ -1450,12 +1450,18 @@ bool AdScene::displayRegionContent(AdRegion *region, bool display3DOnly) {
 }
 
 //////////////////////////////////////////////////////////////////////////
-bool AdScene::compareObjs(const AdObject *obj1, const AdObject *obj2) {
-	if (obj1->_posY < obj2->_posY) {
-		return true;
-	} else {
-		return false;
-	}
+int AdScene::compareObjs(const void *obj1, const void *obj2) {
+	void *o1 = const_cast<void *>(obj1);
+	void *o2 = const_cast<void *>(obj2);
+	AdObject *object1 = *(AdObject **)o1;
+	AdObject *object2 = *(AdObject **)o2;
+
+	if (object1->_posY < object2->_posY)
+		return -1;
+	else if (object1->_posY > object2->_posY)
+		return 1;
+	else
+		return 0;
 }
 
 //////////////////////////////////////////////////////////////////////////
@@ -3720,7 +3726,7 @@ bool AdScene::getRegionObjects(AdRegion *region, BaseArray<AdObject *> &objects,
 	}
 
 	// sort by _posY
-	Common::sort(objects.begin(), objects.end(), AdScene::compareObjs);
+	qsort(objects.data(), objects.size(), sizeof(AdObject *), AdScene::compareObjs);
 
 	return STATUS_OK;
 }
diff --git a/engines/wintermute/ad/ad_scene.h b/engines/wintermute/ad/ad_scene.h
index db26c963f84..4ff0dfede61 100644
--- a/engines/wintermute/ad/ad_scene.h
+++ b/engines/wintermute/ad/ad_scene.h
@@ -105,7 +105,7 @@ public:
 	DECLARE_PERSISTENT(AdScene, BaseObject)
 	bool displayRegionContent(AdRegion *region = nullptr, bool display3DOnly = false);
 	bool displayRegionContentOld(AdRegion *region = nullptr);
-	static bool compareObjs(const AdObject *obj1, const AdObject *obj2);
+	static int compareObjs(const void *obj1, const void *obj2);
 
 	bool updateFreeObjects();
 	bool traverseNodes(bool update = false);
diff --git a/engines/wintermute/ad/ad_scene_geometry.cpp b/engines/wintermute/ad/ad_scene_geometry.cpp
index 0f6a5300db4..643c7a975ef 100644
--- a/engines/wintermute/ad/ad_scene_geometry.cpp
+++ b/engines/wintermute/ad/ad_scene_geometry.cpp
@@ -868,11 +868,6 @@ bool AdSceneGeometry::createLights() {
 	return true;
 }
 
-//////////////////////////////////////////////////////////////////////////
-bool compareLights(const Light3D *light1, const Light3D *light2) {
-	return light1->_distance < light2->_distance;
-}
-
 //////////////////////////////////////////////////////////////////////////
 bool AdSceneGeometry::enableLights(DXVector3 point, BaseArray<char *> &ignoreLights) {
 	const int maxLightCount = 100;
@@ -895,7 +890,7 @@ bool AdSceneGeometry::enableLights(DXVector3 point, BaseArray<char *> &ignoreLig
 			_maxLightsWarning = true;
 		}
 
-		Common::Array<Light3D *> activeLights;
+		BaseArray<Light3D *> activeLights;
 
 		// compute distance to point
 		for (uint i = 0; i < _lights.size(); i++) {
@@ -919,7 +914,7 @@ bool AdSceneGeometry::enableLights(DXVector3 point, BaseArray<char *> &ignoreLig
 
 		// sort by distance
 		if (activeLights.size() > 0) {
-			Common::sort(activeLights.begin(), activeLights.end(), compareLights);
+			qsort(activeLights.begin(), activeLights.size(), sizeof(Light3D *), AdSceneGeometry::compareLights);
 
 			for (uint i = 0; i < activeLights.size(); i++) {
 				activeLights[i]->_isAvailable = static_cast<int>(i) < _gameRef->_renderer3D->getMaxActiveLights();
@@ -965,6 +960,21 @@ bool AdSceneGeometry::enableLights(DXVector3 point, BaseArray<char *> &ignoreLig
 	return true;
 }
 
+//////////////////////////////////////////////////////////////////////////
+int AdSceneGeometry::compareLights(const void *obj1, const void *obj2) {
+	void *o1 = const_cast<void *>(obj1);
+	void *o2 = const_cast<void *>(obj2);
+	Light3D *light1 = *(Light3D **)o1;
+	Light3D *light2 = *(Light3D **)o2;
+
+	if (light1->_distance < light2->_distance)
+		return -1;
+	else if (light1->_distance > light2->_distance)
+		return 1;
+	else
+		return 0;
+}
+
 //////////////////////////////////////////////////////////////////////////
 bool AdSceneGeometry::correctTargetPoint(const DXVector3 &source, DXVector3 *target) {
 	// the source parameter is not even used in wme3d
diff --git a/engines/wintermute/ad/ad_scene_geometry.h b/engines/wintermute/ad/ad_scene_geometry.h
index e8380167fc4..bf6f05b531c 100644
--- a/engines/wintermute/ad/ad_scene_geometry.h
+++ b/engines/wintermute/ad/ad_scene_geometry.h
@@ -73,6 +73,7 @@ public:
 
 	bool createLights();
 	bool enableLights(DXVector3 Point, BaseArray<char *> &IgnoreLights);
+	static int compareLights(const void *obj1, const void *obj2);
 
 	bool initLoop();
 	float getPointsDist(DXVector3 p1, DXVector3 p2);
diff --git a/engines/wintermute/base/base_surface_storage.cpp b/engines/wintermute/base/base_surface_storage.cpp
index 628f7cb6fcb..cc00f875e15 100644
--- a/engines/wintermute/base/base_surface_storage.cpp
+++ b/engines/wintermute/base/base_surface_storage.cpp
@@ -170,36 +170,38 @@ bool BaseSurfaceStorage::persist(BasePersistenceManager *persistMgr)
 
 //////////////////////////////////////////////////////////////////////////
 bool BaseSurfaceStorage::sortSurfaces() {
-	Common::sort(_surfaces.begin(), _surfaces.end(), surfaceSortCB);
+	qsort(_surfaces.data(), _surfaces.size(), sizeof(BaseSurface *), surfaceSortCB);
 	return STATUS_OK;
 }
 
 
 //////////////////////////////////////////////////////////////////////////
-bool BaseSurfaceStorage::surfaceSortCB(const BaseSurface *s1, const BaseSurface *s2) {
+int BaseSurfaceStorage::surfaceSortCB(const void *arg1, const void *arg2) {
+	void *o1 = const_cast<void *>(arg1);
+	void *o2 = const_cast<void *>(arg2);
+	BaseSurface *s1 = *((BaseSurface **)o1);
+	BaseSurface *s2 = *((BaseSurface **)o2);
+
 	// sort by life time
-	if (s1->_lifeTime <= 0 && s2->_lifeTime > 0) {
-		return false;
-	} else if (s1->_lifeTime > 0 && s2->_lifeTime <= 0) {
-		return true;
-	}
+	if (s1->_lifeTime <= 0 && s2->_lifeTime > 0)
+		return 1;
+	else if (s1->_lifeTime > 0 && s2->_lifeTime <= 0)
+		return -1;
 
 
 	// sort by validity
-	if (s1->_valid && !s2->_valid) {
-		return true;
-	} else if (!s1->_valid && s2->_valid) {
-		return false;
-	}
+	if (s1->_valid && !s2->_valid)
+		return -1;
+	else if (!s1->_valid && s2->_valid)
+		return 1;
 
 	// sort by time
-	else if (s1->_lastUsedTime > s2->_lastUsedTime) {
-		return false;
-	} else if (s1->_lastUsedTime < s2->_lastUsedTime) {
-		return true;
-	} else {
-		return false;
-	}
+	else if (s1->_lastUsedTime > s2->_lastUsedTime)
+		return 1;
+	else if (s1->_lastUsedTime < s2->_lastUsedTime)
+		return -1;
+	else
+		return 0;
 }
 
 } // End of namespace Wintermute
diff --git a/engines/wintermute/base/base_surface_storage.h b/engines/wintermute/base/base_surface_storage.h
index 2f23d49aafd..edc708bfd03 100644
--- a/engines/wintermute/base/base_surface_storage.h
+++ b/engines/wintermute/base/base_surface_storage.h
@@ -29,7 +29,7 @@
 #define WINTERMUTE_BASE_SURFACE_STORAGE_H
 
 #include "engines/wintermute/base/base.h"
-#include "common/array.h"
+#include "engines/wintermute/coll_templ.h"
 
 namespace Wintermute {
 class BaseSurface;
@@ -38,7 +38,7 @@ public:
 	uint32 _lastCleanupTime;
 	bool initLoop();
 	bool sortSurfaces();
-	static bool surfaceSortCB(const BaseSurface *arg1, const BaseSurface *arg2);
+	static int surfaceSortCB(const void *arg1, const void *arg);
 	bool cleanup(bool warn = false);
 	//DECLARE_PERSISTENT(BaseSurfaceStorage, BaseClass);
 
@@ -48,7 +48,7 @@ public:
 	BaseSurfaceStorage(BaseGame *inGame);
 	~BaseSurfaceStorage() override;
 
-	Common::Array<BaseSurface *> _surfaces;
+	BaseArray<BaseSurface *> _surfaces;
 };
 
 } // End of namespace Wintermute
diff --git a/engines/wintermute/base/particles/part_emitter.cpp b/engines/wintermute/base/particles/part_emitter.cpp
index dde9ebc6bd7..d113720c396 100644
--- a/engines/wintermute/base/particles/part_emitter.cpp
+++ b/engines/wintermute/base/particles/part_emitter.cpp
@@ -369,17 +369,23 @@ bool PartEmitter::start() {
 //////////////////////////////////////////////////////////////////////////
 bool PartEmitter::sortParticlesByZ() {
 	// sort particles by _posY
-	Common::sort(_particles.begin(), _particles.end(), PartEmitter::compareZ);
+	qsort(_particles.data(), _particles.size(), sizeof(PartParticle *), PartEmitter::compareZ);
 	return STATUS_OK;
 }
 
 //////////////////////////////////////////////////////////////////////////
-bool PartEmitter::compareZ(const PartParticle *p1, const PartParticle *p2) {
-	if (p1->_posZ < p2->_posZ) {
-		return true;
-	} else { // p1->_posZ >= p2->_posZ
-		return false;
-	}
+int PartEmitter::compareZ(const void *obj1, const void *obj2) {
+	void *o1 = const_cast<void *>(obj1);
+	void *o2 = const_cast<void *>(obj2);
+	PartParticle *p1 = *(PartParticle **)o1;
+	PartParticle *p2 = *(PartParticle **)o2;
+
+	if (p1->_posZ < p2->_posZ)
+		return -1;
+	else if (p1->_posZ > p2->_posZ)
+		return 1;
+	else
+		return 0;
 }
 
 //////////////////////////////////////////////////////////////////////////
diff --git a/engines/wintermute/base/particles/part_emitter.h b/engines/wintermute/base/particles/part_emitter.h
index 4641db394a6..9d99e0e92e7 100644
--- a/engines/wintermute/base/particles/part_emitter.h
+++ b/engines/wintermute/base/particles/part_emitter.h
@@ -126,7 +126,7 @@ private:
 	BaseScriptHolder *_owner;
 
 	PartForce *addForceByName(const Common::String &name);
-	bool static compareZ(const PartParticle *p1, const PartParticle *p2);
+	int static compareZ(const void *obj1, const void *obj2);
 	bool initParticle(PartParticle *particle, uint32 currentTime, uint32 timerDelta);
 	bool updateInternal(uint32 currentTime, uint32 timerDelta);
 	uint32 _lastGenTime;




More information about the Scummvm-git-logs mailing list