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_DISTANCEJOINT_H |
31 | #define PX_DISTANCEJOINT_H |
32 | /** \addtogroup extensions |
33 | @{ |
34 | */ |
35 | |
36 | #include "extensions/PxJoint.h" |
37 | |
38 | #if !PX_DOXYGEN |
39 | namespace physx |
40 | { |
41 | #endif |
42 | |
43 | class PxDistanceJoint; |
44 | |
45 | /** |
46 | \brief Create a distance Joint. |
47 | |
48 | \param[in] physics The physics SDK |
49 | \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 |
50 | \param[in] localFrame0 The position and orientation of the joint relative to actor0 |
51 | \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 |
52 | \param[in] localFrame1 The position and orientation of the joint relative to actor1 |
53 | |
54 | @see PxDistanceJoint |
55 | */ |
56 | PxDistanceJoint* PxDistanceJointCreate(PxPhysics& physics, PxRigidActor* actor0, const PxTransform& localFrame0, PxRigidActor* actor1, const PxTransform& localFrame1); |
57 | |
58 | |
59 | /** |
60 | \brief flags for configuring the drive of a PxDistanceJoint |
61 | |
62 | @see PxDistanceJoint |
63 | */ |
64 | struct PxDistanceJointFlag |
65 | { |
66 | enum Enum |
67 | { |
68 | eMAX_DISTANCE_ENABLED = 1<<1, |
69 | eMIN_DISTANCE_ENABLED = 1<<2, |
70 | eSPRING_ENABLED = 1<<3 |
71 | }; |
72 | }; |
73 | |
74 | typedef PxFlags<PxDistanceJointFlag::Enum, PxU16> PxDistanceJointFlags; |
75 | PX_FLAGS_OPERATORS(PxDistanceJointFlag::Enum, PxU16) |
76 | |
77 | /** |
78 | \brief a joint that maintains an upper or lower bound (or both) on the distance between two points on different objects |
79 | |
80 | @see PxDistanceJointCreate PxJoint |
81 | */ |
82 | class PxDistanceJoint : public PxJoint |
83 | { |
84 | public: |
85 | |
86 | /** |
87 | \brief Return the current distance of the joint |
88 | */ |
89 | virtual PxReal getDistance() const = 0; |
90 | |
91 | /** |
92 | \brief Set the allowed minimum distance for the joint. |
93 | |
94 | The minimum distance must be no more than the maximum distance |
95 | |
96 | <b>Default</b> 0.0f |
97 | <b>Range</b> [0, PX_MAX_F32) |
98 | |
99 | \param[in] distance the minimum distance |
100 | |
101 | @see PxDistanceJoint::minDistance, PxDistanceJointFlag::eMIN_DISTANCE_ENABLED getMinDistance() |
102 | */ |
103 | virtual void setMinDistance(PxReal distance) = 0; |
104 | |
105 | /** |
106 | \brief Get the allowed minimum distance for the joint. |
107 | |
108 | \return the allowed minimum distance |
109 | |
110 | @see PxDistanceJoint::minDistance, PxDistanceJointFlag::eMIN_DISTANCE_ENABLED setMinDistance() |
111 | */ |
112 | virtual PxReal getMinDistance() const = 0; |
113 | |
114 | /** |
115 | \brief Set the allowed maximum distance for the joint. |
116 | |
117 | The maximum distance must be no less than the minimum distance. |
118 | |
119 | <b>Default</b> 0.0f |
120 | <b>Range</b> [0, PX_MAX_F32) |
121 | |
122 | \param[in] distance the maximum distance |
123 | |
124 | @see PxDistanceJoint::maxDistance, PxDistanceJointFlag::eMAX_DISTANCE_ENABLED getMinDistance() |
125 | */ |
126 | virtual void setMaxDistance(PxReal distance) = 0; |
127 | |
128 | /** |
129 | \brief Get the allowed maximum distance for the joint. |
130 | |
131 | \return the allowed maximum distance |
132 | |
133 | @see PxDistanceJoint::maxDistance, PxDistanceJointFlag::eMAX_DISTANCE_ENABLED setMaxDistance() |
134 | */ |
135 | virtual PxReal getMaxDistance() const = 0; |
136 | |
137 | /** |
138 | \brief Set the error tolerance of the joint. |
139 | |
140 | \param[in] tolerance the distance beyond the allowed range at which the joint becomes active |
141 | |
142 | @see PxDistanceJoint::tolerance, getTolerance() |
143 | */ |
144 | virtual void setTolerance(PxReal tolerance) = 0; |
145 | |
146 | /** |
147 | \brief Get the error tolerance of the joint. |
148 | |
149 | the distance beyond the joint's [min, max] range before the joint becomes active. |
150 | |
151 | <b>Default</b> 0.25f * PxTolerancesScale::length |
152 | <b>Range</b> (0, PX_MAX_F32) |
153 | |
154 | This value should be used to ensure that if the minimum distance is zero and the |
155 | spring function is in use, the rest length of the spring is non-zero. |
156 | |
157 | @see PxDistanceJoint::tolerance, setTolerance() |
158 | */ |
159 | virtual PxReal getTolerance() const = 0; |
160 | |
161 | /** |
162 | \brief Set the strength of the joint spring. |
163 | |
164 | The spring is used if enabled, and the distance exceeds the range [min-error, max+error]. |
165 | |
166 | <b>Default</b> 0.0f |
167 | <b>Range</b> [0, PX_MAX_F32) |
168 | |
169 | \param[in] stiffness the spring strength of the joint |
170 | |
171 | @see PxDistanceJointFlag::eSPRING_ENABLED getStiffness() |
172 | */ |
173 | virtual void setStiffness(PxReal stiffness) = 0; |
174 | |
175 | /** |
176 | \brief Get the strength of the joint spring. |
177 | |
178 | \return stiffness the spring strength of the joint |
179 | |
180 | @see PxDistanceJointFlag::eSPRING_ENABLED setStiffness() |
181 | */ |
182 | virtual PxReal getStiffness() const = 0; |
183 | |
184 | /** |
185 | \brief Set the damping of the joint spring. |
186 | |
187 | The spring is used if enabled, and the distance exceeds the range [min-error, max+error]. |
188 | |
189 | <b>Default</b> 0.0f |
190 | <b>Range</b> [0, PX_MAX_F32) |
191 | |
192 | \param[in] damping the degree of damping of the joint spring of the joint |
193 | |
194 | @see PxDistanceJointFlag::eSPRING_ENABLED setDamping() |
195 | */ |
196 | virtual void setDamping(PxReal damping) = 0; |
197 | |
198 | /** |
199 | \brief Get the damping of the joint spring. |
200 | |
201 | \return the degree of damping of the joint spring of the joint |
202 | |
203 | @see PxDistanceJointFlag::eSPRING_ENABLED setDamping() |
204 | */ |
205 | virtual PxReal getDamping() const = 0; |
206 | |
207 | /** |
208 | \brief Set the flags specific to the Distance Joint. |
209 | |
210 | <b>Default</b> PxDistanceJointFlag::eMAX_DISTANCE_ENABLED |
211 | |
212 | \param[in] flags The joint flags. |
213 | |
214 | @see PxDistanceJointFlag setFlag() getFlags() |
215 | */ |
216 | virtual void setDistanceJointFlags(PxDistanceJointFlags flags) = 0; |
217 | |
218 | /** |
219 | \brief Set a single flag specific to a Distance Joint to true or false. |
220 | |
221 | \param[in] flag The flag to set or clear. |
222 | \param[in] value the value to which to set the flag |
223 | |
224 | @see PxDistanceJointFlag, getFlags() setFlags() |
225 | */ |
226 | virtual void setDistanceJointFlag(PxDistanceJointFlag::Enum flag, bool value) = 0; |
227 | |
228 | /** |
229 | \brief Get the flags specific to the Distance Joint. |
230 | |
231 | \return the joint flags |
232 | |
233 | @see PxDistanceJoint::flags, PxDistanceJointFlag setFlag() setFlags() |
234 | */ |
235 | virtual PxDistanceJointFlags getDistanceJointFlags() const = 0; |
236 | |
237 | /** |
238 | \brief Returns string name of PxDistanceJoint, used for serialization |
239 | */ |
240 | virtual const char* getConcreteTypeName() const { return "PxDistanceJoint" ; } |
241 | |
242 | protected: |
243 | |
244 | //serialization |
245 | |
246 | /** |
247 | \brief Constructor |
248 | */ |
249 | PX_INLINE PxDistanceJoint(PxType concreteType, PxBaseFlags baseFlags) : PxJoint(concreteType, baseFlags) {} |
250 | |
251 | /** |
252 | \brief Deserialization constructor |
253 | */ |
254 | PX_INLINE PxDistanceJoint(PxBaseFlags baseFlags) : PxJoint(baseFlags) {} |
255 | |
256 | /** |
257 | \brief Returns whether a given type name matches with the type of this instance |
258 | */ |
259 | virtual bool isKindOf(const char* name) const { return !::strcmp(s1: "PxDistanceJoint" , s2: name) || PxJoint::isKindOf(name); } |
260 | |
261 | //~serialization |
262 | }; |
263 | |
264 | #if !PX_DOXYGEN |
265 | } // namespace physx |
266 | #endif |
267 | |
268 | /** @} */ |
269 | #endif |
270 | |