Example #1
0
        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);
        }
Example #2
0
        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);
        }