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);
                }
            });
        }