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_COLLISION_NXCONVEXMESHDESC
00032 #define PX_COLLISION_NXCONVEXMESHDESC
00033
00037 #include "foundation/PxVec3.h"
00038 #include "foundation/PxFlags.h"
00039 #include "common/PxCoreUtilityTypes.h"
00040 #include "geometry/PxConvexMesh.h"
00041
00042 #if !PX_DOXYGEN
00043 namespace physx
00044 {
00045 #endif
00046
00050 struct PxConvexFlag
00051 {
00052 enum Enum
00053 {
00059 e16_BIT_INDICES = (1<<0),
00060
00068 eCOMPUTE_CONVEX = (1<<1),
00069
00081 eCHECK_ZERO_AREA_TRIANGLES = (1<<2),
00082
00092 PX_DEPRECATED eINFLATE_CONVEX = (1<<3),
00093
00101 eQUANTIZE_INPUT = (1 << 4),
00102
00110 eDISABLE_MESH_VALIDATION = (1 << 5),
00111
00129 ePLANE_SHIFTING = (1 << 6),
00130
00135 eFAST_INERTIA_COMPUTATION = (1 << 7),
00136
00142 eGPU_COMPATIBLE = (1 << 8)
00143 };
00144 };
00145
00151 typedef PxFlags<PxConvexFlag::Enum,PxU16> PxConvexFlags;
00152 PX_FLAGS_OPERATORS(PxConvexFlag::Enum,PxU16)
00153
00154
00161 class PxConvexMeshDesc
00162 {
00163 public:
00164
00170 PxBoundedData points;
00171
00180 PxBoundedData polygons;
00181
00192 PxBoundedData indices;
00193
00199 PxConvexFlags flags;
00200
00214 PxU16 vertexLimit;
00215
00225 PxU16 quantizedCount;
00226
00230 PX_INLINE PxConvexMeshDesc();
00234 PX_INLINE void setToDefault();
00240 PX_INLINE bool isValid() const;
00241 };
00242
00243 PX_INLINE PxConvexMeshDesc::PxConvexMeshDesc()
00244 : vertexLimit(255), quantizedCount(255)
00245 {
00246 }
00247
00248 PX_INLINE void PxConvexMeshDesc::setToDefault()
00249 {
00250 *this = PxConvexMeshDesc();
00251 }
00252
00253 PX_INLINE bool PxConvexMeshDesc::isValid() const
00254 {
00255
00256 if(points.count < 3 ||
00257 (points.count > 0xffff && flags & PxConvexFlag::e16_BIT_INDICES))
00258 return false;
00259 if(!points.data)
00260 return false;
00261 if(points.stride < sizeof(PxVec3))
00262 return false;
00263 if (quantizedCount < 4)
00264 return false;
00265
00266
00267 if(polygons.data)
00268 {
00269 if(polygons.count < 4)
00270 return false;
00271
00272 if(!indices.data)
00273 return false;
00274
00275 PxU32 limit = (flags & PxConvexFlag::e16_BIT_INDICES) ? sizeof(PxU16) : sizeof(PxU32);
00276 if(indices.stride < limit)
00277 return false;
00278
00279 limit = sizeof(PxHullPolygon);
00280 if(polygons.stride < limit)
00281 return false;
00282 }
00283 else
00284 {
00285
00286 if(!(flags & PxConvexFlag::eCOMPUTE_CONVEX))
00287 return false;
00288
00289 }
00290
00291 if((flags & PxConvexFlag::ePLANE_SHIFTING) && vertexLimit < 4)
00292 {
00293 return false;
00294 }
00295
00296 if (!(flags & PxConvexFlag::ePLANE_SHIFTING) && vertexLimit < 8)
00297 {
00298 return false;
00299 }
00300
00301 if(vertexLimit > 256)
00302 {
00303 return false;
00304 }
00305 return true;
00306 }
00307
00308 #if !PX_DOXYGEN
00309 }
00310 #endif
00311
00313 #endif