public void TestPhysicsCircleColliderCreate() { var geometry = new CircleGeometry { Center = new float2(-10.10f, 10.12f), Radius = 3.0f }; const uint UserData = 0xDEADBEEF; using (var colliderBlob = PhysicsCircleCollider.Create(geometry, CollisionFilter.Default, PhysicsMaterial.Default, UserData)) { ref var collider = ref colliderBlob.GetColliderRef <PhysicsCircleCollider>(); Assert.AreEqual(ColliderType.Circle, collider.ColliderType); Assert.AreEqual(CollisionType.Convex, collider.CollisionType); Assert.AreEqual(UserData, collider.UserData); Assert.AreEqual(CollisionFilter.Default, collider.Filter); Assert.AreEqual(PhysicsMaterial.Default, collider.Material); Assert.AreEqual(geometry.Center, collider.Center); Assert.AreEqual(geometry.Center, collider.Geometry.Center); Assert.AreEqual(geometry.Radius, collider.Radius); Assert.AreEqual(geometry.Radius, collider.Geometry.Radius); }
public unsafe void PhysicsBodyCastColliderTest() { var geometry = new BoxGeometry { Size = new float2(1f), }; using (var collider = PhysicsBoxCollider.Create(geometry)) { var physicsBody = new PhysicsBody(collider); var queryInput = new ColliderCastInput() { Rotation = float2x2.identity }; var closestHit = new ColliderCastHit(); var allHits = new NativeList <ColliderCastHit>(Allocator.Temp); var circleGeometry = new CircleGeometry { Radius = 0.5f }; using (var circleBlob = PhysicsCircleCollider.Create(circleGeometry)) { queryInput.Collider = circleBlob; // OK case. var startOK = new float2(-10f, -10f); var endOK = new float2(10f, 10f); queryInput.Start = startOK; queryInput.End = endOK; Assert.IsTrue(physicsBody.CastCollider(queryInput)); Assert.IsTrue(physicsBody.CastCollider(queryInput, out closestHit)); Assert.IsTrue(physicsBody.CastCollider(queryInput, ref allHits)); // Fail Case. var startFail = new float2(-10f, -10f); var endFail = new float2(10f, -10f); queryInput.Start = startFail; queryInput.End = endFail; Assert.IsFalse(physicsBody.CastCollider(queryInput)); Assert.IsFalse(physicsBody.CastCollider(queryInput, out closestHit)); Assert.IsFalse(physicsBody.CastCollider(queryInput, ref allHits)); } allHits.Dispose(); } }
public unsafe void PhysicsBodyOverlapColliderTest() { var geometry = new BoxGeometry { Size = new float2(2f), }; using (var collider = PhysicsBoxCollider.Create(geometry)) { var physicsBody = new PhysicsBody(collider); var queryInput = new OverlapColliderInput() { Filter = CollisionFilter.Default }; var closestHit = new OverlapColliderHit(); var allHits = new NativeList <OverlapColliderHit>(Allocator.Temp); var circleGeometry = new CircleGeometry { Radius = 0.5f }; using (var circleBlob = PhysicsCircleCollider.Create(circleGeometry)) { queryInput.Collider = circleBlob; // OK case. var transformOK = new PhysicsTransform(new float2(1f)); queryInput.Transform = transformOK; Assert.IsTrue(physicsBody.OverlapCollider(queryInput)); Assert.IsTrue(physicsBody.OverlapCollider(queryInput, out closestHit)); Assert.IsTrue(physicsBody.OverlapCollider(queryInput, ref allHits)); // Fail Case. var transformFail = new PhysicsTransform(new float2(-10f)); queryInput.Transform = transformFail; Assert.IsFalse(physicsBody.OverlapCollider(queryInput)); Assert.IsFalse(physicsBody.OverlapCollider(queryInput, out closestHit)); Assert.IsFalse(physicsBody.OverlapCollider(queryInput, ref allHits)); } allHits.Dispose(); } }
public unsafe void PhysicsBodyCalculateDistanceTest() { var geometry = new BoxGeometry { Size = new float2(1f), }; using (var collider = PhysicsBoxCollider.Create(geometry)) { var physicsBody = new PhysicsBody(collider); var circleGeometry = new CircleGeometry { Radius = 1f }; using (var circleBlob = PhysicsCircleCollider.Create(circleGeometry)) { var queryInput = new ColliderDistanceInput { Collider = circleBlob, Transform = new PhysicsTransform(new float2(-10f)) }; var closestHit = new DistanceHit(); var allHits = new NativeList <DistanceHit>(Allocator.Temp); // OK case : with enough max distance queryInput.MaxDistance = 10000.0f; Assert.IsTrue(physicsBody.CalculateDistance(queryInput)); Assert.IsTrue(physicsBody.CalculateDistance(queryInput, out closestHit)); Assert.IsTrue(physicsBody.CalculateDistance(queryInput, ref allHits)); // Fail case : not enough max distance queryInput.MaxDistance = 1f; Assert.IsFalse(physicsBody.CalculateDistance(queryInput)); Assert.IsFalse(physicsBody.CalculateDistance(queryInput, out closestHit)); Assert.IsFalse(physicsBody.CalculateDistance(queryInput, ref allHits)); allHits.Dispose(); } } }
public void PhysicsBodyCalculateAabb_CircleColliderTest() { var geometry = new CircleGeometry { Center = new float2(-10.10f, 10.12f), Radius = 3.0f }; var collider1 = PhysicsCircleCollider.Create(geometry); var collider2 = PhysicsCircleCollider.Create(geometry); var physicsBody = new PhysicsBody(collider1); var aabb = physicsBody.CalculateAabb(); Assert.IsTrue(aabb.Equals(collider2.Value.CalculateAabb())); collider1.Dispose(); collider2.Dispose(); }
protected override void OnUpdate() { Entities.ForEach((UnityEngine.CircleCollider2D collider) => { // Convert the collider if it's valid. if (ConversionUtilities.CanConvertCollider(collider)) { try { var lossyScale = new float3(collider.transform.lossyScale).xy; if (math.any(!math.isfinite(lossyScale)) || math.any(lossyScale <= 0.0f)) { throw new ArgumentException("Transform XY scale cannot be zero or Infinite/NaN.", "Transform XY scale."); } var localToWorld = ConversionUtilities.GetColliderLocalToWorld(collider); var geometry = new CircleGeometry { Center = new float3(localToWorld.MultiplyPoint(collider.offset)).xy, Radius = math.clamp(collider.radius * math.cmax(lossyScale), ConversionUtilities.MinRangeClamp, ConversionUtilities.MaxRangeClamp), }; var colliderBlob = PhysicsCircleCollider.Create( geometry, ConversionUtilities.GetCollisionFilterFromCollider(collider), ConversionUtilities.GetPhysicsMaterialFromCollider(collider) ); // Submit the collider for conversion. m_ColliderConversionSystem.SubmitCollider(collider, ref colliderBlob); } catch (ArgumentException exception) { UnityEngine.Debug.LogWarning($"{collider.name}: {exception.Message}", collider); } } }); }
public void TestPhysicsColliderBlobOwner() { // Create the collider blob. var geometry = new CircleGeometry { Radius = 1f }; var colliderBlob = PhysicsCircleCollider.Create(geometry); // Create the entity that owns the collider blob. var entity = EntityManager.CreateEntity(); EntityManager.AddComponentData(entity, new PhysicsColliderBlob { Collider = colliderBlob }); EntityManager.AddComponentData(entity, new PhysicsColliderBlobOwner { Collider = colliderBlob }); // The collider blob components should be present. Assert.IsTrue(EntityManager.HasComponent <PhysicsColliderBlob>(entity)); Assert.IsTrue(EntityManager.HasComponent <PhysicsColliderBlobOwner>(entity)); // Destroy the entity. EntityManager.DestroyEntity(entity); // The collider blob component should be removed but the blob owner should be present still. Assert.IsFalse(EntityManager.HasComponent <PhysicsColliderBlob>(entity)); Assert.IsTrue(EntityManager.HasComponent <PhysicsColliderBlobOwner>(entity)); // Run the system. MainLoop(); // The collider blob owner should now be removed indicating that the // disposal system has disposed of the blob. // Unfortunately I don't believe there's a way to detect the actual deallocation // as our instance here still assumes the blob ptr is valid. Assert.IsFalse(EntityManager.HasComponent <PhysicsColliderBlobOwner>(entity)); }
public void Execute() => PhysicsCircleCollider.Create(new CircleGeometry { Center = float2.zero, Radius = 0.5f }).Dispose();