123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398 |
- /*
- * Copyright (c) Contributors to the Open 3D Engine Project.
- * For complete copyright and license terms please see the LICENSE at the root of this distribution.
- *
- * SPDX-License-Identifier: Apache-2.0 OR MIT
- *
- */
- #include <AZTestShared/Math/MathTestHelpers.h>
- #include <AzToolsFramework/ToolsComponents/EditorNonUniformScaleComponent.h>
- #include <BaseColliderComponent.h>
- #include <BoxColliderComponent.h>
- #include <CapsuleColliderComponent.h>
- #include <EditorColliderComponent.h>
- #include <EditorRigidBodyComponent.h>
- #include <EditorStaticRigidBodyComponent.h>
- #include <EditorTestUtilities.h>
- #include <RigidBodyComponent.h>
- #include <RigidBodyStatic.h>
- #include <SphereColliderComponent.h>
- #include <StaticRigidBodyComponent.h>
- namespace PhysXEditorTests
- {
- void ExpectSingleConvexRuntimeConfig(AZ::Entity* gameEntity)
- {
- PhysX::BaseColliderComponent* colliderComponent = gameEntity->FindComponent<PhysX::BaseColliderComponent>();
- ASSERT_TRUE(colliderComponent != nullptr);
- AzPhysics::ShapeColliderPairList shapeConfigList = colliderComponent->GetShapeConfigurations();
- EXPECT_EQ(shapeConfigList.size(), 1);
- for (const auto& shapeConfigPair : shapeConfigList)
- {
- EXPECT_EQ(shapeConfigPair.second->GetShapeType(), Physics::ShapeType::CookedMesh);
- }
- }
- TEST_F(PhysXEditorFixture, BoxCollider_NonUniformScaleComponent_RuntimeShapeConfigReplacedWithConvex)
- {
- const AZ::Vector3 nonUniformScale(2.0f, 2.5f, 0.5f);
- EntityPtr editorEntity = CreateBoxPrimitiveColliderEditorEntity(
- Physics::ShapeConstants::DefaultBoxDimensions,
- AZ::Transform::CreateIdentity(),
- AZ::Vector3::CreateZero(),
- AZ::Quaternion::CreateIdentity(),
- nonUniformScale);
- EntityPtr gameEntity = CreateActiveGameEntityFromEditorEntity(editorEntity.get());
- // because there is a non-uniform scale component, the runtime entity should have a BaseColliderComponent with a
- // cooked mesh shape configuration, rather than a BoxColliderComponent
- EXPECT_TRUE(gameEntity->FindComponent<PhysX::BoxColliderComponent>() == nullptr);
- ExpectSingleConvexRuntimeConfig(gameEntity.get());
- }
- TEST_F(PhysXEditorFixture, BoxCollider_NonUniformScale_RuntimePhysicsAabbCorrect)
- {
- const AZ::Vector3 boxDimensions(0.5f, 0.7f, 0.9f);
- const AZ::Transform transform(AZ::Vector3(5.0f, 6.0f, 7.0f), AZ::Quaternion::CreateRotationX(AZ::DegToRad(30.0f)), 1.5f);
- const AZ::Vector3 translationOffset(1.0f, 2.0f, 3.0f);
- const AZ::Quaternion rotationOffset = AZ::Quaternion::CreateRotationZ(AZ::DegToRad(45.0f));
- const AZ::Vector3 nonUniformScale(0.7f, 0.9f, 1.1f);
- EntityPtr editorEntity = CreateBoxPrimitiveColliderEditorEntity(boxDimensions, transform, translationOffset, rotationOffset, nonUniformScale);
- EntityPtr gameEntity = CreateActiveGameEntityFromEditorEntity(editorEntity.get());
- // since there was no editor rigid body component, the runtime entity should have a static rigid body
- const auto* staticBody = azdynamic_cast<PhysX::StaticRigidBody*>(gameEntity->FindComponent<PhysX::StaticRigidBodyComponent>()->GetSimulatedBody());
- const AZ::Aabb aabb = staticBody->GetAabb();
- EXPECT_THAT(aabb.GetMin(), UnitTest::IsCloseTolerance(AZ::Vector3(5.6045f, 4.9960f, 11.7074f), 1e-3f));
- EXPECT_THAT(aabb.GetMax(), UnitTest::IsCloseTolerance(AZ::Vector3(6.4955f, 6.7305f, 13.5662f), 1e-3f));
- }
- TEST_F(PhysXEditorFixture, BoxCollider_WithDynamicRigidBody_NonUniformScale_RuntimePhysicsAabbCorrect)
- {
- const AZ::Vector3 boxDimensions(0.5f, 0.7f, 0.9f);
- const AZ::Transform transform(AZ::Vector3(5.0f, 6.0f, 7.0f), AZ::Quaternion::CreateRotationX(AZ::DegToRad(30.0f)), 1.5f);
- const AZ::Vector3 translationOffset(1.0f, 2.0f, 3.0f);
- const AZ::Quaternion rotationOffset = AZ::Quaternion::CreateRotationZ(AZ::DegToRad(45.0f));
- const AZ::Vector3 nonUniformScale(0.7f, 0.9f, 1.1f);
- EntityPtr editorEntity = CreateBoxPrimitiveColliderEditorEntity(
- boxDimensions, transform, translationOffset, rotationOffset, nonUniformScale, RigidBodyType::Dynamic);
- EntityPtr gameEntity = CreateActiveGameEntityFromEditorEntity(editorEntity.get());
- // since there was an editor rigid body component, the runtime entity should have a dynamic rigid body
- const auto* dynamicBody = gameEntity->FindComponent<PhysX::RigidBodyComponent>()->GetRigidBody();
- const AZ::Aabb aabb = dynamicBody->GetAabb();
- EXPECT_THAT(aabb.GetMin(), UnitTest::IsCloseTolerance(AZ::Vector3(5.6045f, 4.9960f, 11.7074f), 1e-3f));
- EXPECT_THAT(aabb.GetMax(), UnitTest::IsCloseTolerance(AZ::Vector3(6.4955f, 6.7305f, 13.5662f), 1e-3f));
- }
- TEST_F(PhysXEditorFixture, CapsuleCollider_NonUniformScaleComponent_RuntimeShapeConfigReplacedWithConvex)
- {
- const AZ::Vector3 nonUniformScale(1.0f, 1.5f, 1.0f);
- EntityPtr editorEntity = CreateCapsulePrimitiveColliderEditorEntity(
- Physics::ShapeConstants::DefaultCapsuleRadius,
- Physics::ShapeConstants::DefaultCapsuleHeight,
- AZ::Transform::CreateIdentity(),
- AZ::Vector3::CreateZero(),
- AZ::Quaternion::CreateIdentity(),
- nonUniformScale);
- EntityPtr gameEntity = CreateActiveGameEntityFromEditorEntity(editorEntity.get());
- // because there is a non-uniform scale component, the runtime entity should have a BaseColliderComponent with a
- // cooked mesh shape configuration, rather than a CapsuleColliderComponent
- EXPECT_TRUE(gameEntity->FindComponent<PhysX::CapsuleColliderComponent>() == nullptr);
- ExpectSingleConvexRuntimeConfig(gameEntity.get());
- }
- TEST_F(PhysXEditorFixture, CapsuleCollider_NonUniformScale_RuntimePhysicsAabbCorrect)
- {
- const float capsuleRadius = 0.3f;
- const float capsuleHeight = 1.4f;
- const AZ::Transform transform(AZ::Vector3(3.0f, 1.0f, -4.0f), AZ::Quaternion::CreateRotationY(AZ::DegToRad(90.0f)), 0.5f);
- const AZ::Vector3 translationOffset(2.0f, 5.0f, 3.0f);
- const AZ::Quaternion rotationOffset = AZ::Quaternion::CreateRotationX(AZ::DegToRad(90.0f));
- const AZ::Vector3 nonUniformScale(1.2f, 0.7f, 0.6f);
- EntityPtr editorEntity = CreateCapsulePrimitiveColliderEditorEntity(
- capsuleRadius, capsuleHeight, transform, translationOffset, rotationOffset, nonUniformScale);
- EntityPtr gameEntity = CreateActiveGameEntityFromEditorEntity(editorEntity.get());
- // since there was no editor rigid body component, the runtime entity should have a static rigid body
- const auto* staticBody = azdynamic_cast<PhysX::StaticRigidBody*>(gameEntity->FindComponent<PhysX::StaticRigidBodyComponent>()->GetSimulatedBody());
- const AZ::Aabb aabb = staticBody->GetAabb();
- EXPECT_THAT(aabb.GetMin(), UnitTest::IsCloseTolerance(AZ::Vector3(3.81f, 2.505f, -5.38f), 1e-3f));
- EXPECT_THAT(aabb.GetMax(), UnitTest::IsCloseTolerance(AZ::Vector3(3.99f, 2.995f, -5.02f), 1e-3f));
- }
- TEST_F(PhysXEditorFixture, CapsuleCollider_WithDynamicRigidBody_NonUniformScale_RuntimePhysicsAabbCorrect)
- {
- const float capsuleRadius = 0.3f;
- const float capsuleHeight = 1.4f;
- const AZ::Transform transform(AZ::Vector3(3.0f, 1.0f, -4.0f), AZ::Quaternion::CreateRotationY(AZ::DegToRad(90.0f)), 0.5f);
- const AZ::Vector3 translationOffset(2.0f, 5.0f, 3.0f);
- const AZ::Quaternion rotationOffset = AZ::Quaternion::CreateRotationX(AZ::DegToRad(90.0f));
- const AZ::Vector3 nonUniformScale(1.2f, 0.7f, 0.6f);
- EntityPtr editorEntity = CreateCapsulePrimitiveColliderEditorEntity(
- capsuleRadius, capsuleHeight, transform, translationOffset, rotationOffset, nonUniformScale, RigidBodyType::Dynamic);
- EntityPtr gameEntity = CreateActiveGameEntityFromEditorEntity(editorEntity.get());
- // since there was an editor rigid body component, the runtime entity should have a dynamic rigid body
- const auto* dynamicBody = gameEntity->FindComponent<PhysX::RigidBodyComponent>()->GetRigidBody();
- const AZ::Aabb aabb = dynamicBody->GetAabb();
- EXPECT_THAT(aabb.GetMin(), UnitTest::IsCloseTolerance(AZ::Vector3(3.81f, 2.505f, -5.38f), 1e-3f));
- EXPECT_THAT(aabb.GetMax(), UnitTest::IsCloseTolerance(AZ::Vector3(3.99f, 2.995f, -5.02f), 1e-3f));
- }
- TEST_F(PhysXEditorFixture, SphereCollider_NonUniformScaleComponent_RuntimeShapeConfigReplacedWithConvex)
- {
- const AZ::Vector3 nonUniformScale(1.0f, 1.5f, 1.0f);
- EntityPtr editorEntity = CreateSpherePrimitiveColliderEditorEntity(
- Physics::ShapeConstants::DefaultSphereRadius,
- AZ::Transform::CreateIdentity(),
- AZ::Vector3::CreateZero(),
- AZ::Quaternion::CreateIdentity(),
- nonUniformScale);
- EntityPtr gameEntity = CreateActiveGameEntityFromEditorEntity(editorEntity.get());
- // because there is a non-uniform scale component, the runtime entity should have a BaseColliderComponent with a
- // cooked mesh shape configuration, rather than a CapsuleColliderComponent
- EXPECT_TRUE(gameEntity->FindComponent<PhysX::SphereColliderComponent>() == nullptr);
- ExpectSingleConvexRuntimeConfig(gameEntity.get());
- }
- TEST_F(PhysXEditorFixture, SphereCollider_NonUniformScale_RuntimePhysicsAabbCorrect)
- {
- const float sphereRadius = 0.7f;
- const AZ::Transform transform(AZ::Vector3(-2.0f, -1.0f, 3.0f), AZ::Quaternion::CreateRotationX(AZ::DegToRad(90.0f)), 1.2f);
- const AZ::Vector3 translationOffset(3.0f, -2.0f, 2.0f);
- const AZ::Quaternion rotationOffset = AZ::Quaternion::CreateRotationY(AZ::DegToRad(90.0f));
- const AZ::Vector3 nonUniformScale(0.8f, 0.9f, 0.6f);
- EntityPtr editorEntity =
- CreateSpherePrimitiveColliderEditorEntity(sphereRadius, transform, translationOffset, rotationOffset, nonUniformScale);
- EntityPtr gameEntity = CreateActiveGameEntityFromEditorEntity(editorEntity.get());
- // since there was no editor rigid body component, the runtime entity should have a static rigid body
- const auto* staticBody = azdynamic_cast<PhysX::StaticRigidBody*>(gameEntity->FindComponent<PhysX::StaticRigidBodyComponent>()->GetSimulatedBody());
- const AZ::Aabb aabb = staticBody->GetAabb();
- EXPECT_THAT(aabb.GetMin(), UnitTest::IsCloseTolerance(AZ::Vector3(0.208f, -2.944f, 0.084f), 1e-3f));
- EXPECT_THAT(aabb.GetMax(), UnitTest::IsCloseTolerance(AZ::Vector3(1.552f, -1.936f, 1.596f), 1e-3f));
- }
- TEST_F(PhysXEditorFixture, SphereCollider_WithDynamicRigidBody_NonUniformScale_RuntimePhysicsAabbCorrect)
- {
- const float sphereRadius = 0.7f;
- const AZ::Transform transform(AZ::Vector3(-2.0f, -1.0f, 3.0f), AZ::Quaternion::CreateRotationX(AZ::DegToRad(90.0f)), 1.2f);
- const AZ::Vector3 translationOffset(3.0f, -2.0f, 2.0f);
- const AZ::Quaternion rotationOffset = AZ::Quaternion::CreateRotationY(AZ::DegToRad(90.0f));
- const AZ::Vector3 nonUniformScale(0.8f, 0.9f, 0.6f);
- EntityPtr editorEntity = CreateSpherePrimitiveColliderEditorEntity(
- sphereRadius, transform, translationOffset, rotationOffset, nonUniformScale, RigidBodyType::Dynamic);
- EntityPtr gameEntity = CreateActiveGameEntityFromEditorEntity(editorEntity.get());
- // since there was an editor rigid body component, the runtime entity should have a dynamic rigid body
- const auto* dynamicBody = gameEntity->FindComponent<PhysX::RigidBodyComponent>()->GetRigidBody();
- const AZ::Aabb aabb = dynamicBody->GetAabb();
- EXPECT_THAT(aabb.GetMin(), UnitTest::IsCloseTolerance(AZ::Vector3(0.208f, -2.944f, 0.084f), 1e-3f));
- EXPECT_THAT(aabb.GetMax(), UnitTest::IsCloseTolerance(AZ::Vector3(1.552f, -1.936f, 1.596f), 1e-3f));
- }
- TEST_F(PhysXEditorFixture, CylinderCollider_RuntimeShapeConfigUsingConvex)
- {
- EntityPtr editorEntity = CreateCylinderPrimitiveColliderEditorEntity(
- Physics::ShapeConstants::DefaultCylinderRadius,
- Physics::ShapeConstants::DefaultCylinderHeight);
- EntityPtr gameEntity = CreateActiveGameEntityFromEditorEntity(editorEntity.get());
- // Since there is no cylinder shape in PhysX, the runtime entity should have a BaseColliderComponent with a
- // cooked mesh shape configuration.
- ExpectSingleConvexRuntimeConfig(gameEntity.get());
- }
- TEST_F(PhysXEditorFixture, CylinderCollider_NonUniformScaleComponent_RuntimeShapeConfigUsingConvex)
- {
- const AZ::Vector3 nonUniformScale(1.0f, 1.5f, 1.0f);
- EntityPtr editorEntity = CreateCylinderPrimitiveColliderEditorEntity(
- Physics::ShapeConstants::DefaultCylinderRadius,
- Physics::ShapeConstants::DefaultCylinderHeight,
- AZ::Transform::CreateIdentity(),
- AZ::Vector3::CreateZero(),
- AZ::Quaternion::CreateIdentity(),
- nonUniformScale);
- EntityPtr gameEntity = CreateActiveGameEntityFromEditorEntity(editorEntity.get());
- // Since there is no cylinder shape in PhysX, the runtime entity should have a BaseColliderComponent with a
- // cooked mesh shape configuration.
- ExpectSingleConvexRuntimeConfig(gameEntity.get());
- }
- TEST_F(PhysXEditorFixture, EditorColliderComponent_CylinderWithOffset_CorrectEditorStaticBodyGeometry)
- {
- const float radius = 1.5f;
- const float height = 7.5f;
- const AZ::Transform transform(AZ::Vector3(3.0f, 3.0f, 5.0f), AZ::Quaternion(0.5f, -0.5f, -0.5f, 0.5f), 1.5f);
- const AZ::Vector3 positionOffset(0.5f, 1.5f, -2.5f);
- const AZ::Quaternion rotationOffset(0.3f, -0.1f, -0.3f, 0.9f);
- EntityPtr editorEntity = CreateCylinderPrimitiveColliderEditorEntity(radius, height, transform, positionOffset, rotationOffset);
- const AZ::Aabb aabb = GetSimulatedBodyAabb(editorEntity->GetId());
- // use a relatively large tolerance, because the cylinder will be a convex approximation rather than an exact primitive
- EXPECT_THAT(aabb.GetMin(), UnitTest::IsCloseTolerance(AZ::Vector3(0.9f, -1.9f, 2.6f), 0.1f));
- EXPECT_THAT(aabb.GetMax(), UnitTest::IsCloseTolerance(AZ::Vector3(12.6f, 6.4f, 11.9f), 0.1f));
- }
- TEST_F(PhysXEditorFixture, EditorColliderComponent_CylinderWithOffset_CorrectEditorDynamicBodyGeometry)
- {
- const float radius = 3.0f;
- const float height = 11.0f;
- const AZ::Transform transform(AZ::Vector3(5.0f, 6.0f, 7.0f), AZ::Quaternion(0.1f, 0.5f, -0.7f, 0.5f), 1.0f);
- const AZ::Vector3 positionOffset(-6.0f, -4.0f, -2.0f);
- const AZ::Quaternion rotationOffset(0.4f, 0.8f, 0.2f, 0.4f);
- EntityPtr editorEntity = CreateCylinderPrimitiveColliderEditorEntity(
- radius, height, transform, positionOffset, rotationOffset, AZStd::nullopt, RigidBodyType::Dynamic);
- const AZ::Aabb aabb = GetSimulatedBodyAabb(editorEntity->GetId());
- // use a relatively large tolerance, because the cylinder will be a convex approximation rather than an exact primitive
- EXPECT_THAT(aabb.GetMin(), UnitTest::IsCloseTolerance(AZ::Vector3(-1.7f, 8.2f, 6.1f), 0.1f));
- EXPECT_THAT(aabb.GetMax(), UnitTest::IsCloseTolerance(AZ::Vector3(9.6f, 14.2f, 18.5f), 0.1f));
- }
- TEST_F(PhysXEditorFixture, EditorColliderComponent_CylinderWithOffset_CorrectRuntimeStaticBodyGeometry)
- {
- const float radius = 0.5f;
- const float height = 4.0f;
- const AZ::Transform transform(AZ::Vector3(3.0f, 5.0f, -9.0f), AZ::Quaternion(0.7f, -0.1f, 0.1f, 0.7f), 0.5f);
- const AZ::Vector3 positionOffset(2.0f, 5.0f, 6.0f);
- const AZ::Quaternion rotationOffset(-0.9f, 0.1f, -0.3f, 0.3f);
- EntityPtr editorEntity = CreateCylinderPrimitiveColliderEditorEntity(radius, height, transform, positionOffset, rotationOffset);
- EntityPtr gameEntity = CreateActiveGameEntityFromEditorEntity(editorEntity.get());
- const AZ::Aabb aabb = GetSimulatedBodyAabb(gameEntity->GetId());
- // use a relatively large tolerance, because the cylinder will be a convex approximation rather than an exact primitive
- EXPECT_THAT(aabb.GetMin(), UnitTest::IsCloseTolerance(AZ::Vector3(2.6f, 1.2f, -7.1f), 0.1f));
- EXPECT_THAT(aabb.GetMax(), UnitTest::IsCloseTolerance(AZ::Vector3(3.9f, 2.8f, -5.5f), 0.1f));
- }
- TEST_F(PhysXEditorFixture, EditorColliderComponent_CylinderWithOffset_CorrectRuntimeDynamicBodyGeometry)
- {
- const float radius = 1.0f;
- const float height = 5.5f;
- const AZ::Transform transform(AZ::Vector3(-4.0f, -1.0f, 2.0f), AZ::Quaternion(0.4f, 0.4f, -0.2f, 0.8f), 1.0f);
- const AZ::Vector3 positionOffset(3.0f, 4.0f, 5.0f);
- const AZ::Quaternion rotationOffset(-0.5f, -0.5f, -0.5f, 0.5f);
- EntityPtr editorEntity = CreateCylinderPrimitiveColliderEditorEntity(
- radius, height, transform, positionOffset, rotationOffset, AZStd::nullopt, RigidBodyType::Dynamic);
- EntityPtr gameEntity = CreateActiveGameEntityFromEditorEntity(editorEntity.get());
- const AZ::Aabb aabb = GetSimulatedBodyAabb(gameEntity->GetId());
- // use a relatively large tolerance, because the cylinder will be a convex approximation rather than an exact primitive
- EXPECT_THAT(aabb.GetMin(), UnitTest::IsCloseTolerance(AZ::Vector3(0.2f, -5.1f, 1.1f), 0.1f));
- EXPECT_THAT(aabb.GetMax(), UnitTest::IsCloseTolerance(AZ::Vector3(5.3f, -0.2f, 5.5f), 0.1f));
- }
- TEST_F(PhysXEditorFixture, EditorColliderComponent_CylinderWithOffsetAndNonUniformScale_CorrectEditorStaticBodyGeometry)
- {
- const float radius = 0.5f;
- const float height = 4.0f;
- const AZ::Transform transform(AZ::Vector3(4.0f, -3.0f, -2.0f), AZ::Quaternion(0.3f, 0.9f, -0.3f, 0.1f), 2.0f);
- const AZ::Vector3 positionOffset(0.5f, 0.2f, 0.3f);
- const AZ::Quaternion rotationOffset(0.5f, -0.5f, -0.5f, 0.5f);
- const AZ::Vector3 nonUniformScale(0.5f, 2.0f, 2.0f);
- EntityPtr editorEntity =
- CreateCylinderPrimitiveColliderEditorEntity(radius, height, transform, positionOffset, rotationOffset, nonUniformScale);
- const AZ::Aabb aabb = GetSimulatedBodyAabb(editorEntity->GetId());
- // use a relatively large tolerance, because the cylinder will be a convex approximation rather than an exact primitive
- EXPECT_THAT(aabb.GetMin(), UnitTest::IsCloseTolerance(AZ::Vector3(1.3f, -5.7f, -6.1f), 0.1f));
- EXPECT_THAT(aabb.GetMax(), UnitTest::IsCloseTolerance(AZ::Vector3(6.9f, -0.3f, -1.0f), 0.1f));
- }
- TEST_F(PhysXEditorFixture, EditorColliderComponent_CylinderWithOffsetAndNonUniformScale_CorrectEditorDynamicBodyGeometry)
- {
- const float radius = 1.5f;
- const float height = 9.0f;
- const AZ::Transform transform(AZ::Vector3(2.0f, 5.0f, -3.0f), AZ::Quaternion(0.7f, -0.1f, 0.1f, 0.7f), 0.5f);
- const AZ::Vector3 positionOffset(-1.0f, -1.0f, 0.5f);
- const AZ::Quaternion rotationOffset(0.9f, -0.3f, -0.3f, 0.1f);
- const AZ::Vector3 nonUniformScale(1.5f, 1.0f, 0.5f);
- EntityPtr editorEntity = CreateCylinderPrimitiveColliderEditorEntity(
- radius, height, transform, positionOffset, rotationOffset, nonUniformScale, RigidBodyType::Dynamic);
- const AZ::Aabb aabb = GetSimulatedBodyAabb(editorEntity->GetId());
- // use a relatively large tolerance, because the cylinder will be a convex approximation rather than an exact primitive
- EXPECT_THAT(aabb.GetMin(), UnitTest::IsCloseTolerance(AZ::Vector3(-1.4f, 3.8f, -5.0f), 0.1f));
- EXPECT_THAT(aabb.GetMax(), UnitTest::IsCloseTolerance(AZ::Vector3(4.3f, 6.0f, -2.4f), 0.1f));
- }
- TEST_F(PhysXEditorFixture, EditorColliderComponent_CylinderWithOffsetAndNonUniformScale_CorrectRuntimeStaticBodyGeometry)
- {
- const float radius = 1.0f;
- const float height = 5.0f;
- const AZ::Transform transform(AZ::Vector3(5.0f, 4.0f, 2.0f), AZ::Quaternion(0.4f, 0.4f, -0.8f, 0.2f), 0.8f);
- const AZ::Vector3 positionOffset(2.0f, 1.0f, -2.0f);
- const AZ::Quaternion rotationOffset(0.7f, -0.1f, -0.5f, 0.5f);
- const AZ::Vector3 nonUniformScale(3.0f, 1.0f, 2.0f);
- EntityPtr editorEntity =
- CreateCylinderPrimitiveColliderEditorEntity(radius, height, transform, positionOffset, rotationOffset, nonUniformScale);
- EntityPtr gameEntity = CreateActiveGameEntityFromEditorEntity(editorEntity.get());
- const AZ::Aabb aabb = GetSimulatedBodyAabb(gameEntity->GetId());
- // use a relatively large tolerance, because the cylinder will be a convex approximation rather than an exact primitive
- EXPECT_THAT(aabb.GetMin(), UnitTest::IsCloseTolerance(AZ::Vector3(0.6f, 4.0f, -8.8f), 0.1f));
- EXPECT_THAT(aabb.GetMax(), UnitTest::IsCloseTolerance(AZ::Vector3(7.8f, 8.1f, 2.1f), 0.1f));
- }
- TEST_F(PhysXEditorFixture, EditorColliderComponent_CylinderWithOffsetAndNonUniformScale_CorrectRuntimeDynamicBodyGeometry)
- {
- const float radius = 2.0f;
- const float height = 7.0f;
- const AZ::Transform transform(AZ::Vector3(-2.0f, -3.0f, -6.0f), AZ::Quaternion(0.1f, 0.5f, -0.7f, 0.5f), 3.0f);
- const AZ::Vector3 positionOffset(-1.0, 0.5f, -2.0f);
- const AZ::Quaternion rotationOffset(0.2f, -0.4f, 0.8f, 0.4f);
- const AZ::Vector3 nonUniformScale(2.0f, 2.0f, 5.0f);
- EntityPtr editorEntity = CreateCylinderPrimitiveColliderEditorEntity(
- radius, height, transform, positionOffset, rotationOffset, nonUniformScale, RigidBodyType::Dynamic);
- EntityPtr gameEntity = CreateActiveGameEntityFromEditorEntity(editorEntity.get());
- const AZ::Aabb aabb = GetSimulatedBodyAabb(gameEntity->GetId());
- // use a relatively large tolerance, because the cylinder will be a convex approximation rather than an exact primitive
- EXPECT_THAT(aabb.GetMin(), UnitTest::IsCloseTolerance(AZ::Vector3(-25.0f, -20.8f, -53.9f), 0.1f));
- EXPECT_THAT(aabb.GetMax(), UnitTest::IsCloseTolerance(AZ::Vector3(10.0f, 70.0f, 17.2f), 0.1f));
- }
- } // namespace PhysXEditorTests
|