/// <summary> /// Applies the given sample. /// </summary> private async void ApplySample(SampleMetadata sampleInfo, SampleSettings sampleSettings) { if (_isChangingSample) { return; } _isChangingSample = true; try { if (_actSampleInfo == sampleInfo) { return; } // Discard presenting before updating current sample _ctrlRenderPanel.DiscardPresent = true; foreach (var actChildWindow in _childWindows) { actChildWindow.DiscardPresent = true; } // Clear previous sample if (_actSampleInfo != null) { await _ctrlRenderPanel.RenderLoop.Scene.ManipulateSceneAsync(manipulator => { manipulator.Clear(true); }); await _ctrlRenderPanel.RenderLoop.Clear2DDrawingLayersAsync(); _ctrlRenderPanel.RenderLoop.ObjectFilters.Clear(); foreach (var actChildWindow in _childWindows) { await actChildWindow.ClearAsync(); } _actSample !.OnSampleClosed(); } if (_actSampleSettings != null) { _actSampleSettings.RecreateRequest -= this.OnSampleSettings_RecreateRequest; } if (this.IsDisposed || !this.IsHandleCreated) { return; } // Reset members _actSample = null; _actSampleInfo = null; // Apply new sample if (sampleInfo != null) { var sampleObject = sampleInfo.CreateSampleObject(); await sampleObject.OnStartupAsync(_ctrlRenderPanel.RenderLoop, sampleSettings); await sampleObject.OnInitRenderingWindowAsync(_ctrlRenderPanel.RenderLoop); await sampleObject.OnReloadAsync(_ctrlRenderPanel.RenderLoop, sampleSettings); foreach (var actChildWindow in _childWindows) { await actChildWindow.SetRenderingDataAsync(sampleObject); } _actSample = sampleObject; _actSampleSettings = sampleSettings; _actSampleInfo = sampleInfo; if (_actSampleSettings != null) { _actSampleSettings.RecreateRequest += this.OnSampleSettings_RecreateRequest; } _propertyGrid.SelectedObject = sampleSettings; this.UpdateSampleCommands(sampleSettings); await _ctrlRenderPanel.RenderLoop.Register2DDrawingLayerAsync( new PerformanceMeasureDrawingLayer(0f, _ctrlRenderPanel.ViewInformation)); } else { _propertyGrid.SelectedObject = null; this.UpdateSampleCommands(null); } if (this.IsDisposed || !this.IsHandleCreated) { return; } // Wait for next finished rendering await _ctrlRenderPanel.RenderLoop.WaitForNextFinishedRenderAsync(); if (this.IsDisposed || !this.IsHandleCreated) { return; } await _ctrlRenderPanel.RenderLoop.WaitForNextFinishedRenderAsync(); if (this.IsDisposed || !this.IsHandleCreated) { } } finally { // Continue presenting _ctrlRenderPanel.DiscardPresent = false; foreach (var actChildWindow in _childWindows) { actChildWindow.DiscardPresent = false; } _isChangingSample = false; } }
/// <summary> /// Applies the given sample. /// </summary> private async void ApplySample(SampleMetadata sampleInfo, SampleSettings sampleSettings) { if (_isChangingSample) { return; } _isChangingSample = true; try { if (_actSampleInfo == sampleInfo) { return; } // Discard presenting before updating current sample this.CtrlRenderer.DiscardPresent = true; foreach (var actChildWindow in _childWindows) { actChildWindow.DiscardPresent = true; } // Clear previous sample if (_actSampleInfo != null) { await CtrlRenderer.RenderLoop.Scene.ManipulateSceneAsync(manipulator => { manipulator.Clear(true); }); await CtrlRenderer.RenderLoop.Clear2DDrawingLayersAsync(); CtrlRenderer.RenderLoop.ObjectFilters.Clear(); foreach (var actChildWindow in _childWindows) { await actChildWindow.ClearAsync(); } _actSample !.OnSampleClosed(); } // Reset members _actSample = null; _actSampleInfo = null; // Apply new sample var sampleObject = sampleInfo.CreateSampleObject(); await sampleObject.OnStartupAsync(CtrlRenderer.RenderLoop, sampleSettings); await sampleObject.OnInitRenderingWindowAsync(CtrlRenderer.RenderLoop); await sampleObject.OnReloadAsync(CtrlRenderer.RenderLoop, sampleSettings); foreach (var actChildWindow in _childWindows) { await actChildWindow.SetRenderingDataAsync(sampleObject); } _actSample = sampleObject; _actSampleInfo = sampleInfo; await CtrlRenderer.RenderLoop.Register2DDrawingLayerAsync( new PerformanceMeasureDrawingLayer(170f, CtrlRenderer.ViewInformation)); // Wait for next finished rendering await CtrlRenderer.RenderLoop.WaitForNextFinishedRenderAsync(); await CtrlRenderer.RenderLoop.WaitForNextFinishedRenderAsync(); } finally { // Continue presenting this.CtrlRenderer.DiscardPresent = false; foreach (var actChildWindow in _childWindows) { actChildWindow.DiscardPresent = false; } _isChangingSample = false; } }