private void GenerateActorsFromMeshStream(Stream ms, out PhysX.TriangleMesh triangleMesh, out PhysX.RigidActor hfActor, out PhysX.Shape shape)
        {
            triangleMesh = _scene.Physics.CreateTriangleMesh(ms);
            PhysX.TriangleMeshGeometry triangleMeshShapeDesc = new PhysX.TriangleMeshGeometry(triangleMesh);

            GenerateActorsFromTrimesh(triangleMeshShapeDesc, out hfActor, out shape);
        }
        private void SwapGroundActor(Tuple <PhysX.RigidActor, PhysX.Shape, PhysX.TriangleMesh> groundActor)
        {
            if (_groundActor != null)
            {
                _scene.RemoveActor(_groundActor);
                _groundActor.Dispose();

                if (!_groundShape.Disposed)
                {
                    _groundShape.Dispose();
                }

                _mesh.Dispose();
            }

            _groundActor = groundActor.Item1;
            _groundShape = groundActor.Item2;
            _mesh        = groundActor.Item3;

            _groundActor.UserData = this;

            CollisionGroup.SetCollisionGroup(CollisionGroupFlag.Ground, _groundShape);

            _scene.AddActor(_groundActor);
        }
Exemple #3
0
        public PhysX.RigidStatic CreateTriangle(PhysX.Scene scene)
        {
            List <PhysX.Math.Vector3> Vertices = new List <PhysX.Math.Vector3>();
            List <int> Indices = new List <int>();


            PhysX.TriangleMeshDesc TriangleMeshDesc = new PhysX.TriangleMeshDesc()
            {
                Triangles = new int[12] {
                    0, 1, 2, 0, 3, 1, 3, 4, 1, 3, 5, 4
                },
                Points = new PhysX.Math.Vector3[6] {
                    new PhysX.Math.Vector3 {
                        X = 0, Y = 0, Z = 0
                    },
                    new PhysX.Math.Vector3 {
                        X = 1, Y = 1, Z = 0
                    },
                    new PhysX.Math.Vector3 {
                        X = 0, Y = 1, Z = 0
                    },

                    new PhysX.Math.Vector3 {
                        X = 1, Y = 0, Z = 0
                    },
                    new PhysX.Math.Vector3 {
                        X = 2, Y = 1, Z = 0
                    },
                    new PhysX.Math.Vector3 {
                        X = 2, Y = 0, Z = 0
                    },
                }
            };


            MemoryStream ms = new MemoryStream();

            PhysX.Cooking cook = scene.Physics.CreateCooking();
            cook.CookTriangleMesh(TriangleMeshDesc, ms);
            cook.Dispose();

            ms.Position = 0;

            PhysX.TriangleMesh         triangleMesh          = scene.Physics.CreateTriangleMesh(ms);
            PhysX.TriangleMeshGeometry triangleMeshShapeDesc = new PhysX.TriangleMeshGeometry(triangleMesh);

            //PhysX.Math.Matrix.RotationYawPitchRoll(0f, (float)Math.PI / 2, 0f) * PhysX.Math.Matrix.Translation(0f, 0f, 0f)
            var hfActor = scene.Physics.CreateRigidStatic();

            hfActor.CreateShape(triangleMeshShapeDesc, scene.Physics.CreateMaterial(0.75f, 0.75f, 0.1f));

            return(hfActor);
        }
        public void Dispose()
        {
            if (_groundActor != null)
            {
                _groundActor.Dispose();
                _groundActor = null;
            }

            if (_mesh != null)
            {
                _mesh.Dispose();
                _mesh = null;
            }
        }
Exemple #5
0
        public Tuple <PhysX.TriangleMesh, MemoryStream> GenerateTrimeshFromIndexedTriangles(PhysX.Math.Vector3[] points, int[] triangles)
        {
            PhysX.TriangleMeshDesc triangleMeshDesc = new PhysX.TriangleMeshDesc()
            {
                Triangles = triangles,
                Points    = points,
            };

            MemoryStream ms = new MemoryStream();

            if (!_cooking.CookTriangleMesh(triangleMeshDesc, ms))
            {
                throw new PhysxSdkException("TerrainMesher: GenerateTrimeshFromIndexedTriangles(): CookTriangleMesh() failed");
            }


            ms.Position = 0;
            PhysX.TriangleMesh triangleMesh = _scene.Physics.CreateTriangleMesh(ms);

            return(new Tuple <PhysX.TriangleMesh, MemoryStream>(triangleMesh, ms));
        }
Exemple #6
0
        public void Dispose()
        {
            if (_groundActor != null)
            {
                _groundActor.Dispose();
                _groundActor = null;
            }

            if (_mesh != null)
            {
                _mesh.Dispose();
                _mesh = null;
            }
        }
Exemple #7
0
        private void SwapGroundActor(Tuple<PhysX.RigidActor, PhysX.Shape, PhysX.TriangleMesh> groundActor)
        {
            if (_groundActor != null)
            {
                _scene.RemoveActor(_groundActor);
                _groundActor.Dispose();

                if (!_groundShape.Disposed)
                {
                    _groundShape.Dispose();
                }

                _mesh.Dispose();
            }

            _groundActor = groundActor.Item1;
            _groundShape = groundActor.Item2;
            _mesh = groundActor.Item3;

            _groundActor.UserData = this;

            CollisionGroup.SetCollisionGroup(CollisionGroupFlag.Ground, _groundShape);

            _scene.AddActor(_groundActor);
        }
        private PhysX.TriangleMeshGeometry GeneratePhysXTrimeshShape(string primName, PrimitiveBaseShape shape, OpenMetaverse.Vector3 size, float LOD, bool isDynamic)
        {
            MeshingResult result = _mesher.CreateMesh(primName, shape, size, LOD, ShapeType.TriMesh, true);

            if (result == null)
            {
                return(null);
            }

            IMesh mesh = result.TriMesh;

            if (mesh == null)
            {
                return(null);
            }


            int[] indexes = mesh.getIndexListAsInt();
            PhysX.Math.Vector3[] verts = PhysUtil.OmvVectorArrayToPhysx(mesh.getVertexListAsArray());

            mesh.ReleaseSourceMeshData();

            PhysX.TriangleMeshDesc desc = new PhysX.TriangleMeshDesc
            {
                Points    = verts,
                Triangles = indexes,
            };

            if (!desc.IsValid())
            {
                m_log.Warn("[InWorldz.PhysxPhysics] Unable to create trimesh for shape. Invalid description.");
                return(null);
            }

            using (MemoryStream ms = new MemoryStream())
            {
                try
                {
                    if (!_cooking.CookTriangleMesh(desc, ms))
                    {
                        m_log.Warn("[InWorldz.PhysxPhysics] Unable to create trimesh for shape.");
                        return(null);
                    }
                }
                catch (Exception e)
                {
                    m_log.Warn("[InWorldz.PhysxPhysics] Unable to create trimesh for shape: {0}", e);
                    return(null);
                }

                ms.Position = 0;

                try
                {
                    PhysX.TriangleMesh triMesh = _scene.Physics.CreateTriangleMesh(ms);

                    //m_log.DebugFormat("Trimesh Created: {0} {1}", triMesh.GetHashCode(), primName);

                    PhysX.TriangleMeshGeometry triGeom = new PhysX.TriangleMeshGeometry(triMesh);

                    return(triGeom);
                }
                catch (Exception e)
                {
                    m_log.WarnFormat("[InWorldz.PhysxPhysics] Unable to create trimesh for shape: {0}", e);
                    return(null);
                }
            }
        }