diff --git a/project/code/LGS/ResourcePathManager.cs b/project/code/LGS/ResourcePathManager.cs index 3bb4b90..7c71c00 100644 --- a/project/code/LGS/ResourcePathManager.cs +++ b/project/code/LGS/ResourcePathManager.cs @@ -13,6 +13,7 @@ public class ResourcePathManager public Dictionary missionPathMap; public Dictionary texturePathMap; public Dictionary objectPathMap; + public Dictionary objectTexturePathMap; } private bool _initialised = false; @@ -53,12 +54,14 @@ public class ResourcePathManager } ZipFile.OpenRead(objPath).ExtractToDirectory(objExtractPath); var objectPathMap = GetObjectPaths(_extractionPath); + var objectTexturePathMap = GetObjectTexturePaths(_extractionPath); _omResources = new CampaignResources { missionPathMap = omsMap, texturePathMap = texturePathMap, objectPathMap = objectPathMap, + objectTexturePathMap = objectTexturePathMap, }; } @@ -66,13 +69,17 @@ public class ResourcePathManager _fmResources = new Dictionary(); foreach (var (campaign, missionPathMap) in fmsMap) { - var texturePathMap = GetTexturePaths(Path.Join(fmsDir, campaign)); - var objectPathMap = GetObjectPaths(Path.Join(fmsDir, campaign)); + var root = Path.Join(fmsDir, campaign); + var texturePathMap = GetTexturePaths(root); + var objectPathMap = GetObjectPaths(root); + var objectTexturePathMap = GetObjectTexturePaths(root); + var resource = new CampaignResources { missionPathMap = missionPathMap, texturePathMap = texturePathMap, objectPathMap = objectPathMap, + objectTexturePathMap = objectTexturePathMap, }; _fmResources.Add(campaign, resource); _fmsDir = fmsDir; @@ -191,49 +198,59 @@ public class ResourcePathManager return null; } - // TODO: Store these as part of the resources - public string GetObjectTexturePath(string campaignName, string modelName, string textureName) + public string GetObjectTexturePath(string campaignName, string textureName) { - var options = new EnumerationOptions + if (!_initialised) return null; + + textureName = Path.GetFileNameWithoutExtension(textureName).ToLower(); + if (campaignName == null || campaignName == "") + { + if (_omResources.objectTexturePathMap.TryGetValue(textureName, out var path)) + { + return path; + } + } + else if (_fmResources.TryGetValue(campaignName, out var campaign)) + { + if (campaign.objectTexturePathMap.TryGetValue(textureName, out var fmPath)) + { + return fmPath; + } + else if (_omResources.objectTexturePathMap.TryGetValue(textureName, out var omPath)) + { + return omPath; + } + } + + return null; + } + + private static Dictionary GetObjectTexturePaths(string root) + { + string[] validExtensions = { ".dds", ".png", ".tga", ".pcx", ".gif", ".bmp", ".cel", }; + + var dirOptions = new EnumerationOptions { MatchCasing = MatchCasing.CaseInsensitive }; + var texOptions = new EnumerationOptions { MatchCasing = MatchCasing.CaseInsensitive, RecurseSubdirectories = true, }; - textureName = textureName.ToLower(); - var omDir = Path.Join(_extractionPath, "obj"); - var omPaths = Directory.GetFiles(omDir, textureName, options); - if (campaignName == null || campaignName == "") + var pathMap = new Dictionary(); + foreach (var dir in Directory.EnumerateDirectories(root, "obj", dirOptions)) { - if (omPaths.Length > 0) + foreach (var path in Directory.EnumerateFiles(dir, "*", texOptions)) { - return omPaths[0]; - } - } - else if (_fmResources.TryGetValue(campaignName, out var campaign)) - { - // TODO: This is a fucking mess - // Basically we need to handle when the campaign doesn't have a models folder lol - if (campaign.objectPathMap.TryGetValue(modelName, out var modelPath)) - { - var dir = Path.GetDirectoryName(modelPath); - var fmPaths = Directory.GetFiles(dir, textureName, options); - if (fmPaths.Length > 0) + var ext = Path.GetExtension(path); + if (validExtensions.Contains(ext.ToLower())) { - return fmPaths[0]; + var key = Path.GetFileNameWithoutExtension(path).ToLower(); + pathMap.TryAdd(key, path); } - else if (omPaths.Length > 0) - { - return omPaths[0]; - } - } - else if (omPaths.Length > 0) - { - return omPaths[0]; } } - return null; + return pathMap; } // TODO: Handle object textures? diff --git a/project/code/TMV/ModelLoader.cs b/project/code/TMV/ModelLoader.cs index 135900c..1181108 100644 --- a/project/code/TMV/ModelLoader.cs +++ b/project/code/TMV/ModelLoader.cs @@ -56,12 +56,11 @@ public class ModelLoader { if (material.Type == 0) { - var path = pathManager.GetObjectTexturePath(campaignName, modelName, material.Name); + var path = pathManager.GetObjectTexturePath(campaignName, material.Name); if (path == null) { - // TODO: JORGE + path = "user://textures/jorge.png"; GD.Print($"Failed to load model texture: {material.Name}"); - continue; } materials.Add(new StandardMaterial3D