private static void PostAssemblyReloading(IUndoRedoService actionService, SessionNodeContainer nodeContainer, ReloadingVisitor reloaderVisitor, ILogger log, Dictionary <AssetViewModel, List <ItemToReload> > assetItemsToReload) { log?.Info("Updating components with newly loaded assemblies"); // Recreate new objects from Yaml streams foreach (var asset in assetItemsToReload) { // Deserialize objects with reloaded types from Yaml reloaderVisitor.Run(asset.Key.Asset, asset.Value); // Set new values var overrides = new YamlAssetMetadata <OverrideType>(); foreach (var itemToReload in asset.Value) { // Set (members) or add nodes (collections) with values created using newly loaded assemblies ReplaceNode(actionService, asset.Key, itemToReload); if (itemToReload.Overrides != null) { var extendedPath = itemToReload.GraphPath.Clone(); if (itemToReload.GraphPathIndex != NodeIndex.Empty) { extendedPath.PushIndex(itemToReload.GraphPathIndex); } var pathToPrepend = AssetNodeMetadataCollectorBase.ConvertPath(extendedPath); foreach (var entry in itemToReload.Overrides) { var path = pathToPrepend.Append(entry.Key); overrides.Set(path, entry.Value); } } } FixupObjectReferences.RunFixupPass(asset.Key.Asset, reloaderVisitor.ObjectReferences, true, false, log); var rootNode = (IAssetNode)nodeContainer.GetNode(asset.Key.Asset); AssetPropertyGraph.ApplyOverrides(rootNode, overrides); } }
/// <summary> /// Initializes a new instance of the <see cref="EditorGameController{TEditorGame}"/> class. /// </summary> /// <param name="asset">The asset associated with this instance.</param> /// <param name="editor">The editor associated with this instance.</param> /// <param name="gameFactory">The factory to create the editor game.</param> protected EditorGameController([NotNull] AssetViewModel asset, [NotNull] GameEditorViewModel editor, [NotNull] EditorGameFactory <TEditorGame> gameFactory) { if (asset == null) { throw new ArgumentNullException(nameof(asset)); } if (editor == null) { throw new ArgumentNullException(nameof(editor)); } Asset = asset; Editor = editor; GameSideNodeContainer = new SessionNodeContainer(asset.Session) { NodeBuilder = { NodeFactory = new AssetNodeFactory() } }; //Logger = GlobalLogger.GetLogger("Scene"); Logger = new LoggerResult(); debugPage = EditorDebugTools.CreateLogDebugPage(Logger, "Scene"); // Create the game var builderService = asset.ServiceProvider.Get <GameStudioBuilderService>(); Game = gameFactory(gameContentLoadedTaskSource, builderService.EffectCompiler, builderService.EffectLogPath); Game.PackageSettings = asset.ServiceProvider.Get <GameSettingsProviderService>(); sceneGameThread = new Thread(SafeAction.Wrap(SceneGameRunThread)) { IsBackground = true, Name = $"EditorGameThread ({asset.Url})" }; sceneGameThread.SetApartmentState(ApartmentState.STA); Debug = new EditorGameDebugService(); Loader = new EditorContentLoader(this, Logger, asset, Game); }