コード例 #1
0
        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);
        }
コード例 #2
0
ファイル: Form1.cs プロジェクト: NoahStarfinder/My-Halcyon
        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);
        }
コード例 #3
0
        private void GenerateActorsFromTrimesh(PhysX.TriangleMeshGeometry triangleMeshShapeDesc, out PhysX.RigidActor hfActor, out PhysX.Shape shape)
        {
            //PhysX.Math.Matrix.RotationYawPitchRoll(0f, (float)Math.PI / 2, 0f) * PhysX.Math.Matrix.Translation(0f, 0f, 0f)

            //PhysX.RigidDynamic dynActor = _scene.Physics.CreateRigidDynamic();
            //dynActor.Flags |= PhysX.RigidDynamicFlags.Kinematic;
            //hfActor = dynActor;

            hfActor = _scene.Physics.CreateRigidStatic();

            shape = hfActor.CreateShape(triangleMeshShapeDesc, Material.GROUND.PhyMaterial);
        }
コード例 #4
0
        private void AssignGeom(PhysX.Geometry primitive, ShapeType shapeType)
        {
            switch (shapeType)
            {
            case ShapeType.PrimitiveBox:
            case ShapeType.PrimitiveSphere:
                _primitiveGeom = primitive;
                break;

            case ShapeType.TriMesh:
                _triMesh = (PhysX.TriangleMeshGeometry)primitive;
                break;
            }

            Complexity = 1;
        }
コード例 #5
0
        private Tuple <PhysX.RigidActor, PhysX.Shape, PhysX.TriangleMesh> GenerateGroundActorFromTrimeshAndMemoryStream(Tuple <PhysX.TriangleMesh, MemoryStream> trimeshData,
                                                                                                                        int revision)
        {
            using (trimeshData.Item2) //free up the stream that gets passed in after its cached
            {
                PhysX.TriangleMeshGeometry triangleMeshShapeDesc = new PhysX.TriangleMeshGeometry(trimeshData.Item1);

                PhysX.RigidActor hfActor;
                PhysX.Shape      shape;

                GenerateActorsFromTrimesh(triangleMeshShapeDesc, out hfActor, out shape);
                CacheTerrainMesh(trimeshData.Item2, revision);

                return(new Tuple <PhysX.RigidActor, PhysX.Shape, PhysX.TriangleMesh>(hfActor, shape, trimeshData.Item1));
            }
        }
コード例 #6
0
            private void GenerateTrimeshAndComplete(MeshingStage meshingStage, ulong meshHash)
            {
                PhysicsShape phyShape;

                PhysX.TriangleMeshGeometry triMesh = meshingStage.GeneratePhysXTrimeshShape(PrimName, Shape, Size, MeshingStage.SCULPT_MESH_LOD, IsDynamic);

                if (triMesh == null)
                {
                    //meshing  or one of its prereq steps failed, generate a bounding box
                    PhysX.Geometry geom = meshingStage.GeneratePhysXBoxShape(Shape);
                    //basic shapes are not cached
                    phyShape = new PhysicsShape(geom, ShapeType.PrimitiveBox, meshHash);
                }
                else
                {
                    phyShape = CreatePhysicsShapeFromTrimeshAndCache(meshingStage, meshHash, triMesh);
                }

                //we are done here, call back to caller
                this.CompletedDelegate(phyShape);
            }
コード例 #7
0
ファイル: TerrainManager.cs プロジェクト: kf6kjg/halcyon
        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);
        }
コード例 #8
0
ファイル: TerrainManager.cs プロジェクト: kf6kjg/halcyon
        private Tuple<PhysX.RigidActor, PhysX.Shape, PhysX.TriangleMesh> GenerateGroundActorFromTrimeshAndMemoryStream(Tuple<PhysX.TriangleMesh, MemoryStream> trimeshData,
            int revision)
        {
            using (trimeshData.Item2) //free up the stream that gets passed in after its cached
            {
                PhysX.TriangleMeshGeometry triangleMeshShapeDesc = new PhysX.TriangleMeshGeometry(trimeshData.Item1);

                PhysX.RigidActor hfActor;
                PhysX.Shape shape;

                GenerateActorsFromTrimesh(triangleMeshShapeDesc, out hfActor, out shape);
                CacheTerrainMesh(trimeshData.Item2, revision);

                return new Tuple<PhysX.RigidActor, PhysX.Shape, PhysX.TriangleMesh>(hfActor, shape, trimeshData.Item1);
            }
        }
コード例 #9
0
        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);
                }
            }
        }
コード例 #10
0
ファイル: PhysicsShape.cs プロジェクト: kf6kjg/halcyon
        private void AssignGeom(PhysX.Geometry primitive, ShapeType shapeType)
        {
            switch (shapeType)
            {
                case ShapeType.PrimitiveBox:
                case ShapeType.PrimitiveSphere:
                    _primitiveGeom = primitive;
                    break;

                case ShapeType.TriMesh:
                    _triMesh = (PhysX.TriangleMeshGeometry)primitive;
                    break;
            }

            Complexity = 1;
        }
コード例 #11
0
ファイル: MeshingStage.cs プロジェクト: kf6kjg/halcyon
        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;
                }
            }
        }
コード例 #12
0
            private static PhysicsShape CreatePhysicsShapeFromTrimeshAndCache(MeshingStage meshingStage, ulong meshHash, PhysX.TriangleMeshGeometry triMesh)
            {
                PhysicsShape phyShape;

                phyShape = new PhysicsShape(triMesh, ShapeType.TriMesh, meshHash);
                phyShape.AddRef();

                //complex shapes are cached
                meshingStage.CacheShape(meshHash, phyShape, ShapeType.TriMesh);
                return(phyShape);
            }
コード例 #13
0
ファイル: Form1.cs プロジェクト: kf6kjg/halcyon
        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;
        }