Example #1
0
 private void ColProxy_CollisionEvent(CollisionProxy colA, CollisionProxy colB)
 {
     if (OnCollisionEvent != null && colA.collider.executing && colB.collider.executing)
     {
         OnCollisionEvent.Invoke(colA.collider, colB.collider);
     }
 }
    internal void Trigger(CollisionProxy source, Collider other)
    {
        CollisionProxy otherAsProxy = other.GetComponent <CollisionProxy>();

        if (otherAsProxy)
        {
            CollisionHandler otherHandler = otherAsProxy as CollisionHandler;
            if (otherHandler == null)
            {
                otherHandler = other.GetComponentInParent <CollisionHandler>();
            }
            if (otherHandler)
            {
                //Debug.Log(mask + " "+otherHandler.mask);
                switch (mask)
                {
                case CollisionMask.All:
                    for (int i = 0; i < users.Length; i++)
                    {
                        users[i].OnTriggered(otherHandler);
                    }
                    break;

                case CollisionMask.OtherFactions:
                    if (faction != null && otherHandler.faction != null && faction.faction != otherHandler.faction.faction)
                    {
                        for (int i = 0; i < users.Length; i++)
                        {
                            users[i].OnTriggered(otherHandler);
                        }
                    }
                    break;

                default:
                    break;
                }
            }
            else
            {
                Debug.Log("Missing collision handler [2]", other.transform);
            }
        }
        else
        {
            Debug.Log("Missing collision handler/proxy [1]", other.transform);
        }
    }
        public override bool Raycast(GameSystem.GameCore.SerializableMath.Vector3 startPoint, GameSystem.GameCore.SerializableMath.Vector3 endPoint, out GameSystem.GameCore.SerializableMath.Vector3[] hitPoint, out CollisionProxy[] hitObject, int mask = -1)
        {
            // transfer serializable math position to bullet math position
            BulletSharp.Math.Vector3 start = startPoint.ToBullet(), end = endPoint.ToBullet();
            var callback = new AllHitsRayResultCallback(start, end);

            // set group mask filter
            callback.CollisionFilterMask = (short)mask;
            world.RayTest(start, end, callback);
            if (callback.HasHit)
            {
                hitPoint  = callback.HitPointWorld.ToSerializableArray();
                hitObject = callback.CollisionObjects.SelectToArray(colObj => (CollisionProxy)colObj.UserObject);
            }
            else
            {
                hitPoint  = new GameSystem.GameCore.SerializableMath.Vector3[0];
                hitObject = new CollisionProxy[0];
            }
            return(callback.HasHit);
        }
        public override void Update(TimeSpan deltaTime)
        {
            float second = (float)deltaTime.TotalSeconds;

            world.StepSimulation(second);

            // on collision events
            int numManifolds = world.Dispatcher.NumManifolds;

            for (int i = 0; i < numManifolds; i++)
            {
                PersistentManifold manifold = world.Dispatcher.GetManifoldByIndexInternal(i);
                CollisionProxy     colA     = (CollisionProxy)manifold.Body0.UserObject;
                CollisionProxy     colB     = (CollisionProxy)manifold.Body1.UserObject;

                // check if both are not null
                if (colA != null && colB != null)
                {
                    // execute colA -> colB event
                    try
                    {
                        colA.ExecuteCollision(colA, colB);
                    }
                    catch (Exception e)
                    {
                        LogError(string.Format("{0} {1}", e.Message, e.StackTrace));
                    }
                    // execute colB -> colA event
                    try
                    {
                        colB.ExecuteCollision(colB, colA);
                    }
                    catch (Exception e)
                    {
                        LogError(string.Format("{0} {1}", e.Message, e.StackTrace));
                    }
                }
            }
        }
Example #5
0
 private void ColProxy_CollisionEvent(CollisionProxy colA, CollisionProxy colB)
 {
     OnCollisionEvent.Invoke(colA.collider, colB.collider);
 }
 public override void RemoveCollision(CollisionProxy colProxy)
 {
     world.RemoveCollisionObject((CollisionObject)colProxy.CollisionObject);
 }
 public override void AddCollision(CollisionProxy colProxy, int layer = 1, int mask = -1)
 {
     world.AddCollisionObject((CollisionObject)colProxy.CollisionObject, (short)layer, (short)mask);
 }
        public override bool Raycast(GameSystem.GameCore.SerializableMath.Vector3 startPoint, GameSystem.GameCore.SerializableMath.Vector3 endPoint, out GameSystem.GameCore.SerializableMath.Vector3 hitPoint, out CollisionProxy hitObject, int mask = -1)
        {
            // transfer serializable math position to bullet math position
            BulletSharp.Math.Vector3 start = startPoint.ToBullet(), end = endPoint.ToBullet();
            var callback = new ClosestRayResultCallback(ref start, ref end);

            // set group mask filter
            callback.CollisionFilterMask = (short)mask;
            world.RayTest(start, end, callback);
            if (callback.HasHit)
            {
                hitPoint  = callback.HitPointWorld.ToSerializable();
                hitObject = (CollisionProxy)callback.CollisionObject.UserObject;
            }
            else
            {
                hitPoint  = GameSystem.GameCore.SerializableMath.Vector3.Zero;
                hitObject = null;
            }
            return(callback.HasHit);
        }