private static Type[] DistinctTypes(IEnumerable <Type> types) { var typesSet = RentitasCache.GetTypeHashSet(); foreach (var index in types) { typesSet.Add(index); } var uniqueTypes = new Type[typesSet.Count]; typesSet.CopyTo(uniqueTypes); //Array.Sort(uniqueTypes); RentitasCache.PushTypeHashSet(typesSet); return(uniqueTypes); }
public T[] GetComponents() { if (_componentsCache == null) { var components = RentitasCache.GetComponentList <T>(); foreach (var componentType in _poolMeta.ComponentTypes) { if (Has(componentType)) { components.Add(Get(componentType)); } } _componentsCache = components.ToArray(); } return(_componentsCache); }
public Type[] GetComponentsTypes() { if (_componentTypesCache == null) { var types = RentitasCache.GetTypeHashSet(); foreach (var componentType in _poolMeta.ComponentTypes) { if (Has(componentType)) { types.Add(componentType); } } _componentTypesCache = types.ToArray(); RentitasCache.PushTypeHashSet(types); } return(_componentTypesCache); }
void UpdateGroupsComponentAddedOrRemoved(Entity <T> entity, Type type, T component) { var groups = _groupsForTypes[type]; if (groups != null) { var events = RentitasCache.GetGroupChangedList <T>(); for (int i = 0; i < groups.Count; i++) { events.Add(groups[i].HandleEntity(entity)); } for (int i = 0; i < events.Count; i++) { var groupChangedEvent = events[i]; groupChangedEvent?.Invoke(groups[i], entity, type, component); } RentitasCache.PushGroupChangedList(events); } }
public Type[] MergeTypes() { var TypesList = RentitasCache.GetTypeList(); if (_allOfTypes != null) { TypesList.AddRange(_allOfTypes); } if (_anyOfTypes != null) { TypesList.AddRange(_anyOfTypes); } if (_noneOfTypes != null) { TypesList.AddRange(_noneOfTypes); } var mergedTypes = DistinctTypes(TypesList); RentitasCache.PushTypeList(TypesList); return(mergedTypes); }
public Pool(string name, int creationIndex, params T[] components) : this(components.Length, creationIndex) { PoolName = name; var types = RentitasCache.GetTypeHashSet(); for (int i = 0; i < components.Length; i++) { var component = components[i]; var type = component.GetType(); if (!types.Add(type)) { throw new PoolMetaDataException <T>(this, null); } var stack = new Stack <T>(); stack.Push(component); _componentPools.Add(type, stack); _groupsForTypes.Add(type, new List <Group <T> >()); var isSingleton = component is ISingleton; if (isSingleton) { // TODO: Create auto single group var group = GetGroup(Matcher.AllOf(type)); _singletons.Add(type, group); } } _metaData = new PoolMeta( types.Count, types.ToArray(), components.ToDictionary( c => c.GetType(), c => c.ToString().Split('.').Last())); RentitasCache.PushTypeHashSet(types); }