Ejemplo n.º 1
0
            public unsafe bool DistanceLeaf <T>(ColliderDistanceInput input, int rigidBodyIndex, ref T collector)
                where T : struct, ICollector <DistanceHit>
            {
                rigidBodyIndex += BaseRigidBodyIndex;
                RigidBody body = m_Bodies[rigidBodyIndex];

                // Transform the input into body space
                var        worldFromBody = new MTransform(body.WorldFromBody);
                MTransform bodyFromWorld = Inverse(worldFromBody);
                var        inputLs       = new ColliderDistanceInput
                {
                    Collider  = input.Collider,
                    Transform = new RigidTransform(
                        math.mul(math.inverse(body.WorldFromBody.rot), input.Transform.rot),
                        Mul(bodyFromWorld, input.Transform.pos)),
                    MaxDistance  = input.MaxDistance,
                    QueryContext = new QueryContext
                    {
                        RigidBodyIndex          = rigidBodyIndex,
                        ColliderKey             = ColliderKey.Empty,
                        NumColliderKeyBits      = 0,
                        WorldFromLocalTransform = worldFromBody,
                        Entity        = body.Entity,
                        IsInitialized = true
                    }
                };

                return(body.CalculateDistance(inputLs, ref collector));
            }
Ejemplo n.º 2
0
            public bool DistanceLeaf <T>(PointDistanceInput input, int rigidBodyIndex, ref T collector)
                where T : struct, ICollector <DistanceHit>
            {
                rigidBodyIndex += BaseRigidBodyIndex;
                RigidBody body = m_Bodies[rigidBodyIndex];

                // Transform the input into body space
                var        worldFromBody = new MTransform(body.WorldFromBody);
                MTransform bodyFromWorld = Inverse(worldFromBody);
                var        inputLs       = new PointDistanceInput
                {
                    Position     = Mul(bodyFromWorld, input.Position),
                    MaxDistance  = input.MaxDistance,
                    Filter       = input.Filter,
                    QueryContext = new QueryContext
                    {
                        RigidBodyIndex          = rigidBodyIndex,
                        ColliderKey             = ColliderKey.Empty,
                        NumColliderKeyBits      = 0,
                        WorldFromLocalTransform = worldFromBody,
                        Entity        = body.Entity,
                        IsInitialized = true
                    }
                };

                return(body.CalculateDistance(inputLs, ref collector));
            }
Ejemplo n.º 3
0
            public unsafe bool DistanceLeaf <T>(ColliderDistanceInput input, int rigidBodyIndex, ref T collector)
                where T : struct, ICollector <DistanceHit>
            {
                rigidBodyIndex += BaseRigidBodyIndex;
                RigidBody body = m_Bodies[rigidBodyIndex];

                // Transform the input into body space
                var        worldFromBody = new MTransform(body.WorldFromBody);
                MTransform bodyFromWorld = Inverse(worldFromBody);
                var        inputLs       = new ColliderDistanceInput
                {
                    Collider  = input.Collider,
                    Transform = new RigidTransform(
                        math.mul(math.inverse(body.WorldFromBody.rot), input.Transform.rot),
                        Mul(bodyFromWorld, input.Transform.pos)),
                    MaxDistance = input.MaxDistance
                };

                float fraction = collector.MaxFraction;
                int   numHits  = collector.NumHits;

                if (body.CalculateDistance(inputLs, ref collector))
                {
                    // Transform results back into world space
                    collector.TransformNewHits(numHits, fraction, worldFromBody, rigidBodyIndex);
                    return(true);
                }
                return(false);
            }
Ejemplo n.º 4
0
            public bool DistanceLeaf <T>(PointDistanceInput input, int rigidBodyIndex, ref T collector)
                where T : struct, ICollector <DistanceHit>
            {
                rigidBodyIndex += BaseRigidBodyIndex;
                RigidBody body = m_Bodies[rigidBodyIndex];

                // Transform the input into body space
                var        worldFromBody = new MTransform(body.WorldFromBody);
                MTransform bodyFromWorld = Inverse(worldFromBody);
                var        inputLs       = new PointDistanceInput
                {
                    Position    = Mul(bodyFromWorld, input.Position),
                    MaxDistance = input.MaxDistance,
                    Filter      = input.Filter
                };

                float fraction = collector.MaxFraction;
                int   numHits  = collector.NumHits;

                if (body.CalculateDistance(inputLs, ref collector))
                {
                    // Transform results back into world space
                    collector.TransformNewHits(numHits, fraction, worldFromBody, rigidBodyIndex);
                    return(true);
                }
                return(false);
            }
Ejemplo n.º 5
0
            public unsafe bool DistanceLeaf <T>(ColliderDistanceInput input, int rigidBodyIndex, ref T collector)
                where T : struct, ICollector <DistanceHit>
            {
                rigidBodyIndex += BaseRigidBodyIndex;

                input.QueryContext.IsInitialized  = true;
                input.QueryContext.RigidBodyIndex = rigidBodyIndex;

                RigidBody body = m_Bodies[rigidBodyIndex];

                return(body.CalculateDistance(input, ref collector));
            }