[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