public void DeletePairedActors() { using (CreateCoreAndScene()) { Actor actorA, actorB; { ActorDescription actorDesc = new ActorDescription() { Shapes = { new BoxShapeDescription(5, 6, 7) } }; actorA = this.Scene.CreateActor(actorDesc); } { ActorDescription actorDesc = new ActorDescription() { Shapes = { new BoxShapeDescription(2, 5, 7) } }; actorB = this.Scene.CreateActor(actorDesc); } this.Scene.SetActorPairFlags(actorA, actorB, ContactPairFlag.All); ContactPairFlag pairFlags = this.Scene.GetActorPairFlags(actorA, actorB); actorB.Dispose(); actorA.Dispose(); } }
public void OnContactNotify(ContactPair contactInformation, ContactPairFlag events) { if (contactNofityEvent != null) { contactNofityEvent(contactInformation, events); } }
// 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); } } }
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); }
public override void OnContactNotify(ContactPair contactInformation, ContactPairFlag events) { Engine.OnContactNotify(contactInformation, events); }
private void CapsuleAndGroundPlaneContact(Actor a, Actor b, ContactPairFlag events) { // The capsule hit the ground, add some bounce // Can be done with materials, but this just an example to demonstrate contact report _demo.ContactReportActor.AddForce(new Vector3(0, 5000, 0), ForceMode.Force); }
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); } } } } } } }
private void HandleNonCarCollision(Vehicle vehicle, NonCar nonCar, Vector3 pos, Vector3 patchnormal, Vector3 normalforce, ContactPairFlag events) { if (nonCar.LastTouchTime + 0.1f > GameEngine.TotalSeconds) { nonCar.LastTouchTime = GameEngine.TotalSeconds; return; } nonCar.LastVehicleToHit = vehicle; if (nonCar.IsAttached) { if (normalforce == Vector3.Zero) { return; } nonCar.Hit = true; float speed = vehicle.Chassis.LastSpeeds.GetMax(); if (speed < 20) { return; } normalforce = Vector3.Normalize(normalforce); Vector3 directedForce = normalforce * speed * vehicle.Config.Mass; float factor = (1 / (nonCar.Config.TorqueRequiredToMove * nonCar.Config.MassWhenAttached)) * 0.005f; nonCar.Rotation.X += -directedForce.X * factor; nonCar.Rotation.Z += directedForce.Z * factor; nonCar.LastTouchTime = GameEngine.TotalSeconds; nonCar.LastForcePosition = pos; nonCar.LastForce = directedForce; //multiply force to match the force generated by hitting a solid wall/barrier etc vehicle.OnCollision(directedForce.Length() * 15, pos, normalforce, true); } else { vehicle.OnCollision(normalforce.Length(), pos, normalforce, false); } nonCar.LastTouchTime = GameEngine.TotalSeconds; }
private void CapsuleAndGroundPlaneContact(Actor a, Actor b, ContactPairFlag events) { // The capsule hit the ground, add some bounce // Can be done with materials, but this just an example to demonstrate contact report _contactReportActor.AddForce(new Vector3(0, 5000, 0), ForceMode.Force); }
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 ); }
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); } } } } } } }
private void HandleNonCarCollision(Vehicle vehicle, NonCar nonCar, Vector3 pos, Vector3 patchnormal, Vector3 normalforce, ContactPairFlag events) { if (nonCar.LastTouchTime + 0.1f > Engine.TotalSeconds) { nonCar.LastTouchTime = Engine.TotalSeconds; return; } nonCar.LastVehicleToHit = vehicle; if (nonCar.IsAttached) { if (normalforce == Vector3.Zero) return; nonCar.Hit = true; float speed = vehicle.Chassis.LastSpeeds.GetMax(); if (speed < 20) return; normalforce = Vector3.Normalize(normalforce); Vector3 directedForce = normalforce * speed * vehicle.Config.Mass; float factor = (1 / (nonCar.Config.TorqueRequiredToMove * nonCar.Config.MassWhenAttached)) * 0.005f; nonCar.Rotation.X += -directedForce.X * factor; nonCar.Rotation.Z += directedForce.Z * factor; nonCar.LastTouchTime = Engine.TotalSeconds; nonCar.LastForcePosition = pos; nonCar.LastForce = directedForce; //multiply force to match the force generated by hitting a solid wall/barrier etc vehicle.OnCollision(directedForce.Length() * 15, pos, normalforce, true); } else { vehicle.OnCollision(normalforce.Length(), pos, normalforce, false); } nonCar.LastTouchTime = Engine.TotalSeconds; }
public abstract void SetShapePairFlags(ActorShape shape1, ActorShape shape2, ContactPairFlag flags);
public abstract void SetActorPairFlags(Actor actor1, Actor actor2, ContactPairFlag flags);
public abstract void SetActorGroupPairFlags(ushort g1, ushort g2, ContactPairFlag flags);