summaryrefslogtreecommitdiff
path: root/Runtime/Dynamics/NxMeshCreation.cpp
diff options
context:
space:
mode:
authorchai <chaifix@163.com>2019-08-14 22:50:43 +0800
committerchai <chaifix@163.com>2019-08-14 22:50:43 +0800
commit15740faf9fe9fe4be08965098bbf2947e096aeeb (patch)
treea730ec236656cc8cab5b13f088adfaed6bb218fb /Runtime/Dynamics/NxMeshCreation.cpp
+Unity Runtime codeHEADmaster
Diffstat (limited to 'Runtime/Dynamics/NxMeshCreation.cpp')
-rw-r--r--Runtime/Dynamics/NxMeshCreation.cpp115
1 files changed, 115 insertions, 0 deletions
diff --git a/Runtime/Dynamics/NxMeshCreation.cpp b/Runtime/Dynamics/NxMeshCreation.cpp
new file mode 100644
index 0000000..7ecff3e
--- /dev/null
+++ b/Runtime/Dynamics/NxMeshCreation.cpp
@@ -0,0 +1,115 @@
+#include "UnityPrefix.h"
+
+#if ENABLE_PHYSICS
+#include "Runtime/Math/Matrix4x4.h"
+#include "Runtime/Filters/Mesh/LodMesh.h"
+#include "Runtime/Dynamics/ExtractDataFromMesh.h"
+#include "External/PhysX/builds/SDKs/Physics/include/NxPhysics.h"
+#include "Runtime/Dynamics/PhysicsManager.h"
+#include "Runtime/Dynamics/nxmemorystream.h"
+#include "External/PhysX/builds/SDKs/Cooking/include/NxCooking.h"
+#include "Runtime/Interfaces/IPhysics.h"
+#include "Runtime/Profiler/Profiler.h"
+
+PROFILER_INFORMATION(gBakeCollisionMesh, "Mesh.Bake PhysX CollisionData", kProfilerPhysics)
+PROFILER_INFORMATION(gBakeCollisionScaledMesh, "Mesh.Bake Scaled Mesh PhysX CollisionData", kProfilerPhysics)
+
+bool CreateNxStreamFromUnityMesh (Mesh* mesh, bool convex, const Matrix4x4f& scalematrix, TransformType transformType, MemoryStream& stream )
+{
+ dynamic_array<Vector3f> vertices;
+ dynamic_array<Vector3f> normals;
+ dynamic_array<UInt16> triangles;
+ dynamic_array<UInt16> remap;
+ if (!ExtractDataFromMesh(*mesh, vertices, triangles, remap))
+ return false;
+
+ int vertexCount = vertices.size();
+ int inStride = sizeof(Vector3f);
+ if (!IsNoScaleTransform(transformType))
+ TransformPoints3x3 (scalematrix, &vertices[0], sizeof(Vector3f), &vertices[0], sizeof(Vector3f), vertexCount);
+
+ // PhysX crashes when using only 1 triangle
+ // So just duplicate the triangle...
+ if (triangles.size() == 3)
+ {
+ triangles.push_back(triangles[0]);
+ triangles.push_back(triangles[1]);
+ triangles.push_back(triangles[2]);
+ }
+
+ if (convex)
+ {
+ NxConvexMeshDesc desc;
+ desc.flags = NX_CF_COMPUTE_CONVEX;
+
+ desc.numVertices = vertexCount;
+ desc.points = &vertices[0];
+ desc.pointStrideBytes = inStride;
+
+ return NxCookConvexMesh (desc, stream);
+ }
+ else
+ {
+ NxTriangleMeshDesc desc;
+
+ desc.numVertices = vertexCount;
+ desc.points = &vertices[0];
+ desc.pointStrideBytes = inStride;
+
+ desc.numTriangles = triangles.size () / 3;
+ desc.triangles = &triangles[0];
+ desc.triangleStrideBytes = sizeof (triangles[0]) * 3;
+ desc.flags = NX_MF_16_BIT_INDICES;
+
+ if (transformType & kOddNegativeScaleTransform)
+ desc.flags |= NX_MF_FLIPNORMALS;
+
+ return NxCookTriangleMesh (desc, stream);
+ }
+}
+
+MemoryStream* CreateNxStreamFromUnityMesh(Mesh& meshData, bool convex)
+{
+ PROFILER_AUTO_THREAD_SAFE(gBakeCollisionMesh, &meshData)
+ Matrix4x4f identity; identity.SetIdentity();
+ MemoryStream* stream = new MemoryStream (NULL, 0);
+ CreateNxStreamFromUnityMesh(&meshData, convex, identity, kNoScaleTransform, *stream);
+ return stream;
+}
+
+void* CreateNxMeshFromUnityMesh (Mesh* mesh, bool convex, const Matrix4x4f& scalematrix, TransformType transformType )
+{
+#if ENABLE_PROFILER
+ if (IsNoScaleTransform(transformType))
+ {
+ PROFILER_BEGIN(gBakeCollisionMesh, mesh)
+ }
+ else
+ {
+ PROFILER_BEGIN(gBakeCollisionScaledMesh, mesh)
+ }
+#endif
+
+ MemoryStream stream (NULL, 0);
+
+ if (!CreateNxStreamFromUnityMesh(mesh, convex, scalematrix, transformType, stream))
+ {
+ PROFILER_END
+ return NULL;
+ }
+
+ if (convex)
+ {
+ NxConvexMesh* nxmesh = GetDynamicsSDK().createConvexMesh (stream);
+ PROFILER_END
+ return nxmesh;
+ }
+ else
+ {
+ NxTriangleMesh* nxmesh = GetDynamicsSDK().createTriangleMesh (stream);
+ PROFILER_END
+ return nxmesh;
+ }
+}
+
+#endif \ No newline at end of file