Skip to content

Commit 6d3df7a

Browse files
committed
Work around for async loading in WPF
Probably a DispatcherQueue integration problem. This works around at expense of performance.
1 parent d35d72b commit 6d3df7a

File tree

2 files changed

+30
-31
lines changed

2 files changed

+30
-31
lines changed

Samples/Islands/WpfCalculator/CalculatorDemo/HelmetScenario.cs

Lines changed: 28 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -21,15 +21,15 @@
2121

2222
class HelmetScenario
2323
{
24-
public static ContentIsland CreateIsland(Compositor compositor)
24+
public static async Task<ContentIsland> CreateIsland(Compositor compositor)
2525
{
26-
var visual = LoadScene_DamagedHelmet(compositor);
26+
var visual = await LoadScene_DamagedHelmet(compositor);
2727

2828
var island = ContentIsland.Create(visual);
2929
return island;
3030
}
3131

32-
private static Visual LoadScene_DamagedHelmet(Compositor compositor)
32+
private static async Task<Visual> LoadScene_DamagedHelmet(Compositor compositor)
3333
{
3434
// Initialize Win2D, used for loading bitmaps.
3535

@@ -68,55 +68,54 @@ private static Visual LoadScene_DamagedHelmet(Compositor compositor)
6868
// - Although Scene Graph objects prefer a UI thread, Win2D can load and create the bitmaps
6969
// on parallel background threads.
7070

71-
var vertexData = SceneNodeCommon.LoadMemoryBufferFromUriAsync(
71+
var vertexData = await SceneNodeCommon.LoadMemoryBufferFromUriAsync(
7272
new Uri("ms-appx:///Assets/SceneNode/DamagedHelmet6.bin"));
7373

74-
var normalData = SceneNodeCommon.LoadMemoryBufferFromUriAsync(
74+
var normalData = await SceneNodeCommon.LoadMemoryBufferFromUriAsync(
7575
new Uri("ms-appx:///Assets/SceneNode/DamagedHelmet7.bin"));
7676

77-
var texCoordData = SceneNodeCommon.LoadMemoryBufferFromUriAsync(
77+
var texCoordData = await SceneNodeCommon.LoadMemoryBufferFromUriAsync(
7878
new Uri("ms-appx:///Assets/SceneNode/DamagedHelmet8.bin"));
7979

80-
var indexData = SceneNodeCommon.LoadMemoryBufferFromUriAsync(
80+
var indexData = await SceneNodeCommon.LoadMemoryBufferFromUriAsync(
8181
new Uri("ms-appx:///Assets/SceneNode/DamagedHelmet9.bin"));
8282

83-
var canvasBitmap0 = CanvasBitmap.LoadAsync(
84-
canvasDevice, new Uri("ms-appx:///Assets/SceneNode/DamagedHelmet1.bmp")).AsTask();
83+
//Task.WaitAll(
84+
// vertexData, normalData, texCoordData, indexData);
8585

86-
var canvasBitmap1 = CanvasBitmap.LoadAsync(
87-
canvasDevice, new Uri("ms-appx:///Assets/SceneNode/DamagedHelmet2.bmp")).AsTask();
86+
var canvasBitmap0 = await CanvasBitmap.LoadAsync(
87+
canvasDevice, new Uri("ms-appx:///Assets/SceneNode/DamagedHelmet1.bmp"));
8888

89-
var canvasBitmap2 = CanvasBitmap.LoadAsync(
90-
canvasDevice, new Uri("ms-appx:///Assets/SceneNode/DamagedHelmet3.bmp")).AsTask();
89+
var canvasBitmap1 = await CanvasBitmap.LoadAsync(
90+
canvasDevice, new Uri("ms-appx:///Assets/SceneNode/DamagedHelmet2.bmp"));
9191

92-
var canvasBitmap3 = CanvasBitmap.LoadAsync(
93-
canvasDevice, new Uri("ms-appx:///Assets/SceneNode/DamagedHelmet4.bmp")).AsTask();
92+
var canvasBitmap2 = await CanvasBitmap.LoadAsync(
93+
canvasDevice, new Uri("ms-appx:///Assets/SceneNode/DamagedHelmet3.bmp"));
9494

95-
var canvasBitmap4 = CanvasBitmap.LoadAsync(
96-
canvasDevice, new Uri("ms-appx:///Assets/SceneNode/DamagedHelmet5.bmp")).AsTask();
95+
var canvasBitmap3 = await CanvasBitmap.LoadAsync(
96+
canvasDevice, new Uri("ms-appx:///Assets/SceneNode/DamagedHelmet4.bmp"));
9797

98-
Task.WaitAll(
99-
vertexData, normalData, texCoordData, indexData,
100-
canvasBitmap0, canvasBitmap1, canvasBitmap2, canvasBitmap3, canvasBitmap4);
98+
var canvasBitmap4 = await CanvasBitmap.LoadAsync(
99+
canvasDevice, new Uri("ms-appx:///Assets/SceneNode/DamagedHelmet5.bmp"));
101100

102101

103102
// Generate mipmaps from the bitmaps, which are needed for 3D rendering.
104103

105-
var materialInput0 = SceneNodeCommon.LoadMipmapFromBitmap(graphicsDevice, canvasBitmap0.Result);
106-
var materialInput1 = SceneNodeCommon.LoadMipmapFromBitmap(graphicsDevice, canvasBitmap1.Result);
107-
var materialInput2 = SceneNodeCommon.LoadMipmapFromBitmap(graphicsDevice, canvasBitmap2.Result);
108-
var materialInput3 = SceneNodeCommon.LoadMipmapFromBitmap(graphicsDevice, canvasBitmap3.Result);
109-
var materialInput4 = SceneNodeCommon.LoadMipmapFromBitmap(graphicsDevice, canvasBitmap4.Result);
104+
var materialInput0 = SceneNodeCommon.LoadMipmapFromBitmap(graphicsDevice, canvasBitmap0);
105+
var materialInput1 = SceneNodeCommon.LoadMipmapFromBitmap(graphicsDevice, canvasBitmap1);
106+
var materialInput2 = SceneNodeCommon.LoadMipmapFromBitmap(graphicsDevice, canvasBitmap2);
107+
var materialInput3 = SceneNodeCommon.LoadMipmapFromBitmap(graphicsDevice, canvasBitmap3);
108+
var materialInput4 = SceneNodeCommon.LoadMipmapFromBitmap(graphicsDevice, canvasBitmap4);
110109

111110

112111
// Copy loaded binary data into mesh: verticies, normals, ...
113112

114113
var mesh0 = SceneMesh.Create(compositor);
115114
mesh0.PrimitiveTopology = DirectXPrimitiveTopology.TriangleList;
116-
mesh0.FillMeshAttribute(SceneAttributeSemantic.Vertex, DirectXPixelFormat.R32G32B32Float, vertexData.Result);
117-
mesh0.FillMeshAttribute(SceneAttributeSemantic.Normal, DirectXPixelFormat.R32G32B32Float, normalData.Result);
118-
mesh0.FillMeshAttribute(SceneAttributeSemantic.TexCoord0, DirectXPixelFormat.R32G32Float, texCoordData.Result);
119-
mesh0.FillMeshAttribute(SceneAttributeSemantic.Index, DirectXPixelFormat.R16UInt, indexData.Result);
115+
mesh0.FillMeshAttribute(SceneAttributeSemantic.Vertex, DirectXPixelFormat.R32G32B32Float, vertexData);
116+
mesh0.FillMeshAttribute(SceneAttributeSemantic.Normal, DirectXPixelFormat.R32G32B32Float, normalData);
117+
mesh0.FillMeshAttribute(SceneAttributeSemantic.TexCoord0, DirectXPixelFormat.R32G32Float, texCoordData);
118+
mesh0.FillMeshAttribute(SceneAttributeSemantic.Index, DirectXPixelFormat.R16UInt, indexData);
120119

121120

122121
// Initialize the material with different texture inputs (color, roughness, normals, ...)

Samples/Islands/WpfCalculator/CalculatorDemo/MainWindow_Demo4.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -33,10 +33,10 @@ private void CreateLottieIslandMenuItem_Click(object sender, RoutedEventArgs e)
3333
wpfIslandHost.DesktopChildSiteBridge.Connect(_lottieContentIsland.Island);
3434
}
3535

36-
private void CreateSceneNodeIslandMenuItem_Click(object sender, RoutedEventArgs e)
36+
private async void CreateSceneNodeIslandMenuItem_Click(object sender, RoutedEventArgs e)
3737
{
3838
var wpfIslandHost = new WpfIslandHost(_compositor);
39-
var helmetIsland = HelmetScenario.CreateIsland(_compositor);
39+
var helmetIsland = await HelmetScenario.CreateIsland(_compositor);
4040

4141
// After this, the WpfIslandHost will be live, and the DesktopChildSiteBridge will be available.
4242
DisplayAreaBorder.Child = wpfIslandHost;

0 commit comments

Comments
 (0)