public static void ReloadModels(Scene scene, MainCaches mainCaches, ProcessingList processingList, GameDriverContext gameDriverContext) { if (mainCaches.modelTaskLocker.GetLocker()) { Task.Run(async() => { List <ModelPack> packs = new List <ModelPack>(); lock (mainCaches.ModelPackCaches) foreach (var modelPack in mainCaches.ModelPackCaches.Values) { if (modelPack.Status == GraphicsObjectStatus.loaded || modelPack.Status == GraphicsObjectStatus.error) { packs.Add(modelPack); } } List <ModelPack> updatePacks = new List <ModelPack>(); for (int i = 0; i < packs.Count; i++) { var pack = packs[i]; if (pack.LoadTask == null) { try { var file = await pack.folder.GetFileAsync(pack.relativePath); var attr = await file.GetBasicPropertiesAsync(); if (attr.DateModified != pack.lastModifiedTime) { updatePacks.Add(pack); pack.lastModifiedTime = attr.DateModified; } } catch { } } } List <ModelPack> newPacks = new List <ModelPack>(); for (int i = 0; i < updatePacks.Count; i++) { var file = await updatePacks[i].folder.GetFileAsync(updatePacks[i].relativePath); ModelPack pack = new ModelPack(); pack.LoadTask = LoadPMX(file, updatePacks[i].folder, pack, processingList); newPacks.Add(pack); } for (int i = 0; i < newPacks.Count; i++) { var pack = newPacks[i]; void fun1() { lock (mainCaches.ModelPackCaches) { mainCaches.ModelPackCaches[pack.fullPath] = pack; } for (int j = 0; j < scene.Entities.Count; j++) { if (scene.Entities[j].ModelPath == pack.fullPath) { scene.Entities[j].ReloadModel(processingList, pack, GetTextureList(processingList, mainCaches, pack.folder, pack.pmx)); scene.EntityRefreshList.Add(scene.Entities[j]); gameDriverContext.RequireResetPhysics = true; gameDriverContext.RequireRender(true); mainCaches.ReloadTextures(processingList, gameDriverContext.RequireRender); } } } if (pack.LoadTask == null && pack.Status == GraphicsObjectStatus.loaded) { fun1(); } else { try { pack.LoadTask.Wait(); fun1(); } catch { } } } mainCaches.modelTaskLocker.FreeLocker(); }).Wait(); } }