/* * Copyright (c) Contributors to the Open 3D Engine Project. * For complete copyright and license terms please see the LICENSE at the root of this distribution. * * SPDX-License-Identifier: Apache-2.0 OR MIT * */ #include #include #include #include #include #include #include #include #include namespace PhysX { void HingeJointComponent::Reflect(AZ::ReflectContext* context) { AZ::SerializeContext* serializeContext = azrtti_cast(context); if (serializeContext) { serializeContext->Class() ->Version(2) ; } } HingeJointComponent::HingeJointComponent( const JointComponentConfiguration& configuration, const JointGenericProperties& genericProperties, const JointLimitProperties& limitProperties) : JointComponent(configuration, genericProperties, limitProperties) { } void HingeJointComponent::InitNativeJoint() { if (m_jointHandle != AzPhysics::InvalidJointHandle) { return; } JointComponent::LeadFollowerInfo leadFollowerInfo; ObtainLeadFollowerInfo(leadFollowerInfo); if (leadFollowerInfo.m_followerActor == nullptr || leadFollowerInfo.m_followerBody == nullptr) { return; } // if there is no lead body, this will be a constraint of the follower's global position, so use invalid body handle. AzPhysics::SimulatedBodyHandle parentHandle = AzPhysics::InvalidSimulatedBodyHandle; if (leadFollowerInfo.m_leadBody != nullptr) { parentHandle = leadFollowerInfo.m_leadBody->m_bodyHandle; } else { AZ_TracePrintf( "PhysX", "Entity [%s] Hinge Joint component missing lead entity. This joint will be a global constraint on the follower's global position.", GetEntity()->GetName().c_str()); } HingeJointConfiguration configuration; configuration.m_parentLocalPosition = leadFollowerInfo.m_leadLocal.GetTranslation(); configuration.m_parentLocalRotation = leadFollowerInfo.m_leadLocal.GetRotation(); configuration.m_childLocalPosition = leadFollowerInfo.m_followerLocal.GetTranslation(); configuration.m_childLocalRotation = leadFollowerInfo.m_followerLocal.GetRotation(); configuration.m_genericProperties = m_genericProperties; configuration.m_limitProperties = m_limits; if (auto* sceneInterface = AZ::Interface::Get()) { m_jointHandle = sceneInterface->AddJoint( leadFollowerInfo.m_followerBody->m_sceneOwner, &configuration, parentHandle, leadFollowerInfo.m_followerBody->m_bodyHandle); m_jointSceneOwner = leadFollowerInfo.m_followerBody->m_sceneOwner; } } } // namespace PhysX