OpenGlPage.xaml.cs 1.8 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556
  1. using Avalonia;
  2. using Avalonia.Controls;
  3. using Avalonia.Markup.Xaml;
  4. using Avalonia.OpenGL;
  5. using Avalonia.OpenGL.Controls;
  6. using ControlCatalog.Pages.OpenGl;
  7. // ReSharper disable StringLiteralTypo
  8. namespace ControlCatalog.Pages
  9. {
  10. public class OpenGlPage : UserControl
  11. {
  12. public OpenGlPage()
  13. {
  14. AvaloniaXamlLoader.Load(this);
  15. this.FindControl<OpenGlPageControl>("GL")
  16. !.Init(this.FindControl<GlPageKnobs>("Knobs")!);
  17. }
  18. }
  19. public class OpenGlPageControl : OpenGlControlBase
  20. {
  21. private OpenGlContent _content = new();
  22. private GlPageKnobs? _knobs;
  23. public void Init(GlPageKnobs knobs)
  24. {
  25. _knobs = knobs;
  26. _knobs.PropertyChanged += KnobsPropertyChanged;
  27. }
  28. private void KnobsPropertyChanged(object? sender, AvaloniaPropertyChangedEventArgs change)
  29. {
  30. if (change.Property == GlPageKnobs.YawProperty
  31. || change.Property == GlPageKnobs.RollProperty
  32. || change.Property == GlPageKnobs.PitchProperty
  33. || change.Property == GlPageKnobs.DiscoProperty)
  34. RequestNextFrameRendering();
  35. }
  36. protected override unsafe void OnOpenGlInit(GlInterface GL) => _content.Init(GL, GlVersion);
  37. protected override void OnOpenGlDeinit(GlInterface GL) => _content.Deinit(GL);
  38. protected override unsafe void OnOpenGlRender(GlInterface gl, int fb)
  39. {
  40. if (_knobs == null)
  41. return;
  42. _content.OnOpenGlRender(gl, fb, new PixelSize((int)Bounds.Width, (int)Bounds.Height),
  43. _knobs.Yaw, _knobs.Pitch, _knobs.Roll, _knobs.Disco);
  44. if (_knobs.Disco > 0.01)
  45. RequestNextFrameRendering();
  46. }
  47. }
  48. }