OpenGlPage.xaml.cs 2.6 KB

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