aboutsummaryrefslogtreecommitdiff
path: root/PhysX_3.4/Samples/SampleNorthPole/SampleNorthPoleDynamics.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/SampleNorthPole/SampleNorthPoleDynamics.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/SampleNorthPole/SampleNorthPoleDynamics.cpp')
-rw-r--r--PhysX_3.4/Samples/SampleNorthPole/SampleNorthPoleDynamics.cpp401
1 files changed, 401 insertions, 0 deletions
diff --git a/PhysX_3.4/Samples/SampleNorthPole/SampleNorthPoleDynamics.cpp b/PhysX_3.4/Samples/SampleNorthPole/SampleNorthPoleDynamics.cpp
new file mode 100644
index 00000000..8cb7e798
--- /dev/null
+++ b/PhysX_3.4/Samples/SampleNorthPole/SampleNorthPoleDynamics.cpp
@@ -0,0 +1,401 @@
+// 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 "PxPhysicsAPI.h"
+#include "extensions/PxExtensionsAPI.h"
+#include "PxTkStream.h"
+#include "SampleNorthPole.h"
+#include "RenderBaseActor.h"
+
+using namespace PxToolkit;
+
+//#define USE_RAYCAST_CCD_FOR_SNOWBALLS
+
+void SampleNorthPole::detach()
+{
+ std::vector<PxShape*>::const_iterator ite;
+ for(ite=mDetaching.begin(); ite<mDetaching.end(); ++ite)
+ {
+ PxSceneWriteLock scopedLock(*mScene);
+
+ PxShape* shape = *ite;
+ PxRigidActor* actor = shape->getActor();
+
+ PxMaterial* mat;
+ shape->getMaterials(&mat,1);
+ PxGeometryHolder geometry = shape->getGeometry();
+ PxTransform newActorPose = PxShapeExt::getGlobalPose(*shape, *actor);
+
+ PxRigidDynamic* newActor = PxCreateDynamic(*mPhysics, newActorPose, geometry.any(), *mat, 1);
+ if(!newActor)
+ fatalError("creating detached actor failed");
+ getActiveScene().addActor(*newActor);
+ mPhysicsActors.push_back(newActor);
+
+ // the only convex shape is the nose, so we can just test the type
+ if(geometry.getType() == PxGeometryType::eCONVEXMESH)
+ {
+ newActor->addForce(PxVec3(0,.1,0),PxForceMode::eFORCE);
+ size_t index = reinterpret_cast<size_t>(actor->userData);
+ mSnowman[index].changeMood();
+ }
+
+ // reuse the old shape's rendering actor
+ RenderBaseActor* render = getRenderActor(actor, shape);
+ PxShape* newShape;
+ newActor->getShapes(&newShape,1);
+ unlink(render, shape, actor);
+ link(render, newShape, newActor);
+ setCCDActive(*newShape, newActor);
+
+ actor->detachShape(*shape);
+ }
+ mDetaching.clear();
+}
+
+void SampleNorthPole::cookCarrotConvexMesh()
+{
+ static const PxVec3 carrotVerts[] = {PxVec3(0,0,.3),PxVec3(.05,0,0),PxVec3(-.05,0,0),PxVec3(0,.05,0),PxVec3(0,-.05,0)};
+
+ mCarrotConvex = PxToolkit::createConvexMesh(getPhysics(), getCooking(), carrotVerts, 5, PxConvexFlag::eCOMPUTE_CONVEX);
+ if(!mCarrotConvex)
+ fatalError("creating the convex mesh failed");
+}
+
+PxRigidDynamic* SampleNorthPole::throwBall()
+{
+ PxSceneWriteLock scopedLock(*mScene);
+
+ static unsigned int numBall = 0;
+
+ PxVec3 vel = getCamera().getViewDir() * 20.0f;
+
+ PxRigidDynamic* ballActor = getPhysics().createRigidDynamic(PxTransform(getCamera().getPos()+getCamera().getViewDir()));
+ if(!ballActor)
+ fatalError("creating ball actor failed");
+
+ ballActor->setLinearVelocity(vel);
+
+ PxShape* ballShape = PxRigidActorExt::createExclusiveShape(*ballActor, PxSphereGeometry(0.1f),getDefaultMaterial());
+ if(!ballShape)
+ fatalError("creating ball shape failed");
+
+ setSnowball(*ballShape);
+
+ PxRigidBodyExt::updateMassAndInertia(*ballActor,1);
+
+#ifndef USE_RAYCAST_CCD_FOR_SNOWBALLS
+ setCCDActive(*ballShape, ballActor);
+#endif
+
+ getActiveScene().addActor(*ballActor);
+
+ RenderBaseActor* actor = mSnowBallsRenderActors[numBall];;
+ if(actor)
+ {
+ link(actor, ballShape, ballActor);
+ }
+ else
+ {
+ actor = createRenderObjectFromShape(ballActor, ballShape, mSnowMaterial);
+ mSnowBallsRenderActors[numBall] = actor;
+ }
+
+#ifdef USE_RAYCAST_CCD_FOR_SNOWBALLS
+ if(ballShape)
+ {
+ RenderBaseActor* renderActor = getRenderActor(ballActor, ballShape);
+ renderActor->setRaycastCCD(true);
+ }
+#endif
+
+ PxRigidDynamic* oldBall = mSnowBalls[numBall];
+
+ if(oldBall)
+ {
+ removeActor(oldBall);
+ oldBall->release();
+ }
+
+ mSnowBalls[numBall] = ballActor;
+ if(! (++numBall < NUM_BALLS))
+ numBall=0;
+
+ return ballActor;
+}
+
+void SampleNorthPole::createSnowMen()
+{
+ PxU32 numSnowmen = NUM_SNOWMEN; // can't have NUM_SNOWMEN in the loop since setting to 0 causes compiler warnings
+ for(PxU32 i=0; i<numSnowmen; i++)
+ {
+ PxVec3 pos(0,1,-8);
+ PxQuat rot(2*PxPi*i/numSnowmen,PxVec3(0,1,0));
+ createSnowMan(PxTransform(rot.rotate(pos),rot),i,i);
+ }
+
+}
+
+PxRigidDynamic* SampleNorthPole::createSnowMan(const PxTransform& pos, const PxU32 mode, const PxU32 index)
+{
+ PxRigidDynamic* snowmanActor = getPhysics().createRigidDynamic(PxTransform(pos));
+ if(!snowmanActor)
+ fatalError("create snowman actor failed");
+
+ PxMaterial& material = getDefaultMaterial();
+ PxShape* armL = NULL; PxShape* armR = NULL;
+
+ switch(mode%5)
+ {
+ case 0: // with a weight at the bottom
+ {
+ PxShape* shape = NULL;
+ shape = PxRigidActorExt::createExclusiveShape(*snowmanActor, PxSphereGeometry(.2),material);
+ if(!shape)
+ fatalError("creating snowman shape failed");
+ shape->setLocalPose(PxTransform(PxVec3(0,-.29,0)));
+
+ PxRigidBodyExt::updateMassAndInertia(*snowmanActor,10);
+
+ shape = PxRigidActorExt::createExclusiveShape(*snowmanActor, PxSphereGeometry(.5),material);
+ if(!shape)
+ fatalError("creating snowman shape failed");
+
+ shape = PxRigidActorExt::createExclusiveShape(*snowmanActor, PxSphereGeometry(.4),material);
+ if(!shape)
+ fatalError("creating snowman shape failed");
+ shape->setLocalPose(PxTransform(PxVec3(0,.6,0)));
+
+ shape = PxRigidActorExt::createExclusiveShape(*snowmanActor, PxSphereGeometry(.3),material);
+ if(!shape)
+ fatalError("creating snowman shape failed");
+ shape->setLocalPose(PxTransform(PxVec3(0,1.1,0)));
+
+ armL = PxRigidActorExt::createExclusiveShape(*snowmanActor, PxCapsuleGeometry(.1,.1),material);
+ if(!armL)
+ fatalError("creating snowman shape failed");
+ armL->setLocalPose(PxTransform(PxVec3(-.4,.7,0)));
+
+ armR = PxRigidActorExt::createExclusiveShape(*snowmanActor, PxCapsuleGeometry(.1,.1),material);
+ if(!armR)
+ fatalError("creating snowman shape failed");
+ armR->setLocalPose(PxTransform(PxVec3( .4,.7,0)));
+ }
+ break;
+ case 1: // only considering lowest shape mass
+ {
+ PxShape* shape = NULL;
+ shape = PxRigidActorExt::createExclusiveShape(*snowmanActor, PxSphereGeometry(.5),material);
+ if(!shape)
+ fatalError("creating snowman shape failed");
+
+ PxRigidBodyExt::updateMassAndInertia(*snowmanActor,1);
+
+ shape = PxRigidActorExt::createExclusiveShape(*snowmanActor, PxSphereGeometry(.4),material);
+ if(!shape)
+ fatalError("creating snowman shape failed");
+ shape->setLocalPose(PxTransform(PxVec3(0,.6,0)));
+
+ shape = PxRigidActorExt::createExclusiveShape(*snowmanActor, PxSphereGeometry(.3),material);
+ if(!shape)
+ fatalError("creating snowman shape failed");
+ shape->setLocalPose(PxTransform(PxVec3(0,1.1,0)));
+
+ armL = PxRigidActorExt::createExclusiveShape(*snowmanActor, PxCapsuleGeometry(.1,.1),material);
+ if(!armL)
+ fatalError("creating snowman shape failed");
+ armL->setLocalPose(PxTransform(PxVec3(-.4,.7,0)));
+
+ armR = PxRigidActorExt::createExclusiveShape(*snowmanActor, PxCapsuleGeometry(.1,.1),material);
+ if(!armR)
+ fatalError("creating snowman shape failed");
+ armR->setLocalPose(PxTransform(PxVec3( .4,.7,0)));
+
+ snowmanActor->setCMassLocalPose(PxTransform(PxVec3(0,-.5,0)));
+ }
+ break;
+ case 2: // considering whole mass
+ {
+ PxShape* shape = NULL;
+ shape = PxRigidActorExt::createExclusiveShape(*snowmanActor, PxSphereGeometry(.5),material);
+ if(!shape)
+ fatalError("creating snowman shape failed");
+
+ shape = PxRigidActorExt::createExclusiveShape(*snowmanActor, PxSphereGeometry(.4),material);
+ if(!shape)
+ fatalError("creating snowman shape failed");
+ shape->setLocalPose(PxTransform(PxVec3(0,.6,0)));
+
+ shape = PxRigidActorExt::createExclusiveShape(*snowmanActor, PxSphereGeometry(.3),material);
+ if(!shape)
+ fatalError("creating snowman shape failed");
+ shape->setLocalPose(PxTransform(PxVec3(0,1.1,0)));
+
+ armL = PxRigidActorExt::createExclusiveShape(*snowmanActor, PxCapsuleGeometry(.1,.1),material);
+ if(!armL)
+ fatalError("creating snowman shape failed");
+ armL->setLocalPose(PxTransform(PxVec3(-.4,.7,0)));
+
+ armR = PxRigidActorExt::createExclusiveShape(*snowmanActor, PxCapsuleGeometry(.1,.1),material);
+ if(!armR)
+ fatalError("creating snowman shape failed");
+ armR->setLocalPose(PxTransform(PxVec3( .4,.7,0)));
+
+ PxRigidBodyExt::updateMassAndInertia(*snowmanActor,1);
+ snowmanActor->setCMassLocalPose(PxTransform(PxVec3(0,-.5,0)));
+ }
+ break;
+ case 3: // considering whole mass with low COM
+ {
+ PxShape* shape = NULL;
+ shape = PxRigidActorExt::createExclusiveShape(*snowmanActor, PxSphereGeometry(.5),material);
+ if(!shape)
+ fatalError("creating snowman shape failed");
+
+ shape = PxRigidActorExt::createExclusiveShape(*snowmanActor, PxSphereGeometry(.4),material);
+ if(!shape)
+ fatalError("creating snowman shape failed");
+ shape->setLocalPose(PxTransform(PxVec3(0,.6,0)));
+
+ shape = PxRigidActorExt::createExclusiveShape(*snowmanActor, PxSphereGeometry(.3),material);
+ if(!shape)
+ fatalError("creating snowman shape failed");
+ shape->setLocalPose(PxTransform(PxVec3(0,1.1,0)));
+
+ armL = PxRigidActorExt::createExclusiveShape(*snowmanActor, PxCapsuleGeometry(.1,.1),material);
+ if(!armL)
+ fatalError("creating snowman shape failed");
+ armL->setLocalPose(PxTransform(PxVec3(-.4,.7,0)));
+
+ armR = PxRigidActorExt::createExclusiveShape(*snowmanActor, PxCapsuleGeometry(.1,.1),material);
+ if(!armR)
+ fatalError("creating snowman shape failed");
+ armR->setLocalPose(PxTransform(PxVec3( .4,.7,0)));
+
+ const PxVec3 localPos = PxVec3(0,-.5,0);
+ PxRigidBodyExt::updateMassAndInertia(*snowmanActor,1,&localPos);
+ }
+ break;
+ case 4: // setting up mass properties manually
+ {
+ PxShape* shape = NULL;
+ shape = PxRigidActorExt::createExclusiveShape(*snowmanActor, PxSphereGeometry(.5),material);
+ if(!shape)
+ fatalError("creating snowman shape failed");
+
+ shape = PxRigidActorExt::createExclusiveShape(*snowmanActor, PxSphereGeometry(.4),material);
+ if(!shape)
+ fatalError("creating snowman shape failed");
+ shape->setLocalPose(PxTransform(PxVec3(0,.6,0)));
+
+ shape = PxRigidActorExt::createExclusiveShape(*snowmanActor, PxSphereGeometry(.3),material);
+ if(!shape)
+ fatalError("creating snowman shape failed");
+ shape->setLocalPose(PxTransform(PxVec3(0,1.1,0)));
+
+ armL = PxRigidActorExt::createExclusiveShape(*snowmanActor, PxCapsuleGeometry(.1,.1),material);
+ if(!armL)
+ fatalError("creating snowman shape failed");
+ armL->setLocalPose(PxTransform(PxVec3(-.4,.7,0)));
+
+ armR = PxRigidActorExt::createExclusiveShape(*snowmanActor, PxCapsuleGeometry(.1,.1),material);
+ if(!armR)
+ fatalError("creating snowman shape failed");
+ armR->setLocalPose(PxTransform(PxVec3( .4,.7,0)));
+
+ snowmanActor->setMass(1);
+ snowmanActor->setCMassLocalPose(PxTransform(PxVec3(0,-.5,0)));
+ snowmanActor->setMassSpaceInertiaTensor(PxVec3(.05,100,100));
+ }
+ break;
+ default:
+ break;
+ }
+
+ setDetachable(*armL);
+ setDetachable(*armR);
+
+ createRenderObjectsFromActor(snowmanActor,mSnowMaterial);
+
+ PxShape* carrot = PxRigidActorExt::createExclusiveShape(*snowmanActor, PxConvexMeshGeometry(mCarrotConvex),material);
+ if(!carrot)
+ fatalError("create snowman shape failed");
+ carrot->setLocalPose(PxTransform(PxVec3(0,1.1,.3)));
+ setDetachable(*carrot);
+
+ createRenderObjectFromShape(snowmanActor, carrot, mCarrotMaterial);
+
+ PxShape* button = NULL;
+
+ button = PxRigidActorExt::createExclusiveShape(*snowmanActor, PxCapsuleGeometry(.02,.05),material);
+ if(!button)
+ fatalError("create snowman shape failed");
+ button->setLocalPose(PxTransform(PxVec3(.1,1.2,.3),PxQuat(PxHalfPi/3,PxVec3(0,0,1))));
+ button->setFlag(PxShapeFlag::eSIMULATION_SHAPE,false);
+ mSnowman[index].eyeL = button;
+ createRenderObjectFromShape(snowmanActor, button, mButtonMaterial);
+
+ button = PxRigidActorExt::createExclusiveShape(*snowmanActor, PxCapsuleGeometry(.02,.05),material);
+ if(!button)
+ fatalError("create snowman shape failed");
+ button->setLocalPose(PxTransform(PxVec3(-.1,1.2,.3),PxQuat(-PxHalfPi/3,PxVec3(0,0,1))));
+ button->setFlag(PxShapeFlag::eSIMULATION_SHAPE,false);
+ mSnowman[index].eyeR = button;
+ createRenderObjectFromShape(snowmanActor, button, mButtonMaterial);
+
+ button = PxRigidActorExt::createExclusiveShape(*snowmanActor, PxSphereGeometry(.05),material);
+ if(!button)
+ fatalError("create snowman shape failed");
+ button->setLocalPose(PxTransform(PxVec3(0,.8,.35)));
+ setDetachable(*button);
+ createRenderObjectFromShape(snowmanActor, button, mButtonMaterial);
+
+ button = PxRigidActorExt::createExclusiveShape(*snowmanActor, PxSphereGeometry(.05),material);
+ if(!button)
+ fatalError("create snowman shape failed");
+ button->setLocalPose(PxTransform(PxVec3(0,.6,.4)));
+ setDetachable(*button);
+ createRenderObjectFromShape(snowmanActor, button, mButtonMaterial);
+
+ button = PxRigidActorExt::createExclusiveShape(*snowmanActor, PxSphereGeometry(.05),material);
+ if(!button)
+ fatalError("create snowman shape failed");
+ button->setLocalPose(PxTransform(PxVec3(0,.4,.35)));
+ setDetachable(*button);
+ createRenderObjectFromShape(snowmanActor, button, mButtonMaterial);
+
+ getActiveScene().addActor(*snowmanActor);
+
+ snowmanActor->userData = (void*)size_t(index);
+
+ mPhysicsActors.push_back(snowmanActor);
+
+ return snowmanActor;
+}