diff options
| author | git perforce import user <a@b> | 2016-10-25 12:29:14 -0600 |
|---|---|---|
| committer | Sheikh Dawood Abdul Ajees <Sheikh Dawood Abdul Ajees> | 2016-10-25 18:56:37 -0500 |
| commit | 3dfe2108cfab31ba3ee5527e217d0d8e99a51162 (patch) | |
| tree | fa6485c169e50d7415a651bf838f5bcd0fd3bfbd /APEX_1.4/shared/external/include/SampleShapeActor.h | |
| download | physx-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 'APEX_1.4/shared/external/include/SampleShapeActor.h')
| -rw-r--r-- | APEX_1.4/shared/external/include/SampleShapeActor.h | 204 |
1 files changed, 204 insertions, 0 deletions
diff --git a/APEX_1.4/shared/external/include/SampleShapeActor.h b/APEX_1.4/shared/external/include/SampleShapeActor.h new file mode 100644 index 00000000..87988445 --- /dev/null +++ b/APEX_1.4/shared/external/include/SampleShapeActor.h @@ -0,0 +1,204 @@ +/* + * Copyright (c) 2008-2015, NVIDIA CORPORATION. All rights reserved. + * + * NVIDIA CORPORATION and its licensors retain all intellectual property + * and proprietary rights in and to this software, 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. + */ + +#ifndef __SAMPLE_SHAPE_ACTOR_H__ +#define __SAMPLE_SHAPE_ACTOR_H__ + +#include "SampleActor.h" +#include "ApexDefs.h" +#include "PxActor.h" +#include "PxRigidDynamic.h" +#include "PxScene.h" + +#if PX_PHYSICS_VERSION_MAJOR == 3 +#include "ScopedPhysXLock.h" +#endif +#include "RenderDebugInterface.h" +#include <Renderer.h> +#include <RendererMeshContext.h> + + +#if PX_PHYSICS_VERSION_MAJOR == 0 +namespace physx +{ +namespace apex +{ +/** +\brief A scoped object for acquiring/releasing read/write lock of a PhysX scene +*/ +class ScopedPhysXLockRead +{ +public: + /** + \brief Ctor + */ + ScopedPhysXLockRead(PxScene *scene,const char *fileName,int lineno) : mScene(scene) + { + if ( mScene ) + { + mScene->lockRead(fileName, (physx::PxU32)lineno); + } + } + ~ScopedPhysXLockRead() + { + if ( mScene ) + { + mScene->unlockRead(); + } + } +private: + PxScene* mScene; +}; + +/** +\brief A scoped object for acquiring/releasing read/write lock of a PhysX scene +*/ +class ScopedPhysXLockWrite +{ +public: + /** + \brief Ctor + */ + ScopedPhysXLockWrite(PxScene *scene,const char *fileName,int lineno) : mScene(scene) + { + if ( mScene ) + { + mScene->lockWrite(fileName, (physx::PxU32)lineno); + } + } + ~ScopedPhysXLockWrite() + { + if ( mScene ) + { + mScene->unlockWrite(); + } + } +private: + PxScene* mScene; +}; + +}; // end apx namespace +}; // end physx namespace + + +#if defined(_DEBUG) || defined(PX_CHECKED) +#define SCOPED_PHYSX_LOCK_WRITE(x) physx::apex::ScopedPhysXLockWrite _wlock(x,__FILE__,__LINE__); +#else +#define SCOPED_PHYSX_LOCK_WRITE(x) physx::apex::ScopedPhysXLockWrite _wlock(x,"",__LINE__); +#endif + +#if defined(_DEBUG) || defined(PX_CHECKED) +#define SCOPED_PHYSX_LOCK_READ(x) physx::apex::ScopedPhysXLockRead _rlock(x,__FILE__,__LINE__); +#else +#define SCOPED_PHYSX_LOCK_READ(x) physx::apex::ScopedPhysXLockRead _rlock(x,"",__LINE__); +#endif + +#endif // PX_PHYSICS_VERSION_MAJOR + + + +class SampleShapeActor : public SampleFramework::SampleActor +{ +public: + SampleShapeActor(nvidia::apex::RenderDebugInterface* rdebug) + : mBlockId(-1) + , mApexRenderDebug(rdebug) + , mRenderer(NULL) + , mPhysxActor(NULL) + { + } + + virtual ~SampleShapeActor(void) + { + if (mApexRenderDebug != NULL) + { + RENDER_DEBUG_IFACE(mApexRenderDebug)->reset(mBlockId); + } + + if (mPhysxActor) + { + SCOPED_PHYSX_LOCK_WRITE(mPhysxActor->getScene()); + mPhysxActor->release(); + } + } + + physx::PxTransform getPose() const + { + return physx::PxTransform(mTransform); + } + + void setPose(const physx::PxTransform& pose) + { + mTransform = physx::PxMat44(pose); + if (mPhysxActor) + { + SCOPED_PHYSX_LOCK_WRITE(mPhysxActor->getScene()); + if (physx::PxRigidDynamic* rd = mPhysxActor->is<physx::PxRigidDynamic>()) + { + rd->setGlobalPose(this->convertToPhysicalCoordinates(mTransform)); + } + } + if (mApexRenderDebug != NULL) + { + RENDER_DEBUG_IFACE(mApexRenderDebug)->setDrawGroupPose(mBlockId, mTransform); + } + } + + virtual void tick(float dtime, bool rewriteBuffers = false) + { + if (mPhysxActor) + { + physx::PxRigidDynamic* rd = mPhysxActor->is<physx::PxRigidDynamic>(); + SCOPED_PHYSX_LOCK_READ(mPhysxActor->getScene()); + if (rd && !rd->isSleeping()) + { + mTransform = this->convertToGraphicalCoordinates(rd->getGlobalPose()); + if (mApexRenderDebug != NULL) + { + RENDER_DEBUG_IFACE(mApexRenderDebug)->setDrawGroupPose(mBlockId, mTransform); + } + } + } + } + + physx::PxActor* getPhysXActor() + { + return mPhysxActor; + } + + virtual void render(bool /*rewriteBuffers*/ = false) + { + if (mRenderer) + { + mRenderer->queueMeshForRender(mRendererMeshContext); + } + } + +protected: + int32_t mBlockId; + nvidia::apex::RenderDebugInterface* mApexRenderDebug; + SampleRenderer::Renderer* mRenderer; + SampleRenderer::RendererMeshContext mRendererMeshContext; + physx::PxMat44 mTransform; + physx::PxActor* mPhysxActor; + +private: + virtual physx::PxMat44 convertToGraphicalCoordinates(const physx::PxTransform & physicsPose) const + { + return physx::PxMat44(physicsPose); + } + + virtual physx::PxTransform convertToPhysicalCoordinates(const physx::PxMat44 & graphicsPose) const + { + return physx::PxTransform(graphicsPose); + } +}; + +#endif |