diff --git a/encompass-cs/Exceptions/IllegalDrawLayerException.cs b/encompass-cs/Exceptions/IllegalDrawLayerException.cs new file mode 100644 index 0000000..c33d4a8 --- /dev/null +++ b/encompass-cs/Exceptions/IllegalDrawLayerException.cs @@ -0,0 +1,13 @@ + +using System; + +namespace Encompass.Exceptions +{ + public class IllegalDrawLayerException : Exception + { + public IllegalDrawLayerException( + string format, + params object[] args + ) : base(string.Format(format, args)) { } + } +} diff --git a/encompass-cs/WorldBuilder.cs b/encompass-cs/WorldBuilder.cs index dbcebcd..e4b3cce 100644 --- a/encompass-cs/WorldBuilder.cs +++ b/encompass-cs/WorldBuilder.cs @@ -33,15 +33,13 @@ namespace Encompass private readonly TrackingManager _trackingManager; private readonly Dictionary> _typeToReaders = new Dictionary>(); - private readonly HashSet _senders = new HashSet(); - private readonly HashSet _componentTypesToPreload = new HashSet(); - private readonly HashSet _messageTypes = new HashSet(); - private readonly Dictionary _typeToIndex = new Dictionary(); + private bool _rendererRegistered = false; + public WorldBuilder(int entityCapacity = 32768) { _entityCapacity = entityCapacity; @@ -177,6 +175,10 @@ namespace Encompass /// The draw layer to register. public void RegisterDrawLayer(int layer) { + if (_rendererRegistered) + { + throw new IllegalDrawLayerException("Cannot register a draw layer after a Renderer has been registered."); + } _drawLayerManager.RegisterDrawLayer(layer); } @@ -189,6 +191,7 @@ namespace Encompass renderer.AssignEntityManager(_entityManager); renderer.AssignComponentManager(_componentManager); _renderManager.RegisterOrderedRenderer(renderer.InternalRender); + _rendererRegistered = true; return renderer; } @@ -202,9 +205,8 @@ namespace Encompass { renderer.AssignEntityManager(_entityManager); renderer.AssignComponentManager(_componentManager); - _renderManager.RegisterGeneralRendererWithLayer(renderer, layer); - + _rendererRegistered = true; return renderer; } diff --git a/test/WorldBuilderTest.cs b/test/WorldBuilderTest.cs index 2f3e7d2..b404e77 100644 --- a/test/WorldBuilderTest.cs +++ b/test/WorldBuilderTest.cs @@ -558,5 +558,38 @@ namespace Tests Assert.That(order.IndexOf(engineA), Is.LessThan(order.IndexOf(engineB))); } } + + public class DrawLayerRegister + { + struct AComponent : IComponent, IDrawableComponent + { + public int Layer { get; set; } + } + + class ARenderer : OrderedRenderer + { + + public override void Render(Entity entity, in AComponent drawComponent) { } + } + + [Test] + public void DrawLayerRegisterAfterOrderedRendererRegisterThrows() + { + var worldBuilder = new WorldBuilder(); + + var rendererA = worldBuilder.AddOrderedRenderer(new ARenderer()); + + Assert.Throws(() => worldBuilder.RegisterDrawLayer(1)); + } + + [Test] + public void DrawLayerRegisterBeforeOrderedRendererDoesNotThrow() + { + var worldBuilder = new WorldBuilder(); + + Assert.DoesNotThrow(() => worldBuilder.RegisterDrawLayer(1)); + Assert.DoesNotThrow(() => worldBuilder.AddOrderedRenderer(new ARenderer())); + } + } } }