Files
doom-dm/Engine/src/Graphics/GenericRenderer.cs
2025-01-02 05:15:16 +03:00

68 lines
1.8 KiB
C#

using Engine.Graphics.Pixel;
using Engine.Graphics.Render.Mesh;
using Engine.Graphics.Render.Quad;
using Engine.Graphics.Render.Text;
using OpenTK.Graphics.OpenGL;
using OpenTK.Mathematics;
namespace Engine.Graphics;
public class GenericRenderer : IRenderer
{
public QuadRenderer QuadRenderer => _quadRenderer ??= new QuadRenderer(_engine, 1024 * 8);
public AnyMeshRenderer AnyMeshRenderer => _globalMeshRenderer ??= new AnyMeshRenderer(_engine, 1024);
public TextRenderer TextRenderer => _textRenderer ??= new TextRenderer(_engine, 1024 * 8);
private QuadRenderer? _quadRenderer;
private AnyMeshRenderer? _globalMeshRenderer;
private TextRenderer? _textRenderer;
private readonly Engine _engine;
internal readonly Framebuffer.Framebuffer _framebuffer;
private bool _frameStarted;
public GenericRenderer(Engine parEngine, int parWidth, int parHeight)
{
_engine = parEngine;
_framebuffer = Framebuffer.Framebuffer.Builder(parWidth, parHeight)
.AddColorAttachment<Rgba8>()
.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, 0.0f);
GL.Clear(ClearBufferMask.ColorBufferBit | ClearBufferMask.DepthBufferBit);
QuadRenderer.Render(parProjectionMatrix, parViewMatrix);
QuadRenderer.Reset();
AnyMeshRenderer.Render(parProjectionMatrix, parViewMatrix);
AnyMeshRenderer.Reset();
TextRenderer.Render(parProjectionMatrix, parViewMatrix);
TextRenderer.Reset();
_framebuffer.Unbind();
_frameStarted = false;
}
public void Resize(int parWidth, int parHeight)
{
_framebuffer.Resize(parWidth, parHeight);
}
}