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); }
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; } }
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)); }
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); } } }