示例#1
0
 public static void ExcuteUserFixedUpdate(Fix64 time)
 {
     foreach (var pair in bodySortedList)
     {
         PBody2D body = pair.Value;
         body.Step(time);
     }
 }
示例#2
0
 public static void ReadNativeBody(PBody2D body2D)
 {
     if (!initialized)
     {
         Initialize();
     }
     NativeParallel2D.GetTransform(body2D.IntPointer, ref body2D.position, ref body2D.angle);
     NativeParallel2D.GetVelocity(body2D.IntPointer, ref body2D.linearVelocity, ref body2D.angularVelocity);
 }
示例#3
0
        public static void ApplyAngularImpulse(PBody2D body, Fix64 impulse)
        {
            if (!initialized)
            {
                Initialize();
            }

            NativeParallel2D.ApplyAngularImpulse(body.IntPointer, impulse);
        }
示例#4
0
        public static void ApplyLinearImpulseToCenter(PBody2D body, Fix64Vec2 impulse)
        {
            if (!initialized)
            {
                Initialize();
            }

            NativeParallel2D.ApplyLinearImpulseToCenter(body.IntPointer, impulse);
        }
示例#5
0
        public static void ApplyTorque(PBody2D body, Fix64 torque)
        {
            if (!initialized)
            {
                Initialize();
            }

            NativeParallel2D.ApplyTorque(body.IntPointer, torque);
        }
示例#6
0
        public static void ApplyForceToCenter(PBody2D body, Fix64Vec2 force)
        {
            if (!initialized)
            {
                Initialize();
            }

            NativeParallel2D.ApplyForceToCenter(body.IntPointer, force);
        }
示例#7
0
        public static void UpdateBodyVelocity(PBody2D body, Fix64Vec2 linearVelocity, Fix64 angularVelocity)
        {
            if (!initialized)
            {
                Initialize();
            }

            NativeParallel2D.UpdateBodyVelocity(body.IntPointer, linearVelocity, angularVelocity);
        }
示例#8
0
        public static void UpdateBodyTransForm(PBody2D body, Fix64Vec2 pos, Fix64 angle)
        {
            if (!initialized)
            {
                Initialize();
            }

            NativeParallel2D.UpdateBodyTransform(body.IntPointer, pos, angle);
        }
示例#9
0
        //2D fixture
        public static PFixture2D AddFixture(PBody2D body2D, PShape2D shape2D, Fix64 density)
        {
            if (!initialized)
            {
                Initialize();
            }

            IntPtr m_NativeObject = NativeParallel2D.AddFixtureToBody(body2D.IntPointer, shape2D.IntPointer, density);

            return(new PFixture2D(m_NativeObject));
        }
示例#10
0
        static void ExportFromEngine()
        {
            ExportContacts();
            PrepareContacts();

            foreach (var pair in bodySortedList)
            {
                PBody2D body = pair.Value;
                body.ReadNative();
            }
        }
示例#11
0
        public static void DestoryBody(PBody2D body2D, IParallelRigidbody2D rigidBody2D)
        {
            if (!initialized)
            {
                Initialize();
            }

            if (bodySortedList.ContainsKey(body2D.BodyID))
            {
                bodySortedList.Remove(body2D.BodyID);
            }

            NativeParallel2D.DestroyBody(internalWorld.IntPointer, body2D.IntPointer);
        }
示例#12
0
        public static void UpdateBodyProperties(PBody2D body,
                                                int bodyType,
                                                Fix64 linearDamping,
                                                Fix64 angularDamping,
                                                bool fixedRotation,
                                                Fix64 gravityScale)
        {
            if (!initialized)
            {
                Initialize();
            }

            NativeParallel2D.UpdateBodyProperties(body.IntPointer, bodyType, linearDamping, angularDamping, fixedRotation, gravityScale);
        }
示例#13
0
        //============================== Unity Events ==============================
        void Awake()
        {
            ParallelPhysicsController2D pSettings = FindObjectOfType <ParallelPhysicsController2D>();

            if (pSettings == null)
            {
                return;
            }

            pSettings.InitIfNecessary();

            parallelFixedUpdates = GetComponents <IParallelFixedUpdate>();
            parallelCollisions   = GetComponents <IParallelCollision2D>();
            parallelTriggers     = GetComponents <IParallelTrigger2D>();

            pTransform.ImportFromUnity();

            colliders = GetComponentsInChildren <ParallelCollider2D>();

            _body2D = Parallel2D.AddBody(
                (int)bodyType,
                (Fix64Vec2)pTransform.position,
                pTransform.rotation.GetZAngle(),
                linearDampling,
                angularDamping,
                fixedRotation,
                gravityScale,
                this);

            _bodyID = _body2D.BodyID;

            foreach (ParallelCollider2D collider in colliders)
            {
                collider.SetRootGameObject(gameObject);
                PShape2D shape = collider.CreateShape(gameObject);

                if (shape == null)
                {
                    Debug.LogError("Failed to create collider shape");
                    continue;
                }

                PFixture2D fixture2D = Parallel2D.AddFixture(_body2D, shape, (Fix64)1);

                collider.ReceiveFixture(fixture2D);
            }
        }
示例#14
0
        //2D body
        public static PBody2D AddBody
            (int bodyType,
            Fix64Vec2 position,
            Fix64 angle,
            Fix64 linearDamping,
            Fix64 angularDamping,
            bool fixedRotation,
            Fix64 gravityScale,
            IParallelRigidbody2D rigidBody2D)
        {
            if (!initialized)
            {
                Initialize();
            }

            UInt16 bodyID = 0;

            IntPtr m_NativeObject = NativeParallel2D.CreateBody(
                internalWorld.IntPointer,
                bodyType,
                position,
                angle,
                linearDamping,
                angularDamping,
                fixedRotation,
                gravityScale,
                ref bodyID);

            PBody2D body2D = new PBody2D(m_NativeObject, bodyID, rigidBody2D as ParallelRigidbody2D, bodyExportSize);

            bodySortedList[bodyID] = body2D;

            ReadNativeBody(body2D);

            return(body2D);
        }
示例#15
0
        public static void ExcuteUserCallbacks(Fix64 time)
        {
            //call contact exit callback

            PContact2DWrapper currentWrapper = _exitContactWrapperHead;

            for (int i = 0; i < _exitContactCount; i++)
            {
                PContact2D contact = currentWrapper.contact;

                PBody2D body1 = bodySortedList[contact.Body1ID];
                PBody2D body2 = bodySortedList[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++)
            {
                PContact2D contact = currentWrapper.contact;

                if (contact.state == ContactState.Active)
                {
                    PBody2D body1 = bodySortedList[contact.Body1ID];
                    PBody2D body2 = bodySortedList[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++)
            {
                PContact2D contact = currentWrapper.contact;
                PBody2D    body1   = bodySortedList[contact.Body1ID];
                PBody2D    body2   = bodySortedList[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;
            }
        }