/** * 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(); } }
public void OnEnable() { // Add collider to current solvers: foreach (ObiSolver solver in solvers) { Oni.AddCollider(solver.OniSolver, oniCollider); } }
/** * 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(); } }
/** * 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); } } } }
private void OnEnable() { // Add collider to current solvers: Oni.AddCollider(oniCollider); }