diff --git a/.editorconfig b/.editorconfig index ce75165..5f0c22a 100644 --- a/.editorconfig +++ b/.editorconfig @@ -194,6 +194,10 @@ dotnet_naming_rule.constant_should_be_constant_style.severity = suggestion dotnet_naming_rule.constant_should_be_constant_style.symbols = constant dotnet_naming_rule.constant_should_be_constant_style.style = constant_style +dotnet_naming_rule.static_readonly_should_be_pascal_case.severity = suggestion +dotnet_naming_rule.static_readonly_should_be_pascal_case.symbols = static_readonly +dotnet_naming_rule.static_readonly_should_be_pascal_case.style = constant_style + dotnet_naming_rule.all_fields_should_be_fields_style.severity = suggestion dotnet_naming_rule.all_fields_should_be_fields_style.symbols = all_fields dotnet_naming_rule.all_fields_should_be_fields_style.style = fields_style @@ -240,6 +244,10 @@ dotnet_naming_symbols.constant.applicable_kinds = field dotnet_naming_symbols.constant.applicable_accessibilities = * dotnet_naming_symbols.constant.required_modifiers = const +dotnet_naming_symbols.static_readonly.applicable_kinds = field +dotnet_naming_symbols.static_readonly.applicable_accessibilities = * +dotnet_naming_symbols.static_readonly.required_modifiers = static, readonly + dotnet_naming_symbols.local.applicable_kinds = local dotnet_naming_symbols.local.applicable_accessibilities = * dotnet_naming_symbols.local.required_modifiers = diff --git a/DoomDeathmatch/src/DoomDeathmatch.cs b/DoomDeathmatch/src/DoomDeathmatch.cs index e4a3b16..d8e5343 100644 --- a/DoomDeathmatch/src/DoomDeathmatch.cs +++ b/DoomDeathmatch/src/DoomDeathmatch.cs @@ -22,15 +22,20 @@ public static class DoomDeathmatch cameraObject.AddComponent(); using var reader = new StreamReader("../DoomDeathmatch/asset/model/test2.obj"); + var mesh = ObjMeshLoader.Load(reader); var box2dRenderer = new GameObject(); - box2dRenderer.AddComponent(new MeshRenderer { Mesh = ObjMeshLoader.Load(reader) }); - box2dRenderer.AddComponent(); + box2dRenderer.AddComponent(new MeshRenderer { Mesh = mesh }); box2dRenderer.AddComponent(); + var testChild = new GameObject(); + testChild.Transform.Scale /= 4; + testChild.AddComponent(new MeshRenderer { Mesh = mesh }); + var scene = new Scene(); scene.Add(cameraObject); scene.Add(box2dRenderer); + scene.AddChild(box2dRenderer, testChild); return scene; } diff --git a/Engine/Engine.csproj b/Engine/Engine.csproj index d1889fc..5add6b0 100644 --- a/Engine/Engine.csproj +++ b/Engine/Engine.csproj @@ -19,6 +19,7 @@ + diff --git a/Engine/src/Engine.cs b/Engine/src/Engine.cs index c983c3c..f365ee1 100644 --- a/Engine/src/Engine.cs +++ b/Engine/src/Engine.cs @@ -7,6 +7,7 @@ using OpenTK.Mathematics; using OpenTK.Windowing.Common; using OpenTK.Windowing.Desktop; using Serilog; +using Debug = Engine.Graphics.Debug; namespace Engine; @@ -69,8 +70,8 @@ public sealed class Engine Profile = ContextProfile.Core }; - Window = new Window(this, new NativeWindow(settings), parHeadless); - Renderer = new Renderer(parWidth, parHeight); + Renderer = new Renderer(parWidth, parHeight, settings); + Window = new Window(this, Renderer.NativeWindow, parHeadless); Log.Logger = parLogger; _logger = Log.ForContext(); @@ -92,18 +93,22 @@ public sealed class Engine { while (!Presenter?.IsExiting ?? false) { +#if DEBUG + Debug.RenderDocStartFrame(); +#endif + Renderer.StartFrame(); - var view = Matrix4.Identity; var projection = Matrix4.Identity; + var view = Matrix4.Identity; lock (_sceneLock) { var camera = SceneManager.CurrentScene?.MainCamera; if (camera != null) { camera.ScreenSize = new Vector2i(Renderer.ViewportWidth, Renderer.ViewportHeight); - view = camera.View; projection = camera.Projection; + view = camera.View; } SceneManager.Render(); @@ -115,10 +120,15 @@ public sealed class Engine Renderer.GlobalMeshRenderer.Render(projection, view); Renderer.GlobalMeshRenderer.Reset(); - Renderer.EndFrame(); + Renderer.EndFrame(projection, view); Presenter!.Present(Renderer.RenderTexture); Presenter!.Render(); + + +#if DEBUG + Debug.RenderDocEndFrame(); +#endif } } diff --git a/Engine/src/Graphics/Buffer/IndexBuffer.cs b/Engine/src/Graphics/Buffer/IndexBuffer.cs index 2d7b13a..3873442 100644 --- a/Engine/src/Graphics/Buffer/IndexBuffer.cs +++ b/Engine/src/Graphics/Buffer/IndexBuffer.cs @@ -52,12 +52,12 @@ public class IndexBuffer : OpenGlObject GL.NamedBufferSubData(Handle, parOffset, parData.Length * sizeof(uint), parData); } - public override void Bind() + internal override void Bind() { GL.BindBuffer(BufferTarget.ElementArrayBuffer, Handle); } - public override void Unbind() + internal override void Unbind() { GL.BindBuffer(BufferTarget.ElementArrayBuffer, 0); } diff --git a/Engine/src/Graphics/Buffer/VertexArray.cs b/Engine/src/Graphics/Buffer/VertexArray.cs index 1851176..bc96033 100644 --- a/Engine/src/Graphics/Buffer/VertexArray.cs +++ b/Engine/src/Graphics/Buffer/VertexArray.cs @@ -22,7 +22,7 @@ public class VertexArray : OpenGlObject { GL.VertexArrayElementBuffer(Handle, parBuffer.Handle); - Log.Debug("Vertex array {Handle} bound to index buffer {Buffer}", Handle, parBuffer.Handle); + Log.Debug("Index buffer {Buffer} bound to vertex array {Handle}", parBuffer.Handle, Handle); } public void BindVertexBuffer(VertexBuffer parBuffer, int parBindingIndex = 0, int parDivisor = 0) @@ -48,9 +48,8 @@ public class VertexArray : OpenGlObject GL.VertexArrayBindingDivisor(Handle, parBindingIndex, parDivisor); - Log.Debug( - "Vertex array {Handle} bound to vertex buffer {Buffer} at {BindingIndex} binding with {Divisor} divisor", - Handle, parBuffer.Handle, parBindingIndex, parDivisor); + Log.Debug("Vertex buffer {Buffer} bound to vertex array {Handle} at {BindingIndex} binding with {Divisor} divisor", + parBuffer.Handle, Handle, parBindingIndex, parDivisor); } private void SetupAttribute(VertexAttribute parAttribute, int parBaseLocation, int parBaseOffset, int parBindingIndex) @@ -70,12 +69,12 @@ public class VertexArray : OpenGlObject } } - public override void Bind() + internal override void Bind() { GL.BindVertexArray(Handle); } - public override void Unbind() + internal override void Unbind() { GL.BindVertexArray(0); } diff --git a/Engine/src/Graphics/Buffer/VertexBuffer.cs b/Engine/src/Graphics/Buffer/VertexBuffer.cs index 88fc71e..db85b13 100644 --- a/Engine/src/Graphics/Buffer/VertexBuffer.cs +++ b/Engine/src/Graphics/Buffer/VertexBuffer.cs @@ -91,12 +91,12 @@ public class VertexBuffer : OpenGlObject GL.NamedBufferSubData(Handle, parOffset * _stride, parCount * _stride, parData); } - public override void Bind() + internal override void Bind() { GL.BindBuffer(BufferTarget.ArrayBuffer, Handle); } - public override void Unbind() + internal override void Unbind() { GL.BindBuffer(BufferTarget.ArrayBuffer, 0); } diff --git a/Engine/src/Graphics/Camera/ICamera.cs b/Engine/src/Graphics/Camera/ICamera.cs index f1caed7..a4f42a1 100644 --- a/Engine/src/Graphics/Camera/ICamera.cs +++ b/Engine/src/Graphics/Camera/ICamera.cs @@ -4,7 +4,7 @@ namespace Engine.Graphics.Camera; public interface ICamera { - public Matrix4 View { get; } - public Matrix4 Projection { get; } - public Vector2i ScreenSize { get; internal set; } + Matrix4 View { get; } + Matrix4 Projection { get; } + Vector2i ScreenSize { get; internal set; } } \ No newline at end of file diff --git a/Engine/src/Graphics/Debug.cs b/Engine/src/Graphics/Debug.cs index 9fdb771..571f513 100644 --- a/Engine/src/Graphics/Debug.cs +++ b/Engine/src/Graphics/Debug.cs @@ -2,17 +2,35 @@ using OpenTK.Graphics.OpenGL; using Serilog; using Serilog.Events; +using Evergine.Bindings.RenderDoc; namespace Engine.Graphics; internal static class Debug { + private static RenderDoc _renderDocApi; + public static void Setup() { GL.Enable(EnableCap.DebugOutput); GL.DebugMessageCallback(DebugCallback, IntPtr.Zero); } + public static void InitializeRenderDoc() + { + RenderDoc.Load(out _renderDocApi); + } + + public static void RenderDocStartFrame() + { + // _renderDocApi.API.StartFrameCapture(IntPtr.Zero, IntPtr.Zero); + } + + public static void RenderDocEndFrame() + { + // _renderDocApi.API.EndFrameCapture(IntPtr.Zero, IntPtr.Zero); + } + private static void DebugCallback(DebugSource parSource, DebugType parType, int parId, DebugSeverity parSeverity, int parLength, IntPtr parMessage, IntPtr parUserParam) diff --git a/Engine/src/Graphics/Framebuffer/Framebuffer.cs b/Engine/src/Graphics/Framebuffer/Framebuffer.cs index c5c5436..e89804a 100644 --- a/Engine/src/Graphics/Framebuffer/Framebuffer.cs +++ b/Engine/src/Graphics/Framebuffer/Framebuffer.cs @@ -35,7 +35,7 @@ public class Framebuffer : OpenGlObject private int _width; private int _height; - public Framebuffer(int parWidth, int parHeight, + internal Framebuffer(int parWidth, int parHeight, IDictionary parAttachments) { Width = parWidth; @@ -62,7 +62,7 @@ public class Framebuffer : OpenGlObject return new FramebufferBuilder(parWidth, parHeight); } - public T? GetAttachment(FramebufferAttachment parAttachment) where T : IFramebufferAttachment + internal T? GetAttachment(FramebufferAttachment parAttachment) where T : IFramebufferAttachment { if (!_attachments.TryGetValue(parAttachment, out var attachmentValue)) { @@ -95,12 +95,12 @@ public class Framebuffer : OpenGlObject Log.Debug("Framebuffer {Handle} resized to {Width}x{Height}", Handle, parWidth, parHeight); } - public override void Bind() + internal override void Bind() { GL.BindFramebuffer(FramebufferTarget.Framebuffer, Handle); } - public override void Unbind() + internal override void Unbind() { GL.BindFramebuffer(FramebufferTarget.Framebuffer, 0); } diff --git a/Engine/src/Graphics/Framebuffer/IFramebufferAttachment.cs b/Engine/src/Graphics/Framebuffer/IFramebufferAttachment.cs index bdcb4e6..7533667 100644 --- a/Engine/src/Graphics/Framebuffer/IFramebufferAttachment.cs +++ b/Engine/src/Graphics/Framebuffer/IFramebufferAttachment.cs @@ -2,11 +2,11 @@ namespace Engine.Graphics.Framebuffer; -public interface IFramebufferAttachment +internal interface IFramebufferAttachment { - internal int Handle { get; } + int Handle { get; } - public void Resize(int parWidth, int parHeight); + void Resize(int parWidth, int parHeight); - internal void Attach(Framebuffer parFramebuffer, FramebufferAttachment parAttachment); + void Attach(Framebuffer parFramebuffer, FramebufferAttachment parAttachment); } \ No newline at end of file diff --git a/Engine/src/Graphics/Framebuffer/Renderbuffer.cs b/Engine/src/Graphics/Framebuffer/Renderbuffer.cs index 2075ebe..87db622 100644 --- a/Engine/src/Graphics/Framebuffer/Renderbuffer.cs +++ b/Engine/src/Graphics/Framebuffer/Renderbuffer.cs @@ -39,12 +39,12 @@ public class Renderbuffer : OpenGlObject, IFramebufferAttachment GL.NamedFramebufferRenderbuffer(parFramebuffer.Handle, parAttachment, RenderbufferTarget.Renderbuffer, Handle); } - public override void Bind() + internal override void Bind() { GL.BindRenderbuffer(RenderbufferTarget.Renderbuffer, Handle); } - public override void Unbind() + internal override void Unbind() { GL.BindRenderbuffer(RenderbufferTarget.Renderbuffer, 0); } diff --git a/Engine/src/Graphics/GenericRenderer.cs b/Engine/src/Graphics/GenericRenderer.cs new file mode 100644 index 0000000..81abd4d --- /dev/null +++ b/Engine/src/Graphics/GenericRenderer.cs @@ -0,0 +1,59 @@ +using Engine.Graphics.Pixel; +using Engine.Graphics.Render.Mesh; +using Engine.Graphics.Render.Quad; +using OpenTK.Graphics.OpenGL; +using OpenTK.Mathematics; + +namespace Engine.Graphics; + +public class GenericRenderer : IRenderer +{ + public QuadRenderer QuadRenderer => _quadRenderer ??= new QuadRenderer(1024 * 8); + public GlobalMeshRenderer GlobalMeshRenderer => _globalMeshRenderer ??= new GlobalMeshRenderer(1024); + + private QuadRenderer? _quadRenderer; + private GlobalMeshRenderer? _globalMeshRenderer; + + internal readonly Framebuffer.Framebuffer _framebuffer; + + private bool _frameStarted; + + public GenericRenderer(int parWidth, int parHeight) + { + _framebuffer = Framebuffer.Framebuffer.Builder(parWidth, parHeight) + .AddColorAttachment() + .AddDepthAttachment() + .Build(); + } + + public void StartFrame() + { + _frameStarted = true; + } + + public void EndFrame(in Matrix4 parProjectionMatrix, in Matrix4 parViewMatrix) + { + if (!_frameStarted) + throw new InvalidOperationException("Frame not started"); + + _framebuffer.Bind(); + + GL.ClearColor(0.0f, 0.0f, 0.0f, 1.0f); + GL.Clear(ClearBufferMask.ColorBufferBit | ClearBufferMask.DepthBufferBit); + + QuadRenderer.Render(parProjectionMatrix, parViewMatrix); + QuadRenderer.Reset(); + + GlobalMeshRenderer.Render(parProjectionMatrix, parViewMatrix); + GlobalMeshRenderer.Reset(); + + _framebuffer.Unbind(); + + _frameStarted = false; + } + + public void Resize(int parWidth, int parHeight) + { + _framebuffer.Resize(parWidth, parHeight); + } +} \ No newline at end of file diff --git a/Engine/src/Graphics/IPresenter.cs b/Engine/src/Graphics/IPresenter.cs index 90ea680..980e060 100644 --- a/Engine/src/Graphics/IPresenter.cs +++ b/Engine/src/Graphics/IPresenter.cs @@ -6,11 +6,11 @@ namespace Engine.Graphics; public interface IPresenter : IUpdate, IRender { - public bool IsExiting { get; } - public int Width { get; } - public int Height { get; } + bool IsExiting { get; } + int Width { get; } + int Height { get; } - public event Action Resize; + event Action Resize; - public void Present(IConstTexture parTexture); + void Present(IConstTexture parTexture); } \ No newline at end of file diff --git a/Engine/src/Graphics/IRenderer.cs b/Engine/src/Graphics/IRenderer.cs new file mode 100644 index 0000000..fef02c3 --- /dev/null +++ b/Engine/src/Graphics/IRenderer.cs @@ -0,0 +1,11 @@ +using OpenTK.Mathematics; + +namespace Engine.Graphics; + +internal interface IRenderer +{ + public void StartFrame(); + public void EndFrame(in Matrix4 parProjectionMatrix, in Matrix4 parViewMatrix); + + public void Resize(int parWidth, int parHeight); +} \ No newline at end of file diff --git a/Engine/src/Graphics/OpenGLObject.cs b/Engine/src/Graphics/OpenGLObject.cs index 6d4a1ac..97a6266 100644 --- a/Engine/src/Graphics/OpenGLObject.cs +++ b/Engine/src/Graphics/OpenGLObject.cs @@ -6,8 +6,8 @@ public abstract class OpenGlObject { public int Handle { get; protected set; } = -1; - public abstract void Bind(); - public abstract void Unbind(); + internal abstract void Bind(); + internal abstract void Unbind(); protected abstract void Destroy(); diff --git a/Engine/src/Graphics/Pipeline/RenderLayer.cs b/Engine/src/Graphics/Pipeline/RenderLayer.cs new file mode 100644 index 0000000..de5c57d --- /dev/null +++ b/Engine/src/Graphics/Pipeline/RenderLayer.cs @@ -0,0 +1,27 @@ +namespace Engine.Graphics.Pipeline; + +public class RenderLayer +{ + public static readonly RenderLayer DEFAULT = new("default"); + public static readonly RenderLayer HUD = new("hud"); + public static readonly RenderLayer OVERLAY = new("overlay"); + + public static readonly IReadOnlyList ALL = new List { DEFAULT, HUD, OVERLAY }.AsReadOnly(); + + public string Name { get; } + + private RenderLayer(string parName) + { + Name = parName; + } + + public override string ToString() + { + return Name; + } + + public override int GetHashCode() + { + return Name.GetHashCode(); + } +} \ No newline at end of file diff --git a/Engine/src/Graphics/Pipeline/RenderPipeline.cs b/Engine/src/Graphics/Pipeline/RenderPipeline.cs new file mode 100644 index 0000000..0cf7f2c --- /dev/null +++ b/Engine/src/Graphics/Pipeline/RenderPipeline.cs @@ -0,0 +1,6 @@ +namespace Engine.Graphics.Pipeline; + +public class RenderPipeline +{ + +} \ No newline at end of file diff --git a/Engine/src/Graphics/Pixel/IPixel.cs b/Engine/src/Graphics/Pixel/IPixel.cs index afdfa09..9c4e1b4 100644 --- a/Engine/src/Graphics/Pixel/IPixel.cs +++ b/Engine/src/Graphics/Pixel/IPixel.cs @@ -4,9 +4,9 @@ namespace Engine.Graphics.Pixel; public interface IPixel { - public PixelFormat Format { get; } - public PixelType Type { get; } + PixelFormat Format { get; } + PixelType Type { get; } - public PixelInternalFormat InternalFormat { get; } - public SizedInternalFormat SizedInternalFormat { get; } + PixelInternalFormat InternalFormat { get; } + SizedInternalFormat SizedInternalFormat { get; } } \ No newline at end of file diff --git a/Engine/src/Graphics/Pixel/Rgba8.cs b/Engine/src/Graphics/Pixel/Rgba8.cs new file mode 100644 index 0000000..437af22 --- /dev/null +++ b/Engine/src/Graphics/Pixel/Rgba8.cs @@ -0,0 +1,21 @@ +using System.Runtime.InteropServices; +using OpenTK.Graphics.OpenGL; + +namespace Engine.Graphics.Pixel; + +[StructLayout(LayoutKind.Sequential)] +public struct Rgba8 : IPixel +{ + public PixelFormat Format => PixelFormat.Rgba; + public PixelType Type => PixelType.UnsignedByte; + + public PixelInternalFormat InternalFormat => PixelInternalFormat.Rgba8; + public SizedInternalFormat SizedInternalFormat => SizedInternalFormat.Rgba8; + + public byte R; + public byte G; + public byte B; + public byte A; + + public override string ToString() => $"{R}, {G}, {B}, {A}"; +} \ No newline at end of file diff --git a/Engine/src/Graphics/Render/InstancedRenderer.cs b/Engine/src/Graphics/Render/InstancedRenderer.cs index 56b418c..0022687 100644 --- a/Engine/src/Graphics/Render/InstancedRenderer.cs +++ b/Engine/src/Graphics/Render/InstancedRenderer.cs @@ -10,8 +10,6 @@ public abstract class InstancedRenderer where C : struct, IVertex where I : struct, IVertex { - protected readonly Renderer _renderer; - private readonly IndexBuffer _indexBuffer; private readonly VertexBuffer _commonVertexBuffer; private readonly VertexBuffer _instanceVertexBuffer; @@ -24,12 +22,11 @@ public abstract class InstancedRenderer private readonly PrimitiveType _primitiveType; private readonly Program _program; - protected InstancedRenderer(Renderer parRenderer, PrimitiveType parPrimitiveType, int parInstanceCount, + protected InstancedRenderer(PrimitiveType parPrimitiveType, int parInstanceCount, uint[] parIndexBuffer, C[] parInstanceBuffer, Program parProgram) { _program = parProgram; - _renderer = parRenderer; _instanceCount = parInstanceCount; _queuedInstanceCount = 0; _instanceVertices = new I[parInstanceCount]; @@ -53,8 +50,6 @@ public abstract class InstancedRenderer return; } - _renderer.EnsureRenderThread(); - _instanceVertexBuffer.UploadData(_instanceVertices, _queuedInstanceCount); _vertexArray.Bind(); diff --git a/Engine/src/Graphics/Render/Mesh/GlobalMeshRenderer.cs b/Engine/src/Graphics/Render/Mesh/GlobalMeshRenderer.cs index 0b784d4..eee5c7c 100644 --- a/Engine/src/Graphics/Render/Mesh/GlobalMeshRenderer.cs +++ b/Engine/src/Graphics/Render/Mesh/GlobalMeshRenderer.cs @@ -3,7 +3,7 @@ using OpenTK.Mathematics; namespace Engine.Graphics.Render.Mesh; -public class GlobalMeshRenderer(Renderer parRenderer, int parMaxInstanceCount) +public class GlobalMeshRenderer(int parMaxInstanceCount) { private readonly Dictionary _meshRenderers = new(); private readonly HashSet _frameMeshes = []; @@ -18,7 +18,7 @@ public class GlobalMeshRenderer(Renderer parRenderer, int parMaxInstanceCount) } else { - var newMeshRenderer = new MeshRenderer(parRenderer, parMesh, parMaxInstanceCount, _program); + var newMeshRenderer = new MeshRenderer(parMesh, parMaxInstanceCount, _program); newMeshRenderer.Commit(parModelMatrix); _meshRenderers.Add(parMesh, newMeshRenderer); diff --git a/Engine/src/Graphics/Render/Mesh/MeshRenderer.cs b/Engine/src/Graphics/Render/Mesh/MeshRenderer.cs index 49521c0..e7faa99 100644 --- a/Engine/src/Graphics/Render/Mesh/MeshRenderer.cs +++ b/Engine/src/Graphics/Render/Mesh/MeshRenderer.cs @@ -5,9 +5,9 @@ using OpenTK.Mathematics; namespace Engine.Graphics.Render.Mesh; -public class MeshRenderer(Renderer parRenderer, Asset.Mesh.Mesh parMesh, int parInstanceCount, Program parProgram) +public class MeshRenderer(Asset.Mesh.Mesh parMesh, int parInstanceCount, Program parProgram) : InstancedRenderer( - parRenderer, PrimitiveType.Triangles, + PrimitiveType.Triangles, parInstanceCount, parMesh.Indices.ToArray(), parMesh.Vertices.ToArray(), diff --git a/Engine/src/Graphics/Render/Quad/QuadRenderer.cs b/Engine/src/Graphics/Render/Quad/QuadRenderer.cs index 832a8bf..c705277 100644 --- a/Engine/src/Graphics/Render/Quad/QuadRenderer.cs +++ b/Engine/src/Graphics/Render/Quad/QuadRenderer.cs @@ -10,8 +10,8 @@ public class QuadRenderer : InstancedRenderer _framebuffer.Width; public int ViewportHeight => _framebuffer.Height; + private readonly Dictionary _renderers = new(); + + internal NativeWindow NativeWindow { get; } + private readonly Framebuffer.Framebuffer _framebuffer; private readonly Thread _renderThread; private readonly Queue _scheduleActions = new(); - public Renderer(int parWidth, int parHeight) + public Renderer(int parWidth, int parHeight, NativeWindowSettings parSettings) { Thread.CurrentThread.Name = "RendererThread"; +#if DEBUG + Debug.InitializeRenderDoc(); +#endif + + NativeWindow = new NativeWindow(parSettings); + InitializeOpenGl(parWidth, parHeight); _renderThread = Thread.CurrentThread; @@ -33,8 +46,8 @@ public class Renderer .AddDepthAttachment() .Build(); - QuadRenderer = new QuadRenderer(this, 1024 * 8); - GlobalMeshRenderer = new GlobalMeshRenderer(this, 1024); + QuadRenderer = new QuadRenderer(1024 * 8); + GlobalMeshRenderer = new GlobalMeshRenderer(1024); } private void InitializeOpenGl(int parWidth, int parHeight) @@ -77,13 +90,31 @@ public class Renderer _framebuffer.Bind(); GL.ClearColor(0.0f, 0.0f, 0.0f, 1.0f); - GL.Clear(ClearBufferMask.ColorBufferBit | ClearBufferMask.DepthBufferBit); + GL.Clear(ClearBufferMask.ColorBufferBit); + + // foreach (var renderer in _renderers.Values) + // { + // renderer.StartFrame(); + // } } - internal void EndFrame() + internal void EndFrame(in Matrix4 parViewMatrix, in Matrix4 parProjectionMatrix) { EnsureRenderThread(); + // foreach (var renderer in _renderers.Values) + // { + // renderer.EndFrame(in parViewMatrix, in parProjectionMatrix); + // } + // + // foreach (var renderer in _renderers.Values) + // { + // QuadRenderer.Commit(Matrix4.CreateScale(2f), Vector4.One, renderer._framebuffer.TextureInternal); + // } + // + // QuadRenderer.Render(in parProjectionMatrix, in parViewMatrix); + // QuadRenderer.Reset(); + _framebuffer.Unbind(); } diff --git a/Engine/src/Graphics/Shader/Program.cs b/Engine/src/Graphics/Shader/Program.cs index 457511b..69143c5 100644 --- a/Engine/src/Graphics/Shader/Program.cs +++ b/Engine/src/Graphics/Shader/Program.cs @@ -62,12 +62,12 @@ public class Program : OpenGlObject } } - public override void Bind() + internal override void Bind() { GL.UseProgram(Handle); } - public override void Unbind() + internal override void Unbind() { GL.UseProgram(0); } diff --git a/Engine/src/Graphics/Texture/Texture.cs b/Engine/src/Graphics/Texture/Texture.cs index c5e49ce..0f20ddb 100644 --- a/Engine/src/Graphics/Texture/Texture.cs +++ b/Engine/src/Graphics/Texture/Texture.cs @@ -127,12 +127,12 @@ public abstract class Texture : OpenGlObject, ITexture GL.BindTextureUnit(parUnit, Handle); } - public override void Bind() + internal override void Bind() { GL.BindTexture(TextureTarget.Texture2D, Handle); } - public override void Unbind() + internal override void Unbind() { GL.BindTexture(TextureTarget.Texture2D, 0); }