Ragdoll now uses Add/Remove SimulatedBody
Addressed Minor Character PR feedback
This commit is contained in:
@@ -167,19 +167,18 @@ namespace PhysX
|
||||
return aznew CharacterController(pxController, AZStd::move(callbackManager), scene->GetSceneHandle());
|
||||
}
|
||||
|
||||
AZStd::unique_ptr<Ragdoll> CreateRagdoll(Physics::RagdollConfiguration& configuration,
|
||||
const Physics::RagdollState& initialState, const ParentIndices& parentIndices, AzPhysics::SceneHandle sceneHandle)
|
||||
Ragdoll* CreateRagdoll(Physics::RagdollConfiguration& configuration, AzPhysics::SceneHandle sceneHandle)
|
||||
{
|
||||
const size_t numNodes = configuration.m_nodes.size();
|
||||
if (numNodes != initialState.size())
|
||||
if (numNodes != configuration.m_initialState.size())
|
||||
{
|
||||
AZ_Error("PhysX Ragdoll", false, "Mismatch between number of nodes in ragdoll configuration (%i) "
|
||||
"and number of nodes in the initial ragdoll state (%i)", numNodes, initialState.size());
|
||||
"and number of nodes in the initial ragdoll state (%i)", numNodes, configuration.m_initialState.size());
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
AZStd::unique_ptr<Ragdoll> ragdoll = AZStd::make_unique<Ragdoll>(sceneHandle);
|
||||
ragdoll->SetParentIndices(parentIndices);
|
||||
Ragdoll* ragdoll = aznew Ragdoll(sceneHandle);
|
||||
ragdoll->SetParentIndices(configuration.m_parentIndices);
|
||||
|
||||
auto* sceneInterface = AZ::Interface<AzPhysics::SceneInterface>::Get();
|
||||
if (sceneInterface == nullptr)
|
||||
@@ -192,7 +191,7 @@ namespace PhysX
|
||||
for (size_t nodeIndex = 0; nodeIndex < numNodes; nodeIndex++)
|
||||
{
|
||||
Physics::RagdollNodeConfiguration& nodeConfig = configuration.m_nodes[nodeIndex];
|
||||
const Physics::RagdollNodeState& nodeState = initialState[nodeIndex];
|
||||
const Physics::RagdollNodeState& nodeState = configuration.m_initialState[nodeIndex];
|
||||
|
||||
Physics::CharacterColliderNodeConfiguration* colliderNodeConfig = configuration.m_colliders.FindNodeConfigByName(nodeConfig.m_debugName);
|
||||
if (colliderNodeConfig)
|
||||
@@ -212,22 +211,20 @@ namespace PhysX
|
||||
}
|
||||
nodeConfig.m_colliderAndShapeData = shapes;
|
||||
}
|
||||
nodeConfig.m_startSimulationEnabled = false;
|
||||
nodeConfig.m_position = nodeState.m_position;
|
||||
nodeConfig.m_orientation = nodeState.m_orientation;
|
||||
|
||||
AzPhysics::SimulatedBodyHandle newBodyHandle = sceneInterface->AddSimulatedBody(sceneHandle, &nodeConfig);
|
||||
if (newBodyHandle == AzPhysics::InvalidSimulatedBodyHandle)
|
||||
AZStd::unique_ptr<RagdollNode> node = AZStd::make_unique<RagdollNode>(sceneHandle, nodeConfig);
|
||||
if (node->GetRigidBodyHandle() != AzPhysics::InvalidSimulatedBodyHandle)
|
||||
{
|
||||
ragdoll->AddNode(AZStd::move(node));
|
||||
}
|
||||
else
|
||||
{
|
||||
AZ_Error("PhysX Ragdoll", false, "Failed to create rigid body for ragdoll node %s", nodeConfig.m_debugName.c_str());
|
||||
return nullptr;
|
||||
node.reset();
|
||||
}
|
||||
sceneInterface->DisableSimulationOfBody(sceneHandle, newBodyHandle);
|
||||
auto* rigidBody = azdynamic_cast<AzPhysics::RigidBody*>(sceneInterface->GetSimulatedBodyFromHandle(sceneHandle, newBodyHandle));
|
||||
|
||||
physx::PxRigidDynamic* pxRigidDynamic = static_cast<physx::PxRigidDynamic*>(rigidBody->GetNativePointer());
|
||||
physx::PxTransform transform(PxMathConvert(nodeState.m_position), PxMathConvert(nodeState.m_orientation));
|
||||
pxRigidDynamic->setGlobalPose(transform);
|
||||
|
||||
AZStd::unique_ptr<RagdollNode> node = AZStd::make_unique<RagdollNode>(rigidBody, newBodyHandle);
|
||||
ragdoll->AddNode(AZStd::move(node));
|
||||
}
|
||||
|
||||
// Set up joints. Needs a second pass because child nodes in the ragdoll config aren't guaranteed to have
|
||||
@@ -235,7 +232,7 @@ namespace PhysX
|
||||
size_t rootIndex = SIZE_MAX;
|
||||
for (size_t nodeIndex = 0; nodeIndex < numNodes; nodeIndex++)
|
||||
{
|
||||
size_t parentIndex = parentIndices[nodeIndex];
|
||||
size_t parentIndex = configuration.m_parentIndices[nodeIndex];
|
||||
if (parentIndex < numNodes)
|
||||
{
|
||||
physx::PxRigidDynamic* parentActor = ragdoll->GetPxRigidDynamic(parentIndex);
|
||||
|
||||
Reference in New Issue
Block a user