Skip to content

Commit

Permalink
refactor: simplify and improve renderer factory
Browse files Browse the repository at this point in the history
  • Loading branch information
CalvinWilkinson committed Aug 17, 2023
1 parent 5b6cea7 commit e36ef7a
Show file tree
Hide file tree
Showing 2 changed files with 98 additions and 102 deletions.
120 changes: 18 additions & 102 deletions Velaptor/Factories/RendererFactory.cs
Original file line number Diff line number Diff line change
Expand Up @@ -7,120 +7,36 @@ namespace Velaptor.Factories;
using System.Diagnostics.CodeAnalysis;
using Batching;
using Graphics.Renderers;
using NativeInterop.OpenGL;
using OpenGL.Batching;
using OpenGL.Buffers;

/// <inheritdoc/>
[ExcludeFromCodeCoverage(Justification = "Cannot unit test due direct interaction with IoC container.")]
public sealed class RendererFactory : IRendererFactory
{
private static ITextureRenderer? textureRenderer;
private static IFontRenderer? fontRenderer;
private static IShapeRenderer? shapeRenderer;
private static ILineRenderer? lineRenderer;

/// <inheritdoc/>
public ITextureRenderer CreateTextureRenderer()
private readonly ITextureRenderer textureRenderer;
private readonly IFontRenderer fontRenderer;
private readonly IShapeRenderer shapeRenderer;
private readonly ILineRenderer lineRenderer;

/// <summary>
/// Initializes a new instance of the <see cref="RendererFactory"/> class.
/// </summary>
public RendererFactory()
{
if (textureRenderer is not null)
{
return textureRenderer;
}

var glInvoker = IoC.Container.GetInstance<IGLInvoker>();
var reactableFactory = IoC.Container.GetInstance<IReactableFactory>();
var openGLService = IoC.Container.GetInstance<IOpenGLService>();
var buffer = IoC.Container.GetInstance<IGPUBuffer<TextureBatchItem>>();
var shader = IoC.Container.GetInstance<IShaderFactory>().CreateTextureShader();
var batchManager = IoC.Container.GetInstance<IBatchingManager>();

textureRenderer = new TextureRenderer(
glInvoker,
reactableFactory,
openGLService,
buffer,
shader,
batchManager);

return textureRenderer;
this.textureRenderer = IoC.Container.GetInstance<ITextureRenderer>();
this.fontRenderer = IoC.Container.GetInstance<IFontRenderer>();
this.shapeRenderer = IoC.Container.GetInstance<IShapeRenderer>();
this.lineRenderer = IoC.Container.GetInstance<ILineRenderer>();
}

/// <inheritdoc/>
public IFontRenderer CreateFontRenderer()
{
if (fontRenderer is not null)
{
return fontRenderer;
}

var glInvoker = IoC.Container.GetInstance<IGLInvoker>();
var reactableFactory = IoC.Container.GetInstance<IReactableFactory>();
var openGLService = IoC.Container.GetInstance<IOpenGLService>();
var buffer = IoC.Container.GetInstance<IGPUBuffer<FontGlyphBatchItem>>();
var shader = IoC.Container.GetInstance<IShaderFactory>().CreateFontShader();
var batchManager = IoC.Container.GetInstance<IBatchingManager>();

fontRenderer = new FontRenderer(
glInvoker,
reactableFactory,
openGLService,
buffer,
shader,
batchManager);

return fontRenderer;
}
public ITextureRenderer CreateTextureRenderer() => this.textureRenderer;

/// <inheritdoc/>
public IShapeRenderer CreateShapeRenderer()
{
if (shapeRenderer is not null)
{
return shapeRenderer;
}

var glInvoker = IoC.Container.GetInstance<IGLInvoker>();
var reactableFactory = IoC.Container.GetInstance<IReactableFactory>();
var openGLService = IoC.Container.GetInstance<IOpenGLService>();
var buffer = IoC.Container.GetInstance<IGPUBuffer<ShapeBatchItem>>();
var shader = IoC.Container.GetInstance<IShaderFactory>().CreateRectShader();
var batchManager = IoC.Container.GetInstance<IBatchingManager>();

shapeRenderer = new ShapeRenderer(
glInvoker,
reactableFactory,
openGLService,
buffer,
shader,
batchManager);

return shapeRenderer;
}
public IFontRenderer CreateFontRenderer() => this.fontRenderer;

/// <inheritdoc/>
public ILineRenderer CreateLineRenderer()
{
if (lineRenderer is not null)
{
return lineRenderer;
}

var glInvoker = IoC.Container.GetInstance<IGLInvoker>();
var reactableFactory = IoC.Container.GetInstance<IReactableFactory>();
var openGLService = IoC.Container.GetInstance<IOpenGLService>();
var buffer = IoC.Container.GetInstance<IGPUBuffer<LineBatchItem>>();
var shader = IoC.Container.GetInstance<IShaderFactory>().CreateLineShader();
var batchManager = IoC.Container.GetInstance<IBatchingManager>();

lineRenderer = new LineRenderer(
glInvoker,
reactableFactory,
openGLService,
buffer,
shader,
batchManager);
public IShapeRenderer CreateShapeRenderer() => this.shapeRenderer;

return lineRenderer;
}
/// <inheritdoc/>
public ILineRenderer CreateLineRenderer() => this.lineRenderer;
}
80 changes: 80 additions & 0 deletions Velaptor/IoC.cs
Original file line number Diff line number Diff line change
Expand Up @@ -67,6 +67,8 @@ private static void SetupContainer()

SetupBuffers();

SetupRendering();

SetupCaching();

SetupFactories();
Expand All @@ -92,6 +94,84 @@ private static void SetupContainer()
isInitialized = true;
}

/// <summary>
/// Sets up the various renderers.
/// </summary>
private static void SetupRendering()
{
IoCContainer.Register<IFontRenderer>(() =>
{
var glInvoker = IoC.Container.GetInstance<IGLInvoker>();
var reactableFactory = IoC.Container.GetInstance<IReactableFactory>();
var openGLService = IoC.Container.GetInstance<IOpenGLService>();
var buffer = IoC.Container.GetInstance<IGPUBuffer<FontGlyphBatchItem>>();
var shader = IoC.Container.GetInstance<IShaderFactory>().CreateFontShader();
var batchManager = IoC.Container.GetInstance<IBatchingManager>();
return new FontRenderer(
glInvoker,
reactableFactory,
openGLService,
buffer,
shader,
batchManager);
});

IoCContainer.Register<ITextureRenderer>(() =>
{
var glInvoker = IoC.Container.GetInstance<IGLInvoker>();
var reactableFactory = IoC.Container.GetInstance<IReactableFactory>();
var openGLService = IoC.Container.GetInstance<IOpenGLService>();
var buffer = IoC.Container.GetInstance<IGPUBuffer<TextureBatchItem>>();
var shader = IoC.Container.GetInstance<IShaderFactory>().CreateTextureShader();
var batchManager = IoC.Container.GetInstance<IBatchingManager>();
return new TextureRenderer(
glInvoker,
reactableFactory,
openGLService,
buffer,
shader,
batchManager);
});

IoCContainer.Register<ILineRenderer>(() =>
{
var glInvoker = IoC.Container.GetInstance<IGLInvoker>();
var reactableFactory = IoC.Container.GetInstance<IReactableFactory>();
var openGLService = IoC.Container.GetInstance<IOpenGLService>();
var buffer = IoC.Container.GetInstance<IGPUBuffer<LineBatchItem>>();
var shader = IoC.Container.GetInstance<IShaderFactory>().CreateLineShader();
var batchManager = IoC.Container.GetInstance<IBatchingManager>();
return new LineRenderer(
glInvoker,
reactableFactory,
openGLService,
buffer,
shader,
batchManager);
});

IoCContainer.Register<IShapeRenderer>(() =>
{
var glInvoker = IoC.Container.GetInstance<IGLInvoker>();
var reactableFactory = IoC.Container.GetInstance<IReactableFactory>();
var openGLService = IoC.Container.GetInstance<IOpenGLService>();
var buffer = IoC.Container.GetInstance<IGPUBuffer<ShapeBatchItem>>();
var shader = IoC.Container.GetInstance<IShaderFactory>().CreateRectShader();
var batchManager = IoC.Container.GetInstance<IBatchingManager>();
return new ShapeRenderer(
glInvoker,
reactableFactory,
openGLService,
buffer,
shader,
batchManager);
});
}

/// <summary>
/// Sets up the container registration related to OpenGL.
/// </summary>
Expand Down

0 comments on commit e36ef7a

Please sign in to comment.