Пример #1
0
        /**
         * Check if the collider transform or its shape have changed any relevant property, and update their Oni counterparts.
         */
        private void UpdateIfNeeded(object sender, EventArgs e)
        {
            bool      unityColliderEnabled = false;
            Component unityCollider        = GetUnityCollider(ref unityColliderEnabled);

            if (unityCollider != null)
            {
                // update the collider:
                if ((tracker != null && tracker.UpdateIfNeeded()) ||
                    transform.hasChanged ||
                    dirty ||
                    unityColliderEnabled != wasUnityColliderEnabled)
                {
                    dirty = false;
                    wasUnityColliderEnabled = unityColliderEnabled;

                    // remove the collider from all solver's spatial partitioning grid:
                    Oni.RemoveCollider(oniCollider);

                    // update the collider:
                    UpdateAdaptor();

                    // re-add the collider to all solver's spatial partitioning grid:
                    if (unityColliderEnabled)
                    {
                        Oni.AddCollider(oniCollider);
                    }
                }
            }
            // If the unity collider is null but its Oni counterpart isn't, the unity collider has been destroyed.
            else if (oniCollider != IntPtr.Zero)
            {
                RemoveCollider();
            }
        }
Пример #2
0
 public void OnEnable()
 {
     // Add collider to current solvers:
     foreach (ObiSolver solver in solvers)
     {
         Oni.AddCollider(solver.OniSolver, oniCollider);
     }
 }
Пример #3
0
        /**
         * Check if the collider transform or its shape have changed any relevant property, and update their Oni counterparts.
         */
        private void UpdateIfNeeded(object sender, EventArgs e)
        {
            if (unityCollider != null)
            {
                // update the collider:
                bool unityColliderEnabled = IsUnityColliderEnabled();

                if (unityCollider.transform.hasChanged ||
                    phase != oldPhase ||
                    thickness != oldThickness ||
                    unityColliderEnabled != wasUnityColliderEnabled)
                {
                    unityCollider.transform.hasChanged = false;
                    oldPhase                = phase;
                    oldThickness            = thickness;
                    wasUnityColliderEnabled = unityColliderEnabled;

                    // remove the collider from all solver's spatial partitioning grid:
                    foreach (ObiSolver solver in solvers)
                    {
                        Oni.RemoveCollider(solver.OniSolver, oniCollider);
                    }

                    // update the collider:
                    UpdateColliderAdaptor();
                    Oni.UpdateCollider(oniCollider, ref adaptor);

                    // re-add the collider to all solver's spatial partitioning grid:
                    if (unityColliderEnabled)
                    {
                        foreach (ObiSolver solver in solvers)
                        {
                            Oni.AddCollider(solver.OniSolver, oniCollider);
                        }
                    }
                }
            }

            // update the shape:
            if (tracker != null)
            {
                tracker.UpdateIfNeeded();
            }

            // send rigidbody data (done only once per step, even with multiple colliders for 1 rigidbody):
            if (obiRigidbody != null)
            {
                obiRigidbody.UpdateIfNeeded();
            }
        }
Пример #4
0
        /**
         * Registers this collider in a given solver, if interesed in its layer.
         */
        public void RegisterInSolver(ObiSolver solver, bool addToSolver)
        {
            if (!solvers.Contains(solver))
            {
                // if the group's collisionLayers mask includes our layer:
                if (solver.collisionLayers == (solver.collisionLayers | (1 << gameObject.layer)))
                {
                    solvers.Add(solver);

                    if (addToSolver)
                    {
                        Oni.AddCollider(solver.OniSolver, oniCollider);
                    }
                }
            }
        }
Пример #5
0
 private void OnEnable()
 {
     // Add collider to current solvers:
     Oni.AddCollider(oniCollider);
 }