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));
            }
Esempio 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);
            }
Esempio n. 3
0
 public unsafe bool CastCollider <T>(ColliderCastInput input, ref T collector) where T : struct, ICollector <ColliderCastHit>
 {
     fixed(TerrainCollider *target = &this)
     {
         return(ColliderCastQueries.ColliderCollider(input, (Collider *)target, ref collector));
     }
 }
Esempio n. 4
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));
            }
Esempio n. 5
0
        public static bool ColliderCast <T>(ref T target, ColliderCastInput input, out ColliderCastHit result) where T : struct, ICollidable
        {
            var collector = new ClosestHitCollector <ColliderCastHit>(1.0f);

            if (target.CastCollider(input, ref collector))
            {
                result = collector.ClosestHit;  // TODO: would be nice to avoid this copy
                return(true);
            }

            result = new ColliderCastHit();
            return(false);
        }
Esempio n. 6
0
        public bool CastCollider <T>(ColliderCastInput input, ref T collector) where T : struct, ICollector <ColliderCastHit>
        {
            // Transform the input into body space
            MTransform worldFromBody = new MTransform(WorldFromBody);
            MTransform bodyFromWorld = Inverse(worldFromBody);

            input.Orientation      = math.mul(math.inverse(WorldFromBody.rot), input.Orientation);
            input.Ray.Origin       = Mul(bodyFromWorld, input.Ray.Origin);
            input.Ray.Displacement = math.mul(bodyFromWorld.Rotation, input.Ray.Displacement);

            SetQueryContextParameters(ref input.QueryContext, ref worldFromBody);

            return(Collider.IsCreated && Collider.Value.CastCollider(input, ref collector));
        }
Esempio n. 7
0
        public static bool CapsuleCastCustom <T, C>(ref T target, float3 point1, float3 point2, float radius, float3 direction, float maxDistance, ref C collector, CollisionFilter filter, QueryInteraction queryInteraction = QueryInteraction.Default)
            where T : struct, ICollidable
            where C : struct, ICollector <ColliderCastHit>
        {
            CapsuleCollider collider = default;

            float3 center = (point1 + point2) / 2;

            CapsuleGeometry geometry = new CapsuleGeometry
            {
                Radius  = radius,
                Vertex0 = point1 - center,
                Vertex1 = point2 - center
            };

            collider.Initialize(geometry, filter, Material.Default);

            ColliderCastInput input;

            unsafe
            {
                input = new ColliderCastInput
                {
                    Collider    = (Collider *)UnsafeUtility.AddressOf(ref collider),
                    Orientation = quaternion.identity,
                    Start       = center,
                    End         = center + direction * maxDistance
                };
            }

            if (queryInteraction == QueryInteraction.Default)
            {
                return(target.CastCollider(input, ref collector));
            }
            else
            {
                unsafe
                {
                    var interactionCollector = new QueryInteractionCollector <ColliderCastHit, C>
                    {
                        Collector = collector
                    };

                    bool returnValue = target.CastCollider(input, ref interactionCollector);

                    collector = interactionCollector.Collector;
                    return(returnValue);
                }
            }
        }
Esempio n. 8
0
        public static bool BoxCastCustom <T, C>(ref T target, float3 center, quaternion orientation, float3 halfExtents, float3 direction, float maxDistance, ref C collector, CollisionFilter filter, QueryInteraction queryInteraction = QueryInteraction.Default)
            where T : struct, ICollidable
            where C : struct, ICollector <ColliderCastHit>
        {
            BoxCollider collider    = default;
            BoxGeometry boxGeometry = new BoxGeometry
            {
                BevelRadius = 0,
                Center      = 0,
                Orientation = quaternion.identity,
                Size        = halfExtents * 2
            };

            collider.Initialize(boxGeometry, filter, Material.Default);

            ColliderCastInput input;

            unsafe
            {
                input = new ColliderCastInput
                {
                    Collider    = (Collider *)UnsafeUtility.AddressOf(ref collider),
                    Orientation = orientation,
                    Start       = center,
                    End         = center + direction * maxDistance
                };
            }

            if (queryInteraction == QueryInteraction.Default)
            {
                return(target.CastCollider(input, ref collector));
            }
            else
            {
                unsafe
                {
                    var interactionCollector = new QueryInteractionCollector <ColliderCastHit, C>
                    {
                        Collector = collector
                    };

                    bool returnValue = target.CastCollider(input, ref interactionCollector);

                    collector = interactionCollector.Collector;
                    return(returnValue);
                }
            }
        }
        public unsafe bool CastCollider <T>(ColliderCastInput input, NativeSlice <RigidBody> rigidBodies, ref T collector)
            where T : struct, ICollector <ColliderCastHit>
        {
            Assert.IsTrue(input.Collider != null);
            if (input.Collider->Filter.IsEmpty)
            {
                return(false);
            }
            var leafProcessor = new BvhLeafProcessor(rigidBodies);

            leafProcessor.BaseRigidBodyIndex = m_DynamicTree.NumBodies;
            bool hasHit = m_StaticTree.BoundingVolumeHierarchy.ColliderCast(input, ref leafProcessor, ref collector);

            leafProcessor.BaseRigidBodyIndex = 0;
            hasHit |= m_DynamicTree.BoundingVolumeHierarchy.ColliderCast(input, ref leafProcessor, ref collector);

            return(hasHit);
        }
Esempio n. 10
0
 public bool CastCollider(ColliderCastInput input, out ColliderCastHit closestHit) => QueryWrappers.ColliderCast(ref this, input, out closestHit);
Esempio n. 11
0
 public bool CastCollider(ColliderCastInput input) => QueryWrappers.ColliderCast(ref this, input);
 public bool CastCollider <T>(ColliderCastInput input, ref T collector) where T : struct, ICollector <ColliderCastHit>
 {
     return(CollisionWorld.CastCollider(input, ref collector));
 }
Esempio n. 13
0
 public bool CastCollider <T>(ColliderCastInput input, ref T collector) where T : struct, ICollector <ColliderCastHit>
 {
     return(Collider != null && Collider->CastCollider(input, ref collector));
 }
Esempio n. 14
0
        public static bool ColliderCast <T>(ref T target, ColliderCastInput input, ref NativeList <ColliderCastHit> allHits) where T : struct, ICollidable
        {
            var collector = new AllHitsCollector <ColliderCastHit>(1.0f, ref allHits);

            return(target.CastCollider(input, ref collector));
        }
Esempio n. 15
0
        public static bool ColliderCast <T>(ref T target, ColliderCastInput input) where T : struct, ICollidable
        {
            var collector = new AnyHitCollector <ColliderCastHit>(1.0f);

            return(target.CastCollider(input, ref collector));
        }
Esempio n. 16
0
 public bool CastCollider(ColliderCastInput input, ref NativeList <ColliderCastHit> allHits) => QueryWrappers.ColliderCast(ref this, input, ref allHits);
Esempio n. 17
0
 public bool CastCollider <T>(ColliderCastInput input, ref T collector) where T : struct, ICollector <ColliderCastHit>
 {
     return(Broadphase.CastCollider(input, m_Bodies, ref collector));
 }
Esempio n. 18
0
 public bool CastCollider <T>(ColliderCastInput input, ref T collector) where T : struct, ICollector <ColliderCastHit>
 {
     return(Collider.IsCreated && Collider.Value.CastCollider(input, ref collector));
 }