示例#1
0
        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);
            }
示例#2
0
        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();
            }
        }
示例#3
0
        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();
            }
        }
示例#4
0
        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();
                }
            }
        }
示例#5
0
        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();
        }
示例#6
0
        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);
                    }
                }
            });
        }
示例#7
0
        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));
        }
示例#8
0
 public void Execute() =>
 PhysicsCircleCollider.Create(new CircleGeometry {
     Center = float2.zero, Radius = 0.5f
 }).Dispose();