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)); }
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); }
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)); } }
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)); }
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); }
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)); }
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); } } }
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); }
public bool CastCollider(ColliderCastInput input, out ColliderCastHit closestHit) => QueryWrappers.ColliderCast(ref this, input, out closestHit);
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)); }
public bool CastCollider <T>(ColliderCastInput input, ref T collector) where T : struct, ICollector <ColliderCastHit> { return(Collider != null && Collider->CastCollider(input, ref collector)); }
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)); }
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)); }
public bool CastCollider(ColliderCastInput input, ref NativeList <ColliderCastHit> allHits) => QueryWrappers.ColliderCast(ref this, input, ref allHits);
public bool CastCollider <T>(ColliderCastInput input, ref T collector) where T : struct, ICollector <ColliderCastHit> { return(Broadphase.CastCollider(input, m_Bodies, ref collector)); }
public bool CastCollider <T>(ColliderCastInput input, ref T collector) where T : struct, ICollector <ColliderCastHit> { return(Collider.IsCreated && Collider.Value.CastCollider(input, ref collector)); }