Beispiel #1
0
        public void FilterArbiters(cpBody body, cpShape filter)
        {
            List <ulong> safeDelete = new List <ulong>();

            foreach (var hash in this.cachedArbiters)
            {
                cpArbiter arb = hash.Value;

                // Match on the filter shape, or if it's null the filter body
                if (
                    (body == arb.body_a && (filter == arb.a || filter == null)) ||
                    (body == arb.body_b && (filter == arb.b || filter == null))
                    )
                {
                    // Call separate when removing shapes.
                    if (filter != null && arb.state != cpArbiterState.Cached)
                    {
                        arb.state = cpArbiterState.Invalidated;
                        cpCollisionHandler handler = arb.handler;
                        handler.separateFunc(arb, this, handler.userData);
                    }

                    arb.Unthread();
                    this.arbiters.Remove(arb);
                    safeDelete.Add(hash.Key);
                }
            }

            foreach (var item in safeDelete)
            {
                cachedArbiters.Remove(item);
            }
        }