Esempio n. 1
0
        static void AddAllContactWrapper(PContact3D contact)
        {
            _allContactWrapperEnd.contact = contact;

            _allContactWrapperEnd = _allContactWrapperEnd.next;

            _allContactCount++;
        }
Esempio n. 2
0
        static void AddExitContactWrapper(PContact3D contact)
        {
            _exitContactWrapperEnd.contact = contact;

            _exitContactWrapperEnd = _exitContactWrapperEnd.next;

            _exitContactCount++;
        }
Esempio n. 3
0
        //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;
        }
Esempio n. 4
0
        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();
            }
        }
Esempio n. 5
0
 static void ResetAllContacts()
 {
     _allContactCount      = 0;
     _allContactWrapperEnd = _allContactWrapperHead;
 }
Esempio n. 6
0
 static void ResetExitContacts()
 {
     _exitContactCount      = 0;
     _exitContactWrapperEnd = _exitContactWrapperHead;
 }
Esempio n. 7
0
 static void ResetEnterContacts()
 {
     _enterContactCount      = 0;
     _enterContactWrapperEnd = _enterContactWrapperHead;
 }