public GraphicsCompositorEditorViewModel([NotNull] GraphicsCompositorViewModel graphicsCompositor) : base(graphicsCompositor) { // Create the service needed to manage observable view models ViewModelService = new GraphViewModelService(Session.AssetNodeContainer); // Update the service provider of this view model to contains the ObservableViewModelService we created. ServiceProvider = new ViewModelServiceProvider(ServiceProvider, ViewModelService.Yield()); // Get some quantum nodes graphicsCompositorNode = Session.AssetNodeContainer.GetNode(graphicsCompositor.Asset); renderStagesNode = graphicsCompositorNode[nameof(GraphicsCompositorAsset.RenderStages)].Target; renderFeaturesNode = graphicsCompositorNode[nameof(GraphicsCompositorAsset.RenderFeatures)].Target; cameraSlotsNode = graphicsCompositorNode[nameof(GraphicsCompositorAsset.Cameras)].Target; sharedRenderersNode = graphicsCompositorNode[nameof(GraphicsCompositorAsset.SharedRenderers)].Target; // Setup commands DeleteSelectionCommand = new AnonymousCommand(ServiceProvider, DeleteSelection); AddNewRenderStageCommand = new AnonymousCommand(ServiceProvider, AddNewRenderStage); RemoveSelectedRenderStagesCommand = new AnonymousCommand(ServiceProvider, RemoveSelectedRenderStages); AddNewRenderFeatureCommand = new AnonymousCommand <AbstractNodeType>(ServiceProvider, AddNewRenderFeature); RemoveSelectedRenderFeaturesCommand = new AnonymousCommand(ServiceProvider, RemoveSelectedRenderFeatures); AddNewCameraSlotCommand = new AnonymousCommand(ServiceProvider, AddNewCameraSlot); RemoveSelectedCameraSlotsCommand = new AnonymousCommand(ServiceProvider, RemoveSelectedCameraSlots); }
private async Task ReloadGraphicsCompositor(bool forceIfSame) { var graphicsCompositorId = AttachedReferenceManager.GetAttachedReference(settingsProvider.CurrentGameSettings.GraphicsCompositor)?.Id; var graphicsCompositorAsset = (GraphicsCompositorViewModel)(graphicsCompositorId.HasValue ? editor.Session.GetAssetById(graphicsCompositorId.Value) : null); // Same compositor as before? if (graphicsCompositorAsset == currentGraphicsCompositorAsset && !forceIfSame) { return; } // TODO: Start listening for changes in this compositor currentGraphicsCompositorAsset = graphicsCompositorAsset; // TODO: If nothing, fallback to default compositor, or stop rendering? if (graphicsCompositorAsset == null) { return; } // TODO: Prevent reentrency var database = editor.ServiceProvider.Get <GameStudioDatabase>(); await database.Build(graphicsCompositorAsset.AssetItem); await controller.InvokeTask(async() => { using (await database.MountInCurrentMicroThread()) { // Unlaod previous graphics compositor if (loadedGraphicsCompositor != null) { game.Content.Unload(loadedGraphicsCompositor); loadedGraphicsCompositor = null; } else { // Should only happen when graphics compositor is fallback one (i.e. first load or failure) game.SceneSystem.GraphicsCompositor?.Dispose(); } game.SceneSystem.GraphicsCompositor = null; // Load and set new graphics compositor loadedGraphicsCompositor = game.Content.Load <GraphicsCompositor>(graphicsCompositorAsset.AssetItem.Location); game.UpdateGraphicsCompositor(loadedGraphicsCompositor); } }); }