1//
2// Redistribution and use in source and binary forms, with or without
3// modification, are permitted provided that the following conditions
4// are met:
5// * Redistributions of source code must retain the above copyright
6// notice, this list of conditions and the following disclaimer.
7// * Redistributions in binary form must reproduce the above copyright
8// notice, this list of conditions and the following disclaimer in the
9// documentation and/or other materials provided with the distribution.
10// * Neither the name of NVIDIA CORPORATION nor the names of its
11// contributors may be used to endorse or promote products derived
12// from this software without specific prior written permission.
13//
14// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ''AS IS'' AND ANY
15// EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
16// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
17// PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
18// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
19// EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
20// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
21// PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
22// OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
23// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
24// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
25//
26// Copyright (c) 2008-2021 NVIDIA Corporation. All rights reserved.
27// Copyright (c) 2004-2008 AGEIA Technologies, Inc. All rights reserved.
28// Copyright (c) 2001-2004 NovodeX AG. All rights reserved.
29
30#ifndef PX_PRISMATICJOINT_H
31#define PX_PRISMATICJOINT_H
32/** \addtogroup extensions
33 @{
34*/
35
36#include "extensions/PxJoint.h"
37#include "extensions/PxJointLimit.h"
38
39#if !PX_DOXYGEN
40namespace physx
41{
42#endif
43
44class PxPrismaticJoint;
45
46/**
47\brief Create a prismatic joint.
48
49 \param[in] physics The physics SDK
50 \param[in] actor0 An actor to which the joint is attached. NULL may be used to attach the joint to a specific point in the world frame
51 \param[in] localFrame0 The position and orientation of the joint relative to actor0
52 \param[in] actor1 An actor to which the joint is attached. NULL may be used to attach the joint to a specific point in the world frame
53 \param[in] localFrame1 The position and orientation of the joint relative to actor1
54
55@see PxPrismaticJoint
56*/
57PxPrismaticJoint* PxPrismaticJointCreate(PxPhysics& physics, PxRigidActor* actor0, const PxTransform& localFrame0, PxRigidActor* actor1, const PxTransform& localFrame1);
58
59
60/**
61\brief Flags specific to the prismatic joint.
62
63@see PxPrismaticJoint
64*/
65struct PxPrismaticJointFlag
66{
67 enum Enum
68 {
69 eLIMIT_ENABLED = 1<<1
70 };
71};
72
73typedef PxFlags<PxPrismaticJointFlag::Enum, PxU16> PxPrismaticJointFlags;
74PX_FLAGS_OPERATORS(PxPrismaticJointFlag::Enum, PxU16)
75
76/**
77 \brief A prismatic joint permits relative translational movement between two bodies along
78 an axis, but no relative rotational movement.
79
80 the axis on each body is defined as the line containing the origin of the joint frame and
81 extending along the x-axis of that frame
82
83 \image html prismJoint.png
84
85 @see PxPrismaticJointCreate() PxJoint
86*/
87class PxPrismaticJoint : public PxJoint
88{
89public:
90
91 /**
92 \brief returns the displacement of the joint along its axis.
93 */
94 virtual PxReal getPosition() const = 0;
95
96 /**
97 \brief returns the velocity of the joint along its axis
98 */
99 virtual PxReal getVelocity() const = 0;
100
101 /**
102 \brief sets the joint limit parameters.
103
104 The limit range is [-PX_MAX_F32, PX_MAX_F32], but note that the width of the limit (upper-lower) must also be
105 a valid float.
106
107 @see PxJointLinearLimitPair getLimit()
108 */
109 virtual void setLimit(const PxJointLinearLimitPair&) = 0;
110
111 /**
112 \brief gets the joint limit parameters.
113
114 @see PxJointLinearLimit getLimit()
115 */
116 virtual PxJointLinearLimitPair getLimit() const = 0;
117
118 /**
119 \brief Set the flags specific to the Prismatic Joint.
120
121 <b>Default</b> PxPrismaticJointFlags(0)
122
123 \param[in] flags The joint flags.
124
125 @see PxPrismaticJointFlag setFlag() getFlags()
126 */
127 virtual void setPrismaticJointFlags(PxPrismaticJointFlags flags) = 0;
128
129 /**
130 \brief Set a single flag specific to a Prismatic Joint to true or false.
131
132 \param[in] flag The flag to set or clear.
133 \param[in] value The value to which to set the flag
134
135 @see PxPrismaticJointFlag, getFlags() setFlags()
136 */
137 virtual void setPrismaticJointFlag(PxPrismaticJointFlag::Enum flag, bool value) = 0;
138
139 /**
140 \brief Get the flags specific to the Prismatic Joint.
141
142 \return the joint flags
143
144 @see PxPrismaticJoint::flags, PxPrismaticJointFlag setFlag() setFlags()
145 */
146 virtual PxPrismaticJointFlags getPrismaticJointFlags() const = 0;
147
148 /**
149 \brief Set the linear tolerance threshold for projection.
150
151 If the joint separates by more than this distance along its locked degrees of freedom, the solver
152 will move the bodies to close the distance.
153
154 Setting a very small tolerance may result in simulation jitter or other artifacts.
155
156 Sometimes it is not possible to project (for example when the joints form a cycle).
157
158 This value must be nonnegative.
159
160 <b>Range:</b> [0, PX_MAX_F32)<br>
161 <b>Default:</b> 1e10f
162
163 \param[in] tolerance the linear tolerance threshold
164
165 @see getProjectionLinearTolerance()
166 */
167 virtual void setProjectionLinearTolerance(PxReal tolerance) = 0;
168
169 /**
170 \brief Get the linear tolerance threshold for projection.
171
172 \return the linear tolerance threshold in radians
173
174 @see setProjectionLinearTolerance()
175 */
176 virtual PxReal getProjectionLinearTolerance() const = 0;
177
178 /**
179 \brief Set the angular tolerance threshold for projection. Projection is enabled if PxConstraintFlag::ePROJECTION
180 is set for the joint.
181
182 If the joint separates by more than this distance along its locked degrees of freedom, the solver
183 will move the bodies to close the distance.
184
185 Setting a very small tolerance may result in simulation jitter or other artifacts.
186
187 Sometimes it is not possible to project (for example when the joints form a cycle).
188
189 <b>Range:</b> [0, PX_MAX_F32)<br>
190 <b>Default:</b> Pi
191
192 \param[in] tolerance the linear tolerance threshold
193
194 @see getProjectionLinearTolerance() PxJoint::setConstraintFlags()
195 */
196 virtual void setProjectionAngularTolerance(PxReal tolerance) = 0;
197
198 /**
199 \brief Get the angular tolerance threshold for projection.
200
201 @see getProjectionAngularTolerance()
202 */
203 virtual PxReal getProjectionAngularTolerance() const = 0;
204
205 /**
206 \brief Returns string name of PxPrismaticJoint, used for serialization
207 */
208 virtual const char* getConcreteTypeName() const { return "PxPrismaticJoint"; }
209
210protected:
211 //serialization
212
213 /**
214 \brief Constructor
215 */
216 PX_INLINE PxPrismaticJoint(PxType concreteType, PxBaseFlags baseFlags) : PxJoint(concreteType, baseFlags) {}
217
218 /**
219 \brief Deserialization constructor
220 */
221 PX_INLINE PxPrismaticJoint(PxBaseFlags baseFlags) : PxJoint(baseFlags) {}
222
223 /**
224 \brief Returns whether a given type name matches with the type of this instance
225 */
226 virtual bool isKindOf(const char* name) const { return !::strcmp(s1: "PxPrismaticJoint", s2: name) || PxJoint::isKindOf(name); }
227
228 //~serialization
229};
230
231#if !PX_DOXYGEN
232} // namespace physx
233#endif
234
235/** @} */
236#endif
237

source code of qtquick3dphysics/src/3rdparty/PhysX/include/extensions/PxPrismaticJoint.h