Bisher gab es in SeeingSharp 2 zwei GettingStarted Projekte: Einmal für Windows.Forms und einmal für WPF. WinUI 3 hat nun zusammen mit dem WindowsAppSdk 1.1 einen recht guten Entwicklungsstand erreicht. Somit wird es Zeit, ebenfalls für WinUI 3 ein GettingStarted Projekt bereitzustellen. Das Projekt zeigt, wie SeeingSharp 2 in ein WinUI 3 Projekt eingebunden und verwendet werden kann. Im Ergebnis wird ein dreidimensionaler Würfel erzeugt, welcher sich in einer endlosen Animation um seine eigene Y-Achse dreht. Unter [1] ist das Coding des Projekts verfügbar.
Das GettingStarted basiert auf dem Template „Blank App, Packaged (WinUI 3 in Desktop)“. Mit diesem Template bekommt man zunächst eine App.xaml und eine MainWindow.xaml, jeweils mit schlankem CodeBehind. Im ersten Schritt muss das Nuget-Paket SeeingSharp2.WinUI [2] eingebunden werden. Anschließend geht es mit der Initialisierung von SeeingSharp 2 im CodeBehind der App.xaml weiter (siehe nachfolgender Codeausschnitt). Der Loader sorgt dafür, dass der Kern von SeeingSharp geladen wird. Dabei werden unter anderem alle am Rechner verfügbaren Grafikkarten sowie deren Möglichkeiten ermittelt.
/// <summary> /// Invoked when the application is launched normally by the end user. Other entry points /// will be used such as when the application is launched to open a specific file. /// </summary> /// <param name="args">Details about the launch request and process.</param> protected override void OnLaunched(Microsoft.UI.Xaml.LaunchActivatedEventArgs args) { // Initialize graphics GraphicsCore.Loader .SupportWinUI() .Load(); _window = new MainWindow(); _window.Activate(); }
Im nächsten Schritt erstellen wir ein SeeingSharpRenderPanel in der View (siehe nachfolgender Codeausschnitt). Wir geben der View einen Namen (hier CtrlView3D), damit im CodeBehind darauf zugegriffen werden kann. In diesem Beispiel befindet sich sonst nichts im Window, grundsätzlich können aber alle anderen Elemente von WinUI frei verwendet werden.
<Window x:Class="GettingStarted.WinUI.MainWindow" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" xmlns:ssharp="using:SeeingSharp.Views" mc:Ignorable="d"> <Grid> <ssharp:SeeingSharpRenderPanel x:Name="CtrlView3D" /> </Grid> </Window>
Anschließend geht es noch um das Laden der 3D-Welt im CodeBehind der MainWindow.xaml (siehe nachfolgender Codeausschnitt). Dieser Code sieht weitestgehend genauso aus, wie bei den anderen GettingStarted Projekten. Zunächst wird das Activated Event registriert, um einen Trigger für die Initialisierung der 3D-Welt zu haben. Darin wird die Scene aufgebaut, also Material, Geometrie und Animation des Würfels erzeugt. Zudem erzeugen wir eine Kamera und hängen sie an die View.
public sealed partial class MainWindow : Window { public MainWindow() { this.InitializeComponent(); this.Activated += this.OnActivated; } private async void OnActivated(object sender, WindowActivatedEventArgs args) { // Configuration this.CtrlView3D.Configuration.AlphaEnabledSwapChain = true; // Build the scene var scene = this.CtrlView3D.Scene; await scene.ManipulateSceneAsync(manipulator => { // Create material resource var resMaterial = manipulator.AddStandardMaterialResource(); var resGeometry = manipulator.AddResource( _ => new GeometryResource(new CubeGeometryFactory())); // Create the mesh and animate it var mesh = new Mesh(resGeometry, resMaterial); mesh.Position = new Vector3(0f, 1f, 0f); mesh.Color = Color4.GreenColor; mesh.BuildAnimationSequence() .RotateEulerAnglesTo(new Vector3(0f, EngineMath.RAD_180DEG, 0f), TimeSpan.FromSeconds(2.0)) .WaitFinished() .RotateEulerAnglesTo(new Vector3(0f, EngineMath.RAD_360DEG, 0f), TimeSpan.FromSeconds(2.0)) .WaitFinished() .CallAction(() => mesh.RotationEuler = Vector3.Zero) .ApplyAndRewind(); manipulator.AddObject(mesh); }); // Configure camera var camera = this.CtrlView3D.Camera; camera.Position = new Vector3(3f, 3f, 3f); camera.Target = new Vector3(0f, 0.5f, 0f); camera.UpdateCamera(); // Append camera behavior (this enables simple input / movement) this.CtrlView3D.RenderLoop.SceneComponents.Add(new FreeMovingCameraComponent()); } }
Und fertig ist das GettingStarted Projekt. Weitere Details zu SeeingSharp 2 können in den Beispielen oder im Wiki [3] nachgelesen werden.