diff options
| author | Sheikh Dawood <[email protected]> | 2018-04-09 10:13:48 -0500 |
|---|---|---|
| committer | Sheikh Dawood <[email protected]> | 2018-04-09 10:13:48 -0500 |
| commit | 238605d8225a9135d6b60646e05d066e25424eee (patch) | |
| tree | 2b013bd4946bb3c699d7a06ef1f21be85d367f63 /PhysX_3.4/Snippets/SnippetDeformableMesh/SnippetDeformableMesh.cpp | |
| parent | Add ParamTool.exe (diff) | |
| download | physx-3.4-238605d8225a9135d6b60646e05d066e25424eee.tar.xz physx-3.4-238605d8225a9135d6b60646e05d066e25424eee.zip | |
PhysX 3.4, APEX 1.4 patch release @23879214
Diffstat (limited to 'PhysX_3.4/Snippets/SnippetDeformableMesh/SnippetDeformableMesh.cpp')
| -rw-r--r-- | PhysX_3.4/Snippets/SnippetDeformableMesh/SnippetDeformableMesh.cpp | 269 |
1 files changed, 269 insertions, 0 deletions
diff --git a/PhysX_3.4/Snippets/SnippetDeformableMesh/SnippetDeformableMesh.cpp b/PhysX_3.4/Snippets/SnippetDeformableMesh/SnippetDeformableMesh.cpp new file mode 100644 index 00000000..ca3a1545 --- /dev/null +++ b/PhysX_3.4/Snippets/SnippetDeformableMesh/SnippetDeformableMesh.cpp @@ -0,0 +1,269 @@ +// 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-2017 NVIDIA Corporation. All rights reserved. +// Copyright (c) 2004-2008 AGEIA Technologies, Inc. All rights reserved. +// Copyright (c) 2001-2004 NovodeX AG. All rights reserved. + +// **************************************************************************** +// This snippet shows how to use deformable meshes in PhysX. +// **************************************************************************** + +#include <ctype.h> + +#include "PxPhysicsAPI.h" + +#include "../SnippetCommon/SnippetPrint.h" +#include "../SnippetCommon/SnippetPVD.h" +#include "../SnippetUtils/SnippetUtils.h" + +using namespace physx; + +PxDefaultAllocator gAllocator; +PxDefaultErrorCallback gErrorCallback; + +PxFoundation* gFoundation = NULL; +PxPhysics* gPhysics = NULL; +PxCooking* gCooking = NULL; + +PxDefaultCpuDispatcher* gDispatcher = NULL; +PxScene* gScene = NULL; + +PxMaterial* gMaterial = NULL; + +PxPvd* gPvd = NULL; + +PxTriangleMesh* gMesh = NULL; +PxRigidStatic* gActor = NULL; + +PxReal stackZ = 10.0f; + +static const PxU32 gGridSize = 8; +static const PxReal gGridStep = 512.0f / PxReal(gGridSize-1); +static float gTime = 0.0f; + +static PxRigidDynamic* createDynamic(const PxTransform& t, const PxGeometry& geometry, const PxVec3& velocity=PxVec3(0), PxReal density=1.0f) +{ + PxRigidDynamic* dynamic = PxCreateDynamic(*gPhysics, t, geometry, *gMaterial, density); + dynamic->setLinearVelocity(velocity); + gScene->addActor(*dynamic); + return dynamic; +} + +static void createStack(const PxTransform& t, PxU32 size, PxReal halfExtent) +{ + PxShape* shape = gPhysics->createShape(PxBoxGeometry(halfExtent, halfExtent, halfExtent), *gMaterial); + for(PxU32 i=0; i<size;i++) + { + for(PxU32 j=0;j<size-i;j++) + { + PxTransform localTm(PxVec3(PxReal(j*2) - PxReal(size-i), PxReal(i*2+1), 0) * halfExtent); + PxRigidDynamic* body = gPhysics->createRigidDynamic(t.transform(localTm)); + body->attachShape(*shape); + PxRigidBodyExt::updateMassAndInertia(*body, 10.0f); + gScene->addActor(*body); + } + } + shape->release(); +} + +struct Triangle +{ + PxU32 ind0, ind1, ind2; +}; + +static void updateVertices(PxVec3* verts, float amplitude=0.0f) +{ + const PxU32 gridSize = gGridSize; + const PxReal gridStep = gGridStep; + + for(PxU32 a=0; a<gridSize; a++) + { + const float coeffA = float(a)/float(gridSize); + for(PxU32 b=0; b<gridSize; b++) + { + const float coeffB = float(b)/float(gridSize); + + const float y = 20.0f + sinf(coeffA*PxTwoPi)*cosf(coeffB*PxTwoPi)*amplitude; + + verts[a * gridSize + b] = PxVec3(-400.0f + b*gridStep, y, -400.0f + a*gridStep); + } + } +} + +static PxTriangleMesh* createMeshGround() +{ + const PxU32 gridSize = gGridSize; + + PxVec3 verts[gridSize * gridSize]; + + const PxU32 nbTriangles = 2 * (gridSize - 1) * (gridSize-1); + + Triangle indices[nbTriangles]; + + updateVertices(verts); + + for (PxU32 a = 0; a < (gridSize-1); ++a) + { + for (PxU32 b = 0; b < (gridSize-1); ++b) + { + Triangle& tri0 = indices[(a * (gridSize-1) + b) * 2]; + Triangle& tri1 = indices[((a * (gridSize-1) + b) * 2) + 1]; + + tri0.ind0 = a * gridSize + b + 1; + tri0.ind1 = a * gridSize + b; + tri0.ind2 = (a + 1) * gridSize + b + 1; + + tri1.ind0 = (a + 1) * gridSize + b + 1; + tri1.ind1 = a * gridSize + b; + tri1.ind2 = (a + 1) * gridSize + b; + } + } + + PxTriangleMeshDesc meshDesc; + meshDesc.points.data = verts; + meshDesc.points.count = gridSize * gridSize; + meshDesc.points.stride = sizeof(PxVec3); + meshDesc.triangles.count = nbTriangles; + meshDesc.triangles.data = indices; + meshDesc.triangles.stride = sizeof(Triangle); + + PxTriangleMesh* triMesh = gCooking->createTriangleMesh(meshDesc, gPhysics->getPhysicsInsertionCallback()); + + return triMesh; +} + +void initPhysics(bool /*interactive*/) +{ + gFoundation = PxCreateFoundation(PX_FOUNDATION_VERSION, gAllocator, gErrorCallback); + + gPvd = PxCreatePvd(*gFoundation); + PxPvdTransport* transport = PxDefaultPvdSocketTransportCreate(PVD_HOST, 5425, 10); + gPvd->connect(*transport,PxPvdInstrumentationFlag::eALL); + + gPhysics = PxCreatePhysics(PX_PHYSICS_VERSION, *gFoundation, PxTolerancesScale(), true, gPvd); + + PxCookingParams cookingParams(gPhysics->getTolerancesScale()); + + // Deformable meshes are only supported with PxMeshMidPhase::eBVH33. + cookingParams.midphaseDesc.setToDefault(PxMeshMidPhase::eBVH33); + // We need to disable the mesh cleaning part so that the vertex mapping remains untouched. + cookingParams.meshPreprocessParams = PxMeshPreprocessingFlag::eDISABLE_CLEAN_MESH; + + gCooking = PxCreateCooking(PX_PHYSICS_VERSION, *gFoundation, cookingParams); + + PxSceneDesc sceneDesc(gPhysics->getTolerancesScale()); + sceneDesc.gravity = PxVec3(0.0f, -9.81f, 0.0f); + gDispatcher = PxDefaultCpuDispatcherCreate(2); + sceneDesc.cpuDispatcher = gDispatcher; + sceneDesc.filterShader = PxDefaultSimulationFilterShader; + + gScene = gPhysics->createScene(sceneDesc); + + PxPvdSceneClient* pvdClient = gScene->getScenePvdClient(); + if(pvdClient) + { + pvdClient->setScenePvdFlag(PxPvdSceneFlag::eTRANSMIT_CONSTRAINTS, true); + pvdClient->setScenePvdFlag(PxPvdSceneFlag::eTRANSMIT_CONTACTS, true); + pvdClient->setScenePvdFlag(PxPvdSceneFlag::eTRANSMIT_SCENEQUERIES, true); + } + + gMaterial = gPhysics->createMaterial(0.5f, 0.5f, 0.6f); + + PxTriangleMesh* mesh = createMeshGround(); + gMesh = mesh; + + PxTriangleMeshGeometry geom(mesh); + + PxRigidStatic* groundMesh = gPhysics->createRigidStatic(PxTransform(PxVec3(0, 2, 0))); + gActor = groundMesh; + groundMesh->createShape(geom, *gMaterial); + + { + PxShape* shape; + groundMesh->getShapes(&shape, 1); + shape->setContactOffset(0.02f); + // A negative rest offset helps to avoid jittering when the deformed mesh moves away from objects resting on it. + shape->setRestOffset(-0.5f); + } + + gScene->addActor(*groundMesh); + + createStack(PxTransform(PxVec3(0,22,0)), 10, 2.0f); +} + +void stepPhysics(bool /*interactive*/) +{ + { + PxVec3* verts = gMesh->getVerticesForModification(); + gTime += 0.01f; + updateVertices(verts, sinf(gTime)*20.0f); + PxBounds3 newBounds = gMesh->refitBVH(); + PX_UNUSED(newBounds); + + // Reset filtering to tell the broadphase about the new mesh bounds. + gScene->resetFiltering(*gActor); + } + gScene->simulate(1.0f/60.0f); + gScene->fetchResults(true); +} + +void cleanupPhysics(bool /*interactive*/) +{ + gScene->release(); + gDispatcher->release(); + gPhysics->release(); + PxPvdTransport* transport = gPvd->getTransport(); + gPvd->release(); + transport->release(); + gCooking->release(); + gFoundation->release(); + + printf("SnippetDeformableMesh done.\n"); +} + +void keyPress(unsigned char key, const PxTransform& camera) +{ + switch(toupper(key)) + { + case ' ': createDynamic(camera, PxSphereGeometry(3.0f), camera.rotate(PxVec3(0,0,-1))*200, 3.0f); break; + } +} + +int snippetMain(int, const char*const*) +{ +#ifdef RENDER_SNIPPET + extern void renderLoop(); + renderLoop(); +#else + static const PxU32 frameCount = 100; + initPhysics(false); + for(PxU32 i=0; i<frameCount; i++) + stepPhysics(false); + cleanupPhysics(false); +#endif + + return 0; +} |