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_META_DATA_EXTENSIONS_H |
31 | #define PX_META_DATA_EXTENSIONS_H |
32 | #include "PxMetaDataObjects.h" |
33 | |
34 | #if PX_SUPPORT_PVD |
35 | #include "PxPvdObjectModelBaseTypes.h" |
36 | |
37 | namespace physx { namespace pvdsdk { |
38 | |
39 | template<> PX_INLINE NamespacedName getPvdNamespacedNameForType<physx::PxMetaDataPlane>() { return getPvdNamespacedNameForType<PxVec4>(); } |
40 | template<> PX_INLINE NamespacedName getPvdNamespacedNameForType<physx::PxRigidActor*>() { return getPvdNamespacedNameForType<VoidPtr>(); } |
41 | |
42 | }} |
43 | #endif |
44 | |
45 | namespace physx |
46 | { |
47 | namespace Vd |
48 | { |
49 | //Additional properties that exist only in pvd land. |
50 | struct PxPvdOnlyProperties |
51 | { |
52 | enum Enum |
53 | { |
54 | FirstProp = PxPropertyInfoName::LastPxPropertyInfoName, |
55 | PxScene_Frame, |
56 | PxScene_Contacts, |
57 | PxScene_SimulateElapsedTime, |
58 | #define DEFINE_ENUM_RANGE( stem, count ) \ |
59 | stem##Begin, \ |
60 | stem##End = stem##Begin + count |
61 | |
62 | //I can't easily add up the number of required property entries, but it is large due to the below |
63 | //geometry count squared properties. Thus I punt and allocate way more than I need right now. |
64 | DEFINE_ENUM_RANGE( PxScene_SimulationStatistics, 1000 ), |
65 | DEFINE_ENUM_RANGE( PxSceneDesc_Limits, PxPropertyInfoName::PxSceneLimits_PropertiesStop - PxPropertyInfoName::PxSceneLimits_PropertiesStart ), |
66 | DEFINE_ENUM_RANGE( PxSimulationStatistics_NumShapes, PxGeometryType::eGEOMETRY_COUNT ), |
67 | DEFINE_ENUM_RANGE( PxSimulationStatistics_NumDiscreteContactPairs, PxGeometryType::eGEOMETRY_COUNT * PxGeometryType::eGEOMETRY_COUNT ), |
68 | DEFINE_ENUM_RANGE( PxSimulationStatistics_NumModifiedContactPairs, PxGeometryType::eGEOMETRY_COUNT * PxGeometryType::eGEOMETRY_COUNT ), |
69 | DEFINE_ENUM_RANGE( PxSimulationStatistics_NumSweptIntegrationPairs, PxGeometryType::eGEOMETRY_COUNT * PxGeometryType::eGEOMETRY_COUNT ), |
70 | DEFINE_ENUM_RANGE( PxSimulationStatistics_NumTriggerPairs, PxGeometryType::eGEOMETRY_COUNT * PxGeometryType::eGEOMETRY_COUNT ), |
71 | DEFINE_ENUM_RANGE( PxRigidDynamic_SolverIterationCounts, 2 ), |
72 | DEFINE_ENUM_RANGE( PxArticulation_SolverIterationCounts, 2 ), |
73 | DEFINE_ENUM_RANGE( PxArticulationJoint_SwingLimit, 2 ), |
74 | DEFINE_ENUM_RANGE( PxArticulationJoint_TwistLimit, 2 ), |
75 | DEFINE_ENUM_RANGE( PxConvexMeshGeometry_Scale, PxPropertyInfoName::PxMeshScale_PropertiesStop - PxPropertyInfoName::PxMeshScale_PropertiesStart ), |
76 | DEFINE_ENUM_RANGE( PxTriangleMeshGeometry_Scale, PxPropertyInfoName::PxMeshScale_PropertiesStop - PxPropertyInfoName::PxMeshScale_PropertiesStart ), |
77 | |
78 | LastPxPvdOnlyProperty |
79 | }; |
80 | }; |
81 | |
82 | template<PxU32 TKey, typename TObjectType, typename TPropertyType, PxU32 TEnableFlag> |
83 | struct PxBufferPropertyInfo : PxReadOnlyPropertyInfo< TKey, TObjectType, TPropertyType > |
84 | { |
85 | typedef PxReadOnlyPropertyInfo< TKey, TObjectType, TPropertyType > TBaseType; |
86 | typedef typename TBaseType::TGetterType TGetterType; |
87 | PxBufferPropertyInfo( const char* inName, TGetterType inGetter ) |
88 | : TBaseType( inName, inGetter ) |
89 | { |
90 | } |
91 | bool isEnabled( PxU32 inFlags ) const { return (inFlags & TEnableFlag) > 0; } |
92 | }; |
93 | |
94 | |
95 | #define DECLARE_BUFFER_PROPERTY( objectType, baseType, propType, propName, fieldName, flagName ) \ |
96 | typedef PxBufferPropertyInfo< PxPvdOnlyProperties::baseType##_##propName, objectType, propType, flagName > T##objectType##propName##Base; \ |
97 | inline propType get##propName( const objectType* inData ) { return inData->fieldName; } \ |
98 | struct baseType##propName##Property : T##objectType##propName##Base \ |
99 | { \ |
100 | baseType##propName##Property() : T##objectType##propName##Base( #propName, get##propName ){} \ |
101 | }; |
102 | |
103 | template<PxU32 PropertyKey, typename TEnumType > |
104 | struct IndexerToNameMap |
105 | { |
106 | PxEnumTraits<TEnumType> Converter; |
107 | }; |
108 | |
109 | struct ValueStructOffsetRecord |
110 | { |
111 | mutable bool mHasValidOffset; |
112 | mutable PxU32 mOffset; |
113 | ValueStructOffsetRecord() : mHasValidOffset( false ), mOffset( 0 ) {} |
114 | void setupValueStructOffset( PxU32 inValue ) const |
115 | { |
116 | mHasValidOffset = true; |
117 | mOffset = inValue; |
118 | } |
119 | }; |
120 | |
121 | template<PxU32 TKey, typename TObjectType, typename TPropertyType> |
122 | struct PxPvdReadOnlyPropertyAccessor : public ValueStructOffsetRecord |
123 | { |
124 | typedef PxReadOnlyPropertyInfo<TKey,TObjectType,TPropertyType> TPropertyInfoType; |
125 | typedef TPropertyType prop_type; |
126 | |
127 | const TPropertyInfoType mProperty; |
128 | PxPvdReadOnlyPropertyAccessor( const TPropertyInfoType& inProp ) |
129 | : mProperty( inProp ) |
130 | { |
131 | } |
132 | prop_type get( const TObjectType* inObj ) const { return mProperty.get( inObj ); } |
133 | |
134 | private: |
135 | PxPvdReadOnlyPropertyAccessor& operator=(const PxPvdReadOnlyPropertyAccessor&); |
136 | }; |
137 | |
138 | template<PxU32 TKey, typename TObjectType, typename TPropertyType> |
139 | struct PxBufferCollectionPropertyAccessor : public ValueStructOffsetRecord |
140 | { |
141 | typedef PxBufferCollectionPropertyInfo< TKey, TObjectType, TPropertyType > TPropertyInfoType; |
142 | typedef TPropertyType prop_type; |
143 | const TPropertyInfoType& mProperty; |
144 | const char* mName; |
145 | |
146 | PxBufferCollectionPropertyAccessor( const TPropertyInfoType& inProp, const char* inName ) |
147 | : mProperty( inProp ) |
148 | , mName( inName ) |
149 | { |
150 | } |
151 | |
152 | const char* name() const { return mName; } |
153 | PxU32 size( const TObjectType* inObj ) const { return mProperty.size( inObj ); } |
154 | PxU32 get( const TObjectType* inObj, prop_type* buffer, PxU32 inNumItems) const { return mProperty.get( inObj, buffer, inNumItems); } |
155 | void set( TObjectType* inObj, prop_type* inBuffer, PxU32 inNumItems ) const { mProperty.set( inObj, inBuffer, inNumItems ); } |
156 | }; |
157 | |
158 | template<PxU32 TKey, typename TObjectType, typename TIndexType, typename TPropertyType> |
159 | struct PxPvdIndexedPropertyAccessor : public ValueStructOffsetRecord |
160 | { |
161 | typedef PxIndexedPropertyInfo< TKey, TObjectType, TIndexType, TPropertyType > TPropertyInfoType; |
162 | typedef TPropertyType prop_type; |
163 | TIndexType mIndex; |
164 | const TPropertyInfoType& mProperty; |
165 | PxPvdIndexedPropertyAccessor( const TPropertyInfoType& inProp, PxU32 inIndex ) |
166 | : mIndex( static_cast<TIndexType>( inIndex ) ) |
167 | , mProperty( inProp ) |
168 | { |
169 | } |
170 | prop_type get( const TObjectType* inObj ) const { return mProperty.get( inObj, mIndex ); } |
171 | void set( TObjectType* inObj, prop_type val ) const { mProperty.set( inObj, mIndex, val ); } |
172 | |
173 | void operator = (PxPvdIndexedPropertyAccessor&) {} |
174 | }; |
175 | |
176 | template<PxU32 TKey, typename TObjectType, typename TIndexType, typename TPropertyType> |
177 | struct PxPvdExtendedIndexedPropertyAccessor : public ValueStructOffsetRecord |
178 | { |
179 | typedef PxExtendedIndexedPropertyInfo< TKey, TObjectType, TIndexType, TPropertyType > TPropertyInfoType; |
180 | typedef TPropertyType prop_type; |
181 | TIndexType mIndex; |
182 | const TPropertyInfoType& mProperty; |
183 | PxPvdExtendedIndexedPropertyAccessor( const TPropertyInfoType& inProp, PxU32 inIndex ) |
184 | : mIndex( static_cast<TIndexType>( inIndex ) ) |
185 | , mProperty( inProp ) |
186 | { |
187 | } |
188 | |
189 | PxU32 size( const TObjectType* inObj ) const { return mProperty.size( inObj ); } |
190 | prop_type get( const TObjectType* inObj, TIndexType index ) const { return mProperty.get( inObj, index ); } |
191 | void set( TObjectType* inObj, TIndexType index, prop_type val ) const { mProperty.set( inObj, index, val ); } |
192 | |
193 | void operator = (PxPvdExtendedIndexedPropertyAccessor&) {} |
194 | }; |
195 | |
196 | template<PxU32 TKey, typename TObjectType, typename TIndexType, typename TPropertyType> |
197 | struct PxPvdFixedSizeLookupTablePropertyAccessor : public ValueStructOffsetRecord |
198 | { |
199 | typedef PxFixedSizeLookupTablePropertyInfo< TKey, TObjectType, TIndexType, TPropertyType > TPropertyInfoType; |
200 | typedef TPropertyType prop_type; |
201 | TIndexType mIndex; |
202 | |
203 | const TPropertyInfoType& mProperty; |
204 | PxPvdFixedSizeLookupTablePropertyAccessor( const TPropertyInfoType& inProp, const PxU32 inIndex3 ) |
205 | : mIndex( static_cast<TIndexType>( inIndex3 ) ) |
206 | , mProperty( inProp ) |
207 | { |
208 | } |
209 | |
210 | PxU32 size( const TObjectType* inObj ) const { return mProperty.size( inObj ); } |
211 | prop_type getX( const TObjectType* inObj, const TIndexType index ) const { return mProperty.getX( inObj, index ); } |
212 | prop_type getY( const TObjectType* inObj, const TIndexType index ) const { return mProperty.getY( inObj, index ); } |
213 | void addPair( TObjectType* inObj, const PxReal x, const PxReal y ) { const_cast<TPropertyInfoType&>(mProperty).addPair( inObj, x, y ); } |
214 | void clear( TObjectType* inObj ) { const_cast<TPropertyInfoType&>(mProperty).clear( inObj ); } |
215 | void operator = (PxPvdFixedSizeLookupTablePropertyAccessor&) {} |
216 | }; |
217 | |
218 | template<PxU32 TKey, typename TObjectType, typename TIdx0Type, typename TIdx1Type, typename TPropertyType> |
219 | struct PxPvdDualIndexedPropertyAccessor : public ValueStructOffsetRecord |
220 | { |
221 | typedef PxDualIndexedPropertyInfo< TKey, TObjectType, TIdx0Type, TIdx1Type, TPropertyType > TPropertyInfoType; |
222 | typedef TPropertyType prop_type; |
223 | TIdx0Type mIdx0; |
224 | TIdx1Type mIdx1; |
225 | const TPropertyInfoType& mProperty; |
226 | |
227 | PxPvdDualIndexedPropertyAccessor( const TPropertyInfoType& inProp, PxU32 idx0, PxU32 idx1 ) |
228 | : mIdx0( static_cast<TIdx0Type>( idx0 ) ) |
229 | , mIdx1( static_cast<TIdx1Type>( idx1 ) ) |
230 | , mProperty( inProp ) |
231 | { |
232 | } |
233 | prop_type get( const TObjectType* inObj ) const { return mProperty.get( inObj, mIdx0, mIdx1 ); } |
234 | void set( TObjectType* inObj, prop_type val ) const { mProperty.set( inObj, mIdx0, mIdx1, val ); } |
235 | |
236 | private: |
237 | PxPvdDualIndexedPropertyAccessor& operator = (const PxPvdDualIndexedPropertyAccessor&); |
238 | }; |
239 | |
240 | template<PxU32 TKey, typename TObjectType, typename TIdx0Type, typename TIdx1Type, typename TPropertyType> |
241 | struct PxPvdExtendedDualIndexedPropertyAccessor : public ValueStructOffsetRecord |
242 | { |
243 | typedef PxExtendedDualIndexedPropertyInfo< TKey, TObjectType, TIdx0Type, TIdx1Type, TPropertyType > TPropertyInfoType; |
244 | typedef TPropertyType prop_type; |
245 | TIdx0Type mIdx0; |
246 | TIdx1Type mIdx1; |
247 | const TPropertyInfoType& mProperty; |
248 | |
249 | PxPvdExtendedDualIndexedPropertyAccessor( const TPropertyInfoType& inProp, PxU32 idx0, PxU32 idx1 ) |
250 | : mIdx0( static_cast<TIdx0Type>( idx0 ) ) |
251 | , mIdx1( static_cast<TIdx1Type>( idx1 ) ) |
252 | , mProperty( inProp ) |
253 | { |
254 | } |
255 | prop_type get( const TObjectType* inObj ) const { return mProperty.get( inObj, mIdx0, mIdx1 ); } |
256 | void set( TObjectType* inObj, prop_type val ) const { mProperty.set( inObj, mIdx0, mIdx1, val ); } |
257 | |
258 | private: |
259 | PxPvdExtendedDualIndexedPropertyAccessor& operator = (const PxPvdExtendedDualIndexedPropertyAccessor&); |
260 | }; |
261 | |
262 | template<PxU32 TKey, typename TObjType, typename TPropertyType> |
263 | struct PxPvdRangePropertyAccessor : public ValueStructOffsetRecord |
264 | { |
265 | typedef PxRangePropertyInfo<TKey, TObjType, TPropertyType> TPropertyInfoType; |
266 | typedef TPropertyType prop_type; |
267 | bool mFirstValue; |
268 | const TPropertyInfoType& mProperty; |
269 | |
270 | PxPvdRangePropertyAccessor( const TPropertyInfoType& inProp, bool inFirstValue ) |
271 | : mFirstValue( inFirstValue ) |
272 | , mProperty( inProp ) |
273 | { |
274 | } |
275 | |
276 | prop_type get( const TObjType* inObj ) const { |
277 | prop_type first,second; |
278 | mProperty.get( inObj, first, second ); |
279 | return mFirstValue ? first : second; |
280 | } |
281 | void set( TObjType* inObj, prop_type val ) const |
282 | { |
283 | prop_type first,second; |
284 | mProperty.get( inObj, first, second ); |
285 | if ( mFirstValue ) mProperty.set( inObj, val, second ); |
286 | else mProperty.set( inObj, first, val ); |
287 | } |
288 | |
289 | void operator = (PxPvdRangePropertyAccessor&) {} |
290 | }; |
291 | |
292 | |
293 | template<typename TDataType> |
294 | struct IsFlagsType |
295 | { |
296 | bool FlagData; |
297 | }; |
298 | |
299 | template<typename TEnumType, typename TStorageType> |
300 | struct IsFlagsType<PxFlags<TEnumType, TStorageType> > |
301 | { |
302 | const PxU32ToName* FlagData; |
303 | IsFlagsType() : FlagData( PxEnumTraits<TEnumType>().NameConversion ) {} |
304 | }; |
305 | |
306 | |
307 | |
308 | template<typename TDataType> |
309 | struct PvdClassForType |
310 | { |
311 | bool Unknown; |
312 | }; |
313 | |
314 | } |
315 | |
316 | } |
317 | |
318 | #endif |
319 | |