PxCooking.h

Go to the documentation of this file.
00001 //
00002 // Redistribution and use in source and binary forms, with or without
00003 // modification, are permitted provided that the following conditions
00004 // are met:
00005 //  * Redistributions of source code must retain the above copyright
00006 //    notice, this list of conditions and the following disclaimer.
00007 //  * Redistributions in binary form must reproduce the above copyright
00008 //    notice, this list of conditions and the following disclaimer in the
00009 //    documentation and/or other materials provided with the distribution.
00010 //  * Neither the name of NVIDIA CORPORATION nor the names of its
00011 //    contributors may be used to endorse or promote products derived
00012 //    from this software without specific prior written permission.
00013 //
00014 // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ``AS IS'' AND ANY
00015 // EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
00016 // IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
00017 // PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR
00018 // CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
00019 // EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
00020 // PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
00021 // PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
00022 // OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
00023 // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
00024 // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
00025 //
00026 // Copyright (c) 2008-2018 NVIDIA Corporation. All rights reserved.
00027 // Copyright (c) 2004-2008 AGEIA Technologies, Inc. All rights reserved.
00028 // Copyright (c) 2001-2004 NovodeX AG. All rights reserved.
00029 
00030 
00031 #ifndef PX_COOKING_H
00032 #define PX_COOKING_H
00033 
00036 #include "common/PxPhysXCommonConfig.h"
00037 #include "common/PxTolerancesScale.h"
00038 #include "cooking/Pxc.h"
00039 
00040 #include "cooking/PxConvexMeshDesc.h"
00041 #include "cooking/PxTriangleMeshDesc.h"
00042 #include "cooking/PxMidphaseDesc.h"
00043 #include "geometry/PxTriangleMesh.h"
00044 
00045 #if !PX_DOXYGEN
00046 namespace physx
00047 {
00048 #endif
00049 
00050 class PxBinaryConverter;
00051 class PxPhysicsInsertionCallback;
00052 class PxFoundation;
00053 
00054 struct PX_DEPRECATED PxPlatform
00055 {
00056     enum Enum
00057     {
00058         ePC,
00059         eARM
00060     };
00061 };
00062 
00063 PX_DEPRECATED PX_FORCE_INLINE PxU32 PxGetGaussMapVertexLimitForPlatform(PxPlatform::Enum targetPlatform)
00064 {
00065     PX_ASSERT_WITH_MESSAGE( (targetPlatform >= PxPlatform::ePC) && 
00066                             (targetPlatform <= PxPlatform::eARM),
00067                             "Unexpected platform in PxGetGaussMapVertexLimitForPlatform");
00068 
00069     PxU32 limit = 0;
00070     switch(targetPlatform)
00071     {
00072         case PxPlatform::ePC:
00073             limit = 32;     break;
00074         case PxPlatform::eARM:
00075             limit = 32;     break;
00076     }
00077     return limit;
00078 }
00079 
00083 struct PxConvexMeshCookingResult
00084 {
00085     enum Enum
00086     {
00090         eSUCCESS,
00091 
00097         eZERO_AREA_TEST_FAILED,
00098 
00106         ePOLYGONS_LIMIT_REACHED,
00107 
00111         eFAILURE
00112     };
00113 };
00114 
00116 struct PxConvexMeshCookingType
00117 {
00118     enum Enum
00119     {
00132         eINFLATION_INCREMENTAL_HULL PX_DEPRECATED = 0,
00133 
00139         eQUICKHULL
00140     };
00141 };
00142 
00146 struct PxTriangleMeshCookingResult
00147 {
00148     enum Enum
00149     {
00153         eSUCCESS            = 0,
00154 
00158         eLARGE_TRIANGLE,
00159 
00163         eFAILURE
00164     };
00165 };
00166 
00173 struct PxMeshPreprocessingFlag
00174 {
00175     enum Enum
00176     {
00180         eWELD_VERTICES                  =   1 << 0, 
00181 
00190         eDISABLE_CLEAN_MESH                             =   1 << 1, 
00191 
00195         eDISABLE_ACTIVE_EDGES_PRECOMPUTE                =   1 << 2,
00196 
00202         eFORCE_32BIT_INDICES                            =   1 << 3
00203     };
00204 };
00205 
00206 typedef PxFlags<PxMeshPreprocessingFlag::Enum,PxU32> PxMeshPreprocessingFlags;
00207 
00214 struct PxCookingParams
00215 {
00225     PxPlatform::Enum    targetPlatform;
00248     PX_DEPRECATED float     skinWidth;
00249 
00262     float       areaTestEpsilon;
00263 
00284     float       planeTolerance;
00285 
00293     PxConvexMeshCookingType::Enum convexMeshCookingType;
00294 
00302     bool        suppressTriangleMeshRemapTable;
00303 
00310     bool        buildTriangleAdjacencies;
00311 
00317     bool        buildGPUData;
00318 
00326     PxTolerancesScale scale;
00327 
00333     PxMeshPreprocessingFlags    meshPreprocessParams;
00334 
00344     PX_DEPRECATED PxMeshCookingHint::Enum           meshCookingHint;
00345 
00359     PX_DEPRECATED PxF32 meshSizePerformanceTradeOff;
00360 
00376     PxReal      meshWeldTolerance;
00377 
00388     PxMidphaseDesc midphaseDesc;
00389 
00397     PxU32   gaussMapLimit;
00398 
00399     PxCookingParams(const PxTolerancesScale& sc):
00400         skinWidth                       (0.025f*sc.length),
00401         areaTestEpsilon                 (0.06f*sc.length*sc.length),
00402         planeTolerance                  (0.0007f),
00403         convexMeshCookingType           (PxConvexMeshCookingType::eQUICKHULL),
00404         suppressTriangleMeshRemapTable  (false),
00405         buildTriangleAdjacencies        (false),
00406         buildGPUData                    (false),
00407         scale                           (sc),
00408         meshPreprocessParams            (0),
00409         meshCookingHint                 (PxMeshCookingHint::eSIM_PERFORMANCE),
00410         meshSizePerformanceTradeOff     (0.55f),
00411         meshWeldTolerance               (0.f)
00412     {
00413 #if PX_INTEL_FAMILY
00414         targetPlatform = PxPlatform::ePC;
00415 #elif PX_ARM_FAMILY
00416         targetPlatform = PxPlatform::eARM;
00417 #else
00418 #error Unknown platform
00419 #endif
00420         gaussMapLimit = PxGetGaussMapVertexLimitForPlatform(targetPlatform);
00421     }
00422 };
00423 
00424 class PxCooking
00425 {
00426 public:
00435     virtual void  release() = 0;
00436 
00444     virtual void  setParams(const PxCookingParams& params) = 0;
00445 
00453     virtual const PxCookingParams& getParams() const = 0;
00454 
00460     virtual bool  platformMismatch() const = 0;
00461 
00482     virtual bool  cookTriangleMesh(const PxTriangleMeshDesc& desc, PxOutputStream& stream, PxTriangleMeshCookingResult::Enum* condition = NULL) const = 0;
00483 
00496     virtual PxTriangleMesh*    createTriangleMesh(const PxTriangleMeshDesc& desc, PxPhysicsInsertionCallback& insertionCallback, PxTriangleMeshCookingResult::Enum* condition = NULL) const = 0;
00497 
00511     virtual bool  validateTriangleMesh(const PxTriangleMeshDesc& desc) const = 0;
00512 
00536     virtual bool  cookConvexMesh(const PxConvexMeshDesc& desc, PxOutputStream& stream, PxConvexMeshCookingResult::Enum* condition = NULL) const = 0;
00537 
00553     virtual PxConvexMesh*    createConvexMesh(const PxConvexMeshDesc& desc, PxPhysicsInsertionCallback& insertionCallback, PxConvexMeshCookingResult::Enum* condition = NULL) const = 0;
00554 
00568     virtual bool  validateConvexMesh(const PxConvexMeshDesc& desc) const = 0;
00569 
00570 
00592     virtual bool  computeHullPolygons(const PxSimpleTriangleMesh& mesh, PxAllocatorCallback& inCallback, PxU32& nbVerts, PxVec3*& vertices,
00593                                             PxU32& nbIndices, PxU32*& indices, PxU32& nbPolygons, PxHullPolygon*& hullPolygons) const = 0;
00594 
00609     virtual bool  cookHeightField(const PxHeightFieldDesc& desc, PxOutputStream& stream) const = 0;
00610 
00620     virtual PxHeightField*    createHeightField(const PxHeightFieldDesc& desc, PxPhysicsInsertionCallback& insertionCallback) const = 0;
00621 
00622 
00623 protected:
00624     virtual ~PxCooking(){}
00625 };
00626 
00627 #if !PX_DOXYGEN
00628 } // namespace physx
00629 #endif
00630 
00648 PX_C_EXPORT PX_PHYSX_COOKING_API physx::PxCooking* PX_CALL_CONV PxCreateCooking(physx::PxU32 version,
00649                                                                                 physx::PxFoundation& foundation,
00650                                                                                 const physx::PxCookingParams& params);
00651 
00653 #endif


Copyright © 2008-2018 NVIDIA Corporation, 2701 San Tomas Expressway, Santa Clara, CA 95050 U.S.A. All rights reserved. www.nvidia.com