示例#1
0
        /// <summary>
        /// When contact debugging is enabled, prims will forward all their contact information to this debug
        /// manager instance.
        /// </summary>
        /// <param name="contactPairHeader"></param>
        /// <param name="pairs"></param>
        public void AnalyzeContactChange(PhysX.ContactPairHeader contactPairHeader, PhysX.ContactPair[] pairs)
        {
            if (_contactDebugStartedAt == 0)
            {
                return;
            }

            if (contactPairHeader.Actors[0] == null || contactPairHeader.Actors[1] == null)
            {
                return;
            }

            foreach (var pair in pairs)
            {
                if ((pair.Events & PhysX.PairFlag.NotifyTouchFound) != 0 || (pair.Events & PhysX.PairFlag.NotifyTouchPersists) != 0)
                {
                    int currCount = pair.ContactCount;
                    if (_contactCounts.TryGetValue(contactPairHeader.Actors[0], out currCount))
                    {
                        currCount += pair.ContactCount;
                    }

                    _contactCounts[contactPairHeader.Actors[0]] = currCount;

                    if (_contactCounts.TryGetValue(contactPairHeader.Actors[1], out currCount))
                    {
                        currCount += pair.ContactCount;
                    }

                    _contactCounts[contactPairHeader.Actors[1]] = currCount;
                }
            }
        }
 public override void OnContact(PhysX.ContactPairHeader contactPairHeader, PhysX.ContactPair[] pairs)
 {
     if (OnContactCallback != null)
     {
         OnContactCallback(contactPairHeader, pairs);
     }
 }
示例#3
0
        private bool TryInformPrimOfContactChange(PhysX.ContactPairHeader contactPairHeader, PhysX.ContactPair[] pairs, int actorIndex)
        {
            PhysxPrim prim = contactPairHeader.Actors[actorIndex].UserData as PhysxPrim;

            if (prim != null)
            {
                prim.OnContactChangeSync(contactPairHeader, pairs, actorIndex);
                return(true);
            }
            else
            {
                return(false);
            }
        }
示例#4
0
        private bool TryInformCharacterOfContactChange(PhysX.ContactPairHeader contactPairHeader, PhysX.ContactPair[] pairs, int actorIndex)
        {
            PhysxCharacter character = contactPairHeader.Actors[actorIndex].UserData as PhysxCharacter;

            if (character != null)
            {
                character.OnContactChangeSync(contactPairHeader, pairs, actorIndex);
                return(true);
            }
            else
            {
                return(false);
            }
        }
示例#5
0
        private void OnContact(PhysX.ContactPairHeader contactPairHeader, PhysX.ContactPair[] pairs)
        {
            if ((contactPairHeader.Flags & PhysX.ContactPairHeaderFlag.DeletedActor0) == 0)
            {
                bool wasPrim = TryInformPrimOfContactChange(contactPairHeader, pairs, 0);
                if (!wasPrim)
                {
                    TryInformCharacterOfContactChange(contactPairHeader, pairs, 0);
                }
            }

            if ((contactPairHeader.Flags & PhysX.ContactPairHeaderFlag.DeletedActor1) == 0)
            {
                bool wasPrim = TryInformPrimOfContactChange(contactPairHeader, pairs, 1);
                if (!wasPrim)
                {
                    TryInformCharacterOfContactChange(contactPairHeader, pairs, 1);
                }
            }
        }