Beispiel #1
0
        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);
            }
        }
Beispiel #3
0
 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;
        }
Beispiel #5
0
        protected virtual void OnDetach()
        {
            if (CurrentPhysicalContacts != null)
            {
                CurrentPhysicalContacts.Clear();
            }

            if (NativeCollisionObject == null || DoNotDispose)
            {
                return;
            }

            NativeCollisionObject.UserObject = null;
            NativeCollisionObject.Dispose();
            NativeCollisionObject = null;
        }
Beispiel #6
0
        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));
        }
Beispiel #8
0
        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;
 }
Beispiel #10
0
        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));
        }
Beispiel #13
0
        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));
            }
        }