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