Beispiel #1
0
        /**
         * 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;
                    }
                }
            }
        }
Beispiel #2
0
 public static extern void UpdateRigidbody(IntPtr rigidbody, ref Oni.Rigidbody adaptor);
Beispiel #3
0
        /**
         * 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;
                    }
                }
            }
        }