1
1
using System ;
2
+ using System . Diagnostics . CodeAnalysis ;
2
3
using System . Numerics ;
3
4
using System . Threading . Tasks ;
4
5
using System . Windows . Input ;
10
11
using Avalonia . Platform ;
11
12
using Avalonia . Rendering . Composition ;
12
13
using Avalonia . Threading ;
13
- using CommunityToolkit . Mvvm . Input ;
14
14
using Nanoforge . FileSystem ;
15
15
using Nanoforge . Render ;
16
16
using Serilog ;
@@ -66,8 +66,6 @@ public string LoadingStatus
66
66
private Vector2 _mousePositionDelta = Vector2 . Zero ;
67
67
private bool _mouseOverViewport = false ;
68
68
private bool _mouseMovedThisFrame = false ;
69
- private bool _sceneInitStarted = false ;
70
- private Task ? _sceneInitTask ;
71
69
72
70
public Viewport3D ( )
73
71
{
@@ -79,8 +77,8 @@ public Viewport3D()
79
77
}
80
78
81
79
_renderer = ( Application . Current as App ) ! . Renderer ;
82
- _rendererOutput = new WriteableBitmap ( new PixelSize ( 1920 , 1080 ) , new Vector ( 96 , 96 ) , PixelFormat . Bgra8888 ) ;
83
-
80
+ CreateRendererOutputTexture ( ( int ) ViewportImage . Width , ( int ) ViewportImage . Height ) ;
81
+
84
82
if ( _renderer != null )
85
83
{
86
84
var mainWindow = MainWindow . Instance ;
@@ -95,7 +93,16 @@ public Viewport3D()
95
93
Log . Error ( "Renderer is null. If you're not in the xaml designer and you see this then there's a big problem." ) ;
96
94
}
97
95
}
98
-
96
+
97
+ [ MemberNotNull ( nameof ( _rendererOutput ) ) ]
98
+ private void CreateRendererOutputTexture ( int width , int height )
99
+ {
100
+ width = Math . Max ( 1 , width ) ;
101
+ height = Math . Max ( 1 , height ) ;
102
+ _rendererOutput = new WriteableBitmap ( new PixelSize ( width , height ) , new Vector ( 96 , 96 ) , PixelFormat . Bgra8888 ) ;
103
+ ViewportImage . Source = _rendererOutput ;
104
+ }
105
+
99
106
private void Control_OnLoaded ( object ? sender , RoutedEventArgs e )
100
107
{
101
108
Update ( ) ;
@@ -144,7 +151,7 @@ private void RenderFrame()
144
151
_renderer . RenderFrame ( Scene ! ) ;
145
152
146
153
using var buffer = _rendererOutput ! . Lock ( ) ;
147
- _renderer . GetRenderImage ( buffer . Address ) ;
154
+ Scene ! . GetRenderImage ( buffer . Address ) ;
148
155
149
156
_lastUpdate = DateTime . Now ;
150
157
}
@@ -181,4 +188,10 @@ private void InputElement_OnPointerExited(object? sender, PointerEventArgs e)
181
188
{
182
189
_mouseOverViewport = false ;
183
190
}
191
+
192
+ private void ViewportImage_OnSizeChanged ( object ? sender , SizeChangedEventArgs e )
193
+ {
194
+ CreateRendererOutputTexture ( ( int ) e . NewSize . Width , ( int ) e . NewSize . Height ) ;
195
+ Scene ? . ViewportResize ( new Vector2 ( ( float ) e . NewSize . Width , ( float ) e . NewSize . Height ) ) ;
196
+ }
184
197
}
0 commit comments