RemoveSimulatedBody automatically updates the requested handle to be invalid once removed. (#740)

This commit is contained in:
amzn-sean
2021-05-13 15:04:00 +01:00
committed by GitHub
parent a13c9e8d53
commit 7f79cc8796
21 changed files with 33 additions and 55 deletions
@@ -88,13 +88,13 @@ namespace AzPhysics
//! Remove a simulated body from the Scene.z
//! @param sceneHandle A handle to the scene to remove the requested simulated body.
//! @param bodyHandle A handle to the simulated body being removed.
virtual void RemoveSimulatedBody(SceneHandle sceneHandle, SimulatedBodyHandle bodyHandle) = 0;
//! @param bodyHandle A handle to the simulated body being removed. This will be set to AzPhysics::InvalidSimulatedBodyHandle as they're no longer valid.
virtual void RemoveSimulatedBody(SceneHandle sceneHandle, SimulatedBodyHandle& bodyHandle) = 0;
//! Remove a list of simulated bodies from the Scene.
//! @param sceneHandle A handle to the scene to remove the simulated bodies from.
//! @param bodyHandles A list of simulated body handles to be removed.
virtual void RemoveSimulatedBodies(SceneHandle sceneHandle, const SimulatedBodyHandleList& bodyHandles) = 0;
//! @param bodyHandles A list of simulated body handles to be removed. All handles will be set to AzPhysics::InvalidSimulatedBodyHandle as they're no longer valid.
virtual void RemoveSimulatedBodies(SceneHandle sceneHandle, SimulatedBodyHandleList& bodyHandles) = 0;
//! Enable / Disable simulation of the requested body. By default all bodies added are enabled.
//! Disabling simulation the body will no longer be affected by any forces, collisions, or found with scene queries.
@@ -286,12 +286,12 @@ namespace AzPhysics
virtual SimulatedBodyList GetSimulatedBodiesFromHandle(const SimulatedBodyHandleList& bodyHandles) = 0;
//! Remove a simulated body from the Scene.
//! @param bodyHandle A handle to the simulated body being removed.
virtual void RemoveSimulatedBody(SimulatedBodyHandle bodyHandle) = 0;
//! @param bodyHandle A handle to the simulated body being removed. This will be set to AzPhysics::InvalidSimulatedBodyHandle as they're no longer valid.
virtual void RemoveSimulatedBody(SimulatedBodyHandle& bodyHandle) = 0;
//! Remove a list of simulated bodies from the Scene.
//! @param bodyHandles A list of simulated body handles to be removed.
virtual void RemoveSimulatedBodies(const SimulatedBodyHandleList& bodyHandles) = 0;
//! @param bodyHandles A list of simulated body handles to be removed. All handles will be set to AzPhysics::InvalidSimulatedBodyHandle as they're no longer valid.
virtual void RemoveSimulatedBodies(SimulatedBodyHandleList& bodyHandles) = 0;
//! Enable / Disable simulation of the requested body. By default all bodies added are enabled.
//! Disabling simulation the body will no longer be affected by any forces, collisions, or found with scene queries.
@@ -92,10 +92,10 @@ namespace Physics
[[maybe_unused]] bool enable) override {}
void RemoveSimulatedBody(
[[maybe_unused]] AzPhysics::SceneHandle sceneHandle,
[[maybe_unused]] AzPhysics::SimulatedBodyHandle bodyHandle) override {}
[[maybe_unused]] AzPhysics::SimulatedBodyHandle& bodyHandle) override {}
void RemoveSimulatedBodies(
[[maybe_unused]] AzPhysics::SceneHandle sceneHandle,
[[maybe_unused]] const AzPhysics::SimulatedBodyHandleList& bodyHandles) override {}
[[maybe_unused]] AzPhysics::SimulatedBodyHandleList& bodyHandles) override {}
void EnableSimulationOfBody(
[[maybe_unused]] AzPhysics::SceneHandle sceneHandle,
[[maybe_unused]] AzPhysics::SimulatedBodyHandle bodyHandle) override {}
@@ -405,7 +405,6 @@ namespace PhysX
if (m_sceneInterface)
{
m_sceneInterface->RemoveSimulatedBody(m_editorSceneHandle, m_editorBodyHandle);
m_editorBodyHandle = AzPhysics::InvalidSimulatedBodyHandle;
}
}
@@ -579,7 +578,6 @@ namespace PhysX
if (m_sceneInterface && m_editorBodyHandle != AzPhysics::InvalidSimulatedBodyHandle)
{
m_sceneInterface->RemoveSimulatedBody(m_editorSceneHandle, m_editorBodyHandle);
m_editorBodyHandle = AzPhysics::InvalidSimulatedBodyHandle;
}
return;
}
@@ -634,7 +632,6 @@ namespace PhysX
if (m_editorBodyHandle != AzPhysics::InvalidSimulatedBodyHandle)
{
m_sceneInterface->RemoveSimulatedBody(m_editorSceneHandle, m_editorBodyHandle);
m_editorBodyHandle = AzPhysics::InvalidSimulatedBodyHandle;
}
m_editorBodyHandle = m_sceneInterface->AddSimulatedBody(m_editorSceneHandle, &configuration);
@@ -1051,7 +1048,6 @@ namespace PhysX
if (m_sceneInterface && m_editorBodyHandle != AzPhysics::InvalidSimulatedBodyHandle)
{
m_sceneInterface->RemoveSimulatedBody(m_editorSceneHandle, m_editorBodyHandle);
m_editorBodyHandle = AzPhysics::InvalidSimulatedBodyHandle;
}
}
@@ -283,7 +283,6 @@ namespace PhysX
if (auto* sceneInterface = AZ::Interface<AzPhysics::SceneInterface>::Get())
{
sceneInterface->RemoveSimulatedBody(m_editorSceneHandle, m_editorRigidBodyHandle);
m_editorRigidBodyHandle = AzPhysics::InvalidSimulatedBodyHandle;
}
}
@@ -428,7 +427,6 @@ namespace PhysX
if (auto* sceneInterface = AZ::Interface<AzPhysics::SceneInterface>::Get())
{
sceneInterface->RemoveSimulatedBody(m_editorSceneHandle, m_editorRigidBodyHandle);
m_editorRigidBodyHandle = AzPhysics::InvalidSimulatedBodyHandle;
CreateEditorWorldRigidBody();
}
@@ -271,7 +271,6 @@ namespace PhysX
if (m_editorBodyHandle != AzPhysics::InvalidSimulatedBodyHandle)
{
m_sceneInterface->RemoveSimulatedBody(m_editorSceneHandle, m_editorBodyHandle);
m_editorBodyHandle = AzPhysics::InvalidSimulatedBodyHandle;
}
m_editorBodyHandle = m_sceneInterface->AddSimulatedBody(m_editorSceneHandle, &configuration);
@@ -681,7 +680,6 @@ namespace PhysX
if (m_sceneInterface && m_editorBodyHandle != AzPhysics::InvalidSimulatedBodyHandle)
{
m_sceneInterface->RemoveSimulatedBody(m_editorSceneHandle, m_editorBodyHandle);
m_editorBodyHandle = AzPhysics::InvalidSimulatedBodyHandle;
}
}
@@ -343,7 +343,6 @@ namespace PhysX
if (auto* sceneInterface = AZ::Interface<AzPhysics::SceneInterface>::Get())
{
sceneInterface->RemoveSimulatedBody(m_sceneOwner, m_shadowBodyHandle);
m_shadowBodyHandle = AzPhysics::InvalidSimulatedBodyHandle;
m_shadowBody = nullptr;
}
}
@@ -163,7 +163,6 @@ namespace PhysX
sceneInterface->RemoveSimulatedBody(m_sceneOwner, m_rigidBodyHandle);
}
m_rigidBody = nullptr;
m_rigidBodyHandle = AzPhysics::InvalidSimulatedBodyHandle;
m_sceneOwner = AzPhysics::InvalidSceneHandle;
}
}
@@ -184,7 +184,6 @@ namespace PhysX
if (auto* sceneInterface = AZ::Interface<AzPhysics::SceneInterface>::Get())
{
sceneInterface->RemoveSimulatedBody(m_attachedSceneHandle, m_rigidBodyHandle);
m_rigidBodyHandle = AzPhysics::InvalidSimulatedBodyHandle;
}
Physics::RigidBodyRequestBus::Handler::BusDisconnect();
+4 -2
View File
@@ -729,7 +729,7 @@ namespace PhysX
return results;
}
void PhysXScene::RemoveSimulatedBody(AzPhysics::SimulatedBodyHandle bodyHandle)
void PhysXScene::RemoveSimulatedBody(AzPhysics::SimulatedBodyHandle& bodyHandle)
{
if (bodyHandle == AzPhysics::InvalidSimulatedBodyHandle)
{
@@ -751,10 +751,12 @@ namespace PhysX
m_deferredDeletions.push_back(m_simulatedBodies[index].second);
m_simulatedBodies[index] = AZStd::make_pair(AZ::Crc32(), nullptr);
m_freeSceneSlots.push(index);
bodyHandle = AzPhysics::InvalidSimulatedBodyHandle;
}
}
void PhysXScene::RemoveSimulatedBodies(const AzPhysics::SimulatedBodyHandleList& bodyHandles)
void PhysXScene::RemoveSimulatedBodies(AzPhysics::SimulatedBodyHandleList& bodyHandles)
{
for (auto& handle: bodyHandles)
{
+2 -2
View File
@@ -48,8 +48,8 @@ namespace PhysX
AzPhysics::SimulatedBodyHandleList AddSimulatedBodies(const AzPhysics::SimulatedBodyConfigurationList& simulatedBodyConfigs) override;
AzPhysics::SimulatedBody* GetSimulatedBodyFromHandle(AzPhysics::SimulatedBodyHandle bodyHandle) override;
AzPhysics::SimulatedBodyList GetSimulatedBodiesFromHandle(const AzPhysics::SimulatedBodyHandleList& bodyHandles) override;
void RemoveSimulatedBody(AzPhysics::SimulatedBodyHandle bodyHandle) override;
void RemoveSimulatedBodies(const AzPhysics::SimulatedBodyHandleList& bodyHandles) override;
void RemoveSimulatedBody(AzPhysics::SimulatedBodyHandle& bodyHandle) override;
void RemoveSimulatedBodies(AzPhysics::SimulatedBodyHandleList& bodyHandles) override;
void EnableSimulationOfBody(AzPhysics::SimulatedBodyHandle bodyHandle) override;
void DisableSimulationOfBody(AzPhysics::SimulatedBodyHandle bodyHandle) override;
AzPhysics::SceneQueryHits QueryScene(const AzPhysics::SceneQueryRequest* request) override;
@@ -112,7 +112,7 @@ namespace PhysX
return {}; //return an empty list
}
void PhysXSceneInterface::RemoveSimulatedBody(AzPhysics::SceneHandle sceneHandle, AzPhysics::SimulatedBodyHandle bodyHandle)
void PhysXSceneInterface::RemoveSimulatedBody(AzPhysics::SceneHandle sceneHandle, AzPhysics::SimulatedBodyHandle& bodyHandle)
{
if (AzPhysics::Scene* scene = m_physxSystem->GetScene(sceneHandle))
{
@@ -120,7 +120,7 @@ namespace PhysX
}
}
void PhysXSceneInterface::RemoveSimulatedBodies(AzPhysics::SceneHandle sceneHandle, const AzPhysics::SimulatedBodyHandleList& bodyHandles)
void PhysXSceneInterface::RemoveSimulatedBodies(AzPhysics::SceneHandle sceneHandle, AzPhysics::SimulatedBodyHandleList& bodyHandles)
{
if (AzPhysics::Scene* scene = m_physxSystem->GetScene(sceneHandle))
{
@@ -40,8 +40,8 @@ namespace PhysX
AzPhysics::SimulatedBodyHandleList AddSimulatedBodies(AzPhysics::SceneHandle sceneHandle, const AzPhysics::SimulatedBodyConfigurationList& simulatedBodyConfigs) override;
AzPhysics::SimulatedBody* GetSimulatedBodyFromHandle(AzPhysics::SceneHandle sceneHandle, AzPhysics::SimulatedBodyHandle bodyHandle) override;
AzPhysics::SimulatedBodyList GetSimulatedBodiesFromHandle(AzPhysics::SceneHandle sceneHandle, const AzPhysics::SimulatedBodyHandleList& bodyHandles) override;
void RemoveSimulatedBody(AzPhysics::SceneHandle sceneHandle, AzPhysics::SimulatedBodyHandle bodyHandle) override;
void RemoveSimulatedBodies(AzPhysics::SceneHandle sceneHandle, const AzPhysics::SimulatedBodyHandleList& bodyHandles) override;
void RemoveSimulatedBody(AzPhysics::SceneHandle sceneHandle, AzPhysics::SimulatedBodyHandle& bodyHandle) override;
void RemoveSimulatedBodies(AzPhysics::SceneHandle sceneHandle, AzPhysics::SimulatedBodyHandleList& bodyHandles) override;
void EnableSimulationOfBody(AzPhysics::SceneHandle sceneHandle, AzPhysics::SimulatedBodyHandle bodyHandle) override;
void DisableSimulationOfBody(AzPhysics::SceneHandle sceneHandle, AzPhysics::SimulatedBodyHandle bodyHandle) override;
AzPhysics::SceneQueryHits QueryScene(AzPhysics::SceneHandle sceneHandle, const AzPhysics::SceneQueryRequest* request) override;
@@ -117,7 +117,6 @@ namespace PhysX
if (auto* sceneInterface = AZ::Interface<AzPhysics::SceneInterface>::Get())
{
sceneInterface->RemoveSimulatedBody(m_attachedSceneHandle, m_staticRigidBodyHandle);
m_staticRigidBodyHandle = AzPhysics::InvalidSceneHandle;
}
AzPhysics::SimulatedBodyComponentRequestsBus::Handler::BusDisconnect();
@@ -129,10 +129,8 @@ namespace PhysX::Benchmarks
for (int i = 0; i < NumCylinderSide; i++)
{
sceneInterface->RemoveSimulatedBody(m_sceneHandle, m_cylinder[i]);
m_cylinder[i] = AzPhysics::InvalidSimulatedBodyHandle;
}
sceneInterface->RemoveSimulatedBody(m_sceneHandle, m_blade);
m_blade = AzPhysics::InvalidSimulatedBodyHandle;
}
m_sceneHandle = AzPhysics::InvalidSceneHandle;
}
@@ -404,10 +404,7 @@ namespace PhysX::Benchmarks
}
subTickTracker.Stop();
for (auto handle : snakeRigidBodyHandles)
{
m_defaultScene->RemoveSimulatedBody(handle);
}
m_defaultScene->RemoveSimulatedBodies(snakeRigidBodyHandles);
snakeRigidBodyHandles.clear();
//sort the frame times and get the P50, P90, P99 percentiles
@@ -233,10 +233,7 @@ namespace PhysX::Benchmarks
subTickTracker.Stop();
//object clean up
for (auto handle : rigidBodies)
{
m_defaultScene->RemoveSimulatedBody(handle);
}
m_defaultScene->RemoveSimulatedBodies(rigidBodies);
rigidBodies.clear();
//sort the frame times and get the P50, P90, P99 percentiles
@@ -310,10 +307,7 @@ namespace PhysX::Benchmarks
//object clean up
washingMachine.TearDownWashingMachine();
for (auto handle : rigidBodies)
{
m_defaultScene->RemoveSimulatedBody(handle);
}
m_defaultScene->RemoveSimulatedBodies(rigidBodies);
rigidBodies.clear();
//sort the frame times and get the P50, P90, P99 percentiles
@@ -465,10 +459,7 @@ namespace PhysX::Benchmarks
//object clean up
collisionHandlers.clear();
washingMachine.TearDownWashingMachine();
for (auto handle : rigidBodies)
{
m_defaultScene->RemoveSimulatedBody(handle);
}
m_defaultScene->RemoveSimulatedBodies(rigidBodies);
rigidBodies.clear();
//sort the frame times and get the P50, P90, P99 percentiles
+7 -2
View File
@@ -237,13 +237,17 @@ namespace PhysX
//select 1 to remove
AzPhysics::SimulatedBodyHandle removedSelection = simBodyHandles[simBodyHandles.size() / 2];
const AzPhysics::SimulatedBodyIndex removedIndex = AZStd::get<AzPhysics::HandleTypeIndex::Index>(removedSelection);
sceneInterface->RemoveSimulatedBody(m_testSceneHandle, removedSelection);
// The removedSelection handle should be set to invalid in RemoveSimulatedBody
EXPECT_EQ(removedSelection, AzPhysics::InvalidSimulatedBodyHandle);
//add a new one.
AzPhysics::SimulatedBodyHandle newSimBodyHandle = sceneInterface->AddSimulatedBody(m_testSceneHandle, &config);
//The old and new handle should share an index as the freed slot will be used
EXPECT_EQ(AZStd::get<AzPhysics::HandleTypeIndex::Index>(removedSelection),
EXPECT_EQ(removedIndex,
AZStd::get<AzPhysics::HandleTypeIndex::Index>(newSimBodyHandle));
}
@@ -287,9 +291,10 @@ namespace PhysX
EXPECT_EQ(simBodyHandle, addEventSimBodyHandle);
//remove the body
const AzPhysics::SimulatedBodyHandle removedHandle = simBodyHandle; //copy the handle as RemoveSimulatedBody will mark it invalid.
sceneInterface->RemoveSimulatedBody(m_testSceneHandle, simBodyHandle);
EXPECT_TRUE(removedTriggered);
EXPECT_EQ(simBodyHandle, removeEventSimBodyHandle);
EXPECT_EQ(removedHandle, removeEventSimBodyHandle);
}
TEST_F(PhysXSceneFixture, StartFinishSimulationEvents_triggerAsExpected)
@@ -882,7 +882,6 @@ namespace PhysX
if (auto* sceneInterface = AZ::Interface<AzPhysics::SceneInterface>::Get())
{
sceneInterface->RemoveSimulatedBody(m_testSceneHandle, rigidBodyHandle);
rigidBodyHandle = AzPhysics::InvalidSimulatedBodyHandle;
}
rigidBody = nullptr;
}
@@ -90,10 +90,10 @@ namespace ScriptCanvasPhysicsTests
[[maybe_unused]] bool enable) override {}
void RemoveSimulatedBody(
[[maybe_unused]] AzPhysics::SceneHandle sceneHandle,
[[maybe_unused]] AzPhysics::SimulatedBodyHandle bodyHandle) override {}
[[maybe_unused]] AzPhysics::SimulatedBodyHandle& bodyHandle) override {}
void RemoveSimulatedBodies(
[[maybe_unused]] AzPhysics::SceneHandle sceneHandle,
[[maybe_unused]] const AzPhysics::SimulatedBodyHandleList& bodyHandles) override {}
[[maybe_unused]] AzPhysics::SimulatedBodyHandleList& bodyHandles) override {}
void EnableSimulationOfBody(
[[maybe_unused]] AzPhysics::SceneHandle sceneHandle,
[[maybe_unused]] AzPhysics::SimulatedBodyHandle bodyHandle) override {}
@@ -163,7 +163,6 @@ namespace WhiteBox
if (m_sceneInterface)
{
m_sceneInterface->RemoveSimulatedBody(m_editorSceneHandle, m_rigidBodyHandle);
m_rigidBodyHandle = AzPhysics::InvalidSimulatedBodyHandle;
}
}
@@ -132,7 +132,6 @@ namespace WhiteBox
sceneInterface->RemoveSimulatedBody(defaultScene, m_simulatedBodyHandle);
}
}
m_simulatedBodyHandle = AzPhysics::InvalidSimulatedBodyHandle;
}
void WhiteBoxColliderComponent::OnTransformChanged(