PxGeometryHelpers.h
Go to the documentation of this file.00001 // This code contains NVIDIA Confidential Information and is disclosed to you 00002 // under a form of NVIDIA software license agreement provided separately to you. 00003 // 00004 // Notice 00005 // NVIDIA Corporation and its licensors retain all intellectual property and 00006 // proprietary rights in and to this software and related documentation and 00007 // any modifications thereto. Any use, reproduction, disclosure, or 00008 // distribution of this software and related documentation without an express 00009 // license agreement from NVIDIA Corporation is strictly prohibited. 00010 // 00011 // ALL NVIDIA DESIGN SPECIFICATIONS, CODE ARE PROVIDED "AS IS.". NVIDIA MAKES 00012 // NO WARRANTIES, EXPRESSED, IMPLIED, STATUTORY, OR OTHERWISE WITH RESPECT TO 00013 // THE MATERIALS, AND EXPRESSLY DISCLAIMS ALL IMPLIED WARRANTIES OF NONINFRINGEMENT, 00014 // MERCHANTABILITY, AND FITNESS FOR A PARTICULAR PURPOSE. 00015 // 00016 // Information and code furnished is believed to be accurate and reliable. 00017 // However, NVIDIA Corporation assumes no responsibility for the consequences of use of such 00018 // information or for any infringement of patents or other rights of third parties that may 00019 // result from its use. No license is granted by implication or otherwise under any patent 00020 // or patent rights of NVIDIA Corporation. Details are subject to change without notice. 00021 // This code supersedes and replaces all information previously supplied. 00022 // NVIDIA Corporation products are not authorized for use as critical 00023 // components in life support devices or systems without express written approval of 00024 // NVIDIA Corporation. 00025 // 00026 // Copyright (c) 2008-2017 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_PHYSICS_GEOMETRYHELPERS 00032 #define PX_PHYSICS_GEOMETRYHELPERS 00033 00037 #include "common/PxPhysXCommonConfig.h" 00038 #include "PxGeometry.h" 00039 #include "PxBoxGeometry.h" 00040 #include "PxSphereGeometry.h" 00041 #include "PxCapsuleGeometry.h" 00042 #include "PxPlaneGeometry.h" 00043 #include "PxConvexMeshGeometry.h" 00044 #include "PxTriangleMeshGeometry.h" 00045 #include "PxHeightFieldGeometry.h" 00046 #include "foundation/PxPlane.h" 00047 #include "foundation/PxTransform.h" 00048 #include "foundation/PxUnionCast.h" 00049 00050 #if !PX_DOXYGEN 00051 namespace physx 00052 { 00053 #endif 00054 00064 PX_ALIGN_PREFIX(4) 00065 class PxGeometryHolder 00066 { 00067 public: 00068 PX_FORCE_INLINE PxGeometryType::Enum getType() const 00069 { 00070 return any().getType(); 00071 } 00072 00073 PX_FORCE_INLINE PxGeometry& any() 00074 { 00075 return *PxUnionCast<PxGeometry*>(&bytes.geometry); 00076 } 00077 00078 PX_FORCE_INLINE const PxGeometry& any() const 00079 { 00080 return *PxUnionCast<const PxGeometry*>(&bytes.geometry); 00081 } 00082 00083 PX_FORCE_INLINE PxSphereGeometry& sphere() 00084 { 00085 return get<PxSphereGeometry, PxGeometryType::eSPHERE>(); 00086 } 00087 00088 PX_FORCE_INLINE const PxSphereGeometry& sphere() const 00089 { 00090 return get<const PxSphereGeometry, PxGeometryType::eSPHERE>(); 00091 } 00092 00093 PX_FORCE_INLINE PxPlaneGeometry& plane() 00094 { 00095 return get<PxPlaneGeometry, PxGeometryType::ePLANE>(); 00096 } 00097 00098 PX_FORCE_INLINE const PxPlaneGeometry& plane() const 00099 { 00100 return get<const PxPlaneGeometry, PxGeometryType::ePLANE>(); 00101 } 00102 00103 PX_FORCE_INLINE PxCapsuleGeometry& capsule() 00104 { 00105 return get<PxCapsuleGeometry, PxGeometryType::eCAPSULE>(); 00106 } 00107 00108 PX_FORCE_INLINE const PxCapsuleGeometry& capsule() const 00109 { 00110 return get<const PxCapsuleGeometry, PxGeometryType::eCAPSULE>(); 00111 } 00112 00113 PX_FORCE_INLINE PxBoxGeometry& box() 00114 { 00115 return get<PxBoxGeometry, PxGeometryType::eBOX>(); 00116 } 00117 00118 PX_FORCE_INLINE const PxBoxGeometry& box() const 00119 { 00120 return get<const PxBoxGeometry, PxGeometryType::eBOX>(); 00121 } 00122 00123 PX_FORCE_INLINE PxConvexMeshGeometry& convexMesh() 00124 { 00125 return get<PxConvexMeshGeometry, PxGeometryType::eCONVEXMESH>(); 00126 } 00127 00128 PX_FORCE_INLINE const PxConvexMeshGeometry& convexMesh() const 00129 { 00130 return get<const PxConvexMeshGeometry, PxGeometryType::eCONVEXMESH>(); 00131 } 00132 00133 PX_FORCE_INLINE PxTriangleMeshGeometry& triangleMesh() 00134 { 00135 return get<PxTriangleMeshGeometry, PxGeometryType::eTRIANGLEMESH>(); 00136 } 00137 00138 PX_FORCE_INLINE const PxTriangleMeshGeometry& triangleMesh() const 00139 { 00140 return get<const PxTriangleMeshGeometry, PxGeometryType::eTRIANGLEMESH>(); 00141 } 00142 00143 PX_FORCE_INLINE PxHeightFieldGeometry& heightField() 00144 { 00145 return get<PxHeightFieldGeometry, PxGeometryType::eHEIGHTFIELD>(); 00146 } 00147 00148 PX_FORCE_INLINE const PxHeightFieldGeometry& heightField() const 00149 { 00150 return get<const PxHeightFieldGeometry, PxGeometryType::eHEIGHTFIELD>(); 00151 } 00152 00153 PX_FORCE_INLINE void storeAny(const PxGeometry& geometry) 00154 { 00155 PX_ASSERT_WITH_MESSAGE( (geometry.getType() >= PxGeometryType::eSPHERE) && 00156 (geometry.getType() < PxGeometryType::eGEOMETRY_COUNT), 00157 "Unexpected GeometryType in PxGeometryHolder::storeAny"); 00158 00159 switch(geometry.getType()) 00160 { 00161 case PxGeometryType::eSPHERE: put<PxSphereGeometry>(geometry); break; 00162 case PxGeometryType::ePLANE: put<PxPlaneGeometry>(geometry); break; 00163 case PxGeometryType::eCAPSULE: put<PxCapsuleGeometry>(geometry); break; 00164 case PxGeometryType::eBOX: put<PxBoxGeometry>(geometry); break; 00165 case PxGeometryType::eCONVEXMESH: put<PxConvexMeshGeometry>(geometry); break; 00166 case PxGeometryType::eTRIANGLEMESH: put<PxTriangleMeshGeometry>(geometry); break; 00167 case PxGeometryType::eHEIGHTFIELD: put<PxHeightFieldGeometry>(geometry); break; 00168 case PxGeometryType::eGEOMETRY_COUNT: 00169 case PxGeometryType::eINVALID: break; 00170 } 00171 } 00172 00173 PX_FORCE_INLINE PxGeometryHolder() {} 00174 PX_FORCE_INLINE PxGeometryHolder(const PxGeometry& geometry){ storeAny(geometry); } 00175 00176 private: 00177 template<typename T> void put(const PxGeometry& geometry) 00178 { 00179 static_cast<T&>(any()) = static_cast<const T&>(geometry); 00180 } 00181 00182 template<typename T, PxGeometryType::Enum type> T& get() 00183 { 00184 PX_ASSERT(getType() == type); 00185 return static_cast<T&>(any()); 00186 } 00187 00188 template<typename T, PxGeometryType::Enum type> T& get() const 00189 { 00190 PX_ASSERT(getType() == type); 00191 return static_cast<T&>(any()); 00192 } 00193 00194 union { 00195 PxU8 geometry[sizeof(PxGeometry)]; 00196 PxU8 box[sizeof(PxBoxGeometry)]; 00197 PxU8 sphere[sizeof(PxSphereGeometry)]; 00198 PxU8 capsule[sizeof(PxCapsuleGeometry)]; 00199 PxU8 plane[sizeof(PxPlaneGeometry)]; 00200 PxU8 convex[sizeof(PxConvexMeshGeometry)]; 00201 PxU8 mesh[sizeof(PxTriangleMeshGeometry)]; 00202 PxU8 heightfield[sizeof(PxHeightFieldGeometry)]; 00203 } bytes; 00204 } 00205 PX_ALIGN_SUFFIX(4); 00206 00207 00208 00209 00210 #if !PX_DOXYGEN 00211 } // namespace physx 00212 #endif 00213 00215 #endif
Copyright © 2008-2017 NVIDIA Corporation, 2701 San Tomas Expressway, Santa Clara, CA 95050 U.S.A. All rights reserved. www.nvidia.com