Revision control
- //
- // Redistribution and use in source and binary forms, with or without
- // modification, are permitted provided that the following conditions
- // are met:
- // * Redistributions of source code must retain the above copyright
- // notice, this list of conditions and the following disclaimer.
- // * Redistributions in binary form must reproduce the above copyright
- // notice, this list of conditions and the following disclaimer in the
- // documentation and/or other materials provided with the distribution.
- // * Neither the name of NVIDIA CORPORATION nor the names of its
- // contributors may be used to endorse or promote products derived
- // from this software without specific prior written permission.
- //
- // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ''AS IS'' AND ANY
- // EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- // IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
- // PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
- // CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
- // EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
- // PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
- // PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
- // OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- //
- // Copyright (c) 2008-2021 NVIDIA Corporation. All rights reserved.
- // Copyright (c) 2004-2008 AGEIA Technologies, Inc. All rights reserved.
- // Copyright (c) 2001-2004 NovodeX AG. All rights reserved.
-
- #ifndef PX_META_DATA_EXTENSIONS_H
- #define PX_META_DATA_EXTENSIONS_H
- #include "PxMetaDataObjects.h"
-
- #if PX_SUPPORT_PVD
- #include "PxPvdObjectModelBaseTypes.h"
-
- namespace physx { namespace pvdsdk {
-
- template<> PX_INLINE NamespacedName getPvdNamespacedNameForType<physx::PxMetaDataPlane>() { return getPvdNamespacedNameForType<PxVec4>(); }
- template<> PX_INLINE NamespacedName getPvdNamespacedNameForType<physx::PxRigidActor*>() { return getPvdNamespacedNameForType<VoidPtr>(); }
-
- }}
- #endif
-
- namespace physx
- {
- namespace Vd
- {
- //Additional properties that exist only in pvd land.
- struct PxPvdOnlyProperties
- {
- enum Enum
- {
- FirstProp = PxPropertyInfoName::LastPxPropertyInfoName,
- PxScene_Frame,
- PxScene_Contacts,
- PxScene_SimulateElapsedTime,
- #define DEFINE_ENUM_RANGE( stem, count ) \
- stem##Begin, \
- stem##End = stem##Begin + count
-
- //I can't easily add up the number of required property entries, but it is large due to the below
- //geometry count squared properties. Thus I punt and allocate way more than I need right now.
- DEFINE_ENUM_RANGE( PxScene_SimulationStatistics, 1000 ),
- DEFINE_ENUM_RANGE( PxSceneDesc_Limits, PxPropertyInfoName::PxSceneLimits_PropertiesStop - PxPropertyInfoName::PxSceneLimits_PropertiesStart ),
- DEFINE_ENUM_RANGE( PxSimulationStatistics_NumShapes, PxGeometryType::eGEOMETRY_COUNT ),
- DEFINE_ENUM_RANGE( PxSimulationStatistics_NumDiscreteContactPairs, PxGeometryType::eGEOMETRY_COUNT * PxGeometryType::eGEOMETRY_COUNT ),
- DEFINE_ENUM_RANGE( PxSimulationStatistics_NumModifiedContactPairs, PxGeometryType::eGEOMETRY_COUNT * PxGeometryType::eGEOMETRY_COUNT ),
- DEFINE_ENUM_RANGE( PxSimulationStatistics_NumSweptIntegrationPairs, PxGeometryType::eGEOMETRY_COUNT * PxGeometryType::eGEOMETRY_COUNT ),
- DEFINE_ENUM_RANGE( PxSimulationStatistics_NumTriggerPairs, PxGeometryType::eGEOMETRY_COUNT * PxGeometryType::eGEOMETRY_COUNT ),
- DEFINE_ENUM_RANGE( PxRigidDynamic_SolverIterationCounts, 2 ),
- DEFINE_ENUM_RANGE( PxArticulation_SolverIterationCounts, 2 ),
- DEFINE_ENUM_RANGE( PxArticulationJoint_SwingLimit, 2 ),
- DEFINE_ENUM_RANGE( PxArticulationJoint_TwistLimit, 2 ),
- DEFINE_ENUM_RANGE( PxConvexMeshGeometry_Scale, PxPropertyInfoName::PxMeshScale_PropertiesStop - PxPropertyInfoName::PxMeshScale_PropertiesStart ),
- DEFINE_ENUM_RANGE( PxTriangleMeshGeometry_Scale, PxPropertyInfoName::PxMeshScale_PropertiesStop - PxPropertyInfoName::PxMeshScale_PropertiesStart ),
-
- LastPxPvdOnlyProperty
- };
- };
-
- template<PxU32 TKey, typename TObjectType, typename TPropertyType, PxU32 TEnableFlag>
- struct PxBufferPropertyInfo : PxReadOnlyPropertyInfo< TKey, TObjectType, TPropertyType >
- {
- typedef PxReadOnlyPropertyInfo< TKey, TObjectType, TPropertyType > TBaseType;
- typedef typename TBaseType::TGetterType TGetterType;
- PxBufferPropertyInfo( const char* inName, TGetterType inGetter )
- : TBaseType( inName, inGetter )
- {
- }
- bool isEnabled( PxU32 inFlags ) const { return (inFlags & TEnableFlag) > 0; }
- };
-
-
- #define DECLARE_BUFFER_PROPERTY( objectType, baseType, propType, propName, fieldName, flagName ) \
- typedef PxBufferPropertyInfo< PxPvdOnlyProperties::baseType##_##propName, objectType, propType, flagName > T##objectType##propName##Base; \
- inline propType get##propName( const objectType* inData ) { return inData->fieldName; } \
- struct baseType##propName##Property : T##objectType##propName##Base \
- { \
- baseType##propName##Property() : T##objectType##propName##Base( #propName, get##propName ){} \
- };
-
- template<PxU32 PropertyKey, typename TEnumType >
- struct IndexerToNameMap
- {
- PxEnumTraits<TEnumType> Converter;
- };
-
- struct ValueStructOffsetRecord
- {
- mutable bool mHasValidOffset;
- mutable PxU32 mOffset;
- ValueStructOffsetRecord() : mHasValidOffset( false ), mOffset( 0 ) {}
- void setupValueStructOffset( PxU32 inValue ) const
- {
- mHasValidOffset = true;
- mOffset = inValue;
- }
- };
-
- template<PxU32 TKey, typename TObjectType, typename TPropertyType>
- struct PxPvdReadOnlyPropertyAccessor : public ValueStructOffsetRecord
- {
- typedef PxReadOnlyPropertyInfo<TKey,TObjectType,TPropertyType> TPropertyInfoType;
- typedef TPropertyType prop_type;
-
- const TPropertyInfoType mProperty;
- PxPvdReadOnlyPropertyAccessor( const TPropertyInfoType& inProp )
- : mProperty( inProp )
- {
- }
- prop_type get( const TObjectType* inObj ) const { return mProperty.get( inObj ); }
-
- private:
- PxPvdReadOnlyPropertyAccessor& operator=(const PxPvdReadOnlyPropertyAccessor&);
- };
-
- template<PxU32 TKey, typename TObjectType, typename TPropertyType>
- struct PxBufferCollectionPropertyAccessor : public ValueStructOffsetRecord
- {
- typedef PxBufferCollectionPropertyInfo< TKey, TObjectType, TPropertyType > TPropertyInfoType;
- typedef TPropertyType prop_type;
- const TPropertyInfoType& mProperty;
- const char* mName;
-
- PxBufferCollectionPropertyAccessor( const TPropertyInfoType& inProp, const char* inName )
- : mProperty( inProp )
- , mName( inName )
- {
- }
-
- const char* name() const { return mName; }
- PxU32 size( const TObjectType* inObj ) const { return mProperty.size( inObj ); }
- PxU32 get( const TObjectType* inObj, prop_type* buffer, PxU32 inNumItems) const { return mProperty.get( inObj, buffer, inNumItems); }
- void set( TObjectType* inObj, prop_type* inBuffer, PxU32 inNumItems ) const { mProperty.set( inObj, inBuffer, inNumItems ); }
- };
-
- template<PxU32 TKey, typename TObjectType, typename TIndexType, typename TPropertyType>
- struct PxPvdIndexedPropertyAccessor : public ValueStructOffsetRecord
- {
- typedef PxIndexedPropertyInfo< TKey, TObjectType, TIndexType, TPropertyType > TPropertyInfoType;
- typedef TPropertyType prop_type;
- TIndexType mIndex;
- const TPropertyInfoType& mProperty;
- PxPvdIndexedPropertyAccessor( const TPropertyInfoType& inProp, PxU32 inIndex )
- : mIndex( static_cast<TIndexType>( inIndex ) )
- , mProperty( inProp )
- {
- }
- prop_type get( const TObjectType* inObj ) const { return mProperty.get( inObj, mIndex ); }
- void set( TObjectType* inObj, prop_type val ) const { mProperty.set( inObj, mIndex, val ); }
-
- void operator = (PxPvdIndexedPropertyAccessor&) {}
- };
-
- template<PxU32 TKey, typename TObjectType, typename TIndexType, typename TPropertyType>
- struct PxPvdExtendedIndexedPropertyAccessor : public ValueStructOffsetRecord
- {
- typedef PxExtendedIndexedPropertyInfo< TKey, TObjectType, TIndexType, TPropertyType > TPropertyInfoType;
- typedef TPropertyType prop_type;
- TIndexType mIndex;
- const TPropertyInfoType& mProperty;
- PxPvdExtendedIndexedPropertyAccessor( const TPropertyInfoType& inProp, PxU32 inIndex )
- : mIndex( static_cast<TIndexType>( inIndex ) )
- , mProperty( inProp )
- {
- }
-
- PxU32 size( const TObjectType* inObj ) const { return mProperty.size( inObj ); }
- prop_type get( const TObjectType* inObj, TIndexType index ) const { return mProperty.get( inObj, index ); }
- void set( TObjectType* inObj, TIndexType index, prop_type val ) const { mProperty.set( inObj, index, val ); }
-
- void operator = (PxPvdExtendedIndexedPropertyAccessor&) {}
- };
-
- template<PxU32 TKey, typename TObjectType, typename TIndexType, typename TPropertyType>
- struct PxPvdFixedSizeLookupTablePropertyAccessor : public ValueStructOffsetRecord
- {
- typedef PxFixedSizeLookupTablePropertyInfo< TKey, TObjectType, TIndexType, TPropertyType > TPropertyInfoType;
- typedef TPropertyType prop_type;
- TIndexType mIndex;
-
- const TPropertyInfoType& mProperty;
- PxPvdFixedSizeLookupTablePropertyAccessor( const TPropertyInfoType& inProp, const PxU32 inIndex3 )
- : mIndex( static_cast<TIndexType>( inIndex3 ) )
- , mProperty( inProp )
- {
- }
-
- PxU32 size( const TObjectType* inObj ) const { return mProperty.size( inObj ); }
- prop_type getX( const TObjectType* inObj, const TIndexType index ) const { return mProperty.getX( inObj, index ); }
- prop_type getY( const TObjectType* inObj, const TIndexType index ) const { return mProperty.getY( inObj, index ); }
- void addPair( TObjectType* inObj, const PxReal x, const PxReal y ) { const_cast<TPropertyInfoType&>(mProperty).addPair( inObj, x, y ); }
- void clear( TObjectType* inObj ) { const_cast<TPropertyInfoType&>(mProperty).clear( inObj ); }
- void operator = (PxPvdFixedSizeLookupTablePropertyAccessor&) {}
- };
-
- template<PxU32 TKey, typename TObjectType, typename TIdx0Type, typename TIdx1Type, typename TPropertyType>
- struct PxPvdDualIndexedPropertyAccessor : public ValueStructOffsetRecord
- {
- typedef PxDualIndexedPropertyInfo< TKey, TObjectType, TIdx0Type, TIdx1Type, TPropertyType > TPropertyInfoType;
- typedef TPropertyType prop_type;
- TIdx0Type mIdx0;
- TIdx1Type mIdx1;
- const TPropertyInfoType& mProperty;
-
- PxPvdDualIndexedPropertyAccessor( const TPropertyInfoType& inProp, PxU32 idx0, PxU32 idx1 )
- : mIdx0( static_cast<TIdx0Type>( idx0 ) )
- , mIdx1( static_cast<TIdx1Type>( idx1 ) )
- , mProperty( inProp )
- {
- }
- prop_type get( const TObjectType* inObj ) const { return mProperty.get( inObj, mIdx0, mIdx1 ); }
- void set( TObjectType* inObj, prop_type val ) const { mProperty.set( inObj, mIdx0, mIdx1, val ); }
-
- private:
- PxPvdDualIndexedPropertyAccessor& operator = (const PxPvdDualIndexedPropertyAccessor&);
- };
-
- template<PxU32 TKey, typename TObjectType, typename TIdx0Type, typename TIdx1Type, typename TPropertyType>
- struct PxPvdExtendedDualIndexedPropertyAccessor : public ValueStructOffsetRecord
- {
- typedef PxExtendedDualIndexedPropertyInfo< TKey, TObjectType, TIdx0Type, TIdx1Type, TPropertyType > TPropertyInfoType;
- typedef TPropertyType prop_type;
- TIdx0Type mIdx0;
- TIdx1Type mIdx1;
- const TPropertyInfoType& mProperty;
-
- PxPvdExtendedDualIndexedPropertyAccessor( const TPropertyInfoType& inProp, PxU32 idx0, PxU32 idx1 )
- : mIdx0( static_cast<TIdx0Type>( idx0 ) )
- , mIdx1( static_cast<TIdx1Type>( idx1 ) )
- , mProperty( inProp )
- {
- }
- prop_type get( const TObjectType* inObj ) const { return mProperty.get( inObj, mIdx0, mIdx1 ); }
- void set( TObjectType* inObj, prop_type val ) const { mProperty.set( inObj, mIdx0, mIdx1, val ); }
-
- private:
- PxPvdExtendedDualIndexedPropertyAccessor& operator = (const PxPvdExtendedDualIndexedPropertyAccessor&);
- };
-
- template<PxU32 TKey, typename TObjType, typename TPropertyType>
- struct PxPvdRangePropertyAccessor : public ValueStructOffsetRecord
- {
- typedef PxRangePropertyInfo<TKey, TObjType, TPropertyType> TPropertyInfoType;
- typedef TPropertyType prop_type;
- bool mFirstValue;
- const TPropertyInfoType& mProperty;
-
- PxPvdRangePropertyAccessor( const TPropertyInfoType& inProp, bool inFirstValue )
- : mFirstValue( inFirstValue )
- , mProperty( inProp )
- {
- }
-
- prop_type get( const TObjType* inObj ) const {
- prop_type first,second;
- mProperty.get( inObj, first, second );
- return mFirstValue ? first : second;
- }
- void set( TObjType* inObj, prop_type val ) const
- {
- prop_type first,second;
- mProperty.get( inObj, first, second );
- if ( mFirstValue ) mProperty.set( inObj, val, second );
- else mProperty.set( inObj, first, val );
- }
-
- void operator = (PxPvdRangePropertyAccessor&) {}
- };
-
-
- template<typename TDataType>
- struct IsFlagsType
- {
- bool FlagData;
- };
-
- template<typename TEnumType, typename TStorageType>
- struct IsFlagsType<PxFlags<TEnumType, TStorageType> >
- {
- const PxU32ToName* FlagData;
- IsFlagsType() : FlagData( PxEnumTraits<TEnumType>().NameConversion ) {}
- };
-
-
-
- template<typename TDataType>
- struct PvdClassForType
- {
- bool Unknown;
- };
-
- }
-
- }
-
- #endif