/// <inheritdoc/> protected override void RemoveItem(int index) { var collectionChanged = itemRemoved; if (collectionChanged != null) { var e = new FastTrackingCollectionChangedEventArgs(NotifyCollectionChangedAction.Remove, this[index], null, index, true); collectionChanged(this, ref e); } base.RemoveItem(index); }
/// <inheritdoc/> protected override void InsertItem(int index, T item) { base.InsertItem(index, item); var collectionChanged = itemAdded; if (collectionChanged == null) { return; } var e = new FastTrackingCollectionChangedEventArgs(NotifyCollectionChangedAction.Add, item, null, index, true); collectionChanged(this, ref e); }
protected void ClearItemsEvents() { var collectionChanged = itemRemoved; if (collectionChanged == null) { return; } for (var i = Count - 1; i >= 0; --i) { var e = new FastTrackingCollectionChangedEventArgs(NotifyCollectionChangedAction.Remove, this[i], null, i, true); collectionChanged(this, ref e); } }
/// <inheritdoc/> protected override void SetItem(int index, T item) { // Note: Changing CollectionChanged is not thread-safe var collectionChangedRemoved = itemRemoved; var oldItem = (collectionChangedRemoved != null) ? (object)this[index] : null; if (collectionChangedRemoved != null) { var e = new FastTrackingCollectionChangedEventArgs(NotifyCollectionChangedAction.Remove, oldItem, null, index); collectionChangedRemoved(this, ref e); } base.SetItem(index, item); var collectionChangedAdded = itemAdded; if (collectionChangedAdded != null) { var e = new FastTrackingCollectionChangedEventArgs(NotifyCollectionChangedAction.Add, item, oldItem, index); collectionChangedAdded(this, ref e); } }
/// <summary> /// Spawners have changed. /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void SpawnersChanged(object sender, ref FastTrackingCollectionChangedEventArgs e) { DirtyParticlePool = true; }
/// <summary> /// Notification that the modules (plugins) have changed. /// Pool's fields may need to be updated if new are required or old ones are no longer needed. /// </summary> /// <param name="sender">Sender</param> /// <param name="e">Event arguments</param> private void ModulesChanged(object sender, ref FastTrackingCollectionChangedEventArgs e) { var module = e.Item as ParticleModule; if (module == null) return; switch (e.Action) { case NotifyCollectionChangedAction.Add: for (int i = 0; i < module.RequiredFields.Count; i++) { AddRequiredField(module.RequiredFields[i]); } break; case NotifyCollectionChangedAction.Remove: for (int i = 0; i < module.RequiredFields.Count; i++) { RemoveRequiredField(module.RequiredFields[i]); } break; } }
private void RenderStages_CollectionChanged(object sender, ref FastTrackingCollectionChangedEventArgs e) { switch (e.Action) { case NotifyCollectionChangedAction.Add: // Make sure mask is big enough RenderData.ChangeDataMultiplier(RenderStageMaskKey, stageMaskMultiplier = (RenderSystem.RenderStages.Count + RenderStageMaskSizePerEntry - 1) / RenderStageMaskSizePerEntry); Array.Resize(ref viewRenderStageMask, stageMaskMultiplier); // Everything will need reevaluation NeedActiveRenderStageReevaluation = true; break; } }
private void RenderFeatures_CollectionChanged(object sender, ref FastTrackingCollectionChangedEventArgs e) { switch (e.Action) { case NotifyCollectionChangedAction.Add: for (int index = 0; index < renderObjectsWithoutFeatures.Count; index++) { var renderObject = renderObjectsWithoutFeatures[index]; // Try to reprocess object that didn't have any stage before if (renderObject.RenderFeature == null) { RenderSystem.AddRenderObject(renderObject); if (renderObject.RenderFeature != null) { renderObjectsWithoutFeatures.SwapRemoveAt(index--); ReevaluateActiveRenderStages(renderObject); } } } break; case NotifyCollectionChangedAction.Remove: foreach (var renderObject in RenderObjects) { if (renderObject.RenderFeature == e.Item) { RenderSystem.RemoveRenderObject(renderObject); renderObjectsWithoutFeatures.Add(renderObject); } } break; } }