fix failing tri calculation

This commit is contained in:
Stanley Dimant
2024-09-10 17:27:03 +02:00
parent 78ff96ca99
commit 953ff065b1
2 changed files with 5 additions and 23 deletions

View File

@@ -115,7 +115,6 @@ public class PlayerDataFactory
private async Task<CharacterData> CreateCharacterData(CharacterData previousData, GameObjectHandler playerRelatedObject, CancellationToken token) private async Task<CharacterData> CreateCharacterData(CharacterData previousData, GameObjectHandler playerRelatedObject, CancellationToken token)
{ {
var objectKind = playerRelatedObject.ObjectKind; var objectKind = playerRelatedObject.ObjectKind;
var charaPointer = playerRelatedObject.Address;
_logger.LogDebug("Building character data for {obj}", playerRelatedObject); _logger.LogDebug("Building character data for {obj}", playerRelatedObject);

View File

@@ -20,6 +20,7 @@ public sealed class XivDataAnalyzer
private readonly FileCacheManager _fileCacheManager; private readonly FileCacheManager _fileCacheManager;
private readonly XivDataStorageService _configService; private readonly XivDataStorageService _configService;
private readonly GameData _luminaGameData; private readonly GameData _luminaGameData;
private readonly List<string> _failedCalculatedTris = [];
public XivDataAnalyzer(ILogger<XivDataAnalyzer> logger, FileCacheManager fileCacheManager, public XivDataAnalyzer(ILogger<XivDataAnalyzer> logger, FileCacheManager fileCacheManager,
XivDataStorageService configService, IDataManager gameData) XivDataStorageService configService, IDataManager gameData)
@@ -153,33 +154,14 @@ public sealed class XivDataAnalyzer
return output; return output;
} }
public Task<long> GetTrianglesFromGamePath(string gamePath)
{
if (_configService.Current.TriangleDictionary.TryGetValue(gamePath, out var cachedTris))
return Task.FromResult(cachedTris);
_logger.LogDebug("Detected Model File {path}, calculating Tris", gamePath);
var file = _luminaGameData.GetFile<MdlFile>(gamePath);
if (file == null)
return Task.FromResult((long)0);
if (file.FileHeader.LodCount <= 0)
return Task.FromResult((long)0);
var meshIdx = file.Lods[0].MeshIndex;
var meshCnt = file.Lods[0].MeshCount;
var tris = file.Meshes.Skip(meshIdx).Take(meshCnt).Sum(p => p.IndexCount) / 3;
_logger.LogDebug("{filePath} => {tris} triangles", gamePath, tris);
_configService.Current.TriangleDictionary[gamePath] = tris;
_configService.Save();
return Task.FromResult(tris);
}
public Task<long> GetTrianglesByHash(string hash) public Task<long> GetTrianglesByHash(string hash)
{ {
if (_configService.Current.TriangleDictionary.TryGetValue(hash, out var cachedTris) && cachedTris > 0) if (_configService.Current.TriangleDictionary.TryGetValue(hash, out var cachedTris) && cachedTris > 0)
return Task.FromResult(cachedTris); return Task.FromResult(cachedTris);
if (_failedCalculatedTris.Contains(hash, StringComparer.Ordinal))
return Task.FromResult((long)0);
var path = _fileCacheManager.GetFileCacheByHash(hash); var path = _fileCacheManager.GetFileCacheByHash(hash);
if (path == null || !path.ResolvedFilepath.EndsWith(".mdl", StringComparison.OrdinalIgnoreCase)) if (path == null || !path.ResolvedFilepath.EndsWith(".mdl", StringComparison.OrdinalIgnoreCase))
return Task.FromResult((long)0); return Task.FromResult((long)0);
@@ -219,6 +201,7 @@ public sealed class XivDataAnalyzer
} }
catch (Exception e) catch (Exception e)
{ {
_failedCalculatedTris.Add(hash);
_configService.Current.TriangleDictionary[hash] = 0; _configService.Current.TriangleDictionary[hash] = 0;
_configService.Save(); _configService.Save();
_logger.LogWarning(e, "Could not parse file {file}", filePath); _logger.LogWarning(e, "Could not parse file {file}", filePath);