// // 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-2019 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() { return getPvdNamespacedNameForType(); } template<> PX_INLINE NamespacedName getPvdNamespacedNameForType() { return getPvdNamespacedNameForType(); } }} #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 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 struct IndexerToNameMap { PxEnumTraits Converter; }; struct ValueStructOffsetRecord { mutable bool mHasValidOffset; mutable PxU32 mOffset; ValueStructOffsetRecord() : mHasValidOffset( false ), mOffset( 0 ) {} void setupValueStructOffset( PxU32 inValue ) const { mHasValidOffset = true; mOffset = inValue; } }; template struct PxPvdReadOnlyPropertyAccessor : public ValueStructOffsetRecord { typedef PxReadOnlyPropertyInfo 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 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 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( 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 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( 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 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( 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(mProperty).addPair( inObj, x, y ); } void clear( TObjectType* inObj ) { const_cast(mProperty).clear( inObj ); } void operator = (PxPvdFixedSizeLookupTablePropertyAccessor&) {} }; template 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( idx0 ) ) , mIdx1( static_cast( 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 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( idx0 ) ) , mIdx1( static_cast( 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 struct PxPvdRangePropertyAccessor : public ValueStructOffsetRecord { typedef PxRangePropertyInfo 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 struct IsFlagsType { bool FlagData; }; template struct IsFlagsType > { const PxU32ToName* FlagData; IsFlagsType > () : FlagData( PxEnumTraits().NameConversion ) {} }; template struct PvdClassForType { bool Unknown; }; } } #endif