diff --git a/encompass-cs/Collections/BitSet512.cs b/encompass-cs/Collections/BitSet512.cs index 1c67de7..e9581e2 100644 --- a/encompass-cs/Collections/BitSet512.cs +++ b/encompass-cs/Collections/BitSet512.cs @@ -1,4 +1,5 @@ using System; +using System.Collections.Generic; namespace Encompass { @@ -118,6 +119,17 @@ namespace Encompass return this == Zero; } + public IEnumerable TrueIndices() + { + for (int i = 0; i < 512; i++) + { + if (Get(i)) + { + yield return i; + } + } + } + public static BitSet512 BitwiseAnd(BitSet512 left, BitSet512 right) { return left & right; diff --git a/encompass-cs/ComponentManager.cs b/encompass-cs/ComponentManager.cs index 3856af5..2c3c119 100644 --- a/encompass-cs/ComponentManager.cs +++ b/encompass-cs/ComponentManager.cs @@ -11,19 +11,21 @@ namespace Encompass private readonly ComponentStore _upToDateComponentStore; public Dictionary TypeToIndex { get; } + private Dictionary IndexToType { get; } private readonly HashSet _entitiesMarkedForRemoval = new HashSet(); internal ComponentBitSet ImmediateBits { get { return _immediateComponentStore.ComponentBitSet; } } internal ComponentBitSet ExistingBits { get { return _existingComponentStore.ComponentBitSet; } } - public ComponentManager(Dictionary typeToIndex) + public ComponentManager(Dictionary typeToIndex, Dictionary indexToType) { _existingComponentStore = new ComponentStore(typeToIndex); _immediateComponentStore = new ComponentStore(typeToIndex); _replayStore = new ComponentDeltaStore(typeToIndex); _upToDateComponentStore = new ComponentStore(typeToIndex); TypeToIndex = typeToIndex; + IndexToType = indexToType; } public void RegisterComponentType() where TComponent : struct @@ -186,6 +188,13 @@ namespace Encompass return ref _existingComponentStore.Get(entityID); } + #if DEBUG + internal TComponent Debug_ReadExistingComponentByEntityAndType(int entityID) where TComponent : struct + { + return _existingComponentStore.Get(entityID); + } + #endif + internal ref TComponent ReadImmediateComponentByEntityAndType(int entityID) where TComponent : struct { return ref _immediateComponentStore.Get(entityID); @@ -284,5 +293,18 @@ namespace Encompass { return _upToDateComponentStore.EntityBitArray(entityID).AllFalse(); } + + // should be used for debugging only! + #if DEBUG + internal IEnumerable Components(int entityID) + { + foreach (var typeIndex in ExistingBits.EntityBitArray(entityID).TrueIndices()) + { + var method = typeof(ComponentManager).GetMethod(nameof(ComponentManager.Debug_ReadExistingComponentByEntityAndType), System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Instance); + var generic = method.MakeGenericMethod(IndexToType[typeIndex]); + yield return generic.Invoke(this, new object[] { entityID }); + } + } + #endif } } diff --git a/encompass-cs/Renderer.cs b/encompass-cs/Renderer.cs index 2ebf732..6b62798 100644 --- a/encompass-cs/Renderer.cs +++ b/encompass-cs/Renderer.cs @@ -64,5 +64,12 @@ namespace Encompass { return _componentManager.SomeExistingComponent(); } + + #if DEBUG + protected IEnumerable Debug_GetAllComponents(Entity entity) + { + return _componentManager.Components(entity.ID); + } + #endif } } diff --git a/encompass-cs/WorldBuilder.cs b/encompass-cs/WorldBuilder.cs index 777b66c..82ba7b2 100644 --- a/encompass-cs/WorldBuilder.cs +++ b/encompass-cs/WorldBuilder.cs @@ -34,13 +34,14 @@ namespace Encompass private readonly HashSet _componentTypesToPreload = new HashSet(); private readonly HashSet _messageTypes = new HashSet(); private readonly Dictionary _typeToIndex = new Dictionary(); + private readonly Dictionary _indexToType = new Dictionary(); public WorldBuilder(int entityCapacity = 32768) { _entityCapacity = entityCapacity; _timeManager = new TimeManager(); _trackingManager = new TrackingManager(); - _componentManager = new ComponentManager(_typeToIndex); + _componentManager = new ComponentManager(_typeToIndex, _indexToType); _messageManager = new MessageManager(_timeManager); _entityManager = new EntityManager(_componentManager, entityCapacity); _renderManager = new RenderManager(_entityManager); @@ -94,7 +95,9 @@ namespace Encompass { if (!_typeToIndex.ContainsKey(typeof(TComponent))) { - _typeToIndex.Add(typeof(TComponent), _typeToIndex.Count); + var count = _typeToIndex.Count; + _typeToIndex.Add(typeof(TComponent), count); + _indexToType.Add(count, typeof(TComponent)); _componentTypesToPreload.Add(typeof(TComponent)); _componentManager.RegisterComponentType(); _startingExistingComponentStore.RegisterComponentType(); @@ -428,7 +431,7 @@ namespace Encompass var dummyTimeManager = new TimeManager(); var dummyMessageManager = new MessageManager(dummyTimeManager); var dummyTrackingManager = new TrackingManager(); - var dummyComponentManager = new ComponentManager(_typeToIndex); + var dummyComponentManager = new ComponentManager(_typeToIndex, _indexToType); var dummyEntityManager = new EntityManager(dummyComponentManager, _entityCapacity); var dummyRenderManager = new RenderManager(dummyEntityManager);