protected override void OnAttach() { NativeCollisionObject = new BulletSharp.CollisionObject { CollisionShape = ColliderShape.InternalShape, ContactProcessingThreshold = !Simulation.CanCcd ? 1e18f : 1e30f, UserObject = this }; NativeCollisionObject.CollisionFlags |= BulletSharp.CollisionFlags.NoContactResponse; if (ColliderShape.NeedsCustomCollisionCallback) { NativeCollisionObject.CollisionFlags |= BulletSharp.CollisionFlags.CustomMaterialCallback; } //this will set all the properties in the native side object base.OnAttach(); UpdatePhysicsTransformation(); //this will set position and rotation of the collider if (IsDefaultGroup) { Simulation.AddCollider(this, CollisionFilterGroupFlags.DefaultFilter, CollisionFilterGroupFlags.AllFilter); } else { Simulation.AddCollider(this, (CollisionFilterGroupFlags)CollisionGroup, CanCollideWith); } }
protected override void OnAttach() { NativeCollisionObject = new BulletSharp.CollisionObject { CollisionShape = ColliderShape.InternalShape, ContactProcessingThreshold = !Simulation.CanCcd ? 1e18f : 1e30f, UserObject = this }; NativeCollisionObject.CollisionFlags |= BulletSharp.CollisionFlags.NoContactResponse; if (ColliderShape.NeedsCustomCollisionCallback) { NativeCollisionObject.CollisionFlags |= BulletSharp.CollisionFlags.CustomMaterialCallback; } //this will set all the properties in the native side object base.OnAttach(); UpdatePhysicsTransformation(); //this will set position and rotation of the collider if (IsDefaultGroup) { Simulation.AddCollider(this, CollisionFilterGroupFlags.DefaultFilter, CollisionFilterGroupFlags.AllFilter); } else { Simulation.AddCollider(this, (CollisionFilterGroupFlags)CollisionGroup, CanCollideWith); } }
protected virtual void OnDetach() { if (NativeCollisionObject == null) { return; } NativeCollisionObject.Dispose(); NativeCollisionObject = null; }
public CollisionObject(CollisionShape shape) { BulletCollisionObject = new BulletSharp.CollisionObject(); BulletCollisionObject.UserObject = this; BulletCollisionObject.CollisionShape = shape.BulletShape; //BulletCollisionObject.Restitution = 1.0f; IsInWorld = true; }
protected virtual void OnDetach() { if (CurrentPhysicalContacts != null) { CurrentPhysicalContacts.Clear(); } if (NativeCollisionObject == null || DoNotDispose) { return; } NativeCollisionObject.UserObject = null; NativeCollisionObject.Dispose(); NativeCollisionObject = null; }
protected virtual void OnDetach() { if (processingPhysicalContacts != null) { processingPhysicalContacts[0].Clear(); processingPhysicalContacts[1].Clear(); } if (NativeCollisionObject == null || DoNotDispose) { return; } NativeCollisionObject.UserObject = null; NativeCollisionObject.Dispose(); NativeCollisionObject = null; }
public MousePole2D(Camera camera, Vector3 forwardAxis, Vector3 rightAxis, Vector3 upAxis) { this.scale = camera.CreateScale(origin, 0.5f, pixelSize: 85); var scaleMatrix = Matrix4.CreateScale(scale, scale, scale); var rotationX = Matrix3.CreateRotationX((float)Math.Acos(Vector3.Dot(Vector3.UnitX, rightAxis))); var rotationY = Matrix3.CreateRotationY((float)Math.Acos(Vector3.Dot(Vector3.UnitY, forwardAxis))); var rotationZ = Matrix3.CreateRotationZ((float)Math.Acos(Vector3.Dot(Vector3.UnitZ, upAxis))); this.rotation = Quaternion.FromMatrix(rotationX * rotationY * rotationZ); var rotationMatrix = Matrix4.CreateFromQuaternion(this.rotation); this.origin = Vector3.Transform(new Vector3(0, 0, 0), scaleMatrix * rotationMatrix); this.right = Vector3.Transform(new Vector3(1, 0, 0), scaleMatrix * rotationMatrix); this.forward = Vector3.Transform(new Vector3(0, 1, 0), scaleMatrix * rotationMatrix); this.up = Vector3.Transform(new Vector3(0, 0, 1), scaleMatrix * rotationMatrix); rightContact = new BulletSharp.CollisionObject( ) { UserObject = this }; forwardContact = new BulletSharp.CollisionObject( ) { UserObject = this }; upContact = new BulletSharp.CollisionObject( ) { UserObject = this }; BufferData(camera); camera.ViewMatrixChanged += camera_ViewMatrixChanged; camera.Viewport.ProjectionChanged += Viewport_ProjectionChanged; camera.Viewport.ViewportChanged += Viewport_ViewportChanged; OnCameraUpdate(this, new CameraEventArgs(camera)); }
private void PersistentManifoldContactProcessed(BulletSharp.ManifoldPoint cp, BulletSharp.CollisionObject body0, BulletSharp.CollisionObject body1) { var colA = (Collider)body0.UserObject; var colB = (Collider)body1.UserObject; if (!colA.NeedsCollisionCheck && !colB.NeedsCollisionCheck) { return; //don't process at all if both the objects don't need any collision event } if (cp.UserPersistentData == null) //New contact! { var contact = new Contact { ColliderA = colA, ColliderB = colB, Distance = cp.Distance, PositionOnA = new Vector3(cp.PositionWorldOnA.X, cp.PositionWorldOnA.Y, cp.PositionWorldOnA.Z), PositionOnB = new Vector3(cp.PositionWorldOnB.X, cp.PositionWorldOnB.Y, cp.PositionWorldOnB.Z), Normal = new Vector3(cp.NormalWorldOnB.X, cp.NormalWorldOnB.Y, cp.NormalWorldOnB.Z) }; //must figure if we are a really brand new collision for correct event propagation var colABegan = false; var previousColAState = colA.Contacts.Where(x => (x.ColliderA == colA && x.ColliderB == colB) || (x.ColliderA == colB && x.ColliderB == colA)); if (!previousColAState.Any()) { colABegan = true; } var colBBegan = false; var previousColBState = colB.Contacts.Where(x => (x.ColliderB == colB && x.ColliderA == colA) || (x.ColliderB == colA && x.ColliderA == colB)); if (!previousColBState.Any()) { colBBegan = true; } colA.Contacts.Add(contact); colB.Contacts.Add(contact); var args = new CollisionArgs { Contact = contact }; cp.UserPersistentData = contact; if (CacheContacts) { contactsCache.Add(new ContactEventData { Type = colABegan ? ContactEventType.FirstContactStart : ContactEventType.ContactStart, Caller = colA, Args = args }); contactsCache.Add(new ContactEventData { Type = colBBegan ? ContactEventType.FirstContactStart : ContactEventType.ContactStart, Caller = colB, Args = args }); } else { if (colABegan) { colA.OnFirstContactStart(args); } colA.OnContactStart(args); if (colBBegan) { colB.OnFirstContactStart(args); } colB.OnContactStart(args); } } else { var contact = (Contact)cp.UserPersistentData; contact.Distance = cp.Distance; contact.PositionOnA = new Vector3(cp.PositionWorldOnA.X, cp.PositionWorldOnA.Y, cp.PositionWorldOnA.Z); contact.PositionOnB = new Vector3(cp.PositionWorldOnB.X, cp.PositionWorldOnB.Y, cp.PositionWorldOnB.Z); contact.Normal = new Vector3(cp.NormalWorldOnB.X, cp.NormalWorldOnB.Y, cp.NormalWorldOnB.Z); var args = new CollisionArgs { Contact = contact }; if (CacheContacts) { contactsCache.Add(new ContactEventData { Type = ContactEventType.ContactChange, Caller = colA, Args = args }); contactsCache.Add(new ContactEventData { Type = ContactEventType.ContactChange, Caller = colB, Args = args }); } else { colA.OnContactChange(args); colB.OnContactChange(args); } } }
internal CollisionData(BulletSharp.CollisionObject body, float impulse) { Impulse = impulse; Body = body; }
private void PersistentManifoldContactProcessed(BulletSharp.ManifoldPoint cp, BulletSharp.CollisionObject body0, BulletSharp.CollisionObject body1) { if (body0 == null || body1 == null) { return; } //this can fail and will fail in the case of multiple scenes and bodies not of the current simulation ( working as intended ) Collider colA, colB; if (!aliveColliders.TryGetValue(body0, out colA)) { return; } if (!aliveColliders.TryGetValue(body1, out colB)) { return; } if (colA == null || colB == null || !colA.ContactsAlwaysValid && !colB.ContactsAlwaysValid) { return; } //Pairs management Collision pair = null; var newPair = true; foreach (var pair1 in colA.Collisions) { if ((pair1.ColliderA != colA || pair1.ColliderB != colB) && (pair1.ColliderA != colB || pair1.ColliderB != colA)) { continue; } pair = pair1; newPair = false; break; } if (pair == null) { pair = new Collision { ColliderA = colA, ColliderB = colB, Contacts = new List <ContactPoint>() }; colA.Collisions.Add(pair); colB.Collisions.Add(pair); } //Contacts management ContactPoint contact = null; var newContact = true; foreach (var contact1 in pair.Contacts) { if (contact1.Handle.IsAllocated && cp.UserPersistentPtr != IntPtr.Zero && contact1.Handle.Target != GCHandle.FromIntPtr(cp.UserPersistentPtr).Target) { continue; } contact = contact1; newContact = false; break; } if (contact == null) { contact = new ContactPoint { Distance = cp.Distance, PositionOnA = new Vector3(cp.PositionWorldOnA.X, cp.PositionWorldOnA.Y, cp.PositionWorldOnA.Z), PositionOnB = new Vector3(cp.PositionWorldOnB.X, cp.PositionWorldOnB.Y, cp.PositionWorldOnB.Z), Normal = new Vector3(cp.NormalWorldOnB.X, cp.NormalWorldOnB.Y, cp.NormalWorldOnB.Z), Pair = pair }; pair.Contacts.Add(contact); contact.Handle = GCHandle.Alloc(contact); cp.UserPersistentPtr = GCHandle.ToIntPtr(contact.Handle); contact.Manifold = cp; } if (newPair) { //are we the first pair we detect? if (colA.Collisions.Count == 1) { firstPairsCache.Add(new KeyValuePair <Collider, Collision>(colA, pair)); } //are we the first pair we detect? if (colB.Collisions.Count == 1) { firstPairsCache.Add(new KeyValuePair <Collider, Collision>(colB, pair)); } newPairsCache.Add(new KeyValuePair <Collider, Collision>(colA, pair)); newPairsCache.Add(new KeyValuePair <Collider, Collision>(colB, pair)); } if (newContact) { newContactsCache.Add(new KeyValuePair <Collision, ContactPoint>(pair, contact)); } else { updatedContactsCache.Add(new KeyValuePair <Collision, ContactPoint>(pair, contact)); } }
protected virtual void OnDetach() { if (NativeCollisionObject == null) return; NativeCollisionObject.UserObject = null; NativeCollisionObject.Dispose(); NativeCollisionObject = null; }
public MousePole2D(Camera camera, Vector3 forwardAxis, Vector3 rightAxis, Vector3 upAxis) { this.scale = camera.CreateScale(origin, 0.5f, pixelSize: 85); var scaleMatrix = Matrix4.CreateScale(scale, scale, scale); var rotationX = Matrix3.CreateRotationX((float)Math.Acos(Vector3.Dot(Vector3.UnitX, rightAxis))); var rotationY = Matrix3.CreateRotationY((float)Math.Acos(Vector3.Dot(Vector3.UnitY, forwardAxis))); var rotationZ = Matrix3.CreateRotationZ((float)Math.Acos(Vector3.Dot(Vector3.UnitZ, upAxis))); this.rotation = Quaternion.FromMatrix(rotationX * rotationY * rotationZ); var rotationMatrix = Matrix4.CreateFromQuaternion(this.rotation); this.origin = Vector3.Transform(new Vector3(0, 0, 0), scaleMatrix * rotationMatrix); this.right = Vector3.Transform(new Vector3(1, 0, 0), scaleMatrix * rotationMatrix); this.forward = Vector3.Transform(new Vector3(0, 1, 0), scaleMatrix * rotationMatrix); this.up = Vector3.Transform(new Vector3(0, 0, 1), scaleMatrix * rotationMatrix); rightContact = new BulletSharp.CollisionObject() { UserObject = this }; forwardContact = new BulletSharp.CollisionObject() { UserObject = this }; upContact = new BulletSharp.CollisionObject() { UserObject = this }; BufferData(camera); camera.ViewMatrixChanged += camera_ViewMatrixChanged; camera.Viewport.ProjectionChanged += Viewport_ProjectionChanged; camera.Viewport.ViewportChanged += Viewport_ViewportChanged; OnCameraUpdate(this, new CameraEventArgs(camera)); }
private void PersistentManifoldContactProcessed(BulletSharp.ManifoldPoint cp, BulletSharp.CollisionObject body0, BulletSharp.CollisionObject body1) { var colA = aliveColliders[body0]; var colB = aliveColliders[body1]; if (colA == null || colB == null || !colA.ContactsAlwaysValid && !colB.ContactsAlwaysValid) { return; } //Pairs management Collision pair = null; var newPair = true; foreach (var pair1 in colA.Pairs) { if ((pair1.ColliderA != colA || pair1.ColliderB != colB) && (pair1.ColliderA != colB || pair1.ColliderB != colA)) { continue; } pair = pair1; newPair = false; break; } if (pair == null) { pair = new Collision { ColliderA = colA, ColliderB = colB, Contacts = new List <ContactPoint>() }; colA.Pairs.Add(pair); colB.Pairs.Add(pair); } //Contacts management ContactPoint contact = null; var newContact = true; foreach (var contact1 in pair.Contacts) { if (contact1 != cp.UserPersistentData) { continue; } contact = contact1; newContact = false; break; } if (contact == null) { contact = new ContactPoint { Distance = cp.Distance, PositionOnA = new Vector3(cp.PositionWorldOnA.X, cp.PositionWorldOnA.Y, cp.PositionWorldOnA.Z), PositionOnB = new Vector3(cp.PositionWorldOnB.X, cp.PositionWorldOnB.Y, cp.PositionWorldOnB.Z), Normal = new Vector3(cp.NormalWorldOnB.X, cp.NormalWorldOnB.Y, cp.NormalWorldOnB.Z), Pair = pair }; pair.Contacts.Add(contact); cp.UserPersistentData = contact; } if (newPair) { //are we the first pair we detect? if (colA.Pairs.Count == 1) { firstPairsCache.Add(new KeyValuePair <Collider, Collision>(colA, pair)); } //are we the first pair we detect? if (colB.Pairs.Count == 1) { firstPairsCache.Add(new KeyValuePair <Collider, Collision>(colB, pair)); } newPairsCache.Add(new KeyValuePair <Collider, Collision>(colA, pair)); newPairsCache.Add(new KeyValuePair <Collider, Collision>(colB, pair)); } if (newContact) { newContactsCache.Add(new KeyValuePair <Collision, ContactPoint>(pair, contact)); } else { updatedContactsCache.Add(new KeyValuePair <Collision, ContactPoint>(pair, contact)); } }