chore: clean recommit
This commit is contained in:
parent
8024c6ac40
commit
60ad2e7fb1
122 changed files with 23950 additions and 323 deletions
|
|
@ -8,13 +8,18 @@ namespace Examples.Web;
|
|||
/// Browser host: owns the single raylib window and the "current" example. The frame loop is
|
||||
/// driven from JavaScript (main.js, via requestAnimationFrame) since a blocking C# loop would
|
||||
/// freeze the page. Methods marked [JSExport] are called from main.js.
|
||||
///
|
||||
/// <para>
|
||||
/// Every switch applies <see cref="IExample.TargetFps"/> and resets the cursor to visible.
|
||||
/// Cursor hiding, <see cref="IExample.ConfigFlags"/>, and per-example window size are not
|
||||
/// honored in the browser; the canvas stays 800x450 and the pointer stays visible.
|
||||
/// </para>
|
||||
/// </summary>
|
||||
public partial class Host
|
||||
{
|
||||
public const int screenWidth = 800;
|
||||
public const int screenHeight = 450;
|
||||
|
||||
// Examples discovered from the assembly, minus desktop-only ones (see ExampleRegistry).
|
||||
private static readonly List<IExample> _examples = new(ExampleRegistry.BrowserExamples);
|
||||
|
||||
private static IExample _current;
|
||||
|
|
@ -24,48 +29,76 @@ public partial class Host
|
|||
InitWindow(screenWidth, screenHeight, "raylib-cs web examples");
|
||||
SetTargetFPS(60);
|
||||
|
||||
SetExample(_examples[0].Name);
|
||||
// main.js selects the first example, so its init failures surface through SetExample.
|
||||
}
|
||||
|
||||
/// <summary>Render one frame of the current example (called every requestAnimationFrame tick).</summary>
|
||||
/// <summary>Render one frame of the current example; false if it threw and was torn down.</summary>
|
||||
[JSExport]
|
||||
public static void UpdateFrame()
|
||||
public static bool UpdateFrame()
|
||||
{
|
||||
if (_current == null)
|
||||
{
|
||||
return true;
|
||||
}
|
||||
|
||||
try
|
||||
{
|
||||
_current?.Update();
|
||||
_current.Update();
|
||||
return true;
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
// Don't let one misbehaving example kill the whole page; log and stop driving it.
|
||||
Console.WriteLine($"[Examples.Web] '{_current?.Name}' threw during Update: {ex}");
|
||||
Console.WriteLine($"[Examples.Web] '{_current.Name}' threw during Update: {ex}");
|
||||
TryUnload(_current);
|
||||
_current = null;
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>Switch the active example by name (called from the nav dropdown).</summary>
|
||||
/// <summary>Switch the active example by name; false on unknown name or failed Init.</summary>
|
||||
[JSExport]
|
||||
public static void SetExample(string name)
|
||||
public static bool SetExample(string name)
|
||||
{
|
||||
var next = _examples.Find(e => e.Name == name);
|
||||
if (next == null)
|
||||
{
|
||||
return;
|
||||
return false;
|
||||
}
|
||||
|
||||
if (_current != null)
|
||||
{
|
||||
TryUnload(_current);
|
||||
_current = null;
|
||||
}
|
||||
|
||||
// Reset the baseline; an example may hide/lock the cursor from its own Update(), and
|
||||
// CursorDisabled/CursorHidden are deliberately never applied in the browser.
|
||||
EnableCursor();
|
||||
ShowCursor();
|
||||
SetTargetFPS(next.TargetFps);
|
||||
|
||||
try
|
||||
{
|
||||
_current?.Unload();
|
||||
next.Init();
|
||||
_current = next;
|
||||
_current.Init();
|
||||
return true;
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
Console.WriteLine($"[Examples.Web] '{next.Name}' failed to initialize: {ex}");
|
||||
_current = null;
|
||||
TryUnload(next);
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>Target FPS of the current example; main.js paces the frame loop with it.</summary>
|
||||
[JSExport]
|
||||
public static int GetCurrentTargetFps()
|
||||
{
|
||||
return _current?.TargetFps ?? 60;
|
||||
}
|
||||
|
||||
/// <summary>Newline-separated example names, used to populate the nav dropdown.</summary>
|
||||
[JSExport]
|
||||
public static string GetExampleNames()
|
||||
|
|
@ -83,4 +116,17 @@ public partial class Host
|
|||
SetMouseOffset(0, 0);
|
||||
SetMouseScale(scaleX, scaleY);
|
||||
}
|
||||
|
||||
/// <summary>Best-effort Unload that never lets a failure cascade.</summary>
|
||||
private static void TryUnload(IExample example)
|
||||
{
|
||||
try
|
||||
{
|
||||
example.Unload();
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
Console.WriteLine($"[Examples.Web] '{example.Name}' threw during Unload: {ex}");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
|||
Loading…
Reference in a new issue