OpenGlPage.xaml.cs 2.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384
  1. using System.Runtime.InteropServices;
  2. using Avalonia;
  3. using Avalonia.Controls;
  4. using Avalonia.Controls.Primitives;
  5. using Avalonia.Interactivity;
  6. using Avalonia.Markup.Xaml;
  7. using Avalonia.OpenGL;
  8. using Avalonia.OpenGL.Controls;
  9. using Avalonia.Rendering.Composition;
  10. using ControlCatalog.Pages.OpenGl;
  11. // ReSharper disable StringLiteralTypo
  12. namespace ControlCatalog.Pages
  13. {
  14. public class OpenGlPage : UserControl
  15. {
  16. public OpenGlPage()
  17. {
  18. AvaloniaXamlLoader.Load(this);
  19. this.FindControl<OpenGlPageControl>("GL")
  20. !.Init(this.FindControl<GlPageKnobs>("Knobs")!);
  21. AttachedToVisualTree += delegate
  22. {
  23. if (TopLevel.GetTopLevel(this) is Window)
  24. this.FindControl<Button>("Snapshot")!.IsVisible = true;
  25. };
  26. }
  27. private async void SnapshotClick(object sender, RoutedEventArgs e)
  28. {
  29. var v = ElementComposition.GetElementVisual(this)!;
  30. var snap = await v.Compositor.CreateCompositionVisualSnapshot(v, 1.5);
  31. await new Window()
  32. {
  33. Content = new ScrollViewer()
  34. {
  35. HorizontalScrollBarVisibility = ScrollBarVisibility.Auto,
  36. VerticalScrollBarVisibility = ScrollBarVisibility.Auto,
  37. Content = new Image()
  38. {
  39. Source = snap
  40. }
  41. }
  42. }.ShowDialog((Window)TopLevel.GetTopLevel(this)!);
  43. }
  44. }
  45. public class OpenGlPageControl : OpenGlControlBase
  46. {
  47. private OpenGlContent _content = new();
  48. private GlPageKnobs? _knobs;
  49. public void Init(GlPageKnobs knobs)
  50. {
  51. _knobs = knobs;
  52. _knobs.PropertyChanged += KnobsPropertyChanged;
  53. }
  54. private void KnobsPropertyChanged(object? sender, AvaloniaPropertyChangedEventArgs change)
  55. {
  56. if (change.Property == GlPageKnobs.YawProperty
  57. || change.Property == GlPageKnobs.RollProperty
  58. || change.Property == GlPageKnobs.PitchProperty
  59. || change.Property == GlPageKnobs.DiscoProperty)
  60. RequestNextFrameRendering();
  61. }
  62. protected override unsafe void OnOpenGlInit(GlInterface GL) => _content.Init(GL, GlVersion);
  63. protected override void OnOpenGlDeinit(GlInterface GL) => _content.Deinit(GL);
  64. protected override unsafe void OnOpenGlRender(GlInterface gl, int fb)
  65. {
  66. if (_knobs == null)
  67. return;
  68. _content.OnOpenGlRender(gl, fb, new PixelSize((int)Bounds.Width, (int)Bounds.Height),
  69. _knobs.Yaw, _knobs.Pitch, _knobs.Roll, _knobs.Disco);
  70. if (_knobs.Disco > 0.01)
  71. RequestNextFrameRendering();
  72. }
  73. }
  74. }