public void DestroyCollider(ObiColliderHandle handle) { if (colliderShapes != null && handle != null && handle.isValid && handle.index < colliderHandles.Count) { int index = handle.index; int lastIndex = colliderHandles.Count - 1; // swap all collider info: colliderHandles.Swap(index, lastIndex); colliderShapes.Swap(index, lastIndex); colliderAabbs.Swap(index, lastIndex); colliderTransforms.Swap(index, lastIndex); // update the index of the handle we swapped with: colliderHandles[index].index = index; // invalidate our handle: // (after updating the swapped one! // in case there's just one handle in the array, // we need to write -1 after 0) handle.Invalidate(); // remove last index: colliderHandles.RemoveAt(lastIndex); colliderShapes.count--; colliderAabbs.count--; colliderTransforms.count--; DestroyIfUnused(); } }
public ObiColliderHandle CreateCollider() { var handle = new ObiColliderHandle(colliderHandles.Count); colliderHandles.Add(handle); colliderShapes.Add(new ColliderShape()); colliderAabbs.Add(new Aabb()); colliderTransforms.Add(new AffineTransform()); return(handle); }
protected void AddCollider() { Component unityCollider = GetUnityCollider(ref wasUnityColliderEnabled); if (unityCollider != null && (shapeHandle == null || !shapeHandle.isValid)) { shapeHandle = ObiColliderWorld.GetInstance().CreateCollider(); shapeHandle.owner = this; // Create shape tracker: CreateTracker(); // Create rigidbody if necessary, and link ourselves to it: CreateRigidbody(); } }