public Aspect(SparseComponentArray sparseComponents, TypeIndexer typeIndexer, int maxEntities, int maxComponentTypes, Type[] types) { Debug.Assert(maxEntities > 0); Debug.Assert(maxComponentTypes > 0); this.maxEntities = maxEntities; this.typeIndexer = typeIndexer; this.sparseComponents = sparseComponents; typeMap = new IntMap(maxComponentTypes); entities = new PackedArray <Entity>(maxEntities); components = new IArrayWrapper[types.Length]; addedEntities = new Entity[maxEntities]; removedEntities = new Entity[maxEntities]; foreach (Type type in types) { int typeIndex = typeIndexer.GetIndex(type); int packedIndex = typeMap.Add(typeIndex); Type genericArrayWrapper = typeof(ArrayWrapper <>).MakeGenericType(type); IArrayWrapper array = (IArrayWrapper)Activator.CreateInstance(genericArrayWrapper, maxEntities); components[packedIndex] = array; Bitmask = Bitmask.Set(typeIndex); } }
public void AddFrom(int thisIndex, IArrayWrapper other, int otherIndex) { Debug.Assert(thisIndex >= 0 && thisIndex < data.Length); Debug.Assert(other is ArrayWrapper <T>); data[thisIndex] = (other as ArrayWrapper <T>)[otherIndex]; }
/// <summary> /// Creates a new ArrayWrapperEnumerator from the ArrayWrapper it is to enumerate over /// </summary> /// <param name="wrapper"></param> public ArrayWrapperEnumerator(IArrayWrapper <T, K> wrapper) { if (wrapper == null) { throw new ArgumentNullException("wrapper"); } logger.Debug("Creating new ArrayWrapper<T, K>. T : " + typeof(T).FullName + "; K : " + typeof(K).FullName); this._wrapper = wrapper; this.index = -1; }
public void Add(Entity entity) { int sparseIndex = entity.Index; int packedIndex = entities.Add(entity, sparseIndex); for (int i = 0; i < components.Length; ++i) { int typeIndex = typeMap.GetSparse(i); IArrayWrapper array = components[i]; IArrayWrapper sparseArray = sparseComponents.GetArrayWrapper(typeIndex); array.AddFrom(packedIndex, sparseArray, entity.Index); } addedEntities[addedEntitiesCount++] = entity; }
public void Remove(Entity entity) { int index = entity.Index; if (!entities.Contains(index)) { return; } entities.Remove(index, out int lastPackedIndex, out int packedIndex); for (int i = 0; i < components.Length; ++i) { IArrayWrapper array = components[i]; if (packedIndex != lastPackedIndex) { array.Swap(packedIndex, lastPackedIndex); } array.RemoveElementAt(lastPackedIndex); } removedEntities[removedEntitiesCount++] = entity; }
/// <summary> /// Disposes of the enumerator /// </summary> public void Dispose() { this._wrapper = null; }