/// <summary> /// Gets filter for specific components. /// </summary> /// <param name="include">Component mask for required components.</param> /// <param name="include">Component mask for denied components.</param> /// <param name="shouldBeFilled">New filter should be filled with compatible entities on creation.</param> internal EcsFilter GetFilter(EcsComponentMask include, EcsComponentMask exclude, bool shouldBeFilled) { #if DEBUG if (include == null) { throw new ArgumentNullException("include"); } if (exclude == null) { throw new ArgumentNullException("exclude"); } #endif var i = _filtersCount - 1; for (; i >= 0; i--) { if (this._filters[i].IncludeMask.IsEquals(include) && _filters[i].ExcludeMask.IsEquals(exclude)) { break; } } if (i == -1) { i = _filtersCount; var filter = new EcsFilter(include, exclude); if (shouldBeFilled) { FillFilter(filter); } if (_filtersCount == _filters.Length) { Array.Resize(ref _filters, _filtersCount << 1); } _filters[_filtersCount++] = filter; for (var bit = 0; bit < include.BitsCount; bit++) { var typeId = include.Bits[bit]; if (typeId >= _componentPoolFilters.Length) { Array.Resize(ref _componentPoolFilters, EcsHelpers.GetPowerOfTwoSize(typeId + 1)); } var filterList = _componentPoolFilters[typeId]; if (filterList == null) { filterList = new EcsFilterList(); _componentPoolFilters[typeId] = filterList; } if (filterList.Count == filterList.Filters.Length) { Array.Resize(ref filterList.Filters, filterList.Count << 1); } filterList.Filters[filterList.Count++] = filter; } } return(_filters[i]); }
/// <summary> /// Fills filter with compatible entities. /// </summary> /// <param name="filter">Filter.</param> void FillFilter(EcsFilter filter) { for (var i = 0; i < _entitiesCount; i++) { var entity = _entities[i]; if (!entity.IsReserved && entity.Mask.IsCompatible(filter)) { filter.Entities.Add(i); } } }
public virtual void Initialize() { _world = GetWorld(); _filter = GetFilter(); _worker = GetWorker(); _minJobSize = GetMinJobSize(); _threadsCount = GetThreadsCount(); _forceSyncState = GetForceSyncState(); #if DEBUG if (_world == null) { throw new Exception("Invalid EcsWorld"); } if (_filter == null) { throw new Exception("Invalid EcsFilter"); } if (_minJobSize < 1) { throw new Exception("Invalid JobSize"); } if (_threadsCount < 1) { throw new Exception("Invalid ThreadsCount"); } #endif #if !UNITY_WEBGL _descs = new WorkerDesc[_threadsCount]; _syncs = new ManualResetEvent[_threadsCount]; EcsMultiThreadJob job; for (var i = 0; i < _descs.Length; i++) { job = new EcsMultiThreadJob(); job.World = _world; var desc = new WorkerDesc(); desc.Job = job; desc.Thread = new Thread(ThreadProc); desc.Thread.IsBackground = true; #if DEBUG desc.Thread.Name = string.Format("ECS-{0:X}-{1}", this.GetHashCode(), i); #endif desc.HasWork = new ManualResetEvent(false); desc.WorkDone = new ManualResetEvent(true); desc.Worker = _worker; _descs[i] = desc; _syncs[i] = desc.WorkDone; desc.Thread.Start(desc); } #endif _localJob = new EcsMultiThreadJob(); _localJob.World = _world; }
void IEcsPreInitSystem.PreInitialize() { _reactFilter = GetReactFilter(); _type = GetReactSystemType(); #if DEBUG if (_type == EcsReactSystemType.OnRemove) { throw new System.NotSupportedException( "OnRemove type not supported for delayed processing, use EcsReactInstantSystem instead."); } #endif _reactFilter.AddListener(this); }
/// <summary> /// Fills filter with compatible entities. /// </summary> /// <param name="filter">Filter.</param> void FillFilter(EcsFilter filter) { for (var i = 0; i < _entitiesCount; i++) { var entity = _entities[i]; if (!entity.IsReserved && entity.Mask.IsCompatible(filter)) { if (filter.Entities.Length == filter.EntitiesCount) { Array.Resize(ref filter.Entities, filter.EntitiesCount << 1); } filter.Entities[filter.EntitiesCount++] = i; } } }
void IEcsPreInitSystem.PreInitialize() { _reactFilter = GetReactFilter(); _type = GetReactSystemType(); switch (_type) { case EcsReactSystemType.OnAdd: _reactFilter.OnEntityAdded += OnEntityAdded; _reactFilter.OnEntityRemoved += OnEntityRemoved; break; case EcsReactSystemType.OnUpdate: _reactFilter.OnEntityUpdated += OnEntityAdded; break; } }
public virtual void Destroy() { #if !UNITY_WEBGL for (var i = 0; i < _descs.Length; i++) { var desc = _descs[i]; _descs[i] = null; desc.Thread.Interrupt(); desc.Thread.Join(10); _syncs[i].Close(); _syncs[i] = null; } #endif _world = null; _filter = null; _worker = null; }
void IEcsPreInitSystem.PreInitialize() { _reactFilter = GetReactFilter(); _type = GetReactSystemType(); _reactFilter.AddListener(this); }