public void OnContactNotify(ContactPair contactInformation, ContactPairFlag events)
 {
     if (contactNofityEvent != null)
     {
         contactNofityEvent(contactInformation, events);
     }
 }
Example #2
0
    private int ContactDistance(ContactPair pair)
    {
        Vector3 aPos = pair.a.transform.position, bPos = pair.b.transform.position;
        float   xDirection = Mathf.Sign(bPos.x - aPos.x);

        aPos.x -= xDirection * (pair.a.Collider.size.x / 2f);
        bPos.x += xDirection * (pair.b.Collider.size.x / 2f);

        return(Mathf.RoundToInt(Vector3.Distance(aPos, bPos) * 1000f));
    }
Example #3
0
        // PhysX calls OnContactNotify is the base class which you then provide the implementation for
        public override void OnContactNotify(ContactPair contactInformation, ContactPairFlag events)
        {
            Actor a = contactInformation.ActorA;
            Actor b = contactInformation.ActorB;

            // This shouldn't be O(n)
            foreach (ContactReportPair pair in _contactPairs)
            {
                if ((pair.ActorA == a || pair.ActorA == b) && (pair.ActorB == a || pair.ActorB == b))
                {
                    pair.Callback(a, b, events);
                }
            }
        }
Example #4
0
		// PhysX calls OnContactNotify is the base class which you then provide the implementation for
		public override void OnContactNotify(ContactPair contactInformation, ContactPairFlag events)
		{
			Actor a = contactInformation.ActorA;
			Actor b = contactInformation.ActorB;

			// This shouldn't be O(n)
			foreach (ContactReportPair pair in _contactPairs)
			{
				if ((pair.ActorA == a || pair.ActorA == b) && (pair.ActorB == a || pair.ActorB == b))
				{
					pair.Callback(a, b, events);
				}
			}
		}
Example #5
0
            public override void OnContactNotify(ContactPair contactInformation, ContactPairFlag events)
            {
                ContactStreamIterator iter;

                using (iter = new ContactStreamIterator(contactInformation.ContactStream))
                {
                    while (iter.GoToNextPair())
                    {
                        while (iter.GoToNextPatch())
                        {
                            while (iter.GoToNextPoint())
                            {
                                // Test each of the available 'information' functions/properties

                                int       numberOfPairs            = iter.GetNumberOfPairs();
                                Shape     shapeA                   = iter.GetShapeA();
                                Shape     shapeB                   = iter.GetShapeB();
                                bool      isShapeADeleted          = iter.IsDeletedShapeA();
                                bool      isShapeBDeleted          = iter.IsDeletedShapeB();
                                ShapeFlag shapeFlags               = iter.GetShapeFlags();
                                int       numberOfPatches          = iter.GetNumberOfPatches();
                                int       numberOfPatchesRemaining = iter.GetNumberOfPatchesRemaining();
                                Vector3   patchNormal              = iter.GetPatchNormal();
                                int       numberOfPoints           = iter.GetNumberOfPoints();
                                int       numberOfPointsRemaining  = iter.GetNumberOfPointsRemaining();
                                Vector3   point            = iter.GetPoint();
                                float     separation       = iter.GetSeperation();
                                int       featureIndex0    = iter.GetFeatureIndex0();
                                int       featureIndex1    = iter.GetFeatureIndex1();
                                float     pointNormalForce = iter.GetPointNormalForce();

                                // First collision should be AB
                                if (IsPairContacting(shapeA, A, B) && IsPairContacting(shapeB, A, B))
                                {
                                    ABHitCallback();
                                }

                                // Second collision should be BC, but only if AB has happened
                                if (IsPairContacting(shapeA, B, C) && IsPairContacting(shapeB, B, C))
                                {
                                    BCHitCallback();
                                }
                            }
                        }
                    }
                }

                Assert.IsTrue(iter.IsDisposed);
            }
Example #6
0
		public override void OnContact(ContactPairHeader pairHeader, ContactPair[] pairs)
		{
			base.OnContact(pairHeader, pairs);

			foreach (var pair in pairs)
			{
				// PhysX seems to report the collision of shapes even if we've disposed of them the previous frame, so either could potentially be null
				if (pair.Shape0 != null && pair.Shape1 != null)
				{
					var names = new[] { pair.Shape0.Actor.Name, pair.Shape1.Actor.Name };

					// Delete the actors when they collide (as long as the pair isn't involving the ground plane)
					if (!names.Contains("Ground Plane"))
					{
						_sample.Touched.Add(pair.Shape0.Actor);
						_sample.Touched.Add(pair.Shape1.Actor);
					}
				}
			}
		}
Example #7
0
        public void OnContactNotify(ContactPair pair, ContactPairFlags events)
        {
            Vector3 position = Vector3.ZERO;

            if (pair.ActorFirst.IsDynamic)
            {
                position = pair.ActorFirst.GlobalPosition;
            }
            else if (pair.ActorSecond.IsDynamic)
            {
                position = pair.ActorSecond.GlobalPosition;
            }

            float volume = pair.SumNormalForce.Length / 1000.0f;

            if (volume > 1.0f)
            {
                volume = 1.0f;
            }

            if (volume > 0.0f)
            {
                EntityWorldEntity node1 = pair.ActorFirst.UserData as EntityWorldEntity;
                EntityWorldEntity node2 = pair.ActorSecond.UserData as EntityWorldEntity;

                if (node1 != null)
                {
                    Engine.Sound.Play3D(node1.CollisionSound, position, volume);
                }

                if (node2 != null)
                {
                    Engine.Sound.Play3D(node2.CollisionSound, position, volume);
                }
            }
        }
Example #8
0
 public override void OnContactNotify(ContactPair contactInformation, ContactPairFlag events)
 {
     Engine.OnContactNotify(contactInformation, events);
 }
Example #9
0
        public override void OnContactNotify(ContactPair contactInfo, ContactPairFlag events)
        {
            using (ContactStreamIterator iter = new ContactStreamIterator(contactInfo.ContactStream))
            {
                //if we are looking at the player car
                if (contactInfo.ActorB.Group == PhysXConsts.VehicleId)
                {
                    Vehicle vehicle = (Vehicle)contactInfo.ActorB.UserData;

                    while (iter.GoToNextPair())
                    {
                        while (iter.GoToNextPatch())
                        {
                            while (iter.GoToNextPoint())
                            {
                                if (contactInfo.ActorA.Group == PhysXConsts.TrackId && iter.GetShapeB() is WheelShape)
                                {
                                    continue; //we dont want to know each time a wheel is touching the ground
                                }
                                Vector3 pos = iter.GetPoint();

                                if (contactInfo.ActorA.UserData is NonCar)
                                {
                                    HandleNonCarCollision(vehicle, (NonCar)contactInfo.ActorA.UserData, pos, iter.GetPatchNormal(), contactInfo.NormalForce, events);
                                    return;
                                }

                                float force = contactInfo.NormalForce.Length(); // iter.GetPointNormalForce();
                                if (force == 0)
                                {
                                    continue;
                                }

                                //GameConsole.WriteEvent(force.ToString());

                                if (force > 0)
                                {
                                    if (contactInfo.ActorA.Group == PhysXConsts.VehicleId)
                                    {
                                        Vehicle vehicle2 = (Vehicle)contactInfo.ActorA.UserData;
                                        //2 vehicle collision
                                        force = iter.GetPointNormalForce();
                                        Vector3 normal = contactInfo.NormalForce;
                                        normal.Normalize();
                                        if (vehicle.Driver is CpuDriver && vehicle2.Driver is PlayerDriver)
                                        {
                                            ((CpuDriver)vehicle.Driver).OnPlayerHit(force);
                                        }
                                        else if (vehicle2.Driver is CpuDriver && vehicle.Driver is PlayerDriver)
                                        {
                                            ((CpuDriver)vehicle2.Driver).OnPlayerHit(force);
                                        }

                                        // stop cars rearing up if they are both trying to push each other.
                                        if (vehicle.Chassis.Wheels.Find(a => !a.IsRear && a.InAir) != null)
                                        {
                                            vehicle.Chassis.Actor.AddForceAtPosition(Vector3.Down * 0.35f * force, pos, ForceMode.Force);
                                        }
                                        if (vehicle2.Chassis.Wheels.Find(a => !a.IsRear && a.InAir) != null)
                                        {
                                            vehicle2.Chassis.Actor.AddForceAtPosition(Vector3.Down * 0.35f * force, pos, ForceMode.Force);
                                        }

                                        vehicle.OnCollision(force * 2, pos, normal, true);
                                        vehicle2.OnCollision(force * 2, pos, normal, true);
                                    }
                                    else
                                    {
                                        Vector3 normal = contactInfo.NormalForce;
                                        normal.Normalize();
                                        if (iter.GetPointNormalForce() != 0)
                                        {
                                            force = iter.GetPointNormalForce();
                                        }

                                        vehicle.OnCollision(force, pos, iter.GetPatchNormal(), true);
                                        //return;
                                    }
                                }
                            }
                        }
                    }
                }

                // a non-car object sliding along the track
                else if (contactInfo.ActorB.Group == PhysXConsts.NonCarId && contactInfo.ActorA.Group == PhysXConsts.TrackId)
                {
                    if (contactInfo.ActorB.LinearVelocity.Length() > 4)
                    {
                        while (iter.GoToNextPair())
                        {
                            while (iter.GoToNextPatch())
                            {
                                while (iter.GoToNextPoint())
                                {
                                    Vector3 pos = iter.GetPoint();

                                    GameVars.SparksEmitter.Update(pos);
                                }
                            }
                        }
                    }
                }
            }
        }
Example #10
0
        public void OnContactNotify(ContactPair pair, ContactPairFlags events)
        {
            Vector3 position = Vector3.ZERO;

            if (pair.ActorFirst.IsDynamic)
                position = pair.ActorFirst.GlobalPosition;
            else if (pair.ActorSecond.IsDynamic)
                position = pair.ActorSecond.GlobalPosition;

            float volume = pair.SumNormalForce.Length / 1000.0f;

            if (volume > 1.0f)
                volume = 1.0f;

            if (volume > 0.0f)
            {
                EntityWorldEntity node1 = pair.ActorFirst.UserData as EntityWorldEntity;
                EntityWorldEntity node2 = pair.ActorSecond.UserData as EntityWorldEntity;

                if (node1 != null)
                    Engine.Sound.Play3D(node1.CollisionSound, position, volume);

                if (node2 != null)
                    Engine.Sound.Play3D(node2.CollisionSound, position, volume);
            }
        }
Example #11
0
			public override void OnContactNotify( ContactPair contactInformation, ContactPairFlag events )
			{
				ContactStreamIterator iter;
				using( iter = new ContactStreamIterator( contactInformation.ContactStream ) )
				{
					while( iter.GoToNextPair() )
					{
						while( iter.GoToNextPatch() )
						{
							while( iter.GoToNextPoint() )
							{
								// Test each of the available 'information' functions/properties

								int numberOfPairs = iter.GetNumberOfPairs();
								Shape shapeA = iter.GetShapeA();
								Shape shapeB = iter.GetShapeB();
								bool isShapeADeleted = iter.IsDeletedShapeA();
								bool isShapeBDeleted = iter.IsDeletedShapeB();
								ShapeFlag shapeFlags = iter.GetShapeFlags();
								int numberOfPatches = iter.GetNumberOfPatches();
								int numberOfPatchesRemaining = iter.GetNumberOfPatchesRemaining();
								Vector3 patchNormal = iter.GetPatchNormal();
								int numberOfPoints = iter.GetNumberOfPoints();
								int numberOfPointsRemaining = iter.GetNumberOfPointsRemaining();
								Vector3 point = iter.GetPoint();
								float separation = iter.GetSeperation();
								int featureIndex0 = iter.GetFeatureIndex0();
								int featureIndex1 = iter.GetFeatureIndex1();
								float pointNormalForce = iter.GetPointNormalForce();

								// First collision should be AB
								if( IsPairContacting( shapeA, A, B ) && IsPairContacting( shapeB, A, B ) )
								{
									ABHitCallback();
								}

								// Second collision should be BC, but only if AB has happened
								if( IsPairContacting( shapeA, B, C ) && IsPairContacting( shapeB, B, C ) )
								{
									BCHitCallback();
								}
							}
						}
					}
				}

				Assert.IsTrue( iter.IsDisposed );
			}
Example #12
0
        public override void OnContactNotify(ContactPair contactInfo, ContactPairFlag events)
        {
            using (ContactStreamIterator iter = new ContactStreamIterator(contactInfo.ContactStream))
            {
                //if we are looking at the player car
                if (contactInfo.ActorB.Group == PhysXConsts.VehicleId)
                {
                    Vehicle vehicle = (Vehicle)contactInfo.ActorB.UserData;

                    while (iter.GoToNextPair())
                    {
                        while (iter.GoToNextPatch())
                        {
                            while (iter.GoToNextPoint())
                            {
                                if (contactInfo.ActorA.Group == PhysXConsts.TrackId && iter.GetShapeB() is WheelShape)
                                    continue; //we dont want to know each time a wheel is touching the ground

                                Vector3 pos = iter.GetPoint();

                                if (contactInfo.ActorA.UserData is NonCar)
                                {
                                    HandleNonCarCollision(vehicle, (NonCar)contactInfo.ActorA.UserData, pos, iter.GetPatchNormal(), contactInfo.NormalForce, events);
                                    return;
                                }

                                float force = contactInfo.NormalForce.Length(); // iter.GetPointNormalForce();
                                if (force == 0) continue;

                                //GameConsole.WriteEvent(force.ToString());

                                if (force > 0)
                                {
                                    if (contactInfo.ActorA.Group == PhysXConsts.VehicleId)
                                    {
                                        Vehicle vehicle2 = (Vehicle)contactInfo.ActorA.UserData;
                                        //2 vehicle collision
                                        force = iter.GetPointNormalForce();
                                        Vector3 normal = contactInfo.NormalForce;
                                        normal.Normalize();
                                        if (vehicle.Driver is CpuDriver && vehicle2.Driver is PlayerDriver)
                                        {
                                            ((CpuDriver)vehicle.Driver).OnPlayerHit(force);
                                        }
                                        else if (vehicle2.Driver is CpuDriver && vehicle.Driver is PlayerDriver)
                                        {
                                            ((CpuDriver)vehicle2.Driver).OnPlayerHit(force);
                                        }

                                        // stop cars rearing up if they are both trying to push each other.
                                        if (vehicle.Chassis.Wheels.Find(a => !a.IsRear && a.InAir) != null)
                                        {
                                            vehicle.Chassis.Actor.AddForceAtPosition(Vector3.Down * 0.35f * force, pos, ForceMode.Force);
                                        }
                                        if (vehicle2.Chassis.Wheels.Find(a => !a.IsRear && a.InAir) != null)
                                        {
                                            vehicle2.Chassis.Actor.AddForceAtPosition(Vector3.Down * 0.35f * force, pos, ForceMode.Force);
                                        }

                                        vehicle.OnCollision(force * 2, pos, normal, true);
                                        vehicle2.OnCollision(force * 2, pos, normal, true);
                                    }
                                    else
                                    {
                                        Vector3 normal = contactInfo.NormalForce;
                                        normal.Normalize();
                                        if (iter.GetPointNormalForce() != 0)
                                            force = iter.GetPointNormalForce();

                                        vehicle.OnCollision(force, pos, iter.GetPatchNormal(), true);
                                        //return;
                                    }
                                }
                            }
                        }
                    }
                }

                // a non-car object sliding along the track
                else if (contactInfo.ActorB.Group == PhysXConsts.NonCarId && contactInfo.ActorA.Group == PhysXConsts.TrackId)
                {
                    if (contactInfo.ActorB.LinearVelocity.Length() > 4)
                    {
                        while (iter.GoToNextPair())
                        {
                            while (iter.GoToNextPatch())
                            {
                                while (iter.GoToNextPoint())
                                {
                                    Vector3 pos = iter.GetPoint();

                                    GameVars.SparksEmitter.Update(pos);
                                }
                            }
                        }
                    }
                }
            }
        }
Example #13
0
 private int ContactComparison(ContactPair x, ContactPair y)
 {
     return(ContactDistance(x) - ContactDistance(y));
 }