Integrating up through commit 90f050496

This commit is contained in:
alexpete
2021-04-07 14:03:29 -07:00
parent 8f2ed080a9
commit c2cbd430fe
2694 changed files with 285622 additions and 176874 deletions
@@ -12,14 +12,16 @@
#include <PhysX_precompiled.h>
#include <AzCore/Serialization/EditContext.h>
#include <AzFramework/Physics/CollisionBus.h>
#include <AzFramework/Physics/PhysicsScene.h>
#include <AzFramework/Physics/Shape.h>
#include <AzFramework/Physics/SystemBus.h>
#include <AzFramework/Physics/Configuration/RigidBodyConfiguration.h>
#include <Common/PhysXSceneQueryHelpers.h>
#include <PhysX/Utils.h>
#include <PhysX/NativeTypeIdentifiers.h>
#include <PhysXCharacters/API/CharacterController.h>
#include <AzFramework/Physics/CollisionBus.h>
#include <AzFramework/Physics/World.h>
#include <PhysX/PhysXLocks.h>
#include <PhysXCharacters/API/CharacterController.h>
#include <Source/Collision.h>
#include <Source/Shape.h>
@@ -201,10 +203,14 @@ namespace PhysX
}
CharacterController::CharacterController(physx::PxController* pxController,
AZStd::unique_ptr<CharacterControllerCallbackManager> callbackManager)
AZStd::unique_ptr<CharacterControllerCallbackManager> callbackManager,
AzPhysics::SceneHandle sceneHandle)
: m_pxController(pxController)
, m_callbackManager(AZStd::move(callbackManager))
{
m_sceneOwner = sceneHandle;
m_simulating = false; //character controller starts disabled, so set m_simulating to false
AZ_Assert(m_pxController, "pxController should not be null.");
m_pxControllerFilters.mFilterCallback = m_callbackManager.get();
m_pxControllerFilters.mCCTFilterCallback = m_callbackManager.get();
@@ -270,14 +276,82 @@ namespace PhysX
m_minimumMovementDistance = distance;
}
void CharacterController::CreateShadowBody(const Physics::CharacterConfiguration& configuration, Physics::World& world)
void CharacterController::CreateShadowBody(const Physics::CharacterConfiguration& configuration)
{
Physics::RigidBodyConfiguration rigidBodyConfig;
DestroyShadowBody();
AzPhysics::RigidBodyConfiguration rigidBodyConfig;
rigidBodyConfig.m_kinematic = true;
rigidBodyConfig.m_debugName = configuration.m_debugName + " (Shadow)";
rigidBodyConfig.m_entityId = configuration.m_entityId;
m_shadowBody = AZ::Interface<Physics::System>::Get()->CreateRigidBody(rigidBodyConfig);
world.AddBody(*m_shadowBody);
if (auto* sceneInterface = AZ::Interface<AzPhysics::SceneInterface>::Get())
{
m_shadowBodyHandle = sceneInterface->AddSimulatedBody(m_sceneOwner, &rigidBodyConfig);
if (m_shadowBodyHandle == AzPhysics::InvalidSimulatedBodyHandle)
{
AZ_Error("PhysXCharacter", false, "Failed to create the CharacterController rigid body.");
return;
}
m_shadowBody = azdynamic_cast<AzPhysics::RigidBody*>(sceneInterface->GetSimulatedBodyFromHandle(m_sceneOwner, m_shadowBodyHandle));
}
}
void CharacterController::EnablePhysics(const Physics::CharacterConfiguration& configuration)
{
if (m_simulating)
{
return;
}
SetFilterDataAndShape(configuration);
SetUserData(configuration);
SetActorName(configuration.m_debugName);
SetMinimumMovementDistance(configuration.m_minimumMovementDistance);
SetMaximumSpeed(configuration.m_maximumSpeed);
CreateShadowBody(configuration);
SetTag(configuration.m_colliderTag);
m_simulating = true;
}
void CharacterController::DisablePhysics()
{
if (!m_simulating)
{
return;
}
DestroyShadowBody();
RemoveControllerFromScene();
m_simulating = false;
}
void CharacterController::DestroyShadowBody()
{
if (m_shadowBodyHandle == AzPhysics::InvalidSimulatedBodyHandle)
{
return;
}
if (auto* sceneInterface = AZ::Interface<AzPhysics::SceneInterface>::Get())
{
sceneInterface->RemoveSimulatedBody(m_sceneOwner, m_shadowBodyHandle);
m_shadowBodyHandle = AzPhysics::InvalidSimulatedBodyHandle;
m_shadowBody = nullptr;
}
}
void CharacterController::RemoveControllerFromScene()
{
if (m_pxController)
{
if (auto* pxScene = m_pxController->getScene())
{
PHYSX_SCENE_WRITE_LOCK(pxScene);
pxScene->removeActor(*m_pxController->getActor());
}
}
}
void CharacterController::SetTag(const AZStd::string& tag)
@@ -292,12 +366,15 @@ namespace PhysX
CharacterController::~CharacterController()
{
DestroyShadowBody();
m_shape = nullptr; //shape has to go before m_pxController
if (m_pxController)
{
PHYSX_SCENE_WRITE_LOCK(m_pxController->getScene());
m_shape = nullptr; //shape has to go before m_pxController
m_pxController->release();
PHYSX_SCENE_WRITE_LOCK(m_pxController->getScene());
m_pxController->release(); // This internally removes the controller's actor from the scene
}
m_pxController = nullptr;
m_material = nullptr;
}
@@ -559,13 +636,12 @@ namespace PhysX
}
}
// Physics::WorldBody
AZ::EntityId CharacterController::GetEntityId() const
{
return m_actorUserData.GetEntityId();
}
Physics::World* CharacterController::GetWorld() const
AzPhysics::Scene* CharacterController::GetScene()
{
return m_pxController ? PhysX::Utils::GetUserData(m_pxController->getScene()) : nullptr;
}
@@ -604,17 +680,17 @@ namespace PhysX
return PxMathConvert(m_pxController->getActor()->getWorldBounds(inflationFactor));
}
Physics::RayCastHit CharacterController::RayCast(const Physics::RayCastRequest& request)
AzPhysics::SceneQueryHit CharacterController::RayCast(const AzPhysics::RayCastRequest& request)
{
if (m_pxController)
{
if (physx::PxRigidDynamic* actor = m_pxController->getActor())
{
return PhysX::Utils::RayCast::ClosestRayHitAgainstPxRigidActor(request, actor);
return PhysX::SceneQueryHelpers::ClosestRayHitAgainstPxRigidActor(request, actor);
}
}
return Physics::RayCastHit();
return AzPhysics::SceneQueryHit();
}
AZ::Crc32 CharacterController::GetNativeType() const
@@ -627,30 +703,6 @@ namespace PhysX
return m_pxController;
}
void CharacterController::AddToWorld(Physics::World& world)
{
if (m_shadowBody)
{
m_shadowBody->AddToWorld(world);
}
}
void CharacterController::RemoveFromWorld(Physics::World& world)
{
physx::PxScene* scene = static_cast<physx::PxScene*>(world.GetNativePointer());
if (scene)
{
PHYSX_SCENE_WRITE_LOCK(scene);
scene->removeActor(*m_pxController->getActor());
}
if (m_shadowBody)
{
m_shadowBody->RemoveFromWorld(world);
}
}
// CharacterController specific
void CharacterController::Resize(float height)
{