static void AddAllContactWrapper(PContact3D contact) { _allContactWrapperEnd.contact = contact; _allContactWrapperEnd = _allContactWrapperEnd.next; _allContactCount++; }
static void AddExitContactWrapper(PContact3D contact) { _exitContactWrapperEnd.contact = contact; _exitContactWrapperEnd = _exitContactWrapperEnd.next; _exitContactCount++; }
//common public static void Initialize() { ReadCollisionLayerMatrix(); NativeParallel3D.Initialize(); internalWorld = CreateWorld(gravity, allowSleep, warmStart); for (int i = 0; i < ParallelConstants.MAX_CONTACT_COUNT_3D; i++) { _enterContactWrapperEnd.next = new PContact3DWrapper(); _enterContactWrapperEnd = _enterContactWrapperEnd.next; _exitContactWrapperEnd.next = new PContact3DWrapper(); _exitContactWrapperEnd = _exitContactWrapperEnd.next; _allContactWrapperEnd.next = new PContact3DWrapper(); _allContactWrapperEnd = _allContactWrapperEnd.next; } initialized = true; }
public static void ExcuteUserCallbacks(Fix64 timeStep) { //call contact exit callback PContact3DWrapper currentWrapper = _exitContactWrapperHead; for (int i = 0; i < _exitContactCount; i++) { PContact3D contact = currentWrapper.contact; PBody3D body1 = bodyDictionary[contact.Body1ID]; PBody3D body2 = bodyDictionary[contact.Body2ID]; if (contact.IsTrigger) { body1.RigidBody.OnParallelTriggerExit(body2.RigidBody); body2.RigidBody.OnParallelTriggerExit(body1.RigidBody); } else { _tempCollision.SetContact(contact, body2.RigidBody); body1.RigidBody.OnParallelCollisionExit(_tempCollision); _tempCollision.SetContact(contact, body1.RigidBody); body2.RigidBody.OnParallelCollisionExit(_tempCollision); } contact.state = ContactState.Inactive; currentWrapper = currentWrapper.next; } //call contact stay callback currentWrapper = _allContactWrapperHead; for (int i = 0; i < _allContactCount; i++) { PContact3D contact = currentWrapper.contact; if (contact.state == ContactState.Active) { PBody3D body1 = bodyDictionary[contact.Body1ID]; PBody3D body2 = bodyDictionary[contact.Body2ID]; if (contact.IsTrigger) { body1.RigidBody.OnParallelTriggerStay(body2.RigidBody); body2.RigidBody.OnParallelTriggerStay(body1.RigidBody); } else { _tempCollision.SetContact(contact, body2.RigidBody); body1.RigidBody.OnParallelCollisionStay(_tempCollision); _tempCollision.SetContact(contact, body1.RigidBody); body2.RigidBody.OnParallelCollisionStay(_tempCollision); } } currentWrapper = currentWrapper.next; } //call contact enter callback currentWrapper = _enterContactWrapperHead; for (int i = 0; i < _enterContactCount; i++) { PContact3D contact = currentWrapper.contact; PBody3D body1 = bodyDictionary[contact.Body1ID]; PBody3D body2 = bodyDictionary[contact.Body2ID]; if (contact.IsTrigger) { body1.RigidBody.OnParallelTriggerEnter(body2.RigidBody); body2.RigidBody.OnParallelTriggerEnter(body1.RigidBody); } else { _tempCollision.SetContact(contact, body2.RigidBody); body1.RigidBody.OnParallelCollisionEnter(_tempCollision); _tempCollision.SetContact(contact, body1.RigidBody); body2.RigidBody.OnParallelCollisionEnter(_tempCollision); } contact.state = ContactState.Active; currentWrapper = currentWrapper.next; } foreach (IParallelRigidbody3D rigidBody in rigidBodies) { rigidBody.Step(timeStep); } foreach (IParallelRigidbody3D rigidBody in rigidBodies) { rigidBody.WriteNative(); } }
static void ResetAllContacts() { _allContactCount = 0; _allContactWrapperEnd = _allContactWrapperHead; }
static void ResetExitContacts() { _exitContactCount = 0; _exitContactWrapperEnd = _exitContactWrapperHead; }
static void ResetEnterContacts() { _enterContactCount = 0; _enterContactWrapperEnd = _enterContactWrapperHead; }