From 60cf3ca82db9fd880bb40d1e6e43cfbf36c188fa Mon Sep 17 00:00:00 2001 From: David Guida <1432872+mizrael@users.noreply.github.com> Date: Wed, 25 Sep 2024 10:07:46 -0400 Subject: [PATCH] added server-side support --- .../Pages/Home.razor | 5 ++- .../Services/FireRenderer.cs | 9 +++-- src/Blazorex/CanvasBase.cs | 4 +- src/Blazorex/CanvasCreationOptions.cs | 9 +++++ src/Blazorex/CanvasManager.razor | 12 +++++- src/Blazorex/IRenderContext.cs | 7 ++-- src/Blazorex/RenderContext2D.cs | 40 ++++++++++++++----- 7 files changed, 65 insertions(+), 21 deletions(-) diff --git a/samples/Blazorex.Samples.DoomFire/Pages/Home.razor b/samples/Blazorex.Samples.DoomFire/Pages/Home.razor index 12a08e5..ba7f0c2 100644 --- a/samples/Blazorex.Samples.DoomFire/Pages/Home.razor +++ b/samples/Blazorex.Samples.DoomFire/Pages/Home.razor @@ -33,7 +33,7 @@ Hidden = true, Width = _fireWidth, Height = _fireHeight, - OnCanvasReady = this.OnFireCanvasReady, + OnCanvasReadyAsync = this.OnFireCanvasReady, OnFrameReady = this.OnFireCanvasFrameReady, }); _canvasManager.CreateCanvas("main", new CanvasCreationOptions() @@ -48,10 +48,11 @@ }); } - private void OnFireCanvasReady(CanvasBase canvas) + private async ValueTask OnFireCanvasReady(CanvasBase canvas) { _fireCanvas = canvas; _fireRenderer = new Services.FireRenderer(canvas.RenderContext, _fireWidth, _fireHeight); + await _fireRenderer.InitAsync(); } private void OnFireCanvasFrameReady(float timeStamp) diff --git a/samples/Blazorex.Samples.DoomFire/Services/FireRenderer.cs b/samples/Blazorex.Samples.DoomFire/Services/FireRenderer.cs index 80bd7b0..879757b 100644 --- a/samples/Blazorex.Samples.DoomFire/Services/FireRenderer.cs +++ b/samples/Blazorex.Samples.DoomFire/Services/FireRenderer.cs @@ -4,7 +4,7 @@ public class FireRenderer { private readonly IRenderContext _context; - private readonly int _renderTarget; + private int _renderTarget = -1; private readonly int _width; private readonly int _height; private readonly byte fireStartIntensity = 36; @@ -22,8 +22,6 @@ public FireRenderer(IRenderContext context, int width, int height) _width = width; _height = height; - _renderTarget = _context.CreateImageData(_width, _height); - fireColorData = new byte[_width * _height * 4]; fireData = new byte[_width * _height]; @@ -31,6 +29,11 @@ public FireRenderer(IRenderContext context, int width, int height) fireData[i] = fireStartIntensity; } + public async ValueTask InitAsync() + { + _renderTarget = await _context.CreateImageDataAsync(_width, _height); + } + public void Update() { for (int column = 0; column < _width; column++) diff --git a/src/Blazorex/CanvasBase.cs b/src/Blazorex/CanvasBase.cs index e769bf5..51dca09 100644 --- a/src/Blazorex/CanvasBase.cs +++ b/src/Blazorex/CanvasBase.cs @@ -26,7 +26,7 @@ protected override async Task OnAfterRenderAsync(bool firstRender) var managedInstance = DotNetObjectReference.Create(this); await JSRuntime.InvokeVoidAsync("Blazorex.initCanvas", Id, managedInstance); - this.RenderContext = new RenderContext2D(Id, this.JSRuntime as IJSInProcessRuntime); + this.RenderContext = new RenderContext2D(Id, this.JSRuntime); await this.OnCanvasReady.InvokeAsync(this); } @@ -37,7 +37,7 @@ protected override async Task OnAfterRenderAsync(bool firstRender) public async ValueTask UpdateFrame(float timeStamp) { await this.OnFrameReady.InvokeAsync(timeStamp); - this.RenderContext.ProcessBatch(); + await this.RenderContext.ProcessBatchAsync(); } [JSInvokable] diff --git a/src/Blazorex/CanvasCreationOptions.cs b/src/Blazorex/CanvasCreationOptions.cs index 9ae4789..77fb31c 100644 --- a/src/Blazorex/CanvasCreationOptions.cs +++ b/src/Blazorex/CanvasCreationOptions.cs @@ -1,5 +1,6 @@ using Microsoft.AspNetCore.Components; using System; +using System.Threading.Tasks; namespace Blazorex; @@ -27,6 +28,14 @@ public readonly struct CanvasCreationOptions /// public Action OnCanvasReady { get; init; } + /// + /// async version of . + /// + /// + /// will ALWAYS take precedence over this, if both are set. + /// + public Func OnCanvasReadyAsync { get; init; } + /// /// fired at every frame refresh /// diff --git a/src/Blazorex/CanvasManager.razor b/src/Blazorex/CanvasManager.razor index d5b568d..80892a9 100644 --- a/src/Blazorex/CanvasManager.razor +++ b/src/Blazorex/CanvasManager.razor @@ -4,9 +4,19 @@ @foreach (var (name, options) in _names) { + if(options.OnCanvasReadyAsync is not null && options.OnCanvasReady is not null) + { + throw new InvalidOperationException($"Cannot set both {nameof(options.OnCanvasReady)} and {nameof(options.OnCanvasReadyAsync)}"); + } + + EventCallback onCanvasReady = + options.OnCanvasReadyAsync != null ? + EventCallback.Factory.Create(this, async (canvas) => await options.OnCanvasReadyAsync(canvas)) : + EventCallback.Factory.Create(this, options.OnCanvasReady); +