bool Playing() { GameDriverContext context = gameDriverContext; var timeManager = context.timeManager; if (!timeManager.RealTimerCorrect("frame", context.FrameInterval, out double deltaTime)) { return(false); } if (!(context.NeedRender > 0 || context.Playing)) { return(false); } context.NeedRender -= 1; context.DeltaTime = Math.Clamp(deltaTime * context.PlaySpeed, -0.17f, 0.17f); if (context.Playing) { context.PlayTime += context.DeltaTime; } return(true); }
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(); } }