[Scummvm-git-logs] scummvm master -> d5239df02cc934f0987c51e151261031a64fa0b3

aquadran noreply at scummvm.org
Sun Oct 27 08:54:53 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:
d5239df02c WINTERMUTE: Sync code with original. Matched names comparing


Commit: d5239df02cc934f0987c51e151261031a64fa0b3
    https://github.com/scummvm/scummvm/commit/d5239df02cc934f0987c51e151261031a64fa0b3
Author: Paweł Kołodziejski (aquadran at gmail.com)
Date: 2024-10-27T09:54:48+01:00

Commit Message:
WINTERMUTE: Sync code with original. Matched names comparing

Changed paths:
    engines/wintermute/ad/ad_generic.cpp
    engines/wintermute/ad/ad_geom_ext_node.cpp
    engines/wintermute/ad/ad_object_3d.cpp
    engines/wintermute/ad/ad_scene_geometry.cpp
    engines/wintermute/base/gfx/xanimation.cpp
    engines/wintermute/base/gfx/xanimation_set.cpp
    engines/wintermute/base/gfx/xframe_node.cpp
    engines/wintermute/base/gfx/xmesh.cpp
    engines/wintermute/base/gfx/xmodel.cpp
    engines/wintermute/utils/utils.cpp
    engines/wintermute/utils/utils.h


diff --git a/engines/wintermute/ad/ad_generic.cpp b/engines/wintermute/ad/ad_generic.cpp
index 1421f5e3786..ecb58e1c46a 100644
--- a/engines/wintermute/ad/ad_generic.cpp
+++ b/engines/wintermute/ad/ad_generic.cpp
@@ -41,6 +41,7 @@ AdGeneric::AdGeneric(BaseGame *inGame) : BaseScriptable(inGame, false, false) {
 //////////////////////////////////////////////////////////////////////////
 AdGeneric::~AdGeneric() {
 	delete _mesh;
+	_mesh = nullptr;
 }
 
 //////////////////////////////////////////////////////////////////////////
diff --git a/engines/wintermute/ad/ad_geom_ext_node.cpp b/engines/wintermute/ad/ad_geom_ext_node.cpp
index f5dab5abbe3..871bd923425 100644
--- a/engines/wintermute/ad/ad_geom_ext_node.cpp
+++ b/engines/wintermute/ad/ad_geom_ext_node.cpp
@@ -140,7 +140,7 @@ bool AdGeomExtNode::setupNode(const char *namePattern, TGeomNodeType type, bool
 
 //////////////////////////////////////////////////////////////////////////
 bool AdGeomExtNode::matchesName(const char *name) {
-	return Common::matchString(name, _namePattern, true);
+	return BaseUtils::matchesPattern(_namePattern, name);
 }
 
 } // namespace Wintermute
diff --git a/engines/wintermute/ad/ad_object_3d.cpp b/engines/wintermute/ad/ad_object_3d.cpp
index 034c65c94bd..eb4ae83637d 100644
--- a/engines/wintermute/ad/ad_object_3d.cpp
+++ b/engines/wintermute/ad/ad_object_3d.cpp
@@ -51,7 +51,6 @@ AdObject3D::AdObject3D(BaseGame *inGame) : AdObject(inGame) {
 	_lastPosVector = DXVector3(0.0f, 0.0f, 0.0f);
 
 	_state = _nextState = STATE_READY;
-
 	_dropToFloor = true;
 	_shadowType = SHADOW_STENCIL;
 
@@ -84,7 +83,7 @@ void AdObject3D::clearIgnoredLights() {
 //////////////////////////////////////////////////////////////////////////
 bool AdObject3D::addIgnoredLight(char *lightName) {
 	for (uint32 i = 0; i < _ignoredLights.size(); i++) {
-		if (_ignoredLights[i] == lightName) {
+		if (scumm_stricmp(_ignoredLights[i], lightName) == 0) {
 			return true;
 		}
 	}
@@ -96,7 +95,7 @@ bool AdObject3D::addIgnoredLight(char *lightName) {
 //////////////////////////////////////////////////////////////////////////
 bool AdObject3D::removeIgnoredLight(char *lightName) {
 	for (uint32 i = 0; i < _ignoredLights.size(); i++) {
-		if (_ignoredLights[i] == lightName) {
+		if (scumm_stricmp(_ignoredLights[i], lightName) == 0) {
 			_ignoredLights.remove_at(i);
 			return true;
 		}
@@ -259,9 +258,7 @@ ScValue *AdObject3D::scGetProperty(const Common::String &name) {
 	// Angle
 	//////////////////////////////////////////////////////////////////////////
 	if (name == "Angle") {
-		float tmp = 0.0f;
-		_scValue->setFloat(tmp);
-		_angle = tmp;
+		_scValue->setFloat(_angle);
 		return _scValue;
 	}
 	//////////////////////////////////////////////////////////////////////////
@@ -602,7 +599,6 @@ bool AdObject3D::getBonePosition2D(const char *boneName, int32 *x, int32 *y) {
 	}
 
 	AdGame *adGame = (AdGame *)_gameRef;
-
 	if (!adGame->_scene || !adGame->_scene->_geom)
 		return false;
 
diff --git a/engines/wintermute/ad/ad_scene_geometry.cpp b/engines/wintermute/ad/ad_scene_geometry.cpp
index bb1ef148051..74f7b0e4321 100644
--- a/engines/wintermute/ad/ad_scene_geometry.cpp
+++ b/engines/wintermute/ad/ad_scene_geometry.cpp
@@ -144,9 +144,12 @@ void AdSceneGeometry::cleanup() {
 AdGeomExt *AdSceneGeometry::getGeometryExtension(char *filename) {
 	AdGeomExt *ret = new AdGeomExt(_gameRef);
 
+	Common::String geomExtFile(filename);
+	geomExtFile.replace(geomExtFile.size() - 3, 3, "geometry", 0, 8);
+
 	bool loadOK = false;
-	if (BaseFileManager::getEngineInstance()->openFile(filename) != nullptr) {
-		loadOK = ret->loadFile(filename);
+	if (BaseFileManager::getEngineInstance()->openFile(geomExtFile) != nullptr) {
+		loadOK = ret->loadFile(geomExtFile.begin());
 	}
 
 	// no ext file found, just use the defaults
@@ -172,15 +175,14 @@ bool AdSceneGeometry::loadFile(const char *filename) {
 		}
 	}
 
-	Common::String filenameTmp(filename);
-
-	if (!filenameTmp.hasSuffix(".3ds") && !filenameTmp.hasSuffix(".3DS")) {
+	Common::String extenstionCheck(filename);
+	extenstionCheck.toLowercase();
+	if (!extenstionCheck.hasSuffix(".3ds")) {
 		_gameRef->LOG(0, "Error: no suitable loader found for file '%s'", filename);
 		return false;
 	}
 
-	filenameTmp.replace(filenameTmp.size() - 3, 3, "geometry", 0, 8);
-	AdGeomExt *geomExt = getGeometryExtension(filenameTmp.begin());
+	AdGeomExt *geomExt = getGeometryExtension(const_cast<char *>(filename));
 
 	Loader3DS *loader = new Loader3DS(_gameRef);
 	if (!loader->parseFile(filename)) {
@@ -510,6 +512,7 @@ bool AdSceneGeometry::directPathExists(DXVector3 *p1, DXVector3 *p2) {
 			v0 = _planes[i]->_mesh->_vertices[_planes[i]->_mesh->_faces[j]._vertices[0]]._pos;
 			v1 = _planes[i]->_mesh->_vertices[_planes[i]->_mesh->_faces[j]._vertices[1]]._pos;
 			v2 = _planes[i]->_mesh->_vertices[_planes[i]->_mesh->_faces[j]._vertices[2]]._pos;
+
 			DXVector3 intersection;
 			float dist;
 
@@ -535,6 +538,7 @@ bool AdSceneGeometry::directPathExists(DXVector3 *p1, DXVector3 *p2) {
 			v0 = _blocks[i]->_mesh->_vertices[_blocks[i]->_mesh->_faces[j]._vertices[0]]._pos;
 			v1 = _blocks[i]->_mesh->_vertices[_blocks[i]->_mesh->_faces[j]._vertices[1]]._pos;
 			v2 = _blocks[i]->_mesh->_vertices[_blocks[i]->_mesh->_faces[j]._vertices[2]]._pos;
+
 			DXVector3 intersection;
 			float dist;
 
@@ -569,6 +573,7 @@ DXVector3 AdSceneGeometry::getBlockIntersection(DXVector3 *p1, DXVector3 *p2) {
 			v0 = _blocks[i]->_mesh->_vertices[_blocks[i]->_mesh->_faces[j]._vertices[0]]._pos;
 			v1 = _blocks[i]->_mesh->_vertices[_blocks[i]->_mesh->_faces[j]._vertices[1]]._pos;
 			v2 = _blocks[i]->_mesh->_vertices[_blocks[i]->_mesh->_faces[j]._vertices[2]]._pos;
+
 			DXVector3 intersection;
 			float dist;
 
@@ -728,12 +733,10 @@ bool AdSceneGeometry::convert2Dto3D(int x, int y, DXVector3 *pos) {
 								  &intersection._x, &intersection._y, &intersection._z)) {
 				ray = intersection - vPickRayOrig;
 				float dist = DXVec3Length(&ray);
-
 				if (dist < minDist) {
 					*pos = intersection;
 					minDist = dist;
 				}
-
 				intFound = true;
 			}
 		}
@@ -763,11 +766,9 @@ bool AdSceneGeometry::getPath(DXVector3 source, DXVector3 target, AdPath3D *path
 
 		// prepare working path
 		uint i, j;
-
 		for (i = 0; i < _PFPath.size(); i++) {
 			delete _PFPath[i];
 		}
-
 		_PFPath.clear();
 
 		// first point
@@ -794,19 +795,18 @@ void AdSceneGeometry::pathFinderStep() {
 	uint i;
 
 	// get lowest unmarked
-	float lowest_dist = FLT_MAX;
-	AdPathPoint3D *lowest_pt = NULL;
+	float lowestDist = FLT_MAX;
+	AdPathPoint3D *lowestPt = NULL;
 
 	for (i = 0; i < _PFPath.size(); i++) {
-		if (!_PFPath[i]->_marked && _PFPath[i]->_distance < lowest_dist) {
-			lowest_dist = _PFPath[i]->_distance;
-			lowest_pt = _PFPath[i];
+		if (!_PFPath[i]->_marked && _PFPath[i]->_distance < lowestDist) {
+			lowestDist = _PFPath[i]->_distance;
+			lowestPt = _PFPath[i];
 		}
 	}
 
-	if (lowest_pt == NULL) { // no path -> terminate PathFinder
+	if (lowestPt == nullptr) { // no path -> terminate PathFinder
 		_PFReady = true;
-
 		if (!_PFRerun) {
 			if (_PFAlternateTarget != DXVector3(0, 0, 0)) {
 				getPath(_PFSource, _PFAlternateTarget, _PFTargetPath, true);
@@ -820,13 +820,13 @@ void AdSceneGeometry::pathFinderStep() {
 		return;
 	}
 
-	lowest_pt->_marked = true;
+	lowestPt->_marked = true;
 
 	// target point marked, generate path and terminate
-	if (lowest_pt->_pos == _PFTarget) {
-		while (lowest_pt != NULL) {
-			_PFTargetPath->_points.insert_at(0, new DXVector3(lowest_pt->_pos));
-			lowest_pt = lowest_pt->_origin;
+	if (lowestPt->_pos == _PFTarget) {
+		while (lowestPt != nullptr) {
+			_PFTargetPath->_points.insert_at(0, new DXVector3(lowestPt->_pos));
+			lowestPt = lowestPt->_origin;
 		}
 		// remove current position
 		if (_PFTargetPath->_points.size() > 0) {
@@ -842,20 +842,20 @@ void AdSceneGeometry::pathFinderStep() {
 	// otherwise keep on searching
 	for (i = 0; i < _PFPath.size(); i++) {
 		if (!_PFPath[i]->_marked) {
-			float dist = getPointsDist(lowest_pt->_pos, _PFPath[i]->_pos);
-			if (dist >= 0 && lowest_pt->_distance + dist < _PFPath[i]->_distance) {
-				_PFPath[i]->_distance = lowest_pt->_distance + dist;
-				_PFPath[i]->_origin = lowest_pt;
+			float dist = getPointsDist(lowestPt->_pos, _PFPath[i]->_pos);
+			if (dist >= 0 && lowestPt->_distance + dist < _PFPath[i]->_distance) {
+				_PFPath[i]->_distance = lowestPt->_distance + dist;
+				_PFPath[i]->_origin = lowestPt;
 			} else {
 				if (!_PFRerun && _PFPath[i]->_pos == _PFTarget) {
-					DXVector3 line = _PFPath[i]->_pos - lowest_pt->_pos;
+					DXVector3 line = _PFPath[i]->_pos - lowestPt->_pos;
 					float len = DXVec3Length(&line);
 
 					if (len < _PFAlternateDist) {
 						_PFAlternateDist = len;
-						_PFAlternateTarget = getBlockIntersection(&lowest_pt->_pos, &_PFPath[i]->_pos);
+						_PFAlternateTarget = getBlockIntersection(&lowestPt->_pos, &_PFPath[i]->_pos);
 
-						DXVector3 dir = _PFAlternateTarget - lowest_pt->_pos;
+						DXVector3 dir = _PFAlternateTarget - lowestPt->_pos;
 						DXVec3Normalize(&dir, &dir);
 						_PFAlternateTarget -= dir * 30;
 					}
@@ -907,15 +907,15 @@ bool AdSceneGeometry::enableLights(DXVector3 point, BaseArray<char *> &ignoreLig
 	const int maxLightCount = 100;
 	int maxLights = _gameRef->_renderer3D->getMaxActiveLights();
 
-	int activeLightCount = 0;
+	int numActiveLights = 0;
 	for (uint i = 0; i < _lights.size(); i++) {
 		_lights[i]->_isAvailable = false;
 		if (_lights[i]->_active) {
-			activeLightCount++;
+			numActiveLights++;
 		}
 	}
 
-	if (activeLightCount <= maxLights) {
+	if (numActiveLights <= maxLights) {
 		for (uint i = 0; i < _lights.size(); i++) {
 			_lights[i]->_isAvailable = true;
 		}
@@ -962,16 +962,14 @@ bool AdSceneGeometry::enableLights(DXVector3 point, BaseArray<char *> &ignoreLig
 		_gameRef->_renderer3D->lightEnable(i, false);
 	}
 
-	activeLightCount = 0;
-
+	numActiveLights = 0;
 	for (uint i = 0; i < _lights.size(); i++) {
-		if (activeLightCount >= maxLights) {
+		if (numActiveLights >= maxLights) {
 			break;
 		}
 
 		if (ignoreLights.size()) {
 			bool ignore = false;
-
 			for (uint j = 0; j < ignoreLights.size(); j++) {
 				if (scumm_stricmp(_lights[i]->getName(), ignoreLights[j]) == 0) {
 					ignore = true;
@@ -986,8 +984,8 @@ bool AdSceneGeometry::enableLights(DXVector3 point, BaseArray<char *> &ignoreLig
 
 		if (_lights[i]->_isAvailable) {
 			if (_lights[i]->_active) {
-				_gameRef->_renderer3D->lightEnable(i, true);
-				++activeLightCount;
+				_gameRef->_renderer3D->lightEnable(i, _lights[i]->_active);
+				++numActiveLights;
 			}
 		}
 	}
diff --git a/engines/wintermute/base/gfx/xanimation.cpp b/engines/wintermute/base/gfx/xanimation.cpp
index c7f4619f620..47aa4779909 100644
--- a/engines/wintermute/base/gfx/xanimation.cpp
+++ b/engines/wintermute/base/gfx/xanimation.cpp
@@ -62,7 +62,7 @@ Animation::~Animation() {
 
 //////////////////////////////////////////////////////////////////////////
 bool Animation::findBone(FrameNode *rootFrame) {
-	if (_targetName != "") {
+	if (!_targetName.empty()) {
 		_targetFrame = rootFrame->findFrame(_targetName.c_str());
 	}
 	return true;
diff --git a/engines/wintermute/base/gfx/xanimation_set.cpp b/engines/wintermute/base/gfx/xanimation_set.cpp
index b022d2749f2..7565e398693 100644
--- a/engines/wintermute/base/gfx/xanimation_set.cpp
+++ b/engines/wintermute/base/gfx/xanimation_set.cpp
@@ -118,7 +118,6 @@ int AnimationSet::getFrameTime() {
 	}
 
 	_frameTime = 0;
-
 	for (uint32 i = 0; i < _animations.size(); i++) {
 		int frameTime = _animations[i]->getFrameTime();
 		if (_frameTime == 0) {
@@ -137,7 +136,6 @@ uint32 AnimationSet::getTotalTime() {
 	}
 
 	_totalTime = 0;
-
 	for (uint32 i = 0; i < _animations.size(); i++) {
 		_totalTime = MAX((float)_totalTime, _animations[i]->getTotalTime() / ((float)_model->_ticksPerSecond / 1000.0f));
 	}
diff --git a/engines/wintermute/base/gfx/xframe_node.cpp b/engines/wintermute/base/gfx/xframe_node.cpp
index 5f05a9061be..dd2b4320b94 100644
--- a/engines/wintermute/base/gfx/xframe_node.cpp
+++ b/engines/wintermute/base/gfx/xframe_node.cpp
@@ -59,14 +59,12 @@ FrameNode::~FrameNode() {
 	for (uint32 i = 0; i < _frames.size(); i++) {
 		delete _frames[i];
 	}
-
 	_frames.clear();
 
 	// remove meshes
 	for (uint32 i = 0; i < _meshes.size(); i++) {
 		delete _meshes[i];
 	}
-
 	_meshes.clear();
 }
 
@@ -224,7 +222,7 @@ bool FrameNode::findBones(FrameNode *rootFrame) {
 
 //////////////////////////////////////////////////////////////////////////
 FrameNode *FrameNode::findFrame(const char *frameName) {
-	if (getName() && scumm_stricmp(getName(), frameName) == 0) {
+	if (getName() && strcmp(getName(), frameName) == 0) {
 		return this;
 	} else {
 		for (uint32 i = 0; i < _frames.size(); i++) {
diff --git a/engines/wintermute/base/gfx/xmesh.cpp b/engines/wintermute/base/gfx/xmesh.cpp
index f25d90734c3..b7e775cd33a 100644
--- a/engines/wintermute/base/gfx/xmesh.cpp
+++ b/engines/wintermute/base/gfx/xmesh.cpp
@@ -121,6 +121,7 @@ bool XMesh::loadFromXData(const Common::String &filename, XFileData *xobj) {
 		mat->_material._diffuse.color._b = 0.5f;
 		mat->_material._specular = mat->_material._diffuse;
 		mat->_material._ambient = mat->_material._diffuse;
+
 		_materials.add(mat);
 	} else {
 		// load the materials
@@ -129,9 +130,11 @@ bool XMesh::loadFromXData(const Common::String &filename, XFileData *xobj) {
 			Material *mat = new Material(_gameRef);
 			mat->_material = fileMats[i];
 			mat->_material._ambient = mat->_material._diffuse;
+
 			if (fileMats[i]._textureFilename[0] != '\0') {
 				mat->setTexture(PathUtil::getDirectoryName(filename) + fileMats[i]._textureFilename, true);
 			}
+
 			_materials.add(mat);
 		}
 	}
@@ -198,7 +201,7 @@ bool XMesh::update(FrameNode *parentFrame) {
 
 		// generate skinned mesh
 		_skinMesh->updateSkinnedMesh(boneMatrices, _blendedMesh);
-		delete [] boneMatrices;
+		delete[] boneMatrices;
 
 		// update mesh bounding box
 		byte *points = _blendedMesh->getVertexBuffer().ptr();
@@ -304,7 +307,7 @@ bool XMesh::pickPoly(DXVector3 *pickRayOrig, DXVector3 *pickRayDir) {
 ////////////////////////////////////////////////////////////////////////////
 bool XMesh::setMaterialSprite(const Common::String &matName, BaseSprite *sprite) {
 	for (uint32 i = 0; i < _materials.size(); i++) {
-		if (_materials[i]->getName() && _materials[i]->getName() == matName) {
+		if (_materials[i]->getName() && scumm_stricmp(_materials[i]->getName(),  matName.c_str()) == 0) {
 			_materials[i]->setSprite(sprite);
 		}
 	}
@@ -314,7 +317,7 @@ bool XMesh::setMaterialSprite(const Common::String &matName, BaseSprite *sprite)
 //////////////////////////////////////////////////////////////////////////
 bool XMesh::setMaterialTheora(const Common::String &matName, VideoTheoraPlayer *theora) {
 	for (uint32 i = 0; i < _materials.size(); i++) {
-		if (_materials[i]->getName() && _materials[i]->getName() == matName) {
+		if (_materials[i]->getName() && scumm_stricmp(_materials[i]->getName(),  matName.c_str()) == 0) {
 			_materials[i]->setTheora(theora);
 		}
 	}
diff --git a/engines/wintermute/base/gfx/xmodel.cpp b/engines/wintermute/base/gfx/xmodel.cpp
index be2a8429c27..151ff0449d3 100644
--- a/engines/wintermute/base/gfx/xmodel.cpp
+++ b/engines/wintermute/base/gfx/xmodel.cpp
@@ -831,7 +831,6 @@ bool XModel::setMaterialTheora(const char *materialName, const char *theoraFilen
 	}
 
 	VideoTheoraPlayer *theora = new VideoTheoraPlayer(_gameRef);
-
 	if (!theora || theora->initialize(theoraFilename)) {
 		delete theora;
 		return false;
@@ -908,7 +907,6 @@ bool XModel::persist(BasePersistenceManager *persistMgr) {
 		for (int i = 0; i < X_NUM_ANIMATION_CHANNELS; i++) {
 			_channels[i] = nullptr;
 		}
-
 		_rootFrame = nullptr;
 
 		if (getFilename()) {
diff --git a/engines/wintermute/utils/utils.cpp b/engines/wintermute/utils/utils.cpp
index 0a1378b217b..a2355ea69c8 100644
--- a/engines/wintermute/utils/utils.cpp
+++ b/engines/wintermute/utils/utils.cpp
@@ -151,6 +151,58 @@ float BaseUtils::randomAngle(float from, float to) {
 	return normalizeAngle(randomFloat(from, to));
 }
 
+//////////////////////////////////////////////////////////////////////////
+bool BaseUtils::matchesPattern(const char *pattern, const char *string) {
+	char stringc, patternc;
+
+	for (; ; ++string) {
+		stringc = toupper(*string);
+		patternc = toupper(*pattern++);
+
+		switch (patternc) {
+			case 0:
+				return (stringc == 0);
+
+			case '?':
+				if (stringc == 0)
+					return false;
+			break;
+
+			case '*':
+				if (!*pattern)
+					return true;
+
+				if (*pattern=='.') {
+					char *dot;
+					if (pattern[1] == '*' && pattern[2] == 0)
+						return true;
+					dot = const_cast<char *>(strchr(string, '.'));
+					if (pattern[1] == 0)
+						return (dot == nullptr || dot[1] == 0);
+					if (dot != nullptr) {
+						string = dot;
+						if (strpbrk(pattern, "*?[") == nullptr && strchr(string + 1, '.') == nullptr)
+							return (scumm_stricmp(pattern + 1, string + 1) == 0);
+					}
+				}
+
+				while (*string)
+					if (BaseUtils::matchesPattern(pattern, string++))
+						return true;
+				return false;
+
+			default:
+				if (patternc != stringc) {
+					if (patternc == '.' && stringc == 0)
+						return (BaseUtils::matchesPattern(pattern, string));
+					else
+						return false;
+				}
+			break;
+		}
+	}
+}
+
 //////////////////////////////////////////////////////////////////////////
 void BaseUtils::RGBtoHSL(uint32 rgbColor, byte *outH, byte *outS, byte *outL) {
 	float varR = (RGBCOLGetR(rgbColor) / 255.0f);
diff --git a/engines/wintermute/utils/utils.h b/engines/wintermute/utils/utils.h
index 49676ba0473..9a796674767 100644
--- a/engines/wintermute/utils/utils.h
+++ b/engines/wintermute/utils/utils.h
@@ -51,6 +51,8 @@ public:
 	static float randomFloat(float from, float to);
 	static float randomAngle(float from, float to);
 
+	static bool matchesPattern(const char *pattern, const char *string);
+
 	static void RGBtoHSL(uint32 rgbColor, byte *outH, byte *outS, byte *outL);
 	static uint32 HSLtoRGB(byte H, byte S, byte L);
 




More information about the Scummvm-git-logs mailing list