world transfer determinism
							parent
							
								
									1ef141422c
								
							
						
					
					
						commit
						a2a81bf477
					
				|  | @ -13,12 +13,9 @@ namespace MoonTools.ECS | |||
| 		{ | ||||
| 		} | ||||
| 
 | ||||
| 		protected IEnumerable<dynamic> Debug_GetAllComponents(Entity entity) | ||||
| 		protected ComponentEnumerator Debug_GetAllComponents(Entity entity) | ||||
| 		{ | ||||
| 			foreach (var typeIndex in EntityStorage.ComponentTypeIndices(entity.ID)) | ||||
| 			{ | ||||
| 				yield return ComponentDepot.Debug_Get(entity.ID, typeIndex); | ||||
| 			} | ||||
| 			return new ComponentEnumerator(ComponentDepot, entity, EntityStorage.ComponentTypeIndices(entity.ID)); | ||||
| 		} | ||||
| 
 | ||||
| 		protected IEnumerable<Entity> Debug_GetEntities(Type componentType) | ||||
|  | @ -39,6 +36,28 @@ namespace MoonTools.ECS | |||
| 				} | ||||
| 			} | ||||
| 		} | ||||
| 
 | ||||
| 		public ref struct ComponentEnumerator | ||||
| 		{ | ||||
| 			private ComponentDepot ComponentDepot; | ||||
| 			private Entity Entity; | ||||
| 			private ReverseSpanEnumerator<int> ComponentTypeIndices; | ||||
| 
 | ||||
| 			public ComponentEnumerator GetEnumerator() => this; | ||||
| 
 | ||||
| 			internal ComponentEnumerator( | ||||
| 				ComponentDepot componentDepot, | ||||
| 				Entity entity, | ||||
| 				Collections.IndexableSet<int> componentTypeIndices | ||||
| 			) { | ||||
| 				ComponentDepot = componentDepot; | ||||
| 				Entity = entity; | ||||
| 				ComponentTypeIndices = componentTypeIndices.GetEnumerator(); | ||||
| 			} | ||||
| 
 | ||||
| 			public bool MoveNext() => ComponentTypeIndices.MoveNext(); | ||||
| 			public object Current => ComponentDepot.Debug_Get(Entity.ID, ComponentTypeIndices.Current); | ||||
| 		} | ||||
| 	} | ||||
| } | ||||
| #endif | ||||
|  |  | |||
|  | @ -1,4 +1,5 @@ | |||
| using System.Collections.Generic; | ||||
| using MoonTools.ECS.Collections; | ||||
| 
 | ||||
| namespace MoonTools.ECS | ||||
| { | ||||
|  | @ -10,8 +11,8 @@ namespace MoonTools.ECS | |||
| 		// FIXME: this is only needed in debug mode | ||||
| 		private readonly HashSet<int> availableIDHash = new HashSet<int>(); | ||||
| 
 | ||||
| 		private Dictionary<int, HashSet<int>> EntityToComponentTypeIndices = new Dictionary<int, HashSet<int>>(); | ||||
| 		private Dictionary<int, HashSet<int>> EntityToRelationTypeIndices = new Dictionary<int, HashSet<int>>(); | ||||
| 		private Dictionary<int, IndexableSet<int>> EntityToComponentTypeIndices = new Dictionary<int, IndexableSet<int>>(); | ||||
| 		private Dictionary<int, IndexableSet<int>> EntityToRelationTypeIndices = new Dictionary<int, IndexableSet<int>>(); | ||||
| 
 | ||||
| 		public int Count => nextID - availableIDs.Count; | ||||
| 
 | ||||
|  | @ -23,12 +24,12 @@ namespace MoonTools.ECS | |||
| 
 | ||||
| 			if (!EntityToComponentTypeIndices.ContainsKey(entity.ID)) | ||||
| 			{ | ||||
| 				EntityToComponentTypeIndices.Add(entity.ID, new HashSet<int>()); | ||||
| 				EntityToComponentTypeIndices.Add(entity.ID, new IndexableSet<int>()); | ||||
| 			} | ||||
| 
 | ||||
| 			if (!EntityToRelationTypeIndices.ContainsKey(entity.ID)) | ||||
| 			{ | ||||
| 				EntityToRelationTypeIndices.Add(entity.ID, new HashSet<int>()); | ||||
| 				EntityToRelationTypeIndices.Add(entity.ID, new IndexableSet<int>()); | ||||
| 			} | ||||
| 
 | ||||
| 			Tags[entity.ID] = tag; | ||||
|  | @ -86,12 +87,12 @@ namespace MoonTools.ECS | |||
| 			return Tags[entityID]; | ||||
| 		} | ||||
| 
 | ||||
| 		public HashSet<int> ComponentTypeIndices(int entityID) | ||||
| 		public IndexableSet<int> ComponentTypeIndices(int entityID) | ||||
| 		{ | ||||
| 			return EntityToComponentTypeIndices[entityID]; | ||||
| 		} | ||||
| 
 | ||||
| 		public HashSet<int> RelationTypeIndices(int entityID) | ||||
| 		public IndexableSet<int> RelationTypeIndices(int entityID) | ||||
| 		{ | ||||
| 			return EntityToRelationTypeIndices[entityID]; | ||||
| 		} | ||||
|  |  | |||
|  | @ -22,8 +22,6 @@ namespace MoonTools.ECS | |||
| 
 | ||||
| 		public bool Equals(FilterSignature other) | ||||
| 		{ | ||||
| 			// workaround for HashSet<T>.SetEquals generating garbage | ||||
| 			// maybe fixed in .NET 8? | ||||
| 			foreach (var included in Included) | ||||
| 			{ | ||||
| 				if (!other.Included.Contains(included)) | ||||
|  |  | |||
|  | @ -148,10 +148,12 @@ namespace MoonTools.ECS | |||
| 				} | ||||
| 			} | ||||
| 
 | ||||
| 			filterSignatureToEntityIDs[filterSignature].Add(entityID); | ||||
| 			if (addCallbacks.TryGetValue(filterSignature, out var addCallback)) | ||||
| 			if (filterSignatureToEntityIDs[filterSignature].Add(entityID)) | ||||
| 			{ | ||||
| 				addCallback(entityID); | ||||
| 				if (addCallbacks.TryGetValue(filterSignature, out var addCallback)) | ||||
| 				{ | ||||
| 					addCallback(entityID); | ||||
| 				} | ||||
| 			} | ||||
| 		} | ||||
| 
 | ||||
|  |  | |||
		Loading…
	
		Reference in New Issue