Revision control

++ // Copyright (C) 2026 The Qt Company Ltd.
++ // SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only
++
++ #ifndef QD6JOINT_P_H
++ #define QD6JOINT_P_H
++
++ //
++ // W A R N I N G
++ // -------------
++ //
++ // This file is not part of the Qt API. It exists purely as an
++ // implementation detail. This header file may change from version to
++ // version without notice, or even be removed.
++ //
++ // We mean it.
++ //
++
++ #include <QtQuick3DPhysics/private/qjoint_p.h>
++ #include <QtQml/qqmlregistration.h>
++
++ #include <extensions/PxD6Joint.h>
++
++ QT_BEGIN_NAMESPACE
++
++ class Q_QUICK3DPHYSICS_EXPORT QD6Joint : public QPhysicsJoint
++ {
++ Q_OBJECT
++ // Motion states for 6 degrees of freedom
++ Q_PROPERTY(Motion xMotion READ xMotion WRITE setXMotion NOTIFY xMotionChanged
++ FINAL REVISION(6, 13))
++ Q_PROPERTY(Motion yMotion READ yMotion WRITE setYMotion NOTIFY yMotionChanged
++ FINAL REVISION(6, 13))
++ Q_PROPERTY(Motion zMotion READ zMotion WRITE setZMotion NOTIFY zMotionChanged
++ FINAL REVISION(6, 13))
++ Q_PROPERTY(Motion twistMotion READ twistMotion WRITE setTwistMotion NOTIFY twistMotionChanged
++ FINAL REVISION(6, 13))
++ Q_PROPERTY(Motion swingMotionY READ swingMotionY WRITE setSwingMotionY NOTIFY swingMotionYChanged
++ FINAL REVISION(6, 13))
++ Q_PROPERTY(Motion swingMotionZ READ swingMotionZ WRITE setSwingMotionZ NOTIFY swingMotionZChanged
++ FINAL REVISION(6, 13))
++
++ // Linear limits per axis
++ Q_PROPERTY(float linearLimitXLower READ linearLimitXLower WRITE setLinearLimitXLower NOTIFY linearLimitXLowerChanged
++ FINAL REVISION(6, 13))
++ Q_PROPERTY(float linearLimitXUpper READ linearLimitXUpper WRITE setLinearLimitXUpper NOTIFY linearLimitXUpperChanged
++ FINAL REVISION(6, 13))
++ Q_PROPERTY(float linearLimitYLower READ linearLimitYLower WRITE setLinearLimitYLower NOTIFY linearLimitYLowerChanged
++ FINAL REVISION(6, 13))
++ Q_PROPERTY(float linearLimitYUpper READ linearLimitYUpper WRITE setLinearLimitYUpper NOTIFY linearLimitYUpperChanged
++ FINAL REVISION(6, 13))
++ Q_PROPERTY(float linearLimitZLower READ linearLimitZLower WRITE setLinearLimitZLower NOTIFY linearLimitZLowerChanged
++ FINAL REVISION(6, 13))
++ Q_PROPERTY(float linearLimitZUpper READ linearLimitZUpper WRITE setLinearLimitZUpper NOTIFY linearLimitZUpperChanged
++ FINAL REVISION(6, 13))
++
++ // Angular limits
++ Q_PROPERTY(float twistLimitLower READ twistLimitLower WRITE setTwistLimitLower NOTIFY twistLimitLowerChanged
++ FINAL REVISION(6, 13))
++ Q_PROPERTY(float twistLimitUpper READ twistLimitUpper WRITE setTwistLimitUpper NOTIFY twistLimitUpperChanged
++ FINAL REVISION(6, 13))
++ Q_PROPERTY(float swingLimitAngleY READ swingLimitAngleY WRITE setSwingLimitAngleY NOTIFY swingLimitAngleYChanged
++ FINAL REVISION(6, 13))
++ Q_PROPERTY(float swingLimitAngleZ READ swingLimitAngleZ WRITE setSwingLimitAngleZ NOTIFY swingLimitAngleZChanged
++ FINAL REVISION(6, 13))
++
++ // Spring parameters for soft constraints / flexible behavior
++ Q_PROPERTY(float linearStiffness READ linearStiffness WRITE setLinearStiffness NOTIFY linearStiffnessChanged
++ FINAL REVISION(6, 13))
++ Q_PROPERTY(float linearDamping READ linearDamping WRITE setLinearDamping NOTIFY linearDampingChanged
++ FINAL REVISION(6, 13))
++ Q_PROPERTY(float angularStiffness READ angularStiffness WRITE setAngularStiffness NOTIFY angularStiffnessChanged
++ FINAL REVISION(6, 13))
++ Q_PROPERTY(float angularDamping READ angularDamping WRITE setAngularDamping NOTIFY angularDampingChanged
++ FINAL REVISION(6, 13))
++
++ QML_NAMED_ELEMENT(D6Joint)
++ QML_ADDED_IN_VERSION(6, 13)
++
++ public:
++ enum class Motion {
++ Locked,
++ Limited,
++ Free
++ };
++ Q_ENUM(Motion)
++
++ QD6Joint();
++ ~QD6Joint() override = default;
++
++ Motion xMotion() const;
++ void setXMotion(Motion motion);
++
++ Motion yMotion() const;
++ void setYMotion(Motion motion);
++
++ Motion zMotion() const;
++ void setZMotion(Motion motion);
++
++ Motion twistMotion() const;
++ void setTwistMotion(Motion motion);
++
++ float linearLimitXLower() const;
++ void setLinearLimitXLower(float limit);
++
++ float linearLimitXUpper() const;
++ void setLinearLimitXUpper(float limit);
++
++ float linearLimitYLower() const;
++ void setLinearLimitYLower(float limit);
++
++ float linearLimitYUpper() const;
++ void setLinearLimitYUpper(float limit);
++
++ float linearLimitZLower() const;
++ void setLinearLimitZLower(float limit);
++
++ float linearLimitZUpper() const;
++ void setLinearLimitZUpper(float limit);
++
++ float twistLimitLower() const;
++ void setTwistLimitLower(float limit);
++
++ float twistLimitUpper() const;
++ void setTwistLimitUpper(float limit);
++
++ float linearStiffness() const;
++ void setLinearStiffness(float stiffness);
++
++ float linearDamping() const;
++ void setLinearDamping(float damping);
++
++ float angularStiffness() const;
++ void setAngularStiffness(float stiffness);
++
++ float angularDamping() const;
++ void setAngularDamping(float damping);
++
++ Motion swingMotionY() const;
++ void setSwingMotionY(Motion newSwingMotionY);
++
++ Motion swingMotionZ() const;
++ void setSwingMotionZ(Motion newSwingMotionZ);
++
++ float swingLimitAngleY() const;
++ void setSwingLimitAngleY(float newSwingLimitAngleY);
++
++ float swingLimitAngleZ() const;
++ void setSwingLimitAngleZ(float newSwingLimitAngleZ);
++
++ signals:
++ void xMotionChanged();
++ void yMotionChanged();
++ void zMotionChanged();
++ void twistMotionChanged();
++ void linearLimitXLowerChanged();
++ void linearLimitXUpperChanged();
++ void linearLimitYLowerChanged();
++ void linearLimitYUpperChanged();
++ void linearLimitZLowerChanged();
++ void linearLimitZUpperChanged();
++ void twistLimitLowerChanged();
++ void twistLimitUpperChanged();
++ void linearStiffnessChanged();
++ void linearDampingChanged();
++ void angularStiffnessChanged();
++ void angularDampingChanged();
++
++ void swingMotionYChanged();
++ void swingMotionZChanged();
++ void swingLimitAngleYChanged();
++ void swingLimitAngleZChanged();
++
++ protected:
++ physx::PxJoint *createPhysxJoint(physx::PxRigidActor *actorA,
++ physx::PxRigidActor *actorB,
++ const physx::PxTransform &trfA,
++ const physx::PxTransform &trfB) override;
++ void setJointProperties() override;
++
++ private:
++ Motion m_xMotion = Motion::Locked;
++ Motion m_yMotion = Motion::Locked;
++ Motion m_zMotion = Motion::Locked;
++ Motion m_twistMotion = Motion::Locked;
++ Motion m_swingMotionY = Motion::Locked;
++ Motion m_swingMotionZ = Motion::Locked;
++
++ // Linear limits
++ float m_linearLimitXLower = -1.0f;
++ float m_linearLimitXUpper = 1.0f;
++ float m_linearLimitYLower = -1.0f;
++ float m_linearLimitYUpper = 1.0f;
++ float m_linearLimitZLower = -1.0f;
++ float m_linearLimitZUpper = 1.0f;
++
++ // Angular limits (Twist: [-45 deg, 45 deg], Swing: 45 deg in radians)
++ float m_twistLimitLower = -float(M_PI_4);
++ float m_twistLimitUpper = float(M_PI_4);
++ float m_swingLimitAngleY = float(M_PI_4);
++ float m_swingLimitAngleZ = float(M_PI_4);
++
++ // Spring & Damping (0.0f means hard limits by default)
++ float m_linearStiffness = 0.0f;
++ float m_linearDamping = 0.0f;
++ float m_angularStiffness = 0.0f;
++ float m_angularDamping = 0.0f;
++
++ };
++
++ QT_END_NAMESPACE
++
++ #endif // QD6JOINT_P_H