[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