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