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_FABRIC |
15 | #define PX_PHYSICS_NX_CLOTH_FABRIC |
16 | /** \addtogroup cloth |
17 | @{ |
18 | */ |
19 | |
20 | |
21 | #include "common/PxBase.h" |
22 | |
23 | #ifndef PX_DOXYGEN |
24 | namespace physx |
25 | { |
26 | #endif |
27 | |
28 | /** |
29 | \brief Describe type of phase in cloth fabric. |
30 | \see PxClothFabric for an explanation of concepts on phase and set. |
31 | */ |
32 | struct PxClothFabricPhaseType |
33 | { |
34 | enum Enum |
35 | { |
36 | eINVALID, //!< invalid type |
37 | eVERTICAL, //!< resists stretching or compression, usually along the gravity |
38 | eHORIZONTAL, //!< resists stretching or compression, perpendicular to the gravity |
39 | eBENDING, //!< resists out-of-plane bending in angle-based formulation |
40 | eSHEARING, //!< resists in-plane shearing along (typically) diagonal edges, |
41 | eCOUNT // internal use only |
42 | }; |
43 | }; |
44 | |
45 | /** |
46 | \brief References a set of constraints that can be solved in parallel. |
47 | \see PxClothFabric for an explanation of the concepts on phase and set. |
48 | */ |
49 | struct PxClothFabricPhase |
50 | { |
51 | PxClothFabricPhase(PxClothFabricPhaseType::Enum type = |
52 | PxClothFabricPhaseType::eINVALID, PxU32 index = 0); |
53 | |
54 | /** |
55 | \brief Type of constraints to solve. |
56 | */ |
57 | PxClothFabricPhaseType::Enum phaseType; |
58 | |
59 | /** |
60 | \brief Index of the set that contains the particle indices. |
61 | */ |
62 | PxU32 setIndex; |
63 | }; |
64 | |
65 | PX_INLINE PxClothFabricPhase::PxClothFabricPhase( |
66 | PxClothFabricPhaseType::Enum type, PxU32 index) |
67 | : phaseType(type) |
68 | , setIndex(index) |
69 | {} |
70 | |
71 | /** |
72 | \brief References all the data required to create a fabric. |
73 | \see PxPhysics.createClothFabric(), PxClothFabricCooker.getDescriptor() |
74 | */ |
75 | class PxClothFabricDesc |
76 | { |
77 | public: |
78 | /** \brief The number of particles needed when creating a PxCloth instance from the fabric. */ |
79 | PxU32 nbParticles; |
80 | |
81 | /** \brief The number of solver phases. */ |
82 | PxU32 nbPhases; |
83 | /** \brief Array defining which constraints to solve each phase. See #PxClothFabric.getPhases(). */ |
84 | const PxClothFabricPhase* phases; |
85 | |
86 | /** \brief The number of sets in the fabric. */ |
87 | PxU32 nbSets; |
88 | /** \brief Array with an index per set which points one entry beyond the last constraint of the set. See #PxClothFabric.getSets(). */ |
89 | const PxU32* sets; |
90 | |
91 | /** \brief Array of particle indices which specifies the pair of constrained vertices. See #PxClothFabric.getParticleIndices(). */ |
92 | const PxU32* indices; |
93 | /** \brief Array of rest values for each constraint. See #PxClothFabric.getRestvalues(). */ |
94 | const PxReal* restvalues; |
95 | |
96 | /** \brief Size of tetherAnchors and tetherLengths arrays, needs to be multiple of nbParticles. */ |
97 | PxU32 nbTethers; |
98 | /** \brief Array of particle indices specifying the tether anchors. See #PxClothFabric.getTetherAnchors(). */ |
99 | const PxU32* tetherAnchors; |
100 | /** \brief Array of rest distance between tethered particle pairs. See #PxClothFabric.getTetherLengths(). */ |
101 | const PxReal* tetherLengths; |
102 | |
103 | /** |
104 | \brief constructor sets to default. |
105 | */ |
106 | PX_INLINE PxClothFabricDesc(); |
107 | |
108 | /** |
109 | \brief (re)sets the structure to the default. |
110 | */ |
111 | PX_INLINE void setToDefault(); |
112 | |
113 | /** |
114 | \brief Returns true if the descriptor is valid. |
115 | \return True if the current settings are valid |
116 | */ |
117 | PX_INLINE bool isValid() const; |
118 | }; |
119 | |
120 | PX_INLINE PxClothFabricDesc::PxClothFabricDesc() |
121 | { |
122 | setToDefault(); |
123 | } |
124 | |
125 | PX_INLINE void PxClothFabricDesc::setToDefault() |
126 | { |
127 | memset(this, 0, sizeof(PxClothFabricDesc)); |
128 | } |
129 | |
130 | PX_INLINE bool PxClothFabricDesc::isValid() const |
131 | { |
132 | return nbParticles && nbPhases && phases && restvalues && nbSets |
133 | && sets && indices && (!nbTethers || (tetherAnchors && tetherLengths)); |
134 | } |
135 | |
136 | |
137 | /** |
138 | \brief A cloth fabric is a structure that contains all the internal solver constraints of a cloth mesh. |
139 | \details A fabric consists of \c phases that represent a group of internal constraints of the same type. |
140 | Each phase references an array of \c rest-values and a \c set of particle indices. |
141 | The data representation for the fabric has layers of indirect indices: |
142 | \arg All particle indices for the constraints of the fabric are stored in one linear array and referenced by the sets. |
143 | \arg Each constraint (particle index pair) has one entry in the restvalues array. |
144 | \arg The set array holds the prefix sum of the number of constraints per set and is referenced by the phases. |
145 | \arg A phase consists of the type of constraints, the index of the set referencing the indices. |
146 | |
147 | Additionally, a fabric also stores the data for the tether constraints, which limit the distances |
148 | between two particles. The tether constraints are stored in an array, and the index of a constraint |
149 | determines which particle is affected: element i affects particle i%N, where N is the number of particles. |
150 | The tether anchor is the index of the other particle, and the tether length is the maximum distance that |
151 | these two particles are allowed to be away from each other. A tether constraint is momentum conserving |
152 | if the anchor particle has infinite mass (zero inverse weight). |
153 | |
154 | @see The fabric structure can be created from a mesh using PxClothFabricCreate. Alternatively, the fabric data can |
155 | be saved into a stream (see PxClothFabricCooker.save()) and later created from the stream using PxPhysics.createClothFabric(PxInputStream&). |
156 | */ |
157 | class PxClothFabric : public PxBase |
158 | { |
159 | public: |
160 | /** |
161 | \brief Release the cloth fabric. |
162 | \details Releases the application's reference to the cloth fabric. |
163 | The fabric is destroyed when the application's reference is released and all cloth instances referencing the fabric are destroyed. |
164 | \see PxPhysics.createClothFabric() |
165 | */ |
166 | virtual void release() = 0; |
167 | |
168 | /** |
169 | \brief Returns number of particles. |
170 | \return The number of particles needed when creating a PxCloth instance from the fabric. |
171 | */ |
172 | virtual PxU32 getNbParticles() const = 0; |
173 | |
174 | /** |
175 | \brief Returns number of phases. |
176 | \return The number of solver phases. |
177 | */ |
178 | virtual PxU32 getNbPhases() const = 0; |
179 | |
180 | /** |
181 | \brief Returns number of rest values. |
182 | \return The size of the rest values array. |
183 | */ |
184 | virtual PxU32 getNbRestvalues() const = 0; |
185 | |
186 | /** |
187 | \brief Returns number of sets. |
188 | \return The size of the set array. |
189 | */ |
190 | virtual PxU32 getNbSets() const = 0; |
191 | |
192 | /** |
193 | \brief Get number of particle indices. |
194 | \return The size of the particle indices array. |
195 | */ |
196 | virtual PxU32 getNbParticleIndices() const = 0; |
197 | |
198 | /** |
199 | \brief Get number of tether constraints. |
200 | \return The size of the tether anchors and lengths arrays. |
201 | */ |
202 | virtual PxU32 getNbTethers() const = 0; |
203 | |
204 | /** |
205 | \brief Copies the phase array to a user specified buffer. |
206 | \details The phase array is a mapping of the phase index to the corresponding phase. |
207 | The array has the same length as getNbPhases(). |
208 | \param [in] userPhaseBuffer Destination buffer to copy the phase data to. |
209 | \param [in] bufferSize Size of userPhaseBuffer, should be at least getNbPhases(). |
210 | \return getNbPhases() if the copy was successful, 0 otherwise. |
211 | \note This function is potentially slow. Consider caching |
212 | the (static) result instead of retrieving it multiple times. |
213 | */ |
214 | virtual PxU32 getPhases(PxClothFabricPhase* userPhaseBuffer, PxU32 bufferSize) const = 0; |
215 | |
216 | /** |
217 | \brief Copies the set array to a user specified buffer. |
218 | \details The set array is the inclusive prefix sum of the number of constraints per set. |
219 | It has the same length as getNbSets(). |
220 | \param [in] userSetBuffer Destination buffer to copy the set data to. |
221 | \param [in] bufferSize Size of userSetBuffer, should be at least getNbSets(). |
222 | \return getNbSets() if the copy was successful, 0 otherwise. |
223 | \note Indices of the i-th set are stored at indices [i?2*set[i-1]:0, 2*set[i]) in the indices array. |
224 | \note This function is potentially slow. Consider caching |
225 | the (static) result instead of retrieving it multiple times. |
226 | */ |
227 | virtual PxU32 getSets(PxU32* userSetBuffer, PxU32 bufferSize) const = 0; |
228 | |
229 | /** |
230 | \brief Copies the particle indices array to a user specified buffer. |
231 | \details The particle indices array determines which particles are affected by each constraint. |
232 | It has the same length as getNbParticleIndices() and twice the number of constraints. |
233 | \param [in] userParticleIndexBuffer Destination buffer to copy the set data to. |
234 | \param [in] bufferSize Size of userParticleIndexBuffer, should be at least getNbParticleIndices(). |
235 | \return getNbParticleIndices() if the copy was successful, 0 otherwise. |
236 | \note This function is potentially slow. Consider caching |
237 | the (static) result instead of retrieving it multiple times. |
238 | */ |
239 | virtual PxU32 getParticleIndices(PxU32* userParticleIndexBuffer, PxU32 bufferSize) const = 0; |
240 | |
241 | /** |
242 | \brief Copies the rest values array to a user specified buffer. |
243 | \details The rest values array holds the target value of the constraint in rest state, |
244 | for example edge length for stretch constraints. |
245 | It stores one value per constraint, so its length is half of getNbParticleIndices(), and |
246 | it has the same length as getNbRestvalues(). The rest-values are stored in the order |
247 | they are (indirectly) referenced by the phases. |
248 | \param [in] userRestvalueBuffer Destination buffer to copy the set data to. |
249 | \param [in] bufferSize Size of userRestvalueBuffer, should be at least getNbRestvalues(). |
250 | \return getNbRestvalues() if the copy was successful, 0 otherwise. |
251 | \note This function is potentially slow. Between calling scaleRestlengths(), |
252 | consider caching the result instead of retrieving it multiple times. |
253 | */ |
254 | virtual PxU32 getRestvalues(PxReal* userRestvalueBuffer, PxU32 bufferSize) const = 0; |
255 | |
256 | /** |
257 | \brief Copies the tether anchors array to a user specified buffer. |
258 | \details The tether anchors array stores for each particle the index of |
259 | another particle from which it cannot move further away than specified by the |
260 | tether lengths array. |
261 | \param [in] userAnchorBuffer Destination buffer to copy the set data to. |
262 | \param [in] bufferSize Size of userAnchorBuffer, should be at least getNbTethers(). |
263 | \return getNbTethers() if the copy was successful, 0 otherwise. |
264 | \note This function is potentially slow, consider caching the |
265 | result instead of retrieving the data multiple times. |
266 | \see getTetherLengths, getNbTethers |
267 | */ |
268 | virtual PxU32 getTetherAnchors(PxU32* userAnchorBuffer, PxU32 bufferSize) const = 0; |
269 | |
270 | /** |
271 | \brief Copies the tether lengths array to a user specified buffer. |
272 | \details The tether lengths array stores for each particle how far it is |
273 | allowed to move away from the particle specified by the tether anchor array. |
274 | \param [in] userLengthBuffer Destination buffer to copy the set data to. |
275 | \param [in] bufferSize Size of userLengthBuffer, should be at least getNbTethers(). |
276 | \return getNbTethers() if the copy was successful, 0 otherwise. |
277 | \note This function is potentially slow. Between calling scaleRestlengths(), |
278 | consider caching the result instead of retrieving it multiple times. |
279 | \see getTetherAnchors, getNbTethers |
280 | */ |
281 | virtual PxU32 getTetherLengths(PxReal* userLengthBuffer, PxU32 bufferSize) const = 0; |
282 | |
283 | /** |
284 | \deprecated |
285 | \brief Returns the type of a phase. |
286 | \param [in] phaseIndex The index of the phase to return the type for. |
287 | \return The phase type as PxClothFabricPhaseType::Enum. |
288 | \note If phase index is invalid, PxClothFabricPhaseType::eINVALID is returned. |
289 | */ |
290 | PX_DEPRECATED virtual PxClothFabricPhaseType::Enum getPhaseType(PxU32 phaseIndex) const = 0; |
291 | |
292 | /** |
293 | \brief Scale all rest values of length dependent constraints. |
294 | \param[in] scale The scale factor to multiply each rest value with. |
295 | */ |
296 | virtual void scaleRestlengths(PxReal scale) = 0; |
297 | |
298 | /** |
299 | \brief Reference count of the cloth instance |
300 | \details At creation, the reference count of the fabric is 1. Every cloth instance referencing this fabric increments the |
301 | count by 1. When the reference count reaches 0, and only then, the fabric gets released automatically. |
302 | \see PxCloth |
303 | */ |
304 | virtual PxU32 getReferenceCount() const = 0; |
305 | |
306 | virtual const char* getConcreteTypeName() const { return "PxClothFabric" ; } |
307 | |
308 | protected: |
309 | |
310 | PX_INLINE PxClothFabric(PxType concreteType, PxBaseFlags baseFlags) : PxBase(concreteType, baseFlags) {} |
311 | PX_INLINE PxClothFabric(PxBaseFlags baseFlags) : PxBase(baseFlags) {} |
312 | virtual ~PxClothFabric() {} |
313 | virtual bool isKindOf(const char* name) const { return !strcmp("PxClothFabric" , name) || PxBase::isKindOf(name); } |
314 | }; |
315 | |
316 | #ifndef PX_DOXYGEN |
317 | } // namespace physx |
318 | #endif |
319 | |
320 | /** @} */ |
321 | #endif |
322 | |