Physics joints updated to the new API (#1361)

Co-authored-by: Ulugbek Adilbekov <ulugbek@amazon.com>
This commit is contained in:
amzn-sean
2021-06-17 15:52:27 +01:00
committed by GitHub
parent c46a17f3a6
commit 9f62d631fb
90 changed files with 2792 additions and 1665 deletions
+105
View File
@@ -31,6 +31,8 @@
#include <PhysXCharacters/API/CharacterController.h>
#include <PhysXCharacters/API/CharacterUtils.h>
#include <System/PhysXSystem.h>
#include <PhysX/Joint/Configuration/PhysXJointConfiguration.h>
#include <Joint/PhysXJoint.h>
namespace PhysX
{
@@ -232,6 +234,18 @@ namespace PhysX
scene->GetSceneHandle());
}
template<class JointType, class ConfigurationType>
AzPhysics::Joint* CreateJoint(const ConfigurationType* configuration,
AzPhysics::SceneHandle sceneHandle,
AzPhysics::SimulatedBodyHandle parentBodyHandle,
AzPhysics::SimulatedBodyHandle childBodyHandle,
AZ::Crc32& crc)
{
JointType* newBody = aznew JointType(*configuration, sceneHandle, parentBodyHandle, childBodyHandle);
crc = AZ::Crc32(newBody, sizeof(*newBody));
return newBody;
}
//helper to perform a ray cast
AzPhysics::SceneQueryHits RayCast(const AzPhysics::RayCastRequest* raycastRequest,
AZStd::vector<physx::PxRaycastHit>& raycastBuffer,
@@ -813,6 +827,90 @@ namespace PhysX
}
}
AzPhysics::JointHandle PhysXScene::AddJoint(const AzPhysics::JointConfiguration* jointConfig,
AzPhysics::SimulatedBodyHandle parentBody, AzPhysics::SimulatedBodyHandle childBody)
{
AzPhysics::Joint* newJoint = nullptr;
AZ::Crc32 newJointCrc;
if (azrtti_istypeof<PhysX::D6JointLimitConfiguration>(jointConfig))
{
newJoint = Internal::CreateJoint<PhysXD6Joint, D6JointLimitConfiguration>(
azdynamic_cast<const D6JointLimitConfiguration*>(jointConfig),
m_sceneHandle, parentBody, childBody, newJointCrc);
}
else if (azrtti_istypeof<PhysX::FixedJointConfiguration*>(jointConfig))
{
newJoint = Internal::CreateJoint<PhysXFixedJoint, FixedJointConfiguration>(
azdynamic_cast<const FixedJointConfiguration*>(jointConfig),
m_sceneHandle, parentBody, childBody, newJointCrc);
}
else if (azrtti_istypeof<PhysX::BallJointConfiguration*>(jointConfig))
{
newJoint = Internal::CreateJoint<PhysXBallJoint, BallJointConfiguration>(
azdynamic_cast<const BallJointConfiguration*>(jointConfig),
m_sceneHandle, parentBody, childBody, newJointCrc);
}
else if (azrtti_istypeof<PhysX::HingeJointConfiguration*>(jointConfig))
{
newJoint = Internal::CreateJoint<PhysXHingeJoint, HingeJointConfiguration>(
azdynamic_cast<const HingeJointConfiguration*>(jointConfig),
m_sceneHandle, parentBody, childBody, newJointCrc);
}
else
{
AZ_Warning("PhysXScene", false, "Unknown JointConfiguration.");
return AzPhysics::InvalidJointHandle;
}
if (newJoint != nullptr)
{
AzPhysics::JointIndex index = index = m_joints.size();
m_joints.emplace_back(newJointCrc, newJoint);
const AzPhysics::JointHandle newJointHandle(newJointCrc, index);
newJoint->m_sceneOwner = m_sceneHandle;
newJoint->m_jointHandle = newJointHandle;
return newJointHandle;
}
return AzPhysics::InvalidJointHandle;
}
AzPhysics::Joint* PhysXScene::GetJointFromHandle(AzPhysics::JointHandle jointHandle)
{
if (jointHandle == AzPhysics::InvalidJointHandle)
{
return nullptr;
}
AzPhysics::JointIndex index = AZStd::get<AzPhysics::HandleTypeIndex::Index>(jointHandle);
if (index < m_joints.size()
&& m_joints[index].first == AZStd::get<AzPhysics::HandleTypeIndex::Crc>(jointHandle))
{
return m_joints[index].second;
}
return nullptr;
}
void PhysXScene::RemoveJoint(AzPhysics::JointHandle jointHandle)
{
if (jointHandle == AzPhysics::InvalidJointHandle)
{
return;
}
AzPhysics::JointIndex index = AZStd::get<AzPhysics::HandleTypeIndex::Index>(jointHandle);
if (index < m_joints.size()
&& m_joints[index].first == AZStd::get<AzPhysics::HandleTypeIndex::Crc>(jointHandle))
{
m_deferredDeletionsJoints.push_back(m_joints[index].second);
m_joints[index] = AZStd::make_pair(AZ::Crc32(), nullptr);
m_freeJointSlots.push(index);
jointHandle = AzPhysics::InvalidJointHandle;
}
}
AzPhysics::SceneQueryHits PhysXScene::QueryScene(const AzPhysics::SceneQueryRequest* request)
{
if (request == nullptr)
@@ -996,6 +1094,13 @@ namespace PhysX
{
delete simulatedBody;
}
AZStd::vector<AzPhysics::Joint*> jointDeletions;
jointDeletions.swap(m_deferredDeletionsJoints);
for (auto* joint : jointDeletions)
{
delete joint;
}
}
void PhysXScene::ProcessTriggerEvents()