00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031 #ifndef PX_PHYSICS_NX_SCENEDESC
00032 #define PX_PHYSICS_NX_SCENEDESC
00033
00037 #include "PxPhysXConfig.h"
00038 #include "foundation/PxFlags.h"
00039 #include "foundation/PxBounds3.h"
00040 #include "PxFiltering.h"
00041 #include "PxBroadPhase.h"
00042 #include "common/PxTolerancesScale.h"
00043 #include "task/PxTask.h"
00044
00045 #if !PX_DOXYGEN
00046 namespace physx
00047 {
00048 #endif
00049
00067 struct PxPruningStructureType
00068 {
00069 enum Enum
00070 {
00071 eNONE,
00072 eDYNAMIC_AABB_TREE,
00073 eSTATIC_AABB_TREE,
00074
00075 eLAST
00076 };
00077 };
00078
00079
00095 struct PxFrictionType
00096 {
00097 enum Enum
00098 {
00099 ePATCH,
00100 eONE_DIRECTIONAL,
00101 eTWO_DIRECTIONAL,
00102 eFRICTION_COUNT
00103 };
00104 };
00105
00112 struct PxSceneFlag
00113 {
00114 enum Enum
00115 {
00128 eENABLE_ACTIVE_ACTORS = (1<<0),
00129
00142 eENABLE_ACTIVETRANSFORMS PX_DEPRECATED = (1<<1),
00143
00156 eENABLE_CCD = (1<<2),
00157
00177 eDISABLE_CCD_RESWEEP = (1<<3),
00178
00179
00187 eADAPTIVE_FORCE = (1<<4),
00188
00189
00200 eENABLE_KINEMATIC_STATIC_PAIRS = (1<<5),
00201
00202
00213 eENABLE_KINEMATIC_PAIRS = (1<<6),
00214
00215
00223 eENABLE_PCM = (1 << 9),
00224
00233 eDISABLE_CONTACT_REPORT_BUFFER_RESIZE = (1 << 10),
00234
00245 eDISABLE_CONTACT_CACHE = (1 << 11),
00246
00247
00263 eREQUIRE_RW_LOCK = (1 << 12),
00264
00272 eENABLE_STABILIZATION = (1 << 14),
00273
00282 eENABLE_AVERAGE_POINT = (1 << 15),
00283
00297 eDEPRECATED_TRIGGER_TRIGGER_REPORTS = (1 << 16),
00298
00311 eEXCLUDE_KINEMATICS_FROM_ACTIVE_ACTORS = (1 << 17),
00312
00325 eSUPPRESS_EAGER_SCENE_QUERY_REFIT = (1 << 18),
00326
00327
00328
00329
00330
00331
00332
00333
00334
00335 eENABLE_GPU_DYNAMICS = (1 << 19),
00336
00359 eENABLE_ENHANCED_DETERMINISM = (1<<20),
00360
00361 eMUTABLE_FLAGS = eENABLE_ACTIVE_ACTORS|eENABLE_ACTIVETRANSFORMS|eEXCLUDE_KINEMATICS_FROM_ACTIVE_ACTORS
00362 };
00363 };
00364
00365
00371 typedef PxFlags<PxSceneFlag::Enum,PxU32> PxSceneFlags;
00372 PX_FLAGS_OPERATORS(PxSceneFlag::Enum,PxU32)
00373
00374
00375 class PxSimulationEventCallback;
00376 class PxContactModifyCallback;
00377 class PxCCDContactModifyCallback;
00378 class PxSimulationFilterCallback;
00379
00388 class PxSceneLimits
00389 {
00390 public:
00391 PxU32 maxNbActors;
00392 PxU32 maxNbBodies;
00393 PxU32 maxNbStaticShapes;
00394 PxU32 maxNbDynamicShapes;
00395 PxU32 maxNbAggregates;
00396 PxU32 maxNbConstraints;
00397 PxU32 maxNbRegions;
00398 PxU32 maxNbBroadPhaseOverlaps;
00399 PX_DEPRECATED PxU32 maxNbObjectsPerRegion;
00400
00404 PX_INLINE PxSceneLimits();
00405
00409 PX_INLINE void setToDefault();
00410
00415 PX_INLINE bool isValid() const;
00416 };
00417
00418 PX_INLINE PxSceneLimits::PxSceneLimits() :
00419 maxNbActors (0),
00420 maxNbBodies (0),
00421 maxNbStaticShapes (0),
00422 maxNbDynamicShapes (0),
00423 maxNbAggregates (0),
00424 maxNbConstraints (0),
00425 maxNbRegions (0),
00426 maxNbBroadPhaseOverlaps (0),
00427 maxNbObjectsPerRegion (0)
00428 {
00429 }
00430
00431 PX_INLINE void PxSceneLimits::setToDefault()
00432 {
00433 *this = PxSceneLimits();
00434 }
00435
00436 PX_INLINE bool PxSceneLimits::isValid() const
00437 {
00438 if(maxNbRegions>256)
00439 return false;
00440
00441 return true;
00442 }
00443
00444
00449 struct PxgDynamicsMemoryConfig
00450 {
00451 PxU32 constraintBufferCapacity;
00452 PxU32 contactBufferCapacity;
00453 PxU32 tempBufferCapacity;
00454 PxU32 contactStreamSize;
00455 PxU32 patchStreamSize;
00456 PxU32 forceStreamCapacity;
00457 PxU32 heapCapacity;
00458 PxU32 foundLostPairsCapacity;
00459
00460 PxgDynamicsMemoryConfig() :
00461 constraintBufferCapacity(32 * 1024 * 1024),
00462 contactBufferCapacity(24 * 1024 * 1024),
00463 tempBufferCapacity(16 * 1024 * 1024),
00464 contactStreamSize(1024 * 512),
00465 patchStreamSize(1024 * 80),
00466 forceStreamCapacity(1 * 1024 * 1024),
00467 heapCapacity(64 * 1024 * 1024),
00468 foundLostPairsCapacity(256 * 1024)
00469 {
00470 }
00471 };
00472
00473
00474
00482 class PxSceneDesc
00483 {
00484 public:
00485
00496 PxVec3 gravity;
00497
00508 PxSimulationEventCallback* simulationEventCallback;
00509
00517 PxContactModifyCallback* contactModifyCallback;
00518
00526 PxCCDContactModifyCallback* ccdContactModifyCallback;
00527
00537 const void* filterShaderData;
00538
00546 PxU32 filterShaderDataSize;
00547
00557 PxSimulationFilterShader filterShader;
00558
00567 PxSimulationFilterCallback* filterCallback;
00568
00576 PxBroadPhaseType::Enum broadPhaseType;
00577
00588 PxBroadPhaseCallback* broadPhaseCallback;
00589
00595 PxSceneLimits limits;
00596
00607 PxFrictionType::Enum frictionType;
00608
00618 PxReal bounceThresholdVelocity;
00619
00633 PxReal frictionOffsetThreshold;
00634
00644 PxReal ccdMaxSeparation;
00645
00654 PxReal solverOffsetSlop;
00655
00661 PxSceneFlags flags;
00662
00668 PxCpuDispatcher* cpuDispatcher;
00669
00677 PxGpuDispatcher* gpuDispatcher;
00678
00684 PxPruningStructureType::Enum staticStructure;
00685
00689 PxPruningStructureType::Enum dynamicStructure;
00690
00708 PxU32 dynamicTreeRebuildRateHint;
00709
00715 void* userData;
00716
00730 PxU32 solverBatchSize;
00731
00745 PxU32 nbContactDataBlocks;
00746
00765 PxU32 maxNbContactDataBlocks;
00766
00783 PxReal maxBiasCoefficient;
00784
00798 PxU32 contactReportStreamBufferSize;
00799
00811 PxU32 ccdMaxPasses;
00812
00823 PxReal wakeCounterResetValue;
00824
00834 PxBounds3 sanityBounds;
00835
00839 PxgDynamicsMemoryConfig gpuDynamicsConfig;
00840
00847 PxU32 gpuMaxNumPartitions;
00848
00852 PxU32 gpuComputeVersion;
00853
00854 private:
00858
00859 PxTolerancesScale tolerancesScale;
00865 public:
00874 PX_INLINE PxSceneDesc(const PxTolerancesScale& scale);
00875
00884 PX_INLINE void setToDefault(const PxTolerancesScale& scale);
00885
00890 PX_INLINE bool isValid() const;
00891
00895
00896 PX_INLINE const PxTolerancesScale& getTolerancesScale() const { return tolerancesScale; }
00900 };
00901
00902 PX_INLINE PxSceneDesc::PxSceneDesc(const PxTolerancesScale& scale):
00903 gravity (PxVec3(0.0f)),
00904 simulationEventCallback (NULL),
00905 contactModifyCallback (NULL),
00906 ccdContactModifyCallback (NULL),
00907
00908 filterShaderData (NULL),
00909 filterShaderDataSize (0),
00910 filterShader (NULL),
00911 filterCallback (NULL),
00912 broadPhaseType (PxBroadPhaseType::eSAP),
00913 broadPhaseCallback (NULL),
00914
00915 frictionType (PxFrictionType::ePATCH),
00916 bounceThresholdVelocity (0.2f * scale.speed),
00917 frictionOffsetThreshold (0.04f * scale.length),
00918 ccdMaxSeparation (0.04f * scale.length),
00919 solverOffsetSlop (0.0f),
00920
00921 flags (PxSceneFlag::eENABLE_PCM),
00922
00923 cpuDispatcher (NULL),
00924 gpuDispatcher (NULL),
00925
00926 staticStructure (PxPruningStructureType::eDYNAMIC_AABB_TREE),
00927 dynamicStructure (PxPruningStructureType::eDYNAMIC_AABB_TREE),
00928 dynamicTreeRebuildRateHint (100),
00929
00930 userData (NULL),
00931
00932 solverBatchSize (128),
00933
00934 nbContactDataBlocks (0),
00935 maxNbContactDataBlocks (1<<16),
00936 maxBiasCoefficient (PX_MAX_F32),
00937 contactReportStreamBufferSize (8192),
00938 ccdMaxPasses (1),
00939 wakeCounterResetValue (20.0f*0.02f),
00940 sanityBounds (PxBounds3(PxVec3(-PX_MAX_BOUNDS_EXTENTS), PxVec3(PX_MAX_BOUNDS_EXTENTS))),
00941
00942 gpuMaxNumPartitions (8),
00943 gpuComputeVersion (0),
00944
00945 tolerancesScale (scale)
00946 {
00947 }
00948
00949 PX_INLINE void PxSceneDesc::setToDefault(const PxTolerancesScale& scale)
00950 {
00951 *this = PxSceneDesc(scale);
00952 }
00953
00954 PX_INLINE bool PxSceneDesc::isValid() const
00955 {
00956 if(!filterShader)
00957 return false;
00958
00959 if( ((filterShaderDataSize == 0) && (filterShaderData != NULL)) ||
00960 ((filterShaderDataSize > 0) && (filterShaderData == NULL)) )
00961 return false;
00962
00963 if(!limits.isValid())
00964 return false;
00965
00966 if(staticStructure!=PxPruningStructureType::eSTATIC_AABB_TREE && staticStructure!=PxPruningStructureType::eDYNAMIC_AABB_TREE)
00967 return false;
00968
00969 if(dynamicTreeRebuildRateHint < 4)
00970 return false;
00971
00972 if(bounceThresholdVelocity < 0.0f)
00973 return false;
00974 if(frictionOffsetThreshold < 0.0f)
00975 return false;
00976 if(ccdMaxSeparation < 0.0f)
00977 return false;
00978
00979 if(!cpuDispatcher)
00980 return false;
00981
00982 if(!contactReportStreamBufferSize)
00983 return false;
00984
00985 if(maxNbContactDataBlocks < nbContactDataBlocks)
00986 return false;
00987
00988 if(wakeCounterResetValue <= 0.0f)
00989 return false;
00990
00991
00992 if((flags & (PxSceneFlag::eADAPTIVE_FORCE | PxSceneFlag::eENABLE_STABILIZATION)) == (PxSceneFlag::eADAPTIVE_FORCE | PxSceneFlag::eENABLE_STABILIZATION))
00993 return false;
00994
00995 if(!sanityBounds.isValid())
00996 return false;
00997
00998
00999 if((gpuMaxNumPartitions&(gpuMaxNumPartitions - 1)) != 0)
01000 return false;
01001 if (gpuMaxNumPartitions > 32)
01002 return false;
01003
01004 return true;
01005 }
01006
01007
01008 #if !PX_DOXYGEN
01009 }
01010 #endif
01011
01013 #endif