From c7b3a06c6b6983b97c09eb490845599fa6d31354 Mon Sep 17 00:00:00 2001 From: greerdv Date: Fri, 9 Jul 2021 19:24:09 +0100 Subject: [PATCH 1/2] expose scene queries to lua Signed-off-by: greerdv --- .../AzCore/AzCore/Script/ScriptContext.cpp | 1 + .../Physics/Common/PhysicsSceneQueries.cpp | 76 ++++ .../AzFramework/Physics/PhysicsScene.cpp | 1 + .../AzFramework/Physics/PhysicsSystem.cpp | 18 +- .../Physics/ShapeConfiguration.cpp | 9 + Gems/PhysX/Code/Source/Scene/PhysXScene.cpp | 4 + Gems/PhysX/Code/Tests/PhysXScriptTest.cpp | 391 +++++++++++++++++- 7 files changed, 495 insertions(+), 5 deletions(-) diff --git a/Code/Framework/AzCore/AzCore/Script/ScriptContext.cpp b/Code/Framework/AzCore/AzCore/Script/ScriptContext.cpp index 84988d23c3..6e57deed74 100644 --- a/Code/Framework/AzCore/AzCore/Script/ScriptContext.cpp +++ b/Code/Framework/AzCore/AzCore/Script/ScriptContext.cpp @@ -3252,6 +3252,7 @@ LUA_API const Node* lua_getDummyNode() else if (Internal::LuaScriptNumber::FromStack(param, result)) return result; else if (Internal::LuaScriptNumber::FromStack(param, result)) return result; else if (Internal::LuaScriptNumber::FromStack(param, result)) return result; + else if (Internal::LuaScriptNumber::FromStack(param, result)) return result; else if (Internal::LuaScriptNumber::FromStack(param, result)) return result; else if (Internal::LuaScriptNumber::FromStack(param, result)) return result; else if (Internal::LuaScriptNumber::FromStack(param, result)) return result; diff --git a/Code/Framework/AzFramework/AzFramework/Physics/Common/PhysicsSceneQueries.cpp b/Code/Framework/AzFramework/AzFramework/Physics/Common/PhysicsSceneQueries.cpp index 3ccf093e4f..51202a235d 100644 --- a/Code/Framework/AzFramework/AzFramework/Physics/Common/PhysicsSceneQueries.cpp +++ b/Code/Framework/AzFramework/AzFramework/Physics/Common/PhysicsSceneQueries.cpp @@ -136,6 +136,7 @@ namespace AzPhysics ->Property("Distance", BehaviorValueProperty(&RayCastRequest::m_distance)) ->Property("Start", BehaviorValueProperty(&RayCastRequest::m_start)) ->Property("Direction", BehaviorValueProperty(&RayCastRequest::m_direction)) + ->Property("ReportMultipleHits", BehaviorValueProperty(&RayCastRequest::m_reportMultipleHits)) ; } } @@ -153,6 +154,45 @@ namespace AzPhysics ->Field("ReportMultipleHits", &ShapeCastRequest::m_reportMultipleHits) ; } + + if (auto* behaviorContext = azdynamic_cast(context)) + { + behaviorContext->Class("ShapeCastRequest") + ->Attribute(AZ::Script::Attributes::Scope, AZ::Script::Attributes::ScopeFlags::Common) + ->Attribute(AZ::Script::Attributes::Module, "physics") + ->Attribute(AZ::Script::Attributes::Category, "PhysX") + ->Property("Distance", BehaviorValueProperty(&ShapeCastRequest::m_distance)) + ->Property("Start", BehaviorValueProperty(&ShapeCastRequest::m_start)) + ->Property("Direction", BehaviorValueProperty(&ShapeCastRequest::m_direction)) + ; + + behaviorContext->Method( + "CreateSphereCastRequest", + [](float radius, const AZ::Transform& startPose, const AZ::Vector3& direction, float distance, + SceneQuery::QueryType queryType, CollisionGroup collisionGroup) + { + return ShapeCastRequestHelpers::CreateSphereCastRequest( + radius, startPose, direction, distance, queryType, collisionGroup, nullptr); + }); + + behaviorContext->Method( + "CreateBoxCastRequest", + [](const AZ::Vector3& boxDimensions, const AZ::Transform& startPose, const AZ::Vector3& direction, float distance, + SceneQuery::QueryType queryType, CollisionGroup collisionGroup) + { + return ShapeCastRequestHelpers::CreateBoxCastRequest( + boxDimensions, startPose, direction, distance, queryType, collisionGroup, nullptr); + }); + + behaviorContext->Method( + "CreateCapsuleCastRequest", + [](float capsuleRadius, float capsuleHeight, const AZ::Transform& startPose, const AZ::Vector3& direction, float distance, + SceneQuery::QueryType queryType, CollisionGroup collisionGroup) + { + return ShapeCastRequestHelpers::CreateCapsuleCastRequest( + capsuleRadius, capsuleHeight, startPose, direction, distance, queryType, collisionGroup, nullptr); + }); + } } namespace ShapeCastRequestHelpers @@ -219,6 +259,42 @@ namespace AzPhysics ->Field("ShapeConfiguration", &OverlapRequest::m_shapeConfiguration) ; } + + if (auto* behaviorContext = azdynamic_cast(context)) + { + behaviorContext->Class("OverlapRequest") + ->Attribute(AZ::Script::Attributes::Scope, AZ::Script::Attributes::ScopeFlags::Common) + ->Attribute(AZ::Script::Attributes::Module, "physics") + ->Attribute(AZ::Script::Attributes::Category, "PhysX") + ->Property("Pose", BehaviorValueProperty(&OverlapRequest::m_pose)) + ; + + behaviorContext->Method( + "CreateSphereOverlapRequest", + [](float radius, const AZ::Transform& pose) + { + return OverlapRequestHelpers::CreateSphereOverlapRequest( + radius, pose, nullptr); + }); + + behaviorContext->Method( + "CreateBoxOverlapRequest", + [](const AZ::Vector3& boxDimensions, const AZ::Transform& pose) + { + return OverlapRequestHelpers::CreateBoxOverlapRequest( + boxDimensions, pose, nullptr); + }); + + behaviorContext->Method( + "CreateCapsuleOverlapRequest", + [](float height, float radius, const AZ::Transform& pose) + { + return OverlapRequestHelpers::CreateCapsuleOverlapRequest( + height, radius, pose, nullptr); + }); + + + } } namespace OverlapRequestHelpers diff --git a/Code/Framework/AzFramework/AzFramework/Physics/PhysicsScene.cpp b/Code/Framework/AzFramework/AzFramework/Physics/PhysicsScene.cpp index 7840d10a6c..1b8117bd3e 100644 --- a/Code/Framework/AzFramework/AzFramework/Physics/PhysicsScene.cpp +++ b/Code/Framework/AzFramework/AzFramework/Physics/PhysicsScene.cpp @@ -48,6 +48,7 @@ namespace AzPhysics ->Attribute(AZ::Script::Attributes::Category, "Physics") ->Method("GetOnGravityChangeEvent", getOnGravityChange) ->Attribute(AZ::Script::Attributes::AzEventDescription, gravityChangedEventDescription) + ->Method("QueryScene", &Scene::QueryScene) ; } } diff --git a/Code/Framework/AzFramework/AzFramework/Physics/PhysicsSystem.cpp b/Code/Framework/AzFramework/AzFramework/Physics/PhysicsSystem.cpp index 4d41ab13b4..06f1802cc9 100644 --- a/Code/Framework/AzFramework/AzFramework/Physics/PhysicsSystem.cpp +++ b/Code/Framework/AzFramework/AzFramework/Physics/PhysicsSystem.cpp @@ -41,7 +41,7 @@ namespace AzPhysics {"Tick time"} // Parameters }; - behaviorContext->Class("System Interface") + behaviorContext->Class("PhysicsSystemInterface") ->Attribute(AZ::Script::Attributes::Scope, AZ::Script::Attributes::ScopeFlags::Common) ->Attribute(AZ::Script::Attributes::Module, "physics") ->Attribute(AZ::Script::Attributes::Category, "PhysX") @@ -49,7 +49,21 @@ namespace AzPhysics ->Attribute(AZ::Script::Attributes::AzEventDescription, presimulateEventDescription) ->Method("GetOnPostsimulateEvent", getOnPostsimulateEvent) ->Attribute(AZ::Script::Attributes::AzEventDescription, postsimulateEventDescription) - ; + ->Method("GetSceneHandle", &SystemInterface::GetSceneHandle) + ->Method("GetScene", &SystemInterface::GetScene); + + behaviorContext->Method( + "GetPhysicsSystem", + []() + { + return AZ::Interface::Get(); + }); + + behaviorContext + ->Constant("DefaultPhysicsSceneName", BehaviorConstant(DefaultPhysicsSceneName)) + ->Constant("DefaultPhysicsSceneId", BehaviorConstant(DefaultPhysicsSceneId)) + ->Constant("EditorPhysicsSceneName", BehaviorConstant(EditorPhysicsSceneName)) + ->Constant("EditorPhysicsSceneId", BehaviorConstant(EditorPhysicsSceneId)); } } } // namespace AzPhysics diff --git a/Code/Framework/AzFramework/AzFramework/Physics/ShapeConfiguration.cpp b/Code/Framework/AzFramework/AzFramework/Physics/ShapeConfiguration.cpp index a122b48d91..a260b6b187 100644 --- a/Code/Framework/AzFramework/AzFramework/Physics/ShapeConfiguration.cpp +++ b/Code/Framework/AzFramework/AzFramework/Physics/ShapeConfiguration.cpp @@ -63,6 +63,15 @@ namespace Physics ; } } + + if (auto behaviorContext = azrtti_cast(context)) + { + behaviorContext->Class() + ->Attribute(AZ::Script::Attributes::Scope, AZ::Script::Attributes::ScopeFlags::Common) + ->Attribute(AZ::Script::Attributes::Module, "physics") + ->Attribute(AZ::Script::Attributes::Category, "PhysX") + ->Property("Radius", BehaviorValueProperty(&SphereShapeConfiguration::m_radius)); + } } SphereShapeConfiguration::SphereShapeConfiguration(float radius) diff --git a/Gems/PhysX/Code/Source/Scene/PhysXScene.cpp b/Gems/PhysX/Code/Source/Scene/PhysXScene.cpp index 81010a6db6..7dfa9c5f78 100644 --- a/Gems/PhysX/Code/Source/Scene/PhysXScene.cpp +++ b/Gems/PhysX/Code/Source/Scene/PhysXScene.cpp @@ -491,6 +491,10 @@ namespace PhysX { m_physicsSystemConfigChanged.Disconnect(); + s_overlapBuffer.swap({}); + s_rayCastBuffer.swap({}); + s_sweepBuffer.swap({}); + for (auto& simulatedBody : m_simulatedBodies) { if (simulatedBody.second != nullptr) diff --git a/Gems/PhysX/Code/Tests/PhysXScriptTest.cpp b/Gems/PhysX/Code/Tests/PhysXScriptTest.cpp index 40213dedcf..c8e366443b 100644 --- a/Gems/PhysX/Code/Tests/PhysXScriptTest.cpp +++ b/Gems/PhysX/Code/Tests/PhysXScriptTest.cpp @@ -19,6 +19,10 @@ #include #include +#include +#include +#include + namespace PhysX { static AZStd::map s_testEntities; @@ -87,7 +91,7 @@ namespace PhysX AZStd::unique_ptr m_scriptContext; }; - TEST_F(PhysXScriptTest, ScriptedRaycast_RaycastNotIntersectingBox_ReturnsNoHits) + TEST_F(PhysXScriptTest, SimulatedBodyRaycast_RaycastNotIntersectingBox_ReturnsNoHits) { s_testEntities.insert( { @@ -109,7 +113,7 @@ namespace PhysX EXPECT_TRUE(GetScriptContext()->Execute(luaCode)); } - TEST_F(PhysXScriptTest, ScriptedRaycast_RaycastIntersectingBox_ReturnsHitOnBox) + TEST_F(PhysXScriptTest, SimulatedBodyRaycast_RaycastIntersectingBox_ReturnsHitOnBox) { s_testEntities.insert( { @@ -131,7 +135,7 @@ namespace PhysX EXPECT_TRUE(GetScriptContext()->Execute(luaCode)); } - TEST_F(PhysXScriptTest, ScriptedRaycast_RaycastNotInteractingCollisionFilters_ReturnsNoHit) + TEST_F(PhysXScriptTest, SimulatedBodyRaycast_RaycastNotInteractingCollisionFilters_ReturnsNoHit) { s_testEntities.insert( { @@ -153,4 +157,385 @@ namespace PhysX EXPECT_TRUE(GetScriptContext()->Execute(luaCode)); } + + TEST_F(PhysXScriptTest, SceneRayCast_RaycastNotIntersectingBox_ReturnsNoHits) + { + s_testEntities.insert( + { + "Box", + TestUtils::AddStaticUnitTestObject(GetDefaultSceneHandle(), AZ::Vector3::CreateZero(), "Box") + }); + + const char luaCode[] = + R"( + physicsSystem = GetPhysicsSystem() + sceneHandle = physicsSystem:GetSceneHandle(DefaultPhysicsSceneName) + scene = physicsSystem:GetScene(sceneHandle) + request = RayCastRequest() + request.Start = Vector3(5.0, 0.0, 5.0) + request.Direction = Vector3(0.0, 0.0, -1.0) + request.Distance = 10.0 + hits = scene:QueryScene(request) + ExpectTrue(hits.HitArray:Size() == 0) + )"; + + EXPECT_TRUE(GetScriptContext()->Execute(luaCode)); + } + + TEST_F(PhysXScriptTest, SceneRayCast_RaycastIntersectingBox_ReturnsHitOnBox) + { + s_testEntities.insert( + { + "Box", + TestUtils::AddStaticUnitTestObject(GetDefaultSceneHandle(), AZ::Vector3::CreateZero(), "Box") + }); + + const char luaCode[] = + R"( + boxId = GetTestEntityId("Box") + physicsSystem = GetPhysicsSystem() + sceneHandle = physicsSystem:GetSceneHandle(DefaultPhysicsSceneName) + scene = physicsSystem:GetScene(sceneHandle) + request = RayCastRequest() + request.Start = Vector3(0.0, 0.0, 5.0) + request.Direction = Vector3(0.0, 0.0, -1.0) + request.Distance = 10.0 + hits = scene:QueryScene(request) + ExpectTrue(hits.HitArray:Size() == 1) + hit = hits.HitArray[1] -- lua uses 1-indexing + ExpectTrue(hit.EntityId == boxId) + )"; + + EXPECT_TRUE(GetScriptContext()->Execute(luaCode)); + } + + TEST_F(PhysXScriptTest, SceneRayCast_MultipleHitRaycastIntersectingBoxes_ReturnsMultipleHits) + { + s_testEntities.insert( + { + "Box1", + TestUtils::AddStaticUnitTestObject(GetDefaultSceneHandle(), AZ::Vector3::CreateZero(), "Box1") + }); + s_testEntities.insert( + { + "Box2", + TestUtils::AddStaticUnitTestObject(GetDefaultSceneHandle(), AZ::Vector3::CreateAxisZ(-5.0f), "Box2") + }); + + const char luaCode[] = + R"( + box1Id = GetTestEntityId("Box1") + box2Id = GetTestEntityId("Box2") + physicsSystem = GetPhysicsSystem() + sceneHandle = physicsSystem:GetSceneHandle(DefaultPhysicsSceneName) + scene = physicsSystem:GetScene(sceneHandle) + request = RayCastRequest() + request.Start = Vector3(0.0, 0.0, 5.0) + request.Direction = Vector3(0.0, 0.0, -1.0) + request.Distance = 10.0 + request.ReportMultipleHits = true + hits = scene:QueryScene(request) + numHits = hits.HitArray:Size() + box1Hit = false + box2Hit = false + for hitIndex = 1, numHits do + box1Hit = box1Hit or hits.HitArray[hitIndex].EntityId == box1Id + box2Hit = box2Hit or hits.HitArray[hitIndex].EntityId == box2Id + end + ExpectTrue(box1Hit) + ExpectTrue(box2Hit) + )"; + + EXPECT_TRUE(GetScriptContext()->Execute(luaCode)); + } + + TEST_F(PhysXScriptTest, SceneRaycast_RaycastNotInteractingCollisionFilters_ReturnsNoHits) + { + s_testEntities.insert( + { + "Box", + TestUtils::AddStaticUnitTestObject(GetDefaultSceneHandle(), AZ::Vector3::CreateZero(), "Box") + }); + + const char luaCode[] = + R"( + physicsSystem = GetPhysicsSystem() + sceneHandle = physicsSystem:GetSceneHandle(DefaultPhysicsSceneName) + scene = physicsSystem:GetScene(sceneHandle) + request = RayCastRequest() + request.Start = Vector3(0.0, 0.0, 5.0) + request.Direction = Vector3(0.0, 0.0, -1.0) + request.Distance = 10.0 + request.Collision = CollisionGroup("None") + hits = scene:QueryScene(request) + ExpectTrue(hits.HitArray:Size() == 0) + )"; + + EXPECT_TRUE(GetScriptContext()->Execute(luaCode)); + } + + TEST_F(PhysXScriptTest, BoxCast_NotIntersectingBox_ReturnsNoHits) + { + s_testEntities.insert( + { + "Box", + TestUtils::AddStaticUnitTestObject(GetDefaultSceneHandle(), AZ::Vector3::CreateZero(), "Box") + }); + + const char luaCode[] = + R"( + physicsSystem = GetPhysicsSystem() + sceneHandle = physicsSystem:GetSceneHandle(DefaultPhysicsSceneName) + scene = physicsSystem:GetScene(sceneHandle) + + boxDimensions = Vector3(1.0, 1.0, 1.0) + startPose = Transform.CreateTranslation(Vector3(0.0, 0.0, 5.0)) + direction = Vector3(-1.0, 0.0, 0.0) + distance = 10.0 + queryType = 0 + collisionGroup = CollisionGroup("All") + request = CreateBoxCastRequest(boxDimensions, startPose, direction, distance, queryType, collisionGroup) + + hits = scene:QueryScene(request) + ExpectTrue(hits.HitArray:Size() == 0) + )"; + + EXPECT_TRUE(GetScriptContext()->Execute(luaCode)); + } + + TEST_F(PhysXScriptTest, BoxCast_IntersectingBox_ReturnsHitOnBox) + { + s_testEntities.insert( + { + "Box", + TestUtils::AddStaticUnitTestObject(GetDefaultSceneHandle(), AZ::Vector3::CreateZero(), "Box") + }); + + const char luaCode[] = + R"( + boxId = GetTestEntityId("Box") + physicsSystem = GetPhysicsSystem() + sceneHandle = physicsSystem:GetSceneHandle(DefaultPhysicsSceneName) + scene = physicsSystem:GetScene(sceneHandle) + + boxDimensions = Vector3(1.0, 1.0, 1.0) + startPose = Transform.CreateTranslation(Vector3(0.0, 0.0, 5.0)) + direction = Vector3(0.0, 0.0, -1.0) + distance = 10.0 + queryType = 0 + collisionGroup = CollisionGroup("All") + request = CreateBoxCastRequest(boxDimensions, startPose, direction, distance, queryType, collisionGroup) + + hits = scene:QueryScene(request) + ExpectTrue(hits.HitArray:Size() == 1) + hit = hits.HitArray[1] -- lua uses 1-indexing + ExpectTrue(hit.EntityId == boxId) + )"; + + EXPECT_TRUE(GetScriptContext()->Execute(luaCode)); + } + + TEST_F(PhysXScriptTest, BoxCast_NotInteractingCollisionFilters_ReturnsNoHits) + { + s_testEntities.insert( + { + "Box", + TestUtils::AddStaticUnitTestObject(GetDefaultSceneHandle(), AZ::Vector3::CreateZero(), "Box") + }); + + const char luaCode[] = + R"( + physicsSystem = GetPhysicsSystem() + sceneHandle = physicsSystem:GetSceneHandle(DefaultPhysicsSceneName) + scene = physicsSystem:GetScene(sceneHandle) + + boxDimensions = Vector3(1.0, 1.0, 1.0) + startPose = Transform.CreateTranslation(Vector3(0.0, 0.0, 5.0)) + direction = Vector3(0.0, 0.0, -1.0) + distance = 10.0 + queryType = 0 + collisionGroup = CollisionGroup("None") + request = CreateBoxCastRequest(boxDimensions, startPose, direction, distance, queryType, collisionGroup) + + hits = scene:QueryScene(request) + ExpectTrue(hits.HitArray:Size() == 0) + )"; + + EXPECT_TRUE(GetScriptContext()->Execute(luaCode)); + } + + TEST_F(PhysXScriptTest, SphereCast_IntersectingBox_ReturnsHitOnBox) + { + s_testEntities.insert( + { + "Box", + TestUtils::AddStaticUnitTestObject(GetDefaultSceneHandle(), AZ::Vector3::CreateZero(), "Box") + }); + + const char luaCode[] = + R"( + boxId = GetTestEntityId("Box") + physicsSystem = GetPhysicsSystem() + sceneHandle = physicsSystem:GetSceneHandle(DefaultPhysicsSceneName) + scene = physicsSystem:GetScene(sceneHandle) + + radius = 2.0 + startPose = Transform.CreateTranslation(Vector3(0.0, 0.0, 5.0)) + direction = Vector3(0.0, 0.0, -1.0) + distance = 10.0 + queryType = 0 + collisionGroup = CollisionGroup("All") + request = CreateSphereCastRequest(radius, startPose, direction, distance, queryType, collisionGroup) + + hits = scene:QueryScene(request) + ExpectTrue(hits.HitArray:Size() == 1) + hit = hits.HitArray[1] -- lua uses 1-indexing + ExpectTrue(hit.EntityId == boxId) + )"; + + EXPECT_TRUE(GetScriptContext()->Execute(luaCode)); + } + + TEST_F(PhysXScriptTest, CapsuleCast_IntersectingBox_ReturnsHitOnBox) + { + s_testEntities.insert( + { + "Box", + TestUtils::AddStaticUnitTestObject(GetDefaultSceneHandle(), AZ::Vector3::CreateZero(), "Box") + }); + + const char luaCode[] = + R"( + boxId = GetTestEntityId("Box") + physicsSystem = GetPhysicsSystem() + sceneHandle = physicsSystem:GetSceneHandle(DefaultPhysicsSceneName) + scene = physicsSystem:GetScene(sceneHandle) + + radius = 0.5 + height = 2.0 + startPose = Transform.CreateTranslation(Vector3(0.0, 0.0, 5.0)) + direction = Vector3(0.0, 0.0, -1.0) + distance = 10.0 + queryType = 0 + collisionGroup = CollisionGroup("All") + request = CreateCapsuleCastRequest(radius, height, startPose, direction, distance, queryType, collisionGroup) + + hits = scene:QueryScene(request) + ExpectTrue(hits.HitArray:Size() == 1) + hit = hits.HitArray[1] -- lua uses 1-indexing + ExpectTrue(hit.EntityId == boxId) + )"; + + EXPECT_TRUE(GetScriptContext()->Execute(luaCode)); + } + + TEST_F(PhysXScriptTest, BoxOverlap_NotIntersectingBox_ReturnsNoHits) + { + s_testEntities.insert( + { + "Box", + TestUtils::AddStaticUnitTestObject(GetDefaultSceneHandle(), AZ::Vector3::CreateZero(), "Box") + }); + + const char luaCode[] = + R"( + physicsSystem = GetPhysicsSystem() + sceneHandle = physicsSystem:GetSceneHandle(DefaultPhysicsSceneName) + scene = physicsSystem:GetScene(sceneHandle) + + boxDimensions = Vector3(1.0, 1.0, 1.0) + pose = Transform.CreateTranslation(Vector3(0.0, 0.0, 5.0)) + request = CreateBoxOverlapRequest(boxDimensions, pose) + + hits = scene:QueryScene(request) + ExpectTrue(hits.HitArray:Size() == 0) + )"; + + EXPECT_TRUE(GetScriptContext()->Execute(luaCode)); + } + + TEST_F(PhysXScriptTest, BoxOverlap_IntersectingBox_ReturnsHitOnBox) + { + s_testEntities.insert( + { + "Box", + TestUtils::AddStaticUnitTestObject(GetDefaultSceneHandle(), AZ::Vector3::CreateZero(), "Box") + }); + + const char luaCode[] = + R"( + boxId = GetTestEntityId("Box") + physicsSystem = GetPhysicsSystem() + sceneHandle = physicsSystem:GetSceneHandle(DefaultPhysicsSceneName) + scene = physicsSystem:GetScene(sceneHandle) + + boxDimensions = Vector3(1.0, 1.0, 1.0) + pose = Transform.CreateTranslation(Vector3(0.0, 0.0, 0.0)) + request = CreateBoxOverlapRequest(boxDimensions, pose) + + hits = scene:QueryScene(request) + ExpectTrue(hits.HitArray:Size() == 1) + hit = hits.HitArray[1] -- lua uses 1-indexing + ExpectTrue(hit.EntityId == boxId) + )"; + + EXPECT_TRUE(GetScriptContext()->Execute(luaCode)); + } + + TEST_F(PhysXScriptTest, SphereOverlap_IntersectingBox_ReturnsHitOnBox) + { + s_testEntities.insert( + { + "Box", + TestUtils::AddStaticUnitTestObject(GetDefaultSceneHandle(), AZ::Vector3::CreateZero(), "Box") + }); + + const char luaCode[] = + R"( + boxId = GetTestEntityId("Box") + physicsSystem = GetPhysicsSystem() + sceneHandle = physicsSystem:GetSceneHandle(DefaultPhysicsSceneName) + scene = physicsSystem:GetScene(sceneHandle) + + radius = 0.5 + pose = Transform.CreateTranslation(Vector3(0.0, 0.0, 0.0)) + request = CreateSphereOverlapRequest(radius, pose) + + hits = scene:QueryScene(request) + ExpectTrue(hits.HitArray:Size() == 1) + hit = hits.HitArray[1] -- lua uses 1-indexing + ExpectTrue(hit.EntityId == boxId) + )"; + + EXPECT_TRUE(GetScriptContext()->Execute(luaCode)); + } + + TEST_F(PhysXScriptTest, CapsuleOverlap_IntersectingBox_ReturnsHitOnBox) + { + s_testEntities.insert( + { + "Box", + TestUtils::AddStaticUnitTestObject(GetDefaultSceneHandle(), AZ::Vector3::CreateZero(), "Box") + }); + + const char luaCode[] = + R"( + boxId = GetTestEntityId("Box") + physicsSystem = GetPhysicsSystem() + sceneHandle = physicsSystem:GetSceneHandle(DefaultPhysicsSceneName) + scene = physicsSystem:GetScene(sceneHandle) + + height = 2.0 + radius = 0.5 + pose = Transform.CreateTranslation(Vector3(0.0, 0.0, 0.0)) + request = CreateCapsuleOverlapRequest(height, radius, pose) + + hits = scene:QueryScene(request) + ExpectTrue(hits.HitArray:Size() == 1) + hit = hits.HitArray[1] -- lua uses 1-indexing + ExpectTrue(hit.EntityId == boxId) + )"; + + EXPECT_TRUE(GetScriptContext()->Execute(luaCode)); + } } // namespace PhysX From 08c3bb6bd76a24113961f59535705f6a2b719650 Mon Sep 17 00:00:00 2001 From: greerdv Date: Fri, 9 Jul 2021 19:39:07 +0100 Subject: [PATCH 2/2] some tidying up Signed-off-by: greerdv --- .../AzFramework/Physics/Common/PhysicsSceneQueries.cpp | 2 -- .../AzFramework/Physics/ShapeConfiguration.cpp | 9 --------- Gems/PhysX/Code/Tests/PhysXScriptTest.cpp | 10 +++------- 3 files changed, 3 insertions(+), 18 deletions(-) diff --git a/Code/Framework/AzFramework/AzFramework/Physics/Common/PhysicsSceneQueries.cpp b/Code/Framework/AzFramework/AzFramework/Physics/Common/PhysicsSceneQueries.cpp index 51202a235d..02597123db 100644 --- a/Code/Framework/AzFramework/AzFramework/Physics/Common/PhysicsSceneQueries.cpp +++ b/Code/Framework/AzFramework/AzFramework/Physics/Common/PhysicsSceneQueries.cpp @@ -292,8 +292,6 @@ namespace AzPhysics return OverlapRequestHelpers::CreateCapsuleOverlapRequest( height, radius, pose, nullptr); }); - - } } diff --git a/Code/Framework/AzFramework/AzFramework/Physics/ShapeConfiguration.cpp b/Code/Framework/AzFramework/AzFramework/Physics/ShapeConfiguration.cpp index a260b6b187..a122b48d91 100644 --- a/Code/Framework/AzFramework/AzFramework/Physics/ShapeConfiguration.cpp +++ b/Code/Framework/AzFramework/AzFramework/Physics/ShapeConfiguration.cpp @@ -63,15 +63,6 @@ namespace Physics ; } } - - if (auto behaviorContext = azrtti_cast(context)) - { - behaviorContext->Class() - ->Attribute(AZ::Script::Attributes::Scope, AZ::Script::Attributes::ScopeFlags::Common) - ->Attribute(AZ::Script::Attributes::Module, "physics") - ->Attribute(AZ::Script::Attributes::Category, "PhysX") - ->Property("Radius", BehaviorValueProperty(&SphereShapeConfiguration::m_radius)); - } } SphereShapeConfiguration::SphereShapeConfiguration(float radius) diff --git a/Gems/PhysX/Code/Tests/PhysXScriptTest.cpp b/Gems/PhysX/Code/Tests/PhysXScriptTest.cpp index c8e366443b..d2d5b664d2 100644 --- a/Gems/PhysX/Code/Tests/PhysXScriptTest.cpp +++ b/Gems/PhysX/Code/Tests/PhysXScriptTest.cpp @@ -19,10 +19,6 @@ #include #include -#include -#include -#include - namespace PhysX { static AZStd::map s_testEntities; @@ -135,7 +131,7 @@ namespace PhysX EXPECT_TRUE(GetScriptContext()->Execute(luaCode)); } - TEST_F(PhysXScriptTest, SimulatedBodyRaycast_RaycastNotInteractingCollisionFilters_ReturnsNoHit) + TEST_F(PhysXScriptTest, SimulatedBodyRaycast_RaycastNonInteractingCollisionFilters_ReturnsNoHits) { s_testEntities.insert( { @@ -249,7 +245,7 @@ namespace PhysX EXPECT_TRUE(GetScriptContext()->Execute(luaCode)); } - TEST_F(PhysXScriptTest, SceneRaycast_RaycastNotInteractingCollisionFilters_ReturnsNoHits) + TEST_F(PhysXScriptTest, SceneRaycast_RaycastNonInteractingCollisionFilters_ReturnsNoHits) { s_testEntities.insert( { @@ -335,7 +331,7 @@ namespace PhysX EXPECT_TRUE(GetScriptContext()->Execute(luaCode)); } - TEST_F(PhysXScriptTest, BoxCast_NotInteractingCollisionFilters_ReturnsNoHits) + TEST_F(PhysXScriptTest, BoxCast_NonInteractingCollisionFilters_ReturnsNoHits) { s_testEntities.insert( {