public Actor ProcessModel(string fileName, Model model, Vector3 position, float orientation) { previewed = true; var actorDesc = new ActorDescription(); if (fileName != null) { encoder = new PxMeshEncoder(fileName); } foreach (ModelMesh mesh in model.Meshes) { actorDesc.Shapes.Add(RetrievePhysicsTriangleMeshFromMesh(mesh, model.Root.Transform * mesh.ParentBone.Transform, true, ref encoder)); } actorDesc.GlobalPose = Matrix.CreateRotationY(orientation) * Matrix.CreateTranslation(position); //actorDesc.GlobalPose = modelSceneNode.Model.Root.Transform; return(PhysX.Instance.Scene.CreateActor(actorDesc)); //PhysicsHelper.SetActorCollisionGroup(modelSceneNode.Actor, CollisionGroup.GROUP_COLLIDABLE_NON_PUSHABLE); }
public static TriangleMeshShapeDescription RetrievePhysicsTriangleMeshFromMesh(ModelMesh mesh, Matrix transforms, bool flipNormals, ref PxMeshEncoder encoder) { Vector3[] vertices; VertexPositionNormalTexture[] meshVerts; var triangleMeshDesc = new TriangleMeshDescription(); triangleMeshDesc.TriangleCount = mesh.MeshParts[0].PrimitiveCount; triangleMeshDesc.AllocateTriangles <int>(mesh.MeshParts[0].PrimitiveCount); meshVerts = new VertexPositionNormalTexture[mesh.MeshParts[0].NumVertices]; if (mesh.IndexBuffer.IndexElementSize == IndexElementSize.SixteenBits) { var indices = new short[mesh.IndexBuffer.SizeInBytes / 2]; mesh.IndexBuffer.GetData(indices); foreach (int ui in indices) { triangleMeshDesc.TriangleStream.Write(ui); } } else { var indices = new int[mesh.IndexBuffer.SizeInBytes / 4]; mesh.IndexBuffer.GetData(indices); foreach (int ui in indices) { triangleMeshDesc.TriangleStream.Write(ui); } } mesh.VertexBuffer.GetData(meshVerts); vertices = new Vector3[mesh.MeshParts[0].NumVertices]; for (int i = 0; i < meshVerts.Length; i++) { vertices[i] = meshVerts[i].Position; } triangleMeshDesc.VertexCount = vertices.Length; triangleMeshDesc.AllocateVertices <Vector3>(vertices.Length); foreach (Vector3 vec in vertices) { triangleMeshDesc.VerticesStream.Write(vec); } if (flipNormals) { triangleMeshDesc.Flags = MeshFlag.FlipNormals; } var stream = new MemoryStream(); Cooking.InitializeCooking(new ConsoleOutputStream()); Cooking.CookTriangleMesh(triangleMeshDesc, stream); Cooking.CloseCooking(); stream.Position = 0; if (encoder != null) { encoder.AddStream(stream); } TriangleMesh pMesh = PhysX.Instance.Core.CreateTriangleMesh(stream); // Create TriangleMesh above code segment. pMesh.SaveToDescription(); var tmsd = new TriangleMeshShapeDescription(); tmsd.TriangleMesh = pMesh; tmsd.LocalPose = transforms; tmsd.MeshPagingMode = MeshPagingMode.Auto; return(tmsd); }