diff --git a/src/CortexEngine.App/Program.cs b/src/CortexEngine.App/Program.cs index c20edef..ead0988 100644 --- a/src/CortexEngine.App/Program.cs +++ b/src/CortexEngine.App/Program.cs @@ -45,7 +45,7 @@ class Program RaylibBackendRegistrar.EnsureRegistered(); VulkanBackendRegistrar.EnsureRegistered(); OpenTKBackendRegistrar.EnsureRegistered(); - using var renderContext = RenderBackendFactory.Create("opentk", 1280, 720, enableValidation: false); + using var renderContext = RenderBackendFactory.Create("raylib", 1280, 720, enableValidation: false); var window = renderContext.Window; var input = window.Input; using var renderer = renderContext.CreateRenderer(); @@ -298,6 +298,7 @@ class Program // Swap buffers for OpenGL backend if (renderContext is OpenTKRenderContext otkCtx) otkCtx.SwapBuffers(); + // Raylib handles swap internally in EndDrawing frames++; if (timing.TotalTime - lastFpsTime >= 1.0) diff --git a/src/Engine.Graphics.OpenTK/OpenTKRenderer.cs b/src/Engine.Graphics.OpenTK/OpenTKRenderer.cs index 122161f..dd373ec 100644 --- a/src/Engine.Graphics.OpenTK/OpenTKRenderer.cs +++ b/src/Engine.Graphics.OpenTK/OpenTKRenderer.cs @@ -195,13 +195,16 @@ public sealed class OpenTKRenderer : IRenderer private void SetUniformMat4(int loc, OTKMatrix mat) { - // OpenTK Matrix4 is row-major in memory; OpenGL expects column-major with transpose=false. - // Use transpose=true so OpenGL transposes our row-major data into column-major. - _matrixBuf[0] = mat.M11; _matrixBuf[1] = mat.M12; _matrixBuf[2] = mat.M13; _matrixBuf[3] = mat.M14; - _matrixBuf[4] = mat.M21; _matrixBuf[5] = mat.M22; _matrixBuf[6] = mat.M23; _matrixBuf[7] = mat.M24; - _matrixBuf[8] = mat.M31; _matrixBuf[9] = mat.M32; _matrixBuf[10] = mat.M33; _matrixBuf[11] = mat.M34; - _matrixBuf[12] = mat.M41; _matrixBuf[13] = mat.M42; _matrixBuf[14] = mat.M43; _matrixBuf[15] = mat.M44; - GL.UniformMatrix4(loc, 1, true, _matrixBuf); + // OpenTK Matrix4 fields: M11,M12,M13,M14, M21..M24, M31..M34, M41..M44 + // These are stored in the struct as row-major (M11=row1col1). + // BUT OpenTK's Matrix4 in memory is actually column-major per its design + // (M11,M21,M31,M41 is the first column in memory). + // So we copy field-by-field and pass with transpose=false. + _matrixBuf[0] = mat.M11; _matrixBuf[1] = mat.M21; _matrixBuf[2] = mat.M31; _matrixBuf[3] = mat.M41; + _matrixBuf[4] = mat.M12; _matrixBuf[5] = mat.M22; _matrixBuf[6] = mat.M32; _matrixBuf[7] = mat.M42; + _matrixBuf[8] = mat.M13; _matrixBuf[9] = mat.M23; _matrixBuf[10] = mat.M33; _matrixBuf[11] = mat.M43; + _matrixBuf[12] = mat.M14; _matrixBuf[13] = mat.M24; _matrixBuf[14] = mat.M34; _matrixBuf[15] = mat.M44; + GL.UniformMatrix4(loc, 1, false, _matrixBuf); } private GLMesh GetOrUploadMesh(Entity e, EngineMesh mesh)