示例#1
0
        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);
        }
示例#2
0
        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();
            }
        }