Ejemplo n.º 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;
                    }
                }
            }
        }
Ejemplo n.º 2
0
    void Gravity()
    {
        foreach (Object planet in PlanetaryObjects.planets)
        {
            if (planet == null || planet.GetInstanceID() == a.GetInstanceID())
            {
                continue;
            }
            Rigidbody2D b           = (Rigidbody2D)planet;
            Vector2     difference  = -a.transform.position + b.transform.position;
            decimal     dist        = (decimal)difference.magnitude * 50000;
            decimal     gMagnitude  = (decimal)(6.7 * b.mass * a.mass) / (dist * dist);
            Vector2     difference2 = -a.transform.position + b.transform.position;
            Vector2     direction   = difference2.normalized;

            Vector2 gravityVector = (direction * (float)gMagnitude);
            a.GetComponent <Rigidbody2D>().AddForce(gravityVector, ForceMode2D.Force);
        }
    }
Ejemplo n.º 3
0
 public static void OscillateVelocity(this Rigidbody2D rigidbody, Vector2 frequency, Vector2 amplitude, Vector2 center, Axis axis = Axis.XY)
 {
     rigidbody.SetVelocity(rigidbody.velocity.Oscillate(frequency, amplitude, center, rigidbody.GetInstanceID() / 1000, axis), axis);
 }
Ejemplo n.º 4
0
 public static void OscillateEulerAngles(this Rigidbody2D rigidbody, float frequency, float amplitude, float center)
 {
     rigidbody.SetEulerAngles(rigidbody.transform.eulerAngles.Oscillate(new Vector3(frequency, frequency, frequency), new Vector3(amplitude, amplitude, amplitude), new Vector3(center, center, center), rigidbody.GetInstanceID() / 1000, Axis.Z).z);
 }
Ejemplo n.º 5
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;
                    }
                }
            }
        }
Ejemplo n.º 6
0
        private void Update2DColliders()
        {
            for (int i = 0; i < colliders2D.Count; i++)
            {
                Collider2D source = colliders2D[i];
                if (source == null || !source.enabled || !source.gameObject.activeInHierarchy)
                {
                    continue;
                }

                Rigidbody2D rb = source.GetComponentInParent <Rigidbody2D>();
                ObiCollider oc = source.GetComponent <ObiCollider>();

                // Get the adequate rigidBodyIndex. If several colliders share a rigidbody, they'll get the same rigidBodyIndex.
                int rigidBodyIndex = -1;
                if (rb != null)
                {
                    if (!rigidbodyIDs.TryGetValue(rb.GetInstanceID(), out rigidBodyIndex))
                    {
                        ObiRigidbody or = rb.GetComponent <ObiRigidbody>();

                        rigidBodyIndex = Oni.GetRigidbodyCount(oniColliderGroup);
                        Oni.SetRigidbodies(oniColliderGroup, new Oni.Rigidbody[] {
                            new Oni.Rigidbody(rb, (or != null) ? or.kinematicForParticles : false)
                        }, 1, rigidBodyIndex);
                        rigidbodyIDs[rb.GetInstanceID()] = rigidBodyIndex;
                    }
                }

                float thickness = (oc != null)?oc.thickness:0;

                if (source is CircleCollider2D)
                {
                    Oni.SetColliders(oniColliderGroup, new Oni.Collider[] {
                        new Oni.Collider(source, Oni.ShapeType.Sphere, thickness, Oni.GetShapeCount(oniColliderGroup, Oni.ShapeType.Sphere), rigidBodyIndex, (oc != null)?oc.materialIndex:0)
                    }, 1, Oni.GetColliderCount(oniColliderGroup));
                    Oni.SetSphereShapes(oniColliderGroup, new Oni.SphereShape[] {
                        new Oni.SphereShape(source as CircleCollider2D)
                    }, 1, Oni.GetShapeCount(oniColliderGroup, Oni.ShapeType.Sphere));
                }
                else if (source is BoxCollider2D)
                {
                    Oni.SetColliders(oniColliderGroup, new Oni.Collider[] {
                        new Oni.Collider(source, Oni.ShapeType.Box, thickness, Oni.GetShapeCount(oniColliderGroup, Oni.ShapeType.Box), rigidBodyIndex, (oc != null)?oc.materialIndex:0)
                    }, 1, Oni.GetColliderCount(oniColliderGroup));
                    Oni.SetBoxShapes(oniColliderGroup, new Oni.BoxShape[] {
                        new Oni.BoxShape(source as BoxCollider2D)
                    }, 1, Oni.GetShapeCount(oniColliderGroup, Oni.ShapeType.Box));
                }
                else if (source is EdgeCollider2D)
                {
                    EdgeCollider2D           mc = source as EdgeCollider2D;
                    EdgeColliderShapeAndData shapeAndData;

                    if (!edgeColliderData.TryGetValue(source as EdgeCollider2D, out shapeAndData))
                    {
                        // Get current amount of triangle mesh shapes:
                        int shapeIndex = Oni.GetShapeCount(oniColliderGroup, Oni.ShapeType.EdgeMesh);

                        // Generate mesh collider triangle data and shape:
                        Oni.EdgeMeshData  data  = new Oni.EdgeMeshData(mc);
                        Oni.EdgeMeshShape shape = new Oni.EdgeMeshShape(mc,
                                                                        thickness,
                                                                        data.AddrOfVertexData(),
                                                                        data.AddrOfEdgeData());

                        // Pack both in a small wrapper:
                        shapeAndData = new EdgeColliderShapeAndData(data, shape, shapeIndex);

                        // Tell Oni we want to define a new triangle mesh:
                        Oni.SetEdgeMeshShapes(oniColliderGroup,
                                              new Oni.EdgeMeshShape[] { shapeAndData.meshShape },
                                              1, shapeIndex);

                        Oni.UpdateEdgeMeshShapes(oniColliderGroup, 1, shapeIndex);

                        // Store mesh collider data:
                        edgeColliderData[mc] = shapeAndData;
                    }

                    Oni.SetColliders(oniColliderGroup, new Oni.Collider[] {
                        new Oni.Collider(source, Oni.ShapeType.EdgeMesh, thickness, shapeAndData.shapeIndex, rigidBodyIndex, (oc != null)?oc.materialIndex:0)
                    }, 1, Oni.GetColliderCount(oniColliderGroup));
                }
                else
                {
                    Debug.LogWarning("2D Collider type " + source.GetType() + " not supported by Obi. Ignoring it.");
                }
            }
        }
Ejemplo n.º 7
0
        /**
         * Injects back into the rigidbodies the new velocities calculated by the solver in response to particle interactions:
         */
        public void UpdateVelocities()
        {
            if (oniColliderGroup == IntPtr.Zero)
            {
                return;
            }

            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.RigidbodyVelocityDelta[] deltas = new Oni.RigidbodyVelocityDelta[rigidbodyIDs.Count];
            Oni.GetRigidbodyVelocityDeltas(oniColliderGroup, deltas, rigidbodyIDs.Count, 0);

            // Update 3d collider velocities:
            for (int i = 0; i < colliders.Count; ++i)
            {
                Collider collider = colliders[i];

                int       rigidBodyIndex = -1;
                Rigidbody rb             = collider.GetComponentInParent <Rigidbody>();

                if (rb != null && rigidbodyIDs.TryGetValue(rb.GetInstanceID(), out rigidBodyIndex))
                {
                    if (rigidBodyIndex < deltas.Length)
                    {
                        rb.velocity        = deltas[rigidBodyIndex].linearVelocityDelta;
                        rb.angularVelocity = deltas[rigidBodyIndex].angularVelocityDelta;
                    }
                }
            }

            // Update 2d collider velocities:
            for (int i = 0; i < colliders2D.Count; ++i)
            {
                Collider2D collider = colliders2D[i];

                int         rigidBodyIndex = -1;
                Rigidbody2D rb             = collider.GetComponentInParent <Rigidbody2D>();

                if (rb != null && rigidbodyIDs.TryGetValue(rb.GetInstanceID(), out rigidBodyIndex))
                {
                    if (rigidBodyIndex < deltas.Length)
                    {
                        rb.velocity = (Vector2)deltas[rigidBodyIndex].linearVelocityDelta;

                        // For some weird reason, in 2D angular velocity is measured in *degrees* per second,
                        // instead of radians/second. Seriously Unity, WTF??
                        rb.angularVelocity = deltas[rigidBodyIndex].angularVelocityDelta.z * Mathf.Rad2Deg;
                    }
                }
            }
        }