aboutsummaryrefslogtreecommitdiff
path: root/APEX_1.4/shared/external/include/SampleConvexMeshActor.h
diff options
context:
space:
mode:
Diffstat (limited to 'APEX_1.4/shared/external/include/SampleConvexMeshActor.h')
-rw-r--r--APEX_1.4/shared/external/include/SampleConvexMeshActor.h232
1 files changed, 232 insertions, 0 deletions
diff --git a/APEX_1.4/shared/external/include/SampleConvexMeshActor.h b/APEX_1.4/shared/external/include/SampleConvexMeshActor.h
new file mode 100644
index 00000000..9e520c05
--- /dev/null
+++ b/APEX_1.4/shared/external/include/SampleConvexMeshActor.h
@@ -0,0 +1,232 @@
+/*
+ * 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_CONVEX_MESH_ACTOR_H__
+#define __SAMPLE_CONVEX_MESH_ACTOR_H__
+
+#include "SampleShapeActor.h"
+#include "RendererMeshShape.h"
+#include "PsMemoryBuffer.h"
+#include "PsArray.h"
+#include "PxStreamFromFileBuf.h"
+#include "ApexSDK.h"
+
+#include "cooking/PxCooking.h"
+#include "cooking/PxConvexMeshDesc.h"
+#include "geometry/PxConvexMeshGeometry.h"
+
+#include "PxRigidDynamic.h"
+#include "PxRigidStatic.h"
+#include "extensions/PxExtensionsAPI.h"
+
+
+
+namespace physx
+{
+class PxMaterial;
+}
+
+#include "RenderDebugInterface.h"
+#include <Renderer.h>
+#include <RendererMeshContext.h>
+
+typedef physx::PxConvexMesh ConvexMesh;
+
+class SampleConvexMeshActor : public SampleShapeActor
+{
+public:
+ SampleConvexMeshActor(SampleRenderer::Renderer* renderer,
+ SampleFramework::SampleMaterialAsset& material,
+ physx::PxScene& physxScene,
+ physx::PxCooking& cooking,
+ const physx::PxVec3* verts,
+ const uint32_t nbVerts,
+ const physx::PxVec3& pos,
+ const physx::PxVec3& vel,
+ float density,
+ physx::PxMaterial* PxMaterial,
+ bool useGroupsMask,
+ nvidia::apex::RenderDebugInterface* rdebug = NULL)
+ : SampleShapeActor(rdebug)
+ , mVerts(NULL)
+ , mNormals(NULL)
+ , mUvs(NULL)
+ , mFaces(NULL)
+ , mNbVerts(0)
+ , mNbFaces(0)
+ , mConvexMesh(NULL)
+ , mRendererMeshShape(NULL)
+ {
+ mRenderer = renderer;
+
+ createActor(physxScene, cooking, verts, nbVerts, pos, vel, density, PxMaterial, useGroupsMask);
+
+ const uint32_t nbPolygons = mConvexMesh->getNbPolygons();
+ const uint8_t* indexBuffer = mConvexMesh->getIndexBuffer();
+ const physx::PxVec3* vertices = mConvexMesh->getVertices();
+
+ for (uint32_t i = 0; i < nbPolygons; i++)
+ {
+ physx::PxHullPolygon data;
+ bool status = mConvexMesh->getPolygonData(i, data);
+ PX_ASSERT(status);
+ PX_UNUSED(status);
+
+ uint32_t nbPolyVerts = data.mNbVerts;
+ mNbVerts += nbPolyVerts;
+ mNbFaces += (nbPolyVerts - 2)*3;
+ }
+
+ mVerts = new physx::PxVec3[mNbVerts];
+ mNormals = new physx::PxVec3[mNbVerts];
+ mFaces = new uint16_t[mNbFaces];
+
+ uint32_t vertCounter = 0;
+ uint32_t facesCounter = 0;
+ for (uint32_t i = 0; i < nbPolygons; i++)
+ {
+ physx::PxHullPolygon data;
+ bool status = mConvexMesh->getPolygonData(i, data);
+ PX_ASSERT(status);
+ PX_UNUSED(status);
+
+ physx::PxVec3 normal(data.mPlane[0], data.mPlane[1], data.mPlane[2]);
+
+ uint32_t vI0 = vertCounter;
+ for (uint32_t vI = 0; vI < data.mNbVerts; vI++)
+ {
+ mVerts[vertCounter] = vertices[indexBuffer[data.mIndexBase + vI]];
+ mNormals[vertCounter] = normal;
+ vertCounter++;
+ }
+
+ for (uint32_t vI = 1; vI < uint32_t(data.mNbVerts) - 1; vI++)
+ {
+ mFaces[facesCounter++] = uint16_t(vI0);
+ mFaces[facesCounter++] = uint16_t(vI0 + vI + 1);
+ mFaces[facesCounter++] = uint16_t(vI0 + vI);
+ }
+ }
+
+ mRendererMeshShape = new SampleRenderer::RendererMeshShape(*mRenderer, mVerts, mNbVerts, mNormals, mUvs, mFaces, mNbFaces / 3);
+
+ mRendererMeshContext.material = material.getMaterial();
+ mRendererMeshContext.materialInstance = material.getMaterialInstance();
+ mRendererMeshContext.mesh = mRendererMeshShape->getMesh();
+ mRendererMeshContext.transform = &mTransform;
+
+ if (rdebug)
+ {
+ mBlockId = RENDER_DEBUG_IFACE(rdebug)->beginDrawGroup(mTransform);
+ RENDER_DEBUG_IFACE(rdebug)->addToCurrentState(RENDER_DEBUG::DebugRenderState::SolidShaded);
+ static uint32_t bcount /* = 0 */;
+ RENDER_DEBUG_IFACE(rdebug)->setCurrentColor(0xFFFFFF);
+ RENDER_DEBUG_IFACE(rdebug)->setCurrentTextScale(0.5f);
+ RENDER_DEBUG_IFACE(rdebug)->addToCurrentState(RENDER_DEBUG::DebugRenderState::CenterText);
+ RENDER_DEBUG_IFACE(rdebug)->addToCurrentState(RENDER_DEBUG::DebugRenderState::CameraFacing);
+ RENDER_DEBUG_IFACE(rdebug)->debugText(physx::PxVec3(0, 1.0f + 0.01f, 0), "Sample Convex Mesh:%d", bcount++);
+ RENDER_DEBUG_IFACE(rdebug)->endDrawGroup();
+ }
+ }
+
+ virtual ~SampleConvexMeshActor()
+ {
+ if (mRendererMeshShape)
+ {
+ delete[] mVerts;
+ delete[] mNormals;
+
+ delete mRendererMeshShape;
+ mRendererMeshShape = NULL;
+ }
+ }
+
+private:
+
+ void createActor(physx::PxScene& physxScene,
+ physx::PxCooking& cooking,
+ const physx::PxVec3* verts,
+ const uint32_t nbVerts,
+ const physx::PxVec3& pos,
+ const physx::PxVec3& vel,
+ float density,
+ physx::PxMaterial* PxMaterial,
+ bool useGroupsMask)
+ {
+ if (!PxMaterial)
+ {
+ physxScene.getPhysics().getMaterials(&PxMaterial, 1);
+ }
+
+ mTransform = physx::PxMat44(physx::PxIdentity);
+ mTransform.setPosition(pos);
+
+ physx::PxRigidActor* actor = NULL;
+ if (density > 0)
+ {
+ actor = physxScene.getPhysics().createRigidDynamic(physx::PxTransform(mTransform));
+ (static_cast<physx::PxRigidDynamic*>(actor))->setAngularDamping(0.5f); // Is it correct?
+ (static_cast<physx::PxRigidDynamic*>(actor))->setLinearVelocity(vel);
+ }
+ else
+ {
+ actor = physxScene.getPhysics().createRigidStatic(physx::PxTransform(mTransform));
+ }
+ PX_ASSERT(actor);
+
+ physx::PxConvexMeshDesc convexMeshDesc;
+ convexMeshDesc.points.count = nbVerts;
+ convexMeshDesc.points.data = verts;
+ convexMeshDesc.points.stride = sizeof(physx::PxVec3);
+ convexMeshDesc.flags = physx::PxConvexFlag::eCOMPUTE_CONVEX;
+
+ physx::PsMemoryBuffer stream;
+ stream.setEndianMode(physx::PxFileBuf::ENDIAN_NONE);
+ nvidia::apex::PxStreamFromFileBuf nvs(stream);
+
+ if (cooking.cookConvexMesh(convexMeshDesc, nvs))
+ {
+ mConvexMesh = physxScene.getPhysics().createConvexMesh(nvs);
+ PX_ASSERT(mConvexMesh);
+ }
+
+ physx::PxConvexMeshGeometry convexMeshGeom(mConvexMesh);
+ physx::PxShape* shape = actor->createShape(convexMeshGeom, *PxMaterial);
+ PX_ASSERT(shape);
+ if (shape && useGroupsMask)
+ {
+ shape->setSimulationFilterData(physx::PxFilterData(1, 0, ~0u, 0));
+ shape->setQueryFilterData(physx::PxFilterData(1, 0, ~0u, 0));
+ }
+
+ if (density > 0)
+ {
+ physx::PxRigidBodyExt::updateMassAndInertia(*(static_cast<physx::PxRigidDynamic*>(actor)), density); // () -> static_cast
+ }
+ SCOPED_PHYSX_LOCK_WRITE(&physxScene);
+ physxScene.addActor(*actor);
+ mPhysxActor = actor;
+ }
+
+private:
+ physx::PxVec3* mVerts;
+ physx::PxVec3* mNormals;
+ float* mUvs;
+ uint16_t* mFaces;
+
+ uint32_t mNbVerts;
+ uint32_t mNbFaces;
+
+ ConvexMesh* mConvexMesh;
+
+ SampleRenderer::RendererMeshShape* mRendererMeshShape;
+};
+
+#endif