// Copyright (c) 2012-2021 Wojciech Figat. All rights reserved. using System; using FlaxEngine; using FlaxEngine.Utilities; namespace FlaxEditor.States { /// /// Editor loading initial state /// /// [HideInEditor] public sealed class LoadingState : EditorState { private bool _loadScriptsFlag; private DateTime _loadScriptsDelayTime; private bool _compilationFailed; /// public override bool CanEditContent => false; /// public override bool IsEditorReady => false; /// public override bool CanReloadScripts => true; /// public override string Status => "Loading..."; internal LoadingState(Editor editor) : base(editor) { } /// /// Starts the Editor initialization process ending. /// /// True if skip scripts compilation on startup. internal void StartInitEnding(bool skipCompile) { ScriptsBuilder.CompilationEnd += OnCompilationEnd; // Check source code has been compiled on start if (ScriptsBuilder.CompilationsCount > 0) { // Check if compilation has been ended if (ScriptsBuilder.IsReady) { // We assume source code has been compiled before Editor init OnCompilationEnd(true); } } else if (Editor.Options.Options.General.ForceScriptCompilationOnStartup && !skipCompile) { // Compile scripts before loading any scenes, then we load them and can open scenes ScriptsBuilder.Compile(); } else { // Skip compilation on startup OnCompilationEnd(true); Editor.EndInit(); } } private void OnCompilationEnd(bool success) { // Check if compilation success if (success) { // Request loading scripts (we need to do this on main thread) _loadScriptsFlag = true; _loadScriptsDelayTime = DateTime.Now + TimeSpan.FromMilliseconds(30); } else { // Cannot compile user scripts, let's end init but on main thread in Update _compilationFailed = true; } } /// public override void Update() { // Check flag if (_loadScriptsFlag) { if (DateTime.Now > _loadScriptsDelayTime) { _loadScriptsFlag = false; // End init Editor.EndInit(); } } else if (_compilationFailed) { _compilationFailed = false; // Compilation failed so just end init Editor.EndInit(); } } /// public override void UpdateFPS() { Time.DrawFPS = 30; Time.UpdateFPS = 60; Time.PhysicsFPS = 30; } /// public override void OnExit(State nextState) { ScriptsBuilder.CompilationEnd -= OnCompilationEnd; } } }