flabbet пре 1 година
родитељ
комит
31e9bc7484

+ 21 - 0
src/DrawingApi.MinimalGpuSetup/DrawingApi.MinimalGpuSetup.csproj

@@ -0,0 +1,21 @@
+<Project Sdk="Microsoft.NET.Sdk">
+
+    <PropertyGroup>
+        <OutputType>Exe</OutputType>
+        <TargetFramework>net8.0</TargetFramework>
+        <ImplicitUsings>enable</ImplicitUsings>
+        <Nullable>enable</Nullable>
+    </PropertyGroup>
+
+    <ItemGroup>
+      <PackageReference Include="Avalonia" Version="11.0.11" />
+      <PackageReference Include="Silk.NET.OpenGL" Version="2.21.0" />
+      <PackageReference Include="Silk.NET.Windowing" Version="2.21.0" />
+    </ItemGroup>
+
+    <ItemGroup>
+      <ProjectReference Include="..\PixiEditor.DrawingApi.Core\PixiEditor.DrawingApi.Core.csproj" />
+      <ProjectReference Include="..\PixiEditor.DrawingApi.Skia\PixiEditor.DrawingApi.Skia.csproj" />
+    </ItemGroup>
+
+</Project>

+ 63 - 0
src/DrawingApi.MinimalGpuSetup/OpenGlSkiaWindow.cs

@@ -0,0 +1,63 @@
+using Silk.NET.GLFW;
+using Silk.NET.Maths;
+using Silk.NET.OpenGL;
+using Silk.NET.Windowing;
+using SkiaSharp;
+
+namespace DrawingApi.MinimalGpuSetup;
+
+public class OpenGlSkiaWindow
+{
+    private GL gl;
+    private IWindow _window;
+    private GRContext _grContext;
+
+    private SKSurface frontBufferSurface;
+    
+    public event Action<SKSurface, double> Render;
+    public event Action<GRContext> Init;
+
+    public OpenGlSkiaWindow()
+    {
+        WindowOptions options = WindowOptions.Default with
+        {
+            Title = "OpenGL Window", Size = new Vector2D<int>(1200, 600)
+        };
+
+        _window = Window.Create(options);
+
+        _window.Load += () =>
+        {
+            gl = GL.GetApi(_window);
+            frontBufferSurface = SKSurface.Create(new SKImageInfo(1200, 600));
+            
+            _window.GLContext.MakeCurrent();
+
+            InitSkiaSurface();
+            
+            Init?.Invoke(_grContext);
+        };
+        
+        _window.Render += OnRender;
+    }
+
+    public void Run()
+    {
+        _window.Run();
+    }
+    
+    private void OnRender(double deltaTime)
+    {
+        frontBufferSurface.Canvas.Clear(SKColors.White);
+        Render?.Invoke(frontBufferSurface, deltaTime); 
+        frontBufferSurface.Canvas.Flush();
+    }
+
+    private void InitSkiaSurface()
+    {
+        _grContext = GRContext.CreateGl(GRGlInterface.Create(Glfw.GetApi().GetProcAddress));
+        var frameBuffer = new GRGlFramebufferInfo(0, SKColorType.RgbaF16.ToGlSizedFormat());
+        GRBackendRenderTarget target = new GRBackendRenderTarget(_window.Size.X, _window.Size.Y, 4, 0, frameBuffer);
+        frontBufferSurface = SKSurface.Create(_grContext, target, GRSurfaceOrigin.BottomLeft, SKColorType.RgbaF16);
+    }
+}

+ 46 - 0
src/DrawingApi.MinimalGpuSetup/Program.cs

@@ -0,0 +1,46 @@
+using DrawingApi.MinimalGpuSetup;
+using PixiEditor.DrawingApi.Core.Bridge;
+using PixiEditor.DrawingApi.Core.Surface;
+using PixiEditor.DrawingApi.Core.Surface.ImageData;
+using PixiEditor.DrawingApi.Core.Surface.PaintImpl;
+using PixiEditor.DrawingApi.Skia;
+using Silk.NET.GLFW;
+using SkiaSharp;
+
+public static class Program
+{
+    private static DrawingSurface _drawingSurface;
+    private static Paint _paint = new Paint();
+    private static SKPaint _screenPaint = new SKPaint();
+    
+    private static int _time = 0;
+    private static double _lastTime = 0;
+    
+    public static void Main()
+    {
+       OpenGlSkiaWindow window = new OpenGlSkiaWindow();
+       window.Render += WindowOnRender;
+       window.Init += Init;
+       window.Run();
+    }
+    
+    private static void Init(GRContext context)
+    {
+        DrawingBackendApi.SetupBackend(new SkiaDrawingBackend(context));
+        _drawingSurface = DrawingSurface.Create(new ImageInfo(100, 100), true);
+    }
+
+    private static void WindowOnRender(SKSurface surface, double deltaTime)
+    {
+        surface.Canvas.DrawSurface((SKSurface)_drawingSurface.Native, 0, 0, _screenPaint);
+        
+        _lastTime += deltaTime;
+        if (_lastTime > 1)
+        {
+            _drawingSurface.Canvas.Clear();
+            _drawingSurface.Canvas.DrawText("Seconds: " + _time, 10, 10, _paint);
+            _time++;
+            _lastTime = 0;
+        }
+    }
+}

+ 65 - 0
src/PixiEditor.AvaloniaHeadless/AppWindow.cs

@@ -0,0 +1,65 @@
+using Silk.NET.GLFW;
+using Silk.NET.Maths;
+using Silk.NET.OpenGL;
+using Silk.NET.Windowing;
+using SkiaSharp;
+
+namespace PixiEditor.AvaloniaHeadless;
+
+public class AppWindow
+{
+    private GL gl;
+    private IWindow _window;
+    private GRContext _grContext;
+
+    private SKSurface frontBufferSurface;
+    
+    public event Action<SKSurface, double> Render;
+    public event Action<GRContext> Init;
+    
+    public Func<Delegate, string[], object> Dispatcher => _window.Invoke;
+
+    public AppWindow()
+    {
+        WindowOptions options = WindowOptions.Default with
+        {
+            Title = "OpenGL Window", Size = new Vector2D<int>(1200, 600)
+        };
+
+        _window = Window.Create(options);
+
+        _window.Load += () =>
+        {
+            gl = GL.GetApi(_window);
+            frontBufferSurface = SKSurface.Create(new SKImageInfo(1200, 600));
+            
+            _window.GLContext.MakeCurrent();
+
+            InitSkiaSurface();
+            
+            Init?.Invoke(_grContext);
+        };
+        
+        _window.Render += OnRender;
+    }
+
+    public void Run()
+    {
+        _window.Run();
+    }
+    
+    private void OnRender(double deltaTime)
+    {
+        frontBufferSurface.Canvas.Clear(SKColors.White);
+        Render?.Invoke(frontBufferSurface, deltaTime); 
+        frontBufferSurface.Canvas.Flush();
+    }
+
+    private void InitSkiaSurface()
+    {
+        _grContext = GRContext.CreateGl(GRGlInterface.Create(Glfw.GetApi().GetProcAddress));
+        var frameBuffer = new GRGlFramebufferInfo(0, SKColorType.RgbaF16.ToGlSizedFormat());
+        GRBackendRenderTarget target = new GRBackendRenderTarget(_window.Size.X, _window.Size.Y, 4, 0, frameBuffer);
+        frontBufferSurface = SKSurface.Create(_grContext, target, GRSurfaceOrigin.BottomLeft, SKColorType.RgbaF16);
+    }
+}

+ 22 - 0
src/PixiEditor.AvaloniaHeadless/PixiEditor.AvaloniaHeadless.csproj

@@ -0,0 +1,22 @@
+<Project Sdk="Microsoft.NET.Sdk">
+
+    <PropertyGroup>
+        <OutputType>Exe</OutputType>
+        <TargetFramework>net8.0</TargetFramework>
+        <ImplicitUsings>enable</ImplicitUsings>
+        <Nullable>enable</Nullable>
+    </PropertyGroup>
+
+    <ItemGroup>
+      <PackageReference Include="Avalonia" Version="11.0.11" />
+      <PackageReference Include="Avalonia.Headless" Version="11.0.11" />
+      <PackageReference Include="Silk.NET.OpenGL" Version="2.21.0" />
+      <PackageReference Include="Silk.NET.Windowing" Version="2.21.0" />
+      <PackageReference Include="SkiaSharp" Version="2.88.8" />
+    </ItemGroup>
+
+    <ItemGroup>
+      <ProjectReference Include="..\PixiEditor.AvaloniaUI\PixiEditor.AvaloniaUI.csproj" />
+    </ItemGroup>
+
+</Project>

+ 117 - 0
src/PixiEditor.AvaloniaHeadless/Program.cs

@@ -0,0 +1,117 @@
+using Avalonia;
+using Avalonia.Controls;
+using Avalonia.Headless;
+using Avalonia.Platform;
+using Avalonia.Threading;
+using PixiEditor.AvaloniaHeadless;
+using PixiEditor.AvaloniaUI;
+using PixiEditor.AvaloniaUI.Models.IO;
+using PixiEditor.DrawingApi.Core.Bridge;
+using PixiEditor.DrawingApi.Skia;
+using PixiEditor.Extensions.Runtime;
+using PixiEditor.OperatingSystem;
+using PixiEditor.Platform;
+using Silk.NET.GLFW;
+using SkiaSharp;
+using Window = Avalonia.Controls.Window;
+
+public static class Program
+{
+    public static void Main(string[] args)
+    {
+        AppWindow window = new AppWindow();
+        window.Init += (gr) =>
+        {
+            WindowOnInit(window.Dispatcher, gr, args);
+        };
+
+        window.Render += WindowOnRender;
+
+        window.Run();
+    }
+
+    private static void WindowOnRender(SKSurface arg1, double arg2)
+    {
+    }
+
+    private static void WindowOnInit(Func<Delegate, string[], object> dispatcher, GRContext grContext, string[] args)
+    
+    {
+        SkiaDrawingBackend skiaDrawingBackend = new SkiaDrawingBackend(grContext);
+        DrawingBackendApi.SetupBackend(skiaDrawingBackend);
+
+        SynchronizationContext.SetSynchronizationContext(new SynchronizationContext());
+        DrawingBackendApi.Current.Dispatcher = dispatcher;
+
+        var appBuilder = AppBuilder.Configure<App>()
+            .UseSkia()
+            .UseHeadless(new AvaloniaHeadlessPlatformOptions() { UseHeadlessDrawing = false });
+        
+
+        appBuilder.StartWithClassicDesktopLifetime(args);
+        
+        //appBuilder.Start(AppMain, args);
+    }
+
+    private static void AppMain(Application app, string[] args)
+    {
+        Type type = App.MainWindowType;
+        ExtensionLoader loader = InitApp();
+
+        var mainWindow = (Window)Activator.CreateInstance(type, loader);
+        
+        mainWindow.Show();
+    }
+
+    private static ExtensionLoader InitApp()
+    {
+        //LoadingWindow.ShowInNewThread();
+
+        InitPlatform();
+
+        ExtensionLoader extensionLoader = new ExtensionLoader(Paths.ExtensionPackagesPath, Paths.UserExtensionsPath);
+        //TODO: fetch from extension store
+        extensionLoader.AddOfficialExtension("pixieditor.supporterpack",
+            new OfficialExtensionData("supporter-pack.snk", AdditionalContentProduct.SupporterPack));
+        extensionLoader.LoadExtensions();
+
+        return extensionLoader;
+    }
+
+
+    private static void InitPlatform()
+    {
+        var platform = GetActivePlatform();
+        IPlatform.RegisterPlatform(platform);
+        platform.PerformHandshake();
+    }
+
+    private static IPlatform GetActivePlatform()
+    {
+#if STEAM
+            return new PixiEditor.Platform.Steam.SteamPlatform();
+#elif MSIX || MSIX_DEBUG
+            return new PixiEditor.Platform.MSStore.MicrosoftStorePlatform();
+#else
+        return new PixiEditor.Platform.Standalone.StandalonePlatform();
+#endif
+    }
+
+    private static void InitOperatingSystem()
+    {
+        IOperatingSystem.RegisterOS(GetActiveOperatingSystem());
+    }
+
+    private static IOperatingSystem GetActiveOperatingSystem()
+    {
+#if WINDOWS
+        return new PixiEditor.Windows.WindowsOperatingSystem();
+#elif LINUX
+            return new PixiEditor.Linux.LinuxOperatingSystem();
+#elif MACOS
+            return new PixiEditor.MacOs.MacOperatingSystem();
+#else
+            throw new PlatformNotSupportedException("This platform is not supported");
+#endif
+    }
+}

+ 2 - 3
src/PixiEditor.AvaloniaUI.Desktop/Program.cs

@@ -19,8 +19,7 @@ public class Program
             .UsePlatformDetect()
             .With(new Win32PlatformOptions()
             {
-                RenderingMode = new [] { Win32RenderingMode.Wgl },
+                RenderingMode = new [] { Win32RenderingMode.AngleEgl },
                 OverlayPopups = true
-            })
-            .LogToTrace();
+            }).LogToTrace();
 }

+ 8 - 7
src/PixiEditor.AvaloniaUI/Initialization/ClassicDesktopEntry.cs

@@ -78,13 +78,6 @@ internal class ClassicDesktopEntry
         desktop.MainWindow.Show();
     }
 
-    private void InitPlatform()
-    {
-        var platform = GetActivePlatform();
-        IPlatform.RegisterPlatform(platform);
-        platform.PerformHandshake();
-    }
-
     public ExtensionLoader InitApp()
     {
         LoadingWindow.ShowInNewThread();
@@ -99,6 +92,14 @@ internal class ClassicDesktopEntry
 
         return extensionLoader;
     }
+    
+    
+    private void InitPlatform()
+    {
+        var platform = GetActivePlatform();
+        IPlatform.RegisterPlatform(platform);
+        platform.PerformHandshake();
+    }
 
     private IPlatform GetActivePlatform()
     {

+ 1 - 1
src/PixiEditor.AvaloniaUI/Views/Visuals/SurfaceControl.cs

@@ -198,7 +198,7 @@ internal class DrawSurfaceOperation : SkiaDrawOperation
         }*/
 
         _paint.Color = _paint.Color.WithAlpha((byte)(Opacity * 255));
-        canvas.DrawSurface((SKSurface)Surface.DrawingSurface.Native, new SKPoint(0, 0), _paint);
+        //canvas.DrawSurface((SKSurface)Surface.DrawingSurface.Native, new SKPoint(0, 0), _paint);
         canvas.Restore();
     }
 

+ 1 - 0
src/PixiEditor.DrawingApi.Core/Bridge/Operations/ICanvasImplementation.cs

@@ -28,6 +28,7 @@ namespace PixiEditor.DrawingApi.Core.Bridge.Operations
         public void Clear(IntPtr objPtr);
         public void Clear(IntPtr objPtr, Color color);
         public void DrawLine(IntPtr objPtr, VecI from, VecI to, Paint paint);
+        public void DrawText(IntPtr objPtr, string text, float x, float y, Paint paint);
         public void Flush(IntPtr objPtr);
         public void SetMatrix(IntPtr objPtr, Matrix3X3 finalMatrix);
         public void RestoreToCount(IntPtr objPtr, int count);

+ 6 - 0
src/PixiEditor.DrawingApi.Core/Surface/Canvas.cs

@@ -154,6 +154,12 @@ namespace PixiEditor.DrawingApi.Core.Surface
             DrawingBackendApi.Current.CanvasImplementation.DrawLine(ObjectPointer, from, to, paint);
             Changed?.Invoke(new RectD(from, to));
         }
+        
+        public void DrawText(string text, float x, float y, Paint paint)
+        {
+            DrawingBackendApi.Current.CanvasImplementation.DrawText(ObjectPointer, text, x, y, paint);
+            Changed?.Invoke(null);
+        }
 
         public void Flush()
         {

+ 5 - 0
src/PixiEditor.DrawingApi.Skia/Implementations/SkiaCanvasImplementation.cs

@@ -145,6 +145,11 @@ namespace PixiEditor.DrawingApi.Skia.Implementations
             var canvas = ManagedInstances[objectPointer];
             canvas.DrawPaint(_paintImpl[paint.ObjectPointer]);
         }
+        
+        public void DrawText(IntPtr objPtr, string text, float x, float y, Paint paint)
+        {
+            ManagedInstances[objPtr].DrawText(text, x, y, _paintImpl[paint.ObjectPointer]);
+        }
 
         public void Flush(IntPtr objPtr)
         {

+ 1 - 1
src/PixiEditor.DrawingApi.Skia/Implementations/SkiaSurfaceImplementation.cs

@@ -28,7 +28,7 @@ namespace PixiEditor.DrawingApi.Skia.Implementations
             SKPixmap pixmap = ManagedInstances[drawingSurface.ObjectPointer].PeekPixels();
             if (pixmap == null)
             {
-                return null;
+                return drawingSurface.Snapshot().PeekPixels();
             }
             
             return _pixmapImplementation.CreateFrom(pixmap);

+ 61 - 30
src/PixiEditor.sln

@@ -104,7 +104,9 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "AnimationRendering", "Anima
 EndProject
 Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "DrawingApi.Benchmarks", "DrawingApi.Benchmarks\DrawingApi.Benchmarks.csproj", "{34B1472E-EE1B-46C7-B5ED-29CD13457C7A}"
 EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Avalonia.CustomTopLevel", "Avalonia.CustomTopLevel\Avalonia.CustomTopLevel.csproj", "{030B4397-B53A-4F5E-94FF-603AA0004997}"
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "DrawingApi.MinimalGpuSetup", "DrawingApi.MinimalGpuSetup\DrawingApi.MinimalGpuSetup.csproj", "{BAF15725-9536-4D8B-9E46-0EB2C9866C86}"
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "PixiEditor.AvaloniaHeadless", "PixiEditor.AvaloniaHeadless\PixiEditor.AvaloniaHeadless.csproj", "{3DEC93A8-E35F-4A5D-BF7B-20C502A48562}"
 EndProject
 Global
 	GlobalSection(SolutionConfigurationPlatforms) = preSolution
@@ -1532,34 +1534,62 @@ Global
 		{34B1472E-EE1B-46C7-B5ED-29CD13457C7A}.Steam|x64.Build.0 = Debug|Any CPU
 		{34B1472E-EE1B-46C7-B5ED-29CD13457C7A}.Steam|ARM64.ActiveCfg = Debug|Any CPU
 		{34B1472E-EE1B-46C7-B5ED-29CD13457C7A}.Steam|ARM64.Build.0 = Debug|Any CPU
-		{030B4397-B53A-4F5E-94FF-603AA0004997}.Debug|x64.ActiveCfg = Debug|Any CPU
-		{030B4397-B53A-4F5E-94FF-603AA0004997}.Debug|x64.Build.0 = Debug|Any CPU
-		{030B4397-B53A-4F5E-94FF-603AA0004997}.Debug|ARM64.ActiveCfg = Debug|Any CPU
-		{030B4397-B53A-4F5E-94FF-603AA0004997}.Debug|ARM64.Build.0 = Debug|Any CPU
-		{030B4397-B53A-4F5E-94FF-603AA0004997}.DevRelease|x64.ActiveCfg = Debug|Any CPU
-		{030B4397-B53A-4F5E-94FF-603AA0004997}.DevRelease|x64.Build.0 = Debug|Any CPU
-		{030B4397-B53A-4F5E-94FF-603AA0004997}.DevRelease|ARM64.ActiveCfg = Debug|Any CPU
-		{030B4397-B53A-4F5E-94FF-603AA0004997}.DevRelease|ARM64.Build.0 = Debug|Any CPU
-		{030B4397-B53A-4F5E-94FF-603AA0004997}.DevSteam|x64.ActiveCfg = Debug|Any CPU
-		{030B4397-B53A-4F5E-94FF-603AA0004997}.DevSteam|x64.Build.0 = Debug|Any CPU
-		{030B4397-B53A-4F5E-94FF-603AA0004997}.DevSteam|ARM64.ActiveCfg = Debug|Any CPU
-		{030B4397-B53A-4F5E-94FF-603AA0004997}.DevSteam|ARM64.Build.0 = Debug|Any CPU
-		{030B4397-B53A-4F5E-94FF-603AA0004997}.MSIX Debug|x64.ActiveCfg = Debug|Any CPU
-		{030B4397-B53A-4F5E-94FF-603AA0004997}.MSIX Debug|x64.Build.0 = Debug|Any CPU
-		{030B4397-B53A-4F5E-94FF-603AA0004997}.MSIX Debug|ARM64.ActiveCfg = Debug|Any CPU
-		{030B4397-B53A-4F5E-94FF-603AA0004997}.MSIX Debug|ARM64.Build.0 = Debug|Any CPU
-		{030B4397-B53A-4F5E-94FF-603AA0004997}.MSIX|x64.ActiveCfg = Debug|Any CPU
-		{030B4397-B53A-4F5E-94FF-603AA0004997}.MSIX|x64.Build.0 = Debug|Any CPU
-		{030B4397-B53A-4F5E-94FF-603AA0004997}.MSIX|ARM64.ActiveCfg = Debug|Any CPU
-		{030B4397-B53A-4F5E-94FF-603AA0004997}.MSIX|ARM64.Build.0 = Debug|Any CPU
-		{030B4397-B53A-4F5E-94FF-603AA0004997}.Release|x64.ActiveCfg = Release|Any CPU
-		{030B4397-B53A-4F5E-94FF-603AA0004997}.Release|x64.Build.0 = Release|Any CPU
-		{030B4397-B53A-4F5E-94FF-603AA0004997}.Release|ARM64.ActiveCfg = Release|Any CPU
-		{030B4397-B53A-4F5E-94FF-603AA0004997}.Release|ARM64.Build.0 = Release|Any CPU
-		{030B4397-B53A-4F5E-94FF-603AA0004997}.Steam|x64.ActiveCfg = Debug|Any CPU
-		{030B4397-B53A-4F5E-94FF-603AA0004997}.Steam|x64.Build.0 = Debug|Any CPU
-		{030B4397-B53A-4F5E-94FF-603AA0004997}.Steam|ARM64.ActiveCfg = Debug|Any CPU
-		{030B4397-B53A-4F5E-94FF-603AA0004997}.Steam|ARM64.Build.0 = Debug|Any CPU
+		{BAF15725-9536-4D8B-9E46-0EB2C9866C86}.Debug|x64.ActiveCfg = Debug|Any CPU
+		{BAF15725-9536-4D8B-9E46-0EB2C9866C86}.Debug|x64.Build.0 = Debug|Any CPU
+		{BAF15725-9536-4D8B-9E46-0EB2C9866C86}.Debug|ARM64.ActiveCfg = Debug|Any CPU
+		{BAF15725-9536-4D8B-9E46-0EB2C9866C86}.Debug|ARM64.Build.0 = Debug|Any CPU
+		{BAF15725-9536-4D8B-9E46-0EB2C9866C86}.DevRelease|x64.ActiveCfg = Debug|Any CPU
+		{BAF15725-9536-4D8B-9E46-0EB2C9866C86}.DevRelease|x64.Build.0 = Debug|Any CPU
+		{BAF15725-9536-4D8B-9E46-0EB2C9866C86}.DevRelease|ARM64.ActiveCfg = Debug|Any CPU
+		{BAF15725-9536-4D8B-9E46-0EB2C9866C86}.DevRelease|ARM64.Build.0 = Debug|Any CPU
+		{BAF15725-9536-4D8B-9E46-0EB2C9866C86}.DevSteam|x64.ActiveCfg = Debug|Any CPU
+		{BAF15725-9536-4D8B-9E46-0EB2C9866C86}.DevSteam|x64.Build.0 = Debug|Any CPU
+		{BAF15725-9536-4D8B-9E46-0EB2C9866C86}.DevSteam|ARM64.ActiveCfg = Debug|Any CPU
+		{BAF15725-9536-4D8B-9E46-0EB2C9866C86}.DevSteam|ARM64.Build.0 = Debug|Any CPU
+		{BAF15725-9536-4D8B-9E46-0EB2C9866C86}.MSIX Debug|x64.ActiveCfg = Debug|Any CPU
+		{BAF15725-9536-4D8B-9E46-0EB2C9866C86}.MSIX Debug|x64.Build.0 = Debug|Any CPU
+		{BAF15725-9536-4D8B-9E46-0EB2C9866C86}.MSIX Debug|ARM64.ActiveCfg = Debug|Any CPU
+		{BAF15725-9536-4D8B-9E46-0EB2C9866C86}.MSIX Debug|ARM64.Build.0 = Debug|Any CPU
+		{BAF15725-9536-4D8B-9E46-0EB2C9866C86}.MSIX|x64.ActiveCfg = Debug|Any CPU
+		{BAF15725-9536-4D8B-9E46-0EB2C9866C86}.MSIX|x64.Build.0 = Debug|Any CPU
+		{BAF15725-9536-4D8B-9E46-0EB2C9866C86}.MSIX|ARM64.ActiveCfg = Debug|Any CPU
+		{BAF15725-9536-4D8B-9E46-0EB2C9866C86}.MSIX|ARM64.Build.0 = Debug|Any CPU
+		{BAF15725-9536-4D8B-9E46-0EB2C9866C86}.Release|x64.ActiveCfg = Release|Any CPU
+		{BAF15725-9536-4D8B-9E46-0EB2C9866C86}.Release|x64.Build.0 = Release|Any CPU
+		{BAF15725-9536-4D8B-9E46-0EB2C9866C86}.Release|ARM64.ActiveCfg = Release|Any CPU
+		{BAF15725-9536-4D8B-9E46-0EB2C9866C86}.Release|ARM64.Build.0 = Release|Any CPU
+		{BAF15725-9536-4D8B-9E46-0EB2C9866C86}.Steam|x64.ActiveCfg = Debug|Any CPU
+		{BAF15725-9536-4D8B-9E46-0EB2C9866C86}.Steam|x64.Build.0 = Debug|Any CPU
+		{BAF15725-9536-4D8B-9E46-0EB2C9866C86}.Steam|ARM64.ActiveCfg = Debug|Any CPU
+		{BAF15725-9536-4D8B-9E46-0EB2C9866C86}.Steam|ARM64.Build.0 = Debug|Any CPU
+		{3DEC93A8-E35F-4A5D-BF7B-20C502A48562}.Debug|x64.ActiveCfg = Debug|Any CPU
+		{3DEC93A8-E35F-4A5D-BF7B-20C502A48562}.Debug|x64.Build.0 = Debug|Any CPU
+		{3DEC93A8-E35F-4A5D-BF7B-20C502A48562}.Debug|ARM64.ActiveCfg = Debug|Any CPU
+		{3DEC93A8-E35F-4A5D-BF7B-20C502A48562}.Debug|ARM64.Build.0 = Debug|Any CPU
+		{3DEC93A8-E35F-4A5D-BF7B-20C502A48562}.DevRelease|x64.ActiveCfg = Debug|Any CPU
+		{3DEC93A8-E35F-4A5D-BF7B-20C502A48562}.DevRelease|x64.Build.0 = Debug|Any CPU
+		{3DEC93A8-E35F-4A5D-BF7B-20C502A48562}.DevRelease|ARM64.ActiveCfg = Debug|Any CPU
+		{3DEC93A8-E35F-4A5D-BF7B-20C502A48562}.DevRelease|ARM64.Build.0 = Debug|Any CPU
+		{3DEC93A8-E35F-4A5D-BF7B-20C502A48562}.DevSteam|x64.ActiveCfg = Debug|Any CPU
+		{3DEC93A8-E35F-4A5D-BF7B-20C502A48562}.DevSteam|x64.Build.0 = Debug|Any CPU
+		{3DEC93A8-E35F-4A5D-BF7B-20C502A48562}.DevSteam|ARM64.ActiveCfg = Debug|Any CPU
+		{3DEC93A8-E35F-4A5D-BF7B-20C502A48562}.DevSteam|ARM64.Build.0 = Debug|Any CPU
+		{3DEC93A8-E35F-4A5D-BF7B-20C502A48562}.MSIX Debug|x64.ActiveCfg = Debug|Any CPU
+		{3DEC93A8-E35F-4A5D-BF7B-20C502A48562}.MSIX Debug|x64.Build.0 = Debug|Any CPU
+		{3DEC93A8-E35F-4A5D-BF7B-20C502A48562}.MSIX Debug|ARM64.ActiveCfg = Debug|Any CPU
+		{3DEC93A8-E35F-4A5D-BF7B-20C502A48562}.MSIX Debug|ARM64.Build.0 = Debug|Any CPU
+		{3DEC93A8-E35F-4A5D-BF7B-20C502A48562}.MSIX|x64.ActiveCfg = Debug|Any CPU
+		{3DEC93A8-E35F-4A5D-BF7B-20C502A48562}.MSIX|x64.Build.0 = Debug|Any CPU
+		{3DEC93A8-E35F-4A5D-BF7B-20C502A48562}.MSIX|ARM64.ActiveCfg = Debug|Any CPU
+		{3DEC93A8-E35F-4A5D-BF7B-20C502A48562}.MSIX|ARM64.Build.0 = Debug|Any CPU
+		{3DEC93A8-E35F-4A5D-BF7B-20C502A48562}.Release|x64.ActiveCfg = Release|Any CPU
+		{3DEC93A8-E35F-4A5D-BF7B-20C502A48562}.Release|x64.Build.0 = Release|Any CPU
+		{3DEC93A8-E35F-4A5D-BF7B-20C502A48562}.Release|ARM64.ActiveCfg = Release|Any CPU
+		{3DEC93A8-E35F-4A5D-BF7B-20C502A48562}.Release|ARM64.Build.0 = Release|Any CPU
+		{3DEC93A8-E35F-4A5D-BF7B-20C502A48562}.Steam|x64.ActiveCfg = Debug|Any CPU
+		{3DEC93A8-E35F-4A5D-BF7B-20C502A48562}.Steam|x64.Build.0 = Debug|Any CPU
+		{3DEC93A8-E35F-4A5D-BF7B-20C502A48562}.Steam|ARM64.ActiveCfg = Debug|Any CPU
+		{3DEC93A8-E35F-4A5D-BF7B-20C502A48562}.Steam|ARM64.Build.0 = Debug|Any CPU
 	EndGlobalSection
 	GlobalSection(SolutionProperties) = preSolution
 		HideSolutionNode = FALSE
@@ -1607,7 +1637,8 @@ Global
 		{9B552A44-9587-4410-8673-254B31E2E4F7} = {2BA72059-FFD7-4887-AE88-269017198933}
 		{CD863C88-72E3-40F4-9AAE-5696BBB4460C} = {2BA72059-FFD7-4887-AE88-269017198933}
 		{34B1472E-EE1B-46C7-B5ED-29CD13457C7A} = {5AFBF881-C054-4CE4-8159-8D4017FFD27A}
-		{030B4397-B53A-4F5E-94FF-603AA0004997} = {5AFBF881-C054-4CE4-8159-8D4017FFD27A}
+		{BAF15725-9536-4D8B-9E46-0EB2C9866C86} = {5AFBF881-C054-4CE4-8159-8D4017FFD27A}
+		{3DEC93A8-E35F-4A5D-BF7B-20C502A48562} = {5AFBF881-C054-4CE4-8159-8D4017FFD27A}
 	EndGlobalSection
 	GlobalSection(ExtensibilityGlobals) = postSolution
 		SolutionGuid = {D04B4AB0-CA33-42FD-A909-79966F9255C5}