/** * Injects back into the rigidbodies the new velocities calculated by the solver in response to patrticle interactions: */ public void UpdateVelocities() { Oni.Rigidbody[] bodies = new Oni.Rigidbody[rigidbodyIDs.Count]; Oni.GetRigidbodies(oniColliderGroup, bodies, rigidbodyIDs.Count, 0); // Update 3d collider velocities: for (int i = 0; i < colliders.Count; ++i) { Collider collider = colliders[i]; if (collider == null || !collider.enabled || !collider.gameObject.activeInHierarchy) { continue; } int rigidBodyIndex = -1; Rigidbody rb = collider.GetComponentInParent <Rigidbody>(); if (rb != null && rigidbodyIDs.TryGetValue(rb.GetInstanceID(), out rigidBodyIndex)) { if (rigidBodyIndex < bodies.Length) { rb.velocity = bodies[rigidBodyIndex].linearVelocity; rb.angularVelocity = bodies[rigidBodyIndex].angularVelocity; } } } // Update 2d collider velocities: for (int i = 0; i < colliders2D.Count; ++i) { Collider2D collider = colliders2D[i]; if (collider == null || !collider.enabled || !collider.gameObject.activeInHierarchy) { continue; } int rigidBodyIndex = -1; Rigidbody2D rb = collider.GetComponentInParent <Rigidbody2D>(); if (rb != null && rigidbodyIDs.TryGetValue(rb.GetInstanceID(), out rigidBodyIndex)) { if (rigidBodyIndex < bodies.Length) { rb.velocity = bodies[rigidBodyIndex].linearVelocity; // For some weird reason, in 2D angular velocity is measured in *degrees* per second, // instead of radians/second. Seriously Unity, WTF?? rb.angularVelocity = bodies[rigidBodyIndex].angularVelocity.z * Mathf.Rad2Deg; } } } }
public static extern void UpdateRigidbody(IntPtr rigidbody, ref Oni.Rigidbody adaptor);
/** * Injects back into the rigidbodies the new velocities calculated by the solver in response to patrticle interactions: */ public void UpdateVelocities() { if (!hasBeenUpdated) { return; } hasBeenUpdated = false; // Collider groups used by solvers simulating in local space do not support two-way interaction: if (usedInLocalSpace) { return; } usedInLocalSpace = false; Oni.Rigidbody[] bodies = new Oni.Rigidbody[rigidbodyIDs.Count]; Oni.GetRigidbodies(oniColliderGroup, bodies, rigidbodyIDs.Count, 0); // Update 3d collider velocities: for (int i = 0; i < colliders.Count; ++i) { Collider collider = colliders[i]; if (collider == null || !collider.enabled || !collider.gameObject.activeInHierarchy) { continue; } int rigidBodyIndex = -1; Rigidbody rb = collider.GetComponentInParent <Rigidbody>(); if (rb != null && rigidbodyIDs.TryGetValue(rb.GetInstanceID(), out rigidBodyIndex)) { if (rigidBodyIndex < bodies.Length && bodies[rigidBodyIndex].impulseCount > 0) { rb.velocity = bodies[rigidBodyIndex].linearVelocity; rb.angularVelocity = bodies[rigidBodyIndex].angularVelocity; } } } // Update 2d collider velocities: for (int i = 0; i < colliders2D.Count; ++i) { Collider2D collider = colliders2D[i]; if (collider == null || !collider.enabled || !collider.gameObject.activeInHierarchy) { continue; } int rigidBodyIndex = -1; Rigidbody2D rb = collider.GetComponentInParent <Rigidbody2D>(); if (rb != null && rigidbodyIDs.TryGetValue(rb.GetInstanceID(), out rigidBodyIndex)) { if (rigidBodyIndex < bodies.Length && bodies[rigidBodyIndex].impulseCount > 0) { rb.velocity = bodies[rigidBodyIndex].linearVelocity; // For some weird reason, in 2D angular velocity is measured in *degrees* per second, // instead of radians/second. Seriously Unity, WTF?? rb.angularVelocity = bodies[rigidBodyIndex].angularVelocity.z * Mathf.Rad2Deg; } } } }