aboutsummaryrefslogtreecommitdiff
path: root/PhysX_3.4/Samples/SampleLargeWorld/MeshBuilder.cpp
diff options
context:
space:
mode:
authorgit perforce import user <a@b>2016-10-25 12:29:14 -0600
committerSheikh Dawood Abdul Ajees <Sheikh Dawood Abdul Ajees>2016-10-25 18:56:37 -0500
commit3dfe2108cfab31ba3ee5527e217d0d8e99a51162 (patch)
treefa6485c169e50d7415a651bf838f5bcd0fd3bfbd /PhysX_3.4/Samples/SampleLargeWorld/MeshBuilder.cpp
downloadphysx-3.4-3dfe2108cfab31ba3ee5527e217d0d8e99a51162.tar.xz
physx-3.4-3dfe2108cfab31ba3ee5527e217d0d8e99a51162.zip
Initial commit:
PhysX 3.4.0 Update @ 21294896 APEX 1.4.0 Update @ 21275617 [CL 21300167]
Diffstat (limited to 'PhysX_3.4/Samples/SampleLargeWorld/MeshBuilder.cpp')
-rw-r--r--PhysX_3.4/Samples/SampleLargeWorld/MeshBuilder.cpp181
1 files changed, 181 insertions, 0 deletions
diff --git a/PhysX_3.4/Samples/SampleLargeWorld/MeshBuilder.cpp b/PhysX_3.4/Samples/SampleLargeWorld/MeshBuilder.cpp
new file mode 100644
index 00000000..972fb4f9
--- /dev/null
+++ b/PhysX_3.4/Samples/SampleLargeWorld/MeshBuilder.cpp
@@ -0,0 +1,181 @@
+// This code contains NVIDIA Confidential Information and is disclosed to you
+// under a form of NVIDIA software license agreement provided separately to you.
+//
+// Notice
+// NVIDIA Corporation and its licensors retain all intellectual property and
+// proprietary rights in and to this software and related documentation and
+// any modifications thereto. Any use, reproduction, disclosure, or
+// distribution of this software and related documentation without an express
+// license agreement from NVIDIA Corporation is strictly prohibited.
+//
+// ALL NVIDIA DESIGN SPECIFICATIONS, CODE ARE PROVIDED "AS IS.". NVIDIA MAKES
+// NO WARRANTIES, EXPRESSED, IMPLIED, STATUTORY, OR OTHERWISE WITH RESPECT TO
+// THE MATERIALS, AND EXPRESSLY DISCLAIMS ALL IMPLIED WARRANTIES OF NONINFRINGEMENT,
+// MERCHANTABILITY, AND FITNESS FOR A PARTICULAR PURPOSE.
+//
+// Information and code furnished is believed to be accurate and reliable.
+// However, NVIDIA Corporation assumes no responsibility for the consequences of use of such
+// information or for any infringement of patents or other rights of third parties that may
+// result from its use. No license is granted by implication or otherwise under any patent
+// or patent rights of NVIDIA Corporation. Details are subject to change without notice.
+// This code supersedes and replaces all information previously supplied.
+// NVIDIA Corporation products are not authorized for use as critical
+// components in life support devices or systems without express written approval of
+// NVIDIA Corporation.
+//
+// Copyright (c) 2008-2016 NVIDIA Corporation. All rights reserved.
+// Copyright (c) 2004-2008 AGEIA Technologies, Inc. All rights reserved.
+// Copyright (c) 2001-2004 NovodeX AG. All rights reserved.
+
+#include "SampleDirManager.h"
+#include "SampleLargeWorld.h"
+#include "MeshBuilder.h"
+#include "wavefront.h"
+
+using namespace PxToolkit;
+using namespace physx;
+using namespace shdfnd;
+
+#define MATERIAL_ID 1
+
+
+MeshBuilder::MeshBuilder(SampleLargeWorld& sample, const char* filename)
+ : mSampleLargeWorld(&sample)
+ , mPhysics(sample.getPhysics())
+ , mScene(sample.getActiveScene())
+ , mCooking(sample.getCooking())
+ , mMaterial(sample.getDefaultMaterial())
+ , mStringTable(sample.mStringTable)
+{
+ PxDefaultFileInputData inputStream(filename);
+ PxSerializationRegistry* sr = PxSerialization::createSerializationRegistry(mPhysics);
+
+ PxCollection* c = PxSerialization::createCollectionFromXml(inputStream, mCooking, *sr, NULL, mStringTable);
+ PX_ASSERT( c );
+
+ c->add( mMaterial, MATERIAL_ID );
+ PxSerialization::complete(*c, *sr);
+
+ PxU32 count = c->getNbObjects();
+ for(PxU32 i = 0; i < count; i++)
+ {
+ PxBase* object = &c->getObject(i);
+ switch ( object->getConcreteType() )
+ {
+ case PxConcreteType::eCONVEX_MESH:
+ {
+ PxConvexMesh* j = static_cast<PxConvexMesh*>(object);
+ mConvexMeshes.push_back( j );
+ break;
+ }
+ case PxConcreteType::eTRIANGLE_MESH_BVH33:
+ case PxConcreteType::eTRIANGLE_MESH_BVH34:
+ {
+ PxTriangleMesh* j = static_cast<PxTriangleMesh*>(object);
+ mTriMeshes.push_back(j);
+ break;
+ }
+ default:
+ break;
+ }
+ }
+ c->release();
+ sr->release();
+}
+
+void MeshBuilder::addObjMeshToPxCollection(
+ PxPhysics& physics,
+ PxCooking& cooking,
+ PxMaterial& material,
+ const char* filename,
+ const char* filenameCooked,
+ const PxTransform& pose,
+ const PxVec3& scale,
+ PxCollection& collection,
+ const char* name)
+{
+ PxTriangleMesh* mesh = NULL;
+
+ PxDefaultFileInputData cooked(filenameCooked);
+ if (cooked.isValid())
+ {
+ //load from disc
+ mesh = physics.createTriangleMesh(cooked); //if this load fails, maybe old format. try to recook below.
+ }
+ if(!mesh)
+ {
+ WavefrontObj wfo;
+ if (!wfo.loadObj(filename, false))
+ {
+ shdfnd::printFormatted("Error loading file: %s\n", filename);
+ }
+
+ PxTriangleMeshDesc meshDesc;
+ meshDesc.points.count = wfo.mVertexCount;
+ meshDesc.triangles.count = wfo.mTriCount;
+ meshDesc.points.stride = sizeof(float) * 3;
+ meshDesc.triangles.stride = sizeof(int) * 3;
+ meshDesc.points.data = wfo.mVertices;
+ meshDesc.triangles.data = wfo.mIndices;
+
+ bool ok;
+ {
+ PxDefaultFileOutputStream stream(filenameCooked);
+ ok = cooking.cookTriangleMesh(meshDesc, stream);
+ }
+ if ( ok )
+ {
+ PxDefaultFileInputData stream(filenameCooked);
+ mesh = physics.createTriangleMesh(stream);
+ }
+ }
+ PX_ASSERT( mesh );
+
+ PxRigidStatic* actor = physics.createRigidStatic(pose);
+ PX_ASSERT( actor );
+ PxMeshScale meshScale = PxMeshScale(scale, PxQuat(PxIdentity));
+ PxShape* shape = PxRigidActorExt::createExclusiveShape(*actor, PxTriangleMeshGeometry(mesh, meshScale), material);
+ PX_ASSERT( shape );
+ shape->setFlag(PxShapeFlag::eVISUALIZATION, false);
+ if( name )
+ {
+ actor->setName(name);
+ }
+
+ collection.add(*actor);
+}
+
+void MeshBuilder::addRepXToPxCollection(
+ const PxTransform& pose,
+ const PxVec3& scale,
+ PxCollection& collection,
+ const char* name)
+{
+
+ PxRigidStatic* actor = mPhysics.createRigidStatic(pose);
+ PX_ASSERT( actor );
+
+ size_t size = mConvexMeshes.size();
+ PxMeshScale meshScale = PxMeshScale(scale, PxQuat(PxIdentity));
+ for(PxU32 i = 0; i < size; ++i)
+ {
+ PxConvexMesh* mesh = mConvexMeshes[i];
+ PxShape* shape = PxRigidActorExt::createExclusiveShape(*actor, PxConvexMeshGeometry(mesh, meshScale), mMaterial);
+ PX_ASSERT( shape );
+ shape->setFlag(PxShapeFlag::eVISUALIZATION, false);
+ }
+
+ size = mTriMeshes.size();
+ for(PxU32 i = 0; i < size; ++i)
+ {
+ PxTriangleMesh* mesh = mTriMeshes[i];
+ PxShape* shape = PxRigidActorExt::createExclusiveShape(*actor, PxTriangleMeshGeometry(mesh, meshScale), mMaterial);
+ PX_ASSERT( shape );
+ shape->setFlag(PxShapeFlag::eVISUALIZATION, false);
+ }
+
+ if( name )
+ actor->setName(name);
+
+ collection.add(*actor);
+}