| 1 | /* |
| 2 | * Copyright (c) 2008-2015, NVIDIA CORPORATION. All rights reserved. |
| 3 | * |
| 4 | * NVIDIA CORPORATION and its licensors retain all intellectual property |
| 5 | * and proprietary rights in and to this software, related documentation |
| 6 | * and any modifications thereto. Any use, reproduction, disclosure or |
| 7 | * distribution of this software and related documentation without an express |
| 8 | * license agreement from NVIDIA CORPORATION is strictly prohibited. |
| 9 | */ |
| 10 | // Copyright (c) 2004-2008 AGEIA Technologies, Inc. All rights reserved. |
| 11 | // Copyright (c) 2001-2004 NovodeX AG. All rights reserved. |
| 12 | |
| 13 | |
| 14 | #ifndef PX_PHYSICS_NX_CLOTH |
| 15 | #define PX_PHYSICS_NX_CLOTH |
| 16 | /** \addtogroup cloth |
| 17 | @{ |
| 18 | */ |
| 19 | |
| 20 | #include "PxPhysXConfig.h" |
| 21 | #include "PxActor.h" |
| 22 | #include "PxLockedData.h" |
| 23 | #include "PxFiltering.h" |
| 24 | #include "cloth/PxClothFabric.h" |
| 25 | #include "cloth/PxClothTypes.h" |
| 26 | #include "cloth/PxClothCollisionData.h" |
| 27 | |
| 28 | #ifndef PX_DOXYGEN |
| 29 | namespace physx |
| 30 | { |
| 31 | #endif |
| 32 | |
| 33 | class PxScene; |
| 34 | |
| 35 | /** |
| 36 | \brief Solver configuration parameters for the vertical and horizontal stretch phase types. |
| 37 | \see PxCloth.setStretchConfig() |
| 38 | \see PxClothFabric for information on actual phase data in cloth fabric |
| 39 | */ |
| 40 | struct PxClothStretchConfig |
| 41 | { |
| 42 | /** |
| 43 | \brief Stiffness of the stretch constraints. |
| 44 | \details Defines for the constraint edges how much of the distance error between current length |
| 45 | and rest length to correct per stiffness period (see PxCloth::setStiffnessFrequency). |
| 46 | A value of 0 means no correction, a value of 1 corrects to rest length. |
| 47 | The default is 1. |
| 48 | */ |
| 49 | PxReal stiffness; |
| 50 | |
| 51 | /** |
| 52 | \brief Stiffness multiplier of the cloth solver under certain limits. |
| 53 | \details The valid range is [0, 1], the default multiplier is 1.0. |
| 54 | \see stretchLimit |
| 55 | */ |
| 56 | PxReal stiffnessMultiplier; |
| 57 | |
| 58 | /** |
| 59 | \brief Limit to control when stiffnessMultiplier has to be applied. |
| 60 | \details stiffnessMultiplier multiplies the normal stiffness if the ratio |
| 61 | between constraint edge length and rest length lies in the [compressionLimit, 1] range. |
| 62 | The valid range is [0, 1], the default limit is 1.0. |
| 63 | */ |
| 64 | PxReal compressionLimit; |
| 65 | |
| 66 | /** |
| 67 | \brief Limit to control when stiffnessMultiplier has to be applied. |
| 68 | \details stiffnessMultiplier multiplies the normal stiffness if the ratio |
| 69 | between constraint edge length and rest length lies in the [1, stretchLimit] range. |
| 70 | The valid range is [1, PX_MAX_F32), the default limit is 1.0. |
| 71 | */ |
| 72 | PxReal stretchLimit; |
| 73 | |
| 74 | /** |
| 75 | \brief Constructor initializes to default values. |
| 76 | */ |
| 77 | PX_INLINE PxClothStretchConfig( PxReal stiffness_=1.0f, |
| 78 | PxReal stiffnessMultiplier_=1.0f, PxReal compressionLimit_=1.0f, PxReal stretchLimit_=1.0f) |
| 79 | : stiffness(stiffness_) |
| 80 | , stiffnessMultiplier(stiffnessMultiplier_) |
| 81 | , compressionLimit(compressionLimit_) |
| 82 | , stretchLimit(stretchLimit_) |
| 83 | {} |
| 84 | }; |
| 85 | |
| 86 | /** |
| 87 | \brief Solver configuration parameters for the tether phases. |
| 88 | \see PxCloth.setTetherConfig() |
| 89 | \see PxClothFabric for information on actual tether constraints in cloth fabric. |
| 90 | */ |
| 91 | struct PxClothTetherConfig |
| 92 | { |
| 93 | /** |
| 94 | \brief Stiffness of the tether constraints. |
| 95 | \details Defines for the tether constraints how much of the error between current |
| 96 | distance and tether length to correct per stiffness period (see PxCloth::setStiffnessFrequency). |
| 97 | A value of 0 means no correction, a value of 1 corrects to rest length. |
| 98 | The default stiffness is 1.0. |
| 99 | */ |
| 100 | PxReal stiffness; |
| 101 | |
| 102 | /** |
| 103 | \brief Scale of tether lengths when applying tether constraints. |
| 104 | \details The limit distance of a tether constraint is computed |
| 105 | as the product of stretchLimit and the tether length. |
| 106 | The default limit is 1.0. |
| 107 | */ |
| 108 | PxReal stretchLimit; |
| 109 | |
| 110 | /** |
| 111 | \brief Constructor sets to default. |
| 112 | */ |
| 113 | PX_INLINE PxClothTetherConfig(PxReal stiffness_ = 1.0f, PxReal stretchLimit_ = 1.0f) |
| 114 | : stiffness(stiffness_), stretchLimit(stretchLimit_) |
| 115 | {} |
| 116 | }; |
| 117 | |
| 118 | /** |
| 119 | \brief Solver configuration parameters for the tether phases. |
| 120 | \see PxCloth.setTetherConfig() |
| 121 | \see PxClothFabric for information on actual tether constraints in cloth fabric. |
| 122 | */ |
| 123 | struct PxClothMotionConstraintConfig |
| 124 | { |
| 125 | /** |
| 126 | \brief Scale of motion constraint radii. |
| 127 | \details The motion constraint radius is computed |
| 128 | as constraint.radius * config.scale + config.bias. |
| 129 | The default scale is 1.0. |
| 130 | */ |
| 131 | PxReal scale; |
| 132 | |
| 133 | /** |
| 134 | \brief Bias of motion constraint radii. |
| 135 | \details The motion constraint radius is computed |
| 136 | as constraint.radius * config.scale + config.bias. |
| 137 | The default bias is 0.0. |
| 138 | */ |
| 139 | PxReal bias; |
| 140 | |
| 141 | /** |
| 142 | \brief Stiffness of the motion constraints. |
| 143 | \details Defines for the motion constraints how much of the error between current |
| 144 | distance and constraint radius to correct per stiffness period (see PxCloth::setStiffnessFrequency). |
| 145 | A value of 0 means no correction, a value of 1 corrects to rest length. |
| 146 | The default stiffness is 1. |
| 147 | */ |
| 148 | PxReal stiffness; |
| 149 | |
| 150 | /** |
| 151 | \brief Constructor sets to default. |
| 152 | */ |
| 153 | PX_INLINE PxClothMotionConstraintConfig(PxReal radiiScale = 1.0f, PxReal radiiBias = 0.0f, PxReal consStiffness = 1.0f) |
| 154 | : scale(radiiScale), bias(radiiBias), stiffness(consStiffness) |
| 155 | {} |
| 156 | }; |
| 157 | |
| 158 | /** |
| 159 | \brief Set of connected particles tailored towards simulating character cloth. |
| 160 | \details A cloth object consists of the following components: |
| 161 | \arg A set of particles that sample the cloth. The sampling does not need to be regular. |
| 162 | Particles are simulated in local space, which allows tuning the effect of changes to the global pose on the particles. |
| 163 | \arg Distance, bending, shearing, and tether constraints between particles. |
| 164 | These are stored in a PxClothFabric instance which can be shared across cloth instances. |
| 165 | \arg Spheres, capsules, convexes, and triangle collision shapes. |
| 166 | These shapes are all treated separately to the main PhysX rigid body scene. |
| 167 | \arg Virtual particles can be used to improve collision at a finer scale than the cloth sampling. |
| 168 | \arg Motion and separation constraints are used to limit the particle movement within or outside of a sphere. |
| 169 | |
| 170 | @see PxPhysics.createCloth |
| 171 | */ |
| 172 | class PxCloth : public PxActor |
| 173 | { |
| 174 | public: |
| 175 | /** |
| 176 | \brief Deletes the cloth. |
| 177 | Do not keep a reference to the deleted instance. |
| 178 | */ |
| 179 | virtual void release() = 0; |
| 180 | |
| 181 | /** |
| 182 | \brief Returns a pointer to the corresponding cloth fabric. |
| 183 | \return The associated cloth fabric. |
| 184 | */ |
| 185 | virtual PxClothFabric* getFabric() const = 0; |
| 186 | |
| 187 | /** |
| 188 | \brief Returns world space bounding box. |
| 189 | \param[in] inflation Scale factor for computed world bounds. Box extents are multiplied by this value. |
| 190 | \return Particle bounds in global coordinates. |
| 191 | */ |
| 192 | virtual PxBounds3 getWorldBounds(float inflation=1.01f) const = 0; |
| 193 | |
| 194 | /** |
| 195 | \brief Returns the number of particles. |
| 196 | \return Number of particles. |
| 197 | */ |
| 198 | virtual PxU32 getNbParticles() const = 0; |
| 199 | |
| 200 | /** |
| 201 | \brief Acquires access to the cloth particle data. |
| 202 | \details This function returns a pointer to a PxClothParticleData instance providing access to the |
| 203 | PxClothParticle array of the current and previous iteration. The user is responsible for calling |
| 204 | PxClothParticleData::unlock() after reading or updating the data. In case the lock has been |
| 205 | requested using PxDataAccessFlag::eWRITABLE, the unlock() call copies the arrays pointed to by |
| 206 | PxClothParticleData::particles/previousParticles back to the internal particle buffer. |
| 207 | Updating the data when a read-only lock has been requested results in undefined behavior. |
| 208 | Requesting multiple concurrent read-only locks is supported, but no other lock may be active |
| 209 | when requesting a write lock. |
| 210 | |
| 211 | If PxDataAccessFlag::eDEVICE is set in flags then the returned pointers will be to GPU |
| 212 | device memory, this can be used for direct interop with graphics APIs. Note that these pointers |
| 213 | should only be considered valid until PxClothParticleData::unlock() is called and should not |
| 214 | be stored. PxDataAccessFlag::eDEVICE implies read and write access, and changing the |
| 215 | particles/previousParticles members results in undefined behavior. |
| 216 | |
| 217 | \param flags Specifies if particle data is read or written. |
| 218 | \return PxClothParticleData pointer which provides access to positions and weight. |
| 219 | */ |
| 220 | virtual PxClothParticleData* lockParticleData(PxDataAccessFlags flags) = 0; |
| 221 | /** |
| 222 | \brief Acquires read access to the cloth particle data. |
| 223 | \return PxClothParticleData pointer which provides access to positions and weight. |
| 224 | \note This function is equivalent to lockParticleData(PxDataAccessFlag::eREADABLE). |
| 225 | */ |
| 226 | virtual PxClothParticleData* lockParticleData() const = 0; |
| 227 | |
| 228 | /** |
| 229 | \brief Updates cloth particle location or inverse weight for current and previous particle state. |
| 230 | \param [in] currentParticles The particle data for the current particle state or NULL if the state should not be changed. |
| 231 | \param [in] previousParticles The particle data for the previous particle state or NULL if the state should not be changed. |
| 232 | \note The invWeight stored in \a previousParticles is the new particle inverse mass, or zero for a static particle. |
| 233 | However, if invWeight stored in \a currentParticles is non-zero, it is still used once for the next particle integration and fabric solve. |
| 234 | \note If <b>currentParticles</b> or <b>previousParticles</b> are non-NULL then they must be the length specified by getNbParticles(). |
| 235 | \note This can be used to teleport particles (use same positions for current and previous). |
| 236 | \see PxClothParticle |
| 237 | */ |
| 238 | virtual void setParticles(const PxClothParticle* currentParticles, const PxClothParticle* previousParticles) = 0; |
| 239 | |
| 240 | /** |
| 241 | \brief Sets cloth flags (e.g. use GPU for simulation, enable CCD, collide against scene). |
| 242 | \param [in] flag Mask of which flags to set. |
| 243 | \param [in] value Value to set flags to. |
| 244 | */ |
| 245 | virtual void setClothFlag(PxClothFlag::Enum flag, bool value) = 0; |
| 246 | /** |
| 247 | \brief Set all cloth flags |
| 248 | \param [in] inFlags Bit mask of flag values |
| 249 | */ |
| 250 | virtual void setClothFlags(PxClothFlags inFlags) = 0; |
| 251 | /** |
| 252 | \brief Returns cloth flags. |
| 253 | \return Cloth flags. |
| 254 | */ |
| 255 | virtual PxClothFlags getClothFlags() const = 0; |
| 256 | |
| 257 | /** @name Integration |
| 258 | * Functions related to particle integration. |
| 259 | */ |
| 260 | /// @{ |
| 261 | |
| 262 | /** |
| 263 | \brief Sets pose that the cloth should move to by the end of the next simulate() call. |
| 264 | \details This function will move the cloth in world space. The resulting |
| 265 | simulation may reflect inertia effect as a result of pose acceleration. |
| 266 | \param [in] pose Target pose at the end of the next simulate() call. |
| 267 | \see setGlobalPose() to move cloth without inertia effect. |
| 268 | */ |
| 269 | virtual void setTargetPose(const PxTransform& pose) = 0; |
| 270 | /** |
| 271 | \brief Sets current pose of the cloth without affecting inertia. |
| 272 | \details Use this to reset the pose (e.g. teleporting). |
| 273 | \param [in] pose New global pose. |
| 274 | \note No pose interpolation is performed. |
| 275 | \note Inertia is not preserved. |
| 276 | \see setTargetPose() for inertia preserving method. |
| 277 | */ |
| 278 | virtual void setGlobalPose(const PxTransform& pose) = 0; |
| 279 | /** |
| 280 | \brief Returns global pose. |
| 281 | \return Global pose as specified by the last setGlobalPose() or setTargetPose() call. |
| 282 | */ |
| 283 | virtual PxTransform getGlobalPose() const = 0; |
| 284 | |
| 285 | /** |
| 286 | \brief Sets the solver frequency parameter. |
| 287 | \details Solver frequency specifies how often the simulation step is computed per second. |
| 288 | For example, a value of 60 represents one simulation step per frame |
| 289 | in a 60fps scene. A value of 120 will represent two simulation steps per frame, etc. |
| 290 | \param [in] frequency Solver frequency per second (default: 60.0). |
| 291 | */ |
| 292 | virtual void setSolverFrequency(PxReal frequency) = 0; |
| 293 | /** |
| 294 | \brief Returns solver frequency. |
| 295 | \return Solver frequency. |
| 296 | */ |
| 297 | virtual PxReal getSolverFrequency() const = 0; |
| 298 | |
| 299 | /** |
| 300 | \brief Returns previous time step size. |
| 301 | \details Time between sampling of previous and current particle positions for computing particle velocity. |
| 302 | \return Previous time step size. |
| 303 | */ |
| 304 | virtual PxReal getPreviousTimeStep() const = 0; |
| 305 | |
| 306 | /** |
| 307 | \brief Sets the stiffness frequency parameter. |
| 308 | \details The stiffness frequency controls the power-law nonlinearity of all rate of change parameters |
| 309 | (stretch stiffness, shear stiffness, bending stiffness, tether stiffness, self-collision |
| 310 | stiffness, motion constraint stiffness, damp coefficient, linear and angular drag coefficients). |
| 311 | Increasing the frequency avoids numerical cancellation for values near zero or one, but increases the |
| 312 | non-linearity of the parameter. It is not recommended to change this parameter after cloth initialization. |
| 313 | For example, the portion of edge overstretch removed per second is |
| 314 | equal to the stretch stiffness raised to the power of the stiffness frequency. |
| 315 | \param [in] frequency Stiffness frequency per second (default: 10.0). |
| 316 | */ |
| 317 | virtual void setStiffnessFrequency(PxReal frequency) = 0; |
| 318 | /** |
| 319 | \brief Returns stiffness frequency. |
| 320 | \return Stiffness frequency. |
| 321 | \see setStiffnessFrequency() for details. |
| 322 | */ |
| 323 | virtual PxReal getStiffnessFrequency() const = 0; |
| 324 | |
| 325 | /** |
| 326 | \brief Sets the acceleration scale factor to adjust inertia effect from global pose changes. |
| 327 | \param [in] scale New scale factor between 0.0 (no inertia) and 1.0 (full inertia) (default: 1.0). |
| 328 | \note The scale is specified independently for each local coordinate axis. |
| 329 | \note A value of 0.0 disables all inertia effects of translations applied through setTargetPos(). |
| 330 | \see setTargetPose() |
| 331 | */ |
| 332 | virtual void setLinearInertiaScale(PxVec3 scale) = 0; |
| 333 | /** |
| 334 | \brief Returns linear acceleration scale parameter. |
| 335 | \return Linear acceleration scale parameter. |
| 336 | */ |
| 337 | virtual PxVec3 getLinearInertiaScale() const = 0; |
| 338 | /** |
| 339 | \brief Sets the acceleration scale factor to adjust inertia effect from global pose changes. |
| 340 | \param [in] scale New scale factor between 0.0 (no inertia) and 1.0 (full inertia) (default: 1.0). |
| 341 | \note The scale is specified independently for each local rotation axis. |
| 342 | \note A value of 0.0 disables all inertia effects of rotations applied through setTargetPos(). |
| 343 | \see setTargetPose() |
| 344 | */ |
| 345 | virtual void setAngularInertiaScale(PxVec3 scale) = 0; |
| 346 | /** |
| 347 | \brief Returns angular acceleration scale parameter. |
| 348 | \return Angular acceleration scale parameter. |
| 349 | */ |
| 350 | virtual PxVec3 getAngularInertiaScale() const = 0; |
| 351 | /** |
| 352 | \brief Sets the acceleration scale factor to adjust inertia effect from global pose changes. |
| 353 | \param [in] scale New scale factor between 0.0 (no centrifugal force) and 1.0 (full centrifugal force) (default: 1.0). |
| 354 | \note The scale is specified independently for each local rotation axis. |
| 355 | \note A value of 0.0 disables all centrifugal forces of rotations applied through setTargetPos(). |
| 356 | \see setTargetPose() |
| 357 | */ |
| 358 | virtual void setCentrifugalInertiaScale(PxVec3 scale) = 0; |
| 359 | /** |
| 360 | \brief Returns centrifugal acceleration scale parameter. |
| 361 | \return Centrifugal acceleration scale parameter. |
| 362 | */ |
| 363 | virtual PxVec3 getCentrifugalInertiaScale() const = 0; |
| 364 | /** |
| 365 | \brief Same as <code>setLinearInertiaScale(PxVec3(scale)); |
| 366 | setAngularInertiaScale(PxVec3(scale)); getCentrifugalInertiaScale(PxVec3(scale)); </code> |
| 367 | */ |
| 368 | virtual void setInertiaScale(PxReal scale) = 0; |
| 369 | |
| 370 | /** |
| 371 | \brief Sets the damping coefficient. |
| 372 | \details The damping coefficient is the portion of local particle velocity |
| 373 | that is canceled per stiffness period (see PxCloth::setStiffnessFrequency). |
| 374 | \note The scale is specified independently for each local space axis. |
| 375 | \param [in] dampingCoefficient New damping coefficient between 0.0 and 1.0 (default: 0.0). |
| 376 | */ |
| 377 | virtual void setDampingCoefficient(PxVec3 dampingCoefficient) = 0; |
| 378 | /** |
| 379 | \brief Returns the damping coefficient. |
| 380 | \return Damping coefficient. |
| 381 | */ |
| 382 | virtual PxVec3 getDampingCoefficient() const = 0; |
| 383 | |
| 384 | /** |
| 385 | \brief Sets the linear drag coefficient. |
| 386 | \details The linear drag coefficient is the portion of the pose translation |
| 387 | that is applied to each particle per stiffness period (see PxCloth::setStiffnessFrequency). |
| 388 | \note The scale is specified independently for each local space axis. |
| 389 | \param [in] dragCoefficient New linear drag coefficient between 0.0f and 1.0 (default: 0.0). |
| 390 | \note The drag coefficient shouldn't be set higher than the damping coefficient. |
| 391 | */ |
| 392 | virtual void setLinearDragCoefficient(PxVec3 dragCoefficient) = 0; |
| 393 | /** |
| 394 | \brief Returns the linear drag coefficient. |
| 395 | \return Linear drag coefficient. |
| 396 | */ |
| 397 | virtual PxVec3 getLinearDragCoefficient() const = 0; |
| 398 | /** |
| 399 | \brief Sets the angular drag coefficient. |
| 400 | \details The angular drag coefficient is the portion of the pose rotation |
| 401 | that is applied to each particle per stiffness period (see PxCloth::setStiffnessFrequency). |
| 402 | \note The scale is specified independently for each local rotation axis. |
| 403 | \param [in] dragCoefficient New angular drag coefficient between 0.0f and 1.0 (default: 0.0). |
| 404 | \note The drag coefficient shouldn't be set higher than the damping coefficient. |
| 405 | */ |
| 406 | virtual void setAngularDragCoefficient(PxVec3 dragCoefficient) = 0; |
| 407 | /** |
| 408 | \brief Returns the angular drag coefficient. |
| 409 | \return Angular drag coefficient. |
| 410 | */ |
| 411 | virtual PxVec3 getAngularDragCoefficient() const = 0; |
| 412 | /** |
| 413 | \brief Same as <code>setLinearDragCoefficient(PxVec3(coefficient)); |
| 414 | setAngularDragCoefficient(PxVec3(coefficient));</code> |
| 415 | */ |
| 416 | virtual void setDragCoefficient(PxReal scale) = 0; |
| 417 | |
| 418 | /** |
| 419 | \brief Sets external particle accelerations. |
| 420 | \param [in] acceleration New acceleration in global coordinates (default: 0.0). |
| 421 | \note Use this to implement simple wind etc. |
| 422 | */ |
| 423 | virtual void setExternalAcceleration(PxVec3 acceleration) = 0; |
| 424 | /** |
| 425 | \brief Returns external acceleration. |
| 426 | \return External acceleration in global coordinates. |
| 427 | */ |
| 428 | virtual PxVec3 getExternalAcceleration() const = 0; |
| 429 | |
| 430 | /** |
| 431 | \brief Updates particle accelerations, w component is ignored. |
| 432 | \param [in] particleAccelerations New particle accelerations. |
| 433 | \note The <b>particleAccelerations</b> must either be null to disable accelerations, |
| 434 | or be the same length as the number of particles, see getNbParticles(). |
| 435 | */ |
| 436 | virtual void setParticleAccelerations(const PxVec4* particleAccelerations) = 0; |
| 437 | /** |
| 438 | \brief Copies particle accelerations to the user provided buffer. |
| 439 | \param [out] particleAccelerationsBuffer Destination buffer, must be at least getNbParticleAccelerations(). |
| 440 | \return true if the copy was successful. |
| 441 | */ |
| 442 | virtual bool getParticleAccelerations(PxVec4* particleAccelerationsBuffer) const = 0; |
| 443 | /** |
| 444 | \brief Returns the number of particle accelerations. |
| 445 | \return Number of particle accelerations (same as getNbParticles() if enabled, 0 otherwise). |
| 446 | */ |
| 447 | virtual PxU32 getNbParticleAccelerations() const = 0; |
| 448 | |
| 449 | /// @} |
| 450 | |
| 451 | /** @name Constraints |
| 452 | * Functions related to particle and distance constaints. |
| 453 | */ |
| 454 | /// @{ |
| 455 | |
| 456 | /** |
| 457 | \brief Updates motion constraints (position and radius of the constraint sphere). |
| 458 | \param [in] motionConstraints motion constraints at the end of the next simulate() call. |
| 459 | \note The <b>motionConstraints</b> must either be null to disable motion constraints, |
| 460 | or be the same length as the number of particles, see getNbParticles(). |
| 461 | \see clearInterpolation() |
| 462 | */ |
| 463 | virtual void setMotionConstraints(const PxClothParticleMotionConstraint* motionConstraints) = 0; |
| 464 | /** |
| 465 | \brief Copies motion constraints to the user provided buffer. |
| 466 | \param [out] motionConstraintsBuffer Destination buffer, must be at least getNbMotionConstraints(). |
| 467 | \return True if the copy was successful. |
| 468 | */ |
| 469 | virtual bool getMotionConstraints(PxClothParticleMotionConstraint* motionConstraintsBuffer) const = 0; |
| 470 | /** |
| 471 | \brief Returns the number of motion constraints. |
| 472 | \return Number of motion constraints (same as getNbParticles() if enabled, 0 otherwise). |
| 473 | */ |
| 474 | virtual PxU32 getNbMotionConstraints() const = 0; |
| 475 | /** |
| 476 | \brief Specifies motion constraint scale, bias, and stiffness. |
| 477 | \param [in] config Motion constraints solver parameters. |
| 478 | */ |
| 479 | virtual void setMotionConstraintConfig(const PxClothMotionConstraintConfig& config) = 0; |
| 480 | /** |
| 481 | \brief Reads back scale and bias factor for motion constraints. |
| 482 | \see setMotionConstraintConfig() |
| 483 | */ |
| 484 | virtual PxClothMotionConstraintConfig getMotionConstraintConfig() const = 0; |
| 485 | |
| 486 | /** |
| 487 | \brief Updates separation constraints (position and radius of the constraint sphere). |
| 488 | \param [in] separationConstraints separation constraints at the end of the next simulate() call. |
| 489 | \note The <b>separationConstraints</b> must either be null to disable separation constraints, |
| 490 | or be the same length as the number of particles, see getNbParticles(). |
| 491 | \see clearInterpolation() |
| 492 | */ |
| 493 | virtual void setSeparationConstraints(const PxClothParticleSeparationConstraint* separationConstraints) = 0; |
| 494 | /** |
| 495 | \brief Copies separation constraints to the user provided buffer. |
| 496 | \param [out] separationConstraintsBuffer Destination buffer, must be at least getNbSeparationConstraints(). |
| 497 | \return True if the copy was successful. |
| 498 | */ |
| 499 | virtual bool getSeparationConstraints(PxClothParticleSeparationConstraint* separationConstraintsBuffer) const = 0; |
| 500 | /** |
| 501 | \brief Returns the number of separation constraints. |
| 502 | \return Number of separation constraints (same as getNbParticles() if enabled, 0 otherwise). |
| 503 | */ |
| 504 | virtual PxU32 getNbSeparationConstraints() const = 0; |
| 505 | |
| 506 | /** |
| 507 | \brief Assign current to previous positions for collision shapes, motion constraints, and separation constraints. |
| 508 | \details This allows to prevent false interpolation after leaping to an animation frame, for example. |
| 509 | After calling clearInterpolation(), the current positions will be used without interpolation. |
| 510 | New positions can be set afterwards to interpolate to by the end of the next frame. |
| 511 | */ |
| 512 | virtual void clearInterpolation() = 0; |
| 513 | |
| 514 | /** |
| 515 | \brief Sets the solver parameters for the vertical solver phases. |
| 516 | \param [in] config Stretch solver parameters. |
| 517 | \param [in] type Type of phases to set config for. |
| 518 | */ |
| 519 | virtual void setStretchConfig(PxClothFabricPhaseType::Enum type, const PxClothStretchConfig& config) = 0; |
| 520 | /** |
| 521 | \brief Returns the solver parameters for one of the phase types. |
| 522 | \param [in] type Type of phases to return the config for. |
| 523 | \return Vertical solver parameters. |
| 524 | */ |
| 525 | virtual PxClothStretchConfig getStretchConfig(PxClothFabricPhaseType::Enum type) const = 0; |
| 526 | /** |
| 527 | \brief Sets the stiffness parameters for the tether constraints. |
| 528 | \param [in] config Tether constraints solver parameters. |
| 529 | */ |
| 530 | virtual void setTetherConfig(const PxClothTetherConfig& config) = 0; |
| 531 | /** |
| 532 | \brief Returns the stiffness parameters for the tether constraints. |
| 533 | \return Tether solver parameters. |
| 534 | */ |
| 535 | virtual PxClothTetherConfig getTetherConfig() const = 0; |
| 536 | |
| 537 | /// @} |
| 538 | |
| 539 | /** @name Collision |
| 540 | * Functions related to particle collision. |
| 541 | */ |
| 542 | /// @{ |
| 543 | |
| 544 | /** |
| 545 | \brief Adds a new collision sphere. |
| 546 | \param [in] sphere New collision sphere. |
| 547 | \note A maximum of 32 spheres are supported. |
| 548 | */ |
| 549 | virtual void addCollisionSphere(const PxClothCollisionSphere& sphere) = 0; |
| 550 | /** |
| 551 | \brief Removes collision sphere. |
| 552 | \param [in] index Index of sphere to remove. |
| 553 | \note The indices of spheres added after \c index are decremented by 1. |
| 554 | \note Capsules made from the sphere to be removed are removed as well. |
| 555 | */ |
| 556 | virtual void removeCollisionSphere(PxU32 index) = 0; |
| 557 | /** |
| 558 | \brief Updates location and radii of collision spheres. |
| 559 | \param [in] spheresBuffer New sphere positions and radii by the end of the next simulate() call. |
| 560 | \param [in] count New number of collision spheres. |
| 561 | \note You can also use this function to change the number of collision spheres. |
| 562 | \note A maximum of 32 spheres are supported. |
| 563 | \see clearInterpolation() |
| 564 | */ |
| 565 | virtual void setCollisionSpheres(const PxClothCollisionSphere* spheresBuffer, PxU32 count) = 0; |
| 566 | /** |
| 567 | \brief Returns the number of collision spheres. |
| 568 | \return Number of collision spheres. |
| 569 | */ |
| 570 | virtual PxU32 getNbCollisionSpheres() const = 0; |
| 571 | |
| 572 | /** |
| 573 | \brief Adds a new collision capsule. |
| 574 | \details A collision capsule is defined as the bounding volume of two spheres. |
| 575 | \param [in] first Index of first sphere. |
| 576 | \param [in] second Index of second sphere. |
| 577 | \note A maximum of 32 capsules are supported. |
| 578 | \note Spheres referenced by a capsule need to be defined |
| 579 | before simulating the scene, see addCollisionSphere/setCollisionSpheres. |
| 580 | */ |
| 581 | virtual void addCollisionCapsule(PxU32 first, PxU32 second) = 0; |
| 582 | /** |
| 583 | \brief Removes a collision capsule. |
| 584 | \param [in] index Index of capsule to remove. |
| 585 | \note The indices of capsules added after \c index are decremented by 1. |
| 586 | */ |
| 587 | virtual void removeCollisionCapsule(PxU32 index) = 0; |
| 588 | /** |
| 589 | \brief Returns the number of collision capsules. |
| 590 | \return Number of collision capsules. |
| 591 | */ |
| 592 | virtual PxU32 getNbCollisionCapsules() const = 0; |
| 593 | |
| 594 | /** |
| 595 | \brief Adds a collision plane. |
| 596 | \param [in] plane New collision plane. |
| 597 | \note Planes are not used for collision until they are added to a convex object, see addCollisionConvex(). |
| 598 | \note A maximum of 32 planes are supported. |
| 599 | */ |
| 600 | virtual void addCollisionPlane(const PxClothCollisionPlane& plane) = 0; |
| 601 | /** |
| 602 | \brief Removes a collision plane. |
| 603 | \param [in] index Index of plane to remove. |
| 604 | \note The indices of planes added after \c index are decremented by 1. |
| 605 | \note Convexes that reference the plane will have the plane removed from their mask. |
| 606 | If after removal a convex consists of zero planes, it will also be removed. |
| 607 | */ |
| 608 | virtual void removeCollisionPlane(PxU32 index) = 0; |
| 609 | /** |
| 610 | \brief Updates positions of collision planes. |
| 611 | \param [in] planesBuffer New plane positions by the end of the next simulate() call. |
| 612 | \param [in] count New number of collision planes. |
| 613 | \note You can also use this function to change the number of collision planes. |
| 614 | \note A maximum of 32 planes are supported. |
| 615 | \see clearInterpolation() |
| 616 | */ |
| 617 | virtual void setCollisionPlanes(const PxClothCollisionPlane* planesBuffer, PxU32 count) = 0; |
| 618 | /** |
| 619 | \brief Returns the number of collision planes. |
| 620 | \return Number of collision planes. |
| 621 | */ |
| 622 | virtual PxU32 getNbCollisionPlanes() const = 0; |
| 623 | |
| 624 | /** |
| 625 | \brief Adds a new collision convex. |
| 626 | \details A collision convex is defined as the intersection of planes. |
| 627 | \param [in] mask The bitmask of the planes that make up the convex. |
| 628 | \note Planes referenced by a collision convex need to be defined |
| 629 | before simulating the scene, see addCollisionPlane/setCollisionPlanes. |
| 630 | */ |
| 631 | virtual void addCollisionConvex(PxU32 mask) = 0; |
| 632 | /** |
| 633 | \brief Removes a collision convex. |
| 634 | \param [in] index Index of convex to remove. |
| 635 | \note The indices of convexes added after \c index are decremented by 1. |
| 636 | \note Planes referenced by this convex will not be removed. |
| 637 | */ |
| 638 | virtual void removeCollisionConvex(PxU32 index) = 0; |
| 639 | /** |
| 640 | \brief Returns the number of collision convexes. |
| 641 | \return Number of collision convexes. |
| 642 | */ |
| 643 | virtual PxU32 getNbCollisionConvexes() const = 0; |
| 644 | |
| 645 | /** |
| 646 | \brief Adds a new collision triangle. |
| 647 | \param [in] triangle New collision triangle. |
| 648 | \note GPU cloth is limited to 500 triangles per instance. |
| 649 | */ |
| 650 | virtual void addCollisionTriangle(const PxClothCollisionTriangle& triangle) = 0; |
| 651 | /** |
| 652 | \brief Removes a collision triangle. |
| 653 | \param [in] index Index of triangle to remove. |
| 654 | \note The indices of triangles added after \c index are decremented by 1. |
| 655 | */ |
| 656 | virtual void removeCollisionTriangle(PxU32 index) = 0; |
| 657 | /** |
| 658 | \brief Updates positions of collision triangles. |
| 659 | \param [in] trianglesBuffer New triangle positions by the end of the next simulate() call. |
| 660 | \param [in] count New number of collision triangles. |
| 661 | \note You can also use this function to change the number of collision triangles. |
| 662 | \note GPU cloth is limited to 500 triangles per instance. |
| 663 | \see clearInterpolation() |
| 664 | */ |
| 665 | virtual void setCollisionTriangles(const PxClothCollisionTriangle* trianglesBuffer, PxU32 count) = 0; |
| 666 | /** |
| 667 | \brief Returns the number of collision triangles. |
| 668 | \return Number of collision triangles. |
| 669 | */ |
| 670 | virtual PxU32 getNbCollisionTriangles() const = 0; |
| 671 | |
| 672 | /** |
| 673 | \brief Retrieves the collision shapes. |
| 674 | \details Returns collision spheres, capsules, convexes, and triangles that were added through |
| 675 | the addCollision*() methods and modified through the setCollision*() methods. |
| 676 | \param [out] spheresBuffer Spheres destination buffer, must be NULL or the same length as getNbCollisionSpheres(). |
| 677 | \param [out] capsulesBuffer Capsules destination buffer, must be NULL or the same length as 2*getNbCollisionCapsules(). |
| 678 | \param [out] planesBuffer Planes destination buffer, must be NULL or the same length as getNbCollisionPlanes(). |
| 679 | \param [out] convexesBuffer Convexes destination buffer, must be NULL or the same length as getNbCollisionConvexes(). |
| 680 | \param [out] trianglesBuffer Triangles destination buffer, must be NULL or the same length as getNbCollisionTriangles(). |
| 681 | \note Returns the positions at the end of the next simulate() call as specified by the setCollision*() methods. |
| 682 | */ |
| 683 | virtual void getCollisionData(PxClothCollisionSphere* spheresBuffer, PxU32* capsulesBuffer, |
| 684 | PxClothCollisionPlane* planesBuffer, PxU32* convexesBuffer, PxClothCollisionTriangle* trianglesBuffer) const = 0; |
| 685 | |
| 686 | /** |
| 687 | \brief Assigns virtual particles. |
| 688 | \details Virtual particles provide more robust and accurate collision handling against collision spheres and capsules. |
| 689 | More virtual particles will generally increase the accuracy of collision handling, and thus |
| 690 | a sufficient number of virtual particles can mimic triangle-based collision handling.\n |
| 691 | Virtual particles are specified as barycentric interpolation of real particles: |
| 692 | The position of a virtual particle is w0 * P0 + w1 * P1 + w2 * P2, where P0, P1, P2 real particle positions. |
| 693 | The barycentric weights w0, w1, w2 are stored in a separate table so they can be shared across multiple virtual particles. |
| 694 | \param [in] numVirtualParticles total number of virtual particles. |
| 695 | \param [in] indices Each virtual particle has four indices, the first three for real particle indices, and the last |
| 696 | for the weight table index. Thus, the length of <b>indices</b> needs to be 4*numVirtualParticles. |
| 697 | \param [in] numWeights total number of unique weights triples. |
| 698 | \param [in] weights array for barycentric weights. |
| 699 | \note Virtual particles only incur a runtime cost during the collision stage. Still, it is advisable to |
| 700 | only use virtual particles for areas where high collision accuracy is desired. (e.g. sleeve around elbow). |
| 701 | */ |
| 702 | virtual void setVirtualParticles(PxU32 numVirtualParticles, const PxU32* indices, PxU32 numWeights, const PxVec3* weights) = 0; |
| 703 | /** |
| 704 | \brief Returns the number of virtual particles. |
| 705 | \return Number of virtual particles. |
| 706 | */ |
| 707 | virtual PxU32 getNbVirtualParticles() const = 0; |
| 708 | /** |
| 709 | \brief Copies index array of virtual particles to the user provided buffer. |
| 710 | \param [out] indicesBuffer Destination buffer, must be at least 4*getNbVirtualParticles(). |
| 711 | \see setVirtualParticles() |
| 712 | */ |
| 713 | virtual void getVirtualParticles(PxU32* indicesBuffer) const = 0; |
| 714 | /** |
| 715 | \brief Returns the number of the virtual particle weights. |
| 716 | \return Number of virtual particle weights. |
| 717 | */ |
| 718 | virtual PxU32 getNbVirtualParticleWeights() const = 0; |
| 719 | /** |
| 720 | \brief Copies weight table of virtual particles to the user provided buffer. |
| 721 | \param [out] weightsBuffer Destination buffer, must be at least getNbVirtualParticleWeights(). |
| 722 | */ |
| 723 | virtual void getVirtualParticleWeights(PxVec3* weightsBuffer) const = 0; |
| 724 | |
| 725 | /** |
| 726 | \brief Sets the collision friction coefficient. |
| 727 | \param [in] frictionCoefficient New friction coefficient between 0.0 and 1.0 (default: 0.0). |
| 728 | \note Currently only spheres and capsules impose friction on the colliding particles. |
| 729 | */ |
| 730 | virtual void setFrictionCoefficient(PxReal frictionCoefficient) = 0; |
| 731 | /** |
| 732 | \brief Returns the friction coefficient. |
| 733 | \return Friction coefficient. |
| 734 | */ |
| 735 | virtual PxReal getFrictionCoefficient() const = 0; |
| 736 | |
| 737 | /** |
| 738 | \brief Sets the collision mass scaling coefficient. |
| 739 | \details During collision it is possible to artificially increase the |
| 740 | mass of a colliding particle, this has an effect comparable to making |
| 741 | constraints attached to the particle stiffer and can help reduce stretching |
| 742 | and interpenetration around collision shapes. |
| 743 | \param [in] scalingCoefficient Unitless multiplier that can take on values > 1 (default: 0.0). |
| 744 | */ |
| 745 | virtual void setCollisionMassScale(PxReal scalingCoefficient) = 0; |
| 746 | /** |
| 747 | \brief Returns the mass-scaling coefficient. |
| 748 | \return Mass-scaling coefficient. |
| 749 | */ |
| 750 | virtual PxReal getCollisionMassScale() const = 0; |
| 751 | |
| 752 | /// @} |
| 753 | |
| 754 | /** @name Self-Collision |
| 755 | * Functions related to particle against particle collision. |
| 756 | */ |
| 757 | /// @{ |
| 758 | |
| 759 | /** |
| 760 | \brief Sets the self collision distance. |
| 761 | \details A value larger than 0.0 enables particle versus particle collision. |
| 762 | \param [in] distance Minimum distance at which two particles repel each other (default: 0.0). |
| 763 | */ |
| 764 | virtual void setSelfCollisionDistance(PxReal distance) = 0; |
| 765 | /** |
| 766 | \brief Returns the self-collision distance. |
| 767 | \return Self-collision distance. |
| 768 | */ |
| 769 | virtual PxReal getSelfCollisionDistance() const = 0; |
| 770 | /** |
| 771 | \brief Sets the self collision stiffness. |
| 772 | \details Self-collision stiffness controls how much two particles repel |
| 773 | each other when they are closer than the self-collision distance. |
| 774 | \param [in] stiffness Fraction of distance residual to resolve per iteration (default: 1.0). |
| 775 | */ |
| 776 | virtual void setSelfCollisionStiffness(PxReal stiffness) = 0; |
| 777 | /** |
| 778 | \brief Returns the self-collision stiffness. |
| 779 | \return Self-collision stiffness. |
| 780 | */ |
| 781 | virtual PxReal getSelfCollisionStiffness() const = 0; |
| 782 | |
| 783 | /** |
| 784 | \brief Sets a subset of cloth particles which participate in self-collision. |
| 785 | \details If non-null the cloth self-collision will consider a subset of particles |
| 786 | instead of all the particles. This can be used to improve self-collision performance |
| 787 | or to increase the minimum distance between two self-colliding particles |
| 788 | (and therefore the maximum sensible self-collision distance). |
| 789 | \param [in] indices array of particle indices which participate in self-collision. |
| 790 | \param [in] nbIndices number of particle indices, or 0 to use all particles for self-collision. |
| 791 | \note These indices will also be used if cloth inter-collision is enabled. |
| 792 | */ |
| 793 | virtual void setSelfCollisionIndices(const PxU32* indices, PxU32 nbIndices) = 0; |
| 794 | /** |
| 795 | \brief Copies array of particles participating in self-collision to the user provided buffer. |
| 796 | \param [out] indices Destination buffer, must be at least getNbSelfCollisionIndices() in length. |
| 797 | \return true if the copy was successful. |
| 798 | */ |
| 799 | virtual bool getSelfCollisionIndices(PxU32* indices) const = 0; |
| 800 | |
| 801 | /** |
| 802 | \brief Returns the number of particles participating in self-collision. |
| 803 | \return Size of particle subset participating in self-collision, or 0 if all particles are used. |
| 804 | */ |
| 805 | virtual PxU32 getNbSelfCollisionIndices() const = 0; |
| 806 | |
| 807 | /** |
| 808 | \brief Sets the cloth particles rest positions. |
| 809 | \details If non-null the cloth self-collision will consider the rest positions by |
| 810 | discarding particle->particle collision where the distance between the associated |
| 811 | rest particles is < the self collision distance. This allows self-collision distances |
| 812 | that are larger than the minimum edge length in the mesh. Typically this function |
| 813 | should be called with the same positions used to construct the cloth instance. |
| 814 | \param [in] restPositions Undeformed particle positions, the w component will be ignored |
| 815 | \note <b>restPositions</b> must either be null to disable rest position consideration, |
| 816 | or be the same length as the number of particles, see getNbParticles(). |
| 817 | */ |
| 818 | virtual void setRestPositions(const PxVec4* restPositions) = 0; |
| 819 | /** |
| 820 | \brief Copies array of rest positions to the user provided buffer. |
| 821 | \param [out] restPositions Destination buffer, must be at least getNbParticles() in length. |
| 822 | \return true if the copy was successful. |
| 823 | */ |
| 824 | virtual bool getRestPositions(PxVec4* restPositions) const = 0; |
| 825 | /** |
| 826 | \brief Returns the number of rest positions. |
| 827 | \return Number of rest positions (same as getNbParticles() if enabled, 0 otherwise). |
| 828 | */ |
| 829 | virtual PxU32 getNbRestPositions() const = 0; |
| 830 | |
| 831 | /// @} |
| 832 | |
| 833 | /** @name Inter-Collision |
| 834 | * Functions related to collision between cloth instances. |
| 835 | */ |
| 836 | /// @{ |
| 837 | |
| 838 | /** |
| 839 | \brief Sets the user definable collision filter data. |
| 840 | \param data The data that will be returned in the PxScene filter shader callback. |
| 841 | \note To disable collision on a cloth actor it is sufficient to set the |
| 842 | filter data to some non-zero value (if using the SDK's default filter shader). |
| 843 | @see PxSimulationFilterShader PxFilterData |
| 844 | */ |
| 845 | virtual void setSimulationFilterData(const PxFilterData& data) = 0; |
| 846 | |
| 847 | /** |
| 848 | \brief Retrieves the object's collision filter data. |
| 849 | \return Associated filter data |
| 850 | @see setSimulationFilterData() PxFilterData |
| 851 | */ |
| 852 | virtual PxFilterData getSimulationFilterData() const = 0; |
| 853 | |
| 854 | /// @} |
| 855 | |
| 856 | /** @name Scene-Collision |
| 857 | * Functions related to collision against scene objects. |
| 858 | */ |
| 859 | /// @{ |
| 860 | |
| 861 | /** |
| 862 | \brief Sets the width by which the cloth bounding box is increased to find nearby scene collision shapes. |
| 863 | \details The cloth particles collide against shapes in the scene that intersect the cloth bounding box enlarged by |
| 864 | the contact offset (if the eSCENE_COLLISION flag is set). <b>Default:</b> 0.0f |
| 865 | \param[in] offset <b>Range:</b> [0, PX_MAX_F32) |
| 866 | @see getContactOffset setRestOffset |
| 867 | */ |
| 868 | virtual void setContactOffset(PxReal offset) = 0; |
| 869 | |
| 870 | /** |
| 871 | \brief Returns cloth contact offset. |
| 872 | @see setContactOffset |
| 873 | */ |
| 874 | virtual PxReal getContactOffset() const = 0; |
| 875 | |
| 876 | /** |
| 877 | \brief Sets the minimum distance between colliding cloth particles and scene shapes. |
| 878 | \details Cloth particles colliding against shapes in the scene get no closer to the shape's surface |
| 879 | than specified by the rest offset (if the eSCENE_COLLISION flag is set). <b>Default:</b> 0.0f |
| 880 | \param[in] offset <b>Range:</b> [0, PX_MAX_F32) |
| 881 | @see getRestOffset setContactOffset |
| 882 | */ |
| 883 | virtual void setRestOffset(PxReal offset) = 0; |
| 884 | |
| 885 | /** |
| 886 | \brief Returns cloth rest offset. |
| 887 | @see setRestOffset |
| 888 | */ |
| 889 | virtual PxReal getRestOffset() const = 0; |
| 890 | |
| 891 | /// @} |
| 892 | |
| 893 | /** @name Sleeping |
| 894 | * Functions related to sleeping. |
| 895 | */ |
| 896 | /// @{ |
| 897 | |
| 898 | /** |
| 899 | \brief Sets the velocity threshold for putting cloth in sleep state. |
| 900 | \details If none of the particles moves faster (in local space) |
| 901 | than the threshold for a while, the cloth will be put in |
| 902 | sleep state and simulation will be skipped. |
| 903 | \param [in] threshold Velocity threshold (default: 0.0f) |
| 904 | */ |
| 905 | virtual void setSleepLinearVelocity(PxReal threshold) = 0; |
| 906 | /** |
| 907 | \brief Returns the velocity threshold for putting cloth in sleep state. |
| 908 | \return Velocity threshold for putting cloth in sleep state. |
| 909 | */ |
| 910 | virtual PxReal getSleepLinearVelocity() const = 0; |
| 911 | /** |
| 912 | \brief Sets the wake counter for the cloth. |
| 913 | \details The wake counter value determines how long all particles need to move less than the velocity threshold until the cloth |
| 914 | is put to sleep (see #setSleepLinearVelocity()). |
| 915 | \note Passing in a positive value will wake the cloth up automatically. |
| 916 | <b>Default:</b> 0.395 (which corresponds to 20 frames for a time step of 0.02) |
| 917 | \param[in] wakeCounterValue Wake counter value. <b>Range:</b> [0, PX_MAX_F32) |
| 918 | @see isSleeping() getWakeCounter() |
| 919 | */ |
| 920 | virtual void setWakeCounter(PxReal wakeCounterValue) = 0; |
| 921 | /** |
| 922 | \brief Returns the wake counter of the cloth. |
| 923 | \return The wake counter of the cloth. |
| 924 | @see isSleeping() setWakeCounter() |
| 925 | */ |
| 926 | virtual PxReal getWakeCounter() const = 0; |
| 927 | /** |
| 928 | \brief Forces cloth to wake up from sleep state. |
| 929 | \note This will set the wake counter of the cloth to the value specified in #PxSceneDesc::wakeCounterResetValue. |
| 930 | \note It is invalid to use this method if the cloth has not been added to a scene already. |
| 931 | @see isSleeping() putToSleep() |
| 932 | */ |
| 933 | virtual void wakeUp() = 0; |
| 934 | /** |
| 935 | \brief Forces cloth to be put in sleep state. |
| 936 | \note It is invalid to use this method if the cloth has not been added to a scene already. |
| 937 | */ |
| 938 | virtual void putToSleep() = 0; |
| 939 | /** |
| 940 | \brief Returns true if cloth is in sleep state |
| 941 | \note It is invalid to use this method if the cloth has not been added to a scene already. |
| 942 | \return True if cloth is in sleep state. |
| 943 | */ |
| 944 | virtual bool isSleeping() const = 0; |
| 945 | |
| 946 | /// @} |
| 947 | |
| 948 | virtual const char* getConcreteTypeName() const { return "PxCloth" ; } |
| 949 | |
| 950 | protected: |
| 951 | PX_INLINE PxCloth(PxType concreteType, PxBaseFlags baseFlags) : PxActor(concreteType, baseFlags) {} |
| 952 | PX_INLINE PxCloth(PxBaseFlags baseFlags) : PxActor(baseFlags) {} |
| 953 | virtual ~PxCloth() {} |
| 954 | virtual bool isKindOf(const char* name) const { return !strcmp("PxCloth" , name) || PxActor::isKindOf(name); } |
| 955 | }; |
| 956 | |
| 957 | PX_DEPRECATED PX_INLINE PxCloth* PxActor::isCloth() { return is<PxCloth>(); } |
| 958 | PX_DEPRECATED PX_INLINE const PxCloth* PxActor::isCloth() const { return is<PxCloth>(); } |
| 959 | |
| 960 | #ifndef PX_DOXYGEN |
| 961 | } // namespace physx |
| 962 | #endif |
| 963 | |
| 964 | /** @} */ |
| 965 | #endif |
| 966 | |