Exemplo n.º 1
0
            public unsafe bool ColliderCastLeaf <T>(ColliderCastInput input, int rigidBodyIndex, ref T collector)
                where T : struct, ICollector <ColliderCastHit>
            {
                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 ColliderCastInput
                {
                    Collider     = input.Collider,
                    Orientation  = math.mul(math.inverse(body.WorldFromBody.rot), input.Orientation),
                    QueryContext = new QueryContext
                    {
                        RigidBodyIndex          = rigidBodyIndex,
                        NumColliderKeyBits      = 0,
                        ColliderKey             = ColliderKey.Empty,
                        WorldFromLocalTransform = worldFromBody,
                        Entity        = body.Entity,
                        IsInitialized = true
                    }
                };

                inputLs.Ray.Origin       = Mul(bodyFromWorld, input.Ray.Origin);
                inputLs.Ray.Displacement = math.mul(bodyFromWorld.Rotation, input.Ray.Displacement);

                return(body.CastCollider(inputLs, ref collector));
            }
Exemplo n.º 2
0
            public unsafe bool ColliderCastLeaf <T>(ColliderCastInput input, int rigidBodyIndex, ref T collector)
                where T : struct, ICollector <ColliderCastHit>
            {
                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 ColliderCastInput
                {
                    Collider    = input.Collider,
                    Orientation = math.mul(math.inverse(body.WorldFromBody.rot), input.Orientation),
                };

                inputLs.Ray.Origin       = Mul(bodyFromWorld, input.Ray.Origin);
                inputLs.Ray.Displacement = math.mul(bodyFromWorld.Rotation, input.Ray.Displacement);

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

                if (body.CastCollider(inputLs, ref collector))
                {
                    // Transform results back into world space
                    collector.TransformNewHits(numHits, fraction, worldFromBody, rigidBodyIndex);
                    return(true);
                }
                return(false);
            }
Exemplo n.º 3
0
            public unsafe bool ColliderCastLeaf <T>(ColliderCastInput input, int rigidBodyIndex, ref T collector)
                where T : struct, ICollector <ColliderCastHit>
            {
                rigidBodyIndex += BaseRigidBodyIndex;

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

                RigidBody body = m_Bodies[rigidBodyIndex];

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