feat: switch default backend to Silk.NET OpenGL

- OpenGLRenderContext: Initialize() + CreateOpenGL() for non-blocking
- OpenGLWindow: Initialize() instead of Run(), CreateGL() method
- Program.cs: default backend is now 'opengl', SwapBuffers per frame
- ImGui guarded: only initialized for RaylibRenderer, ObjectManipulator
  checks _imGuiAvailable before calling ImGui.GetIO()
- 66/66 tests, 145 FPS with OpenGL backend
This commit is contained in:
emil28092005
2026-06-17 20:14:15 +03:00
parent cc9a1a4602
commit 417915e861
6 changed files with 40 additions and 23 deletions
+18 -11
View File
@@ -11,6 +11,7 @@ using Engine.Core;
using Engine.Core.Components;
using Engine.Graphics;
using Engine.Graphics.Loaders;
using Engine.Graphics.OpenGL;
using Engine.Graphics.RaylibBackend;
using Engine.Graphics.Vulkan;
using Engine.Physics;
@@ -43,19 +44,22 @@ class Program
RaylibBackendRegistrar.EnsureRegistered();
VulkanBackendRegistrar.EnsureRegistered();
using var renderContext = RenderBackendFactory.Create("raylib", 1280, 720, enableValidation: false);
OpenGLBackendRegistrar.EnsureRegistered();
using var renderContext = RenderBackendFactory.Create("opengl", 1280, 720, enableValidation: false);
var window = renderContext.Window;
var input = window.Input;
using var renderer = renderContext.CreateRenderer();
// ImGui editor layer
var imGuiLayer = new ImGuiLayer();
// ImGui editor layer (Raylib only)
ImGuiLayer? imGuiLayer = null;
var objectManipulator = new ObjectManipulator();
if (!cameraTour)
objectManipulator.SetImGuiAvailable(false);
if (!cameraTour && renderer is RaylibRenderer rlRenderer)
{
imGuiLayer = new ImGuiLayer();
imGuiLayer.Initialize();
if (renderer is RaylibRenderer rlRenderer)
rlRenderer.ImGuiLayer = imGuiLayer;
rlRenderer.ImGuiLayer = imGuiLayer;
objectManipulator.SetImGuiAvailable(true);
}
var (modelPath, mcpPort) = ParseArgs(args);
@@ -283,15 +287,18 @@ class Program
}
// Feed frame data to ImGui before rendering.
imGuiLayer.SetFrameData(world, timing, currentFps);
if (imGuiLayer != null)
imGuiLayer.SetFrameData(world, timing, currentFps);
// Sync selection between manipulator and ImGui
if (objectManipulator.IsDragging && !string.IsNullOrEmpty(objectManipulator.SelectedEntityName))
imGuiLayer.SetSelectedEntity(objectManipulator.SelectedEntityName);
objectManipulator.SetImGuiAvailable(imGuiLayer != null);
renderer.RenderWorld(world);
queue.CompletePendingScreenshots();
// Swap buffers for OpenGL backend
if (renderContext is OpenGLRenderContext glCtx2)
glCtx2.SwapBuffers();
frames++;
if (timing.TotalTime - lastFpsTime >= 1.0)
{
@@ -303,7 +310,7 @@ class Program
}
Console.WriteLine("Shutting down...");
imGuiLayer.Dispose();
imGuiLayer?.Dispose();
#if !RELEASE_AOT
if (mcpApp != null)
await mcpApp.StopAsync();