public Mesh Clone() { Mesh result = new Mesh(); foreach (Triangle t in m_triangles) { result.Add(new Triangle(t.v1.Clone(), t.v2.Clone(), t.v3.Clone())); } return result; }
/// <summary> /// Creates a simple bounding box mesh for a complex input mesh /// </summary> /// <param name="meshIn"></param> /// <returns></returns> private static Mesh CreateBoundingBoxMesh(Mesh meshIn) { float minX = float.MaxValue; float maxX = float.MinValue; float minY = float.MaxValue; float maxY = float.MinValue; float minZ = float.MaxValue; float maxZ = float.MinValue; foreach (Vector3 v in meshIn.getVertexList()) { if (v.X < minX) minX = v.X; if (v.Y < minY) minY = v.Y; if (v.Z < minZ) minZ = v.Z; if (v.X > maxX) maxX = v.X; if (v.Y > maxY) maxY = v.Y; if (v.Z > maxZ) maxZ = v.Z; } return CreateSimpleBoxMesh(minX, maxX, minY, maxY, minZ, maxZ); }
/// <summary> /// Create a physics mesh from data that comes with the prim. The actual data used depends on the prim type. /// </summary> /// <param name="primName"></param> /// <param name="primShape"></param> /// <param name="size"></param> /// <param name="lod"></param> /// <returns></returns> private Mesh CreateMeshFromPrimMesher(string primName, PrimitiveBaseShape primShape, Vector3 size, float lod) { // m_log.DebugFormat( // "[MESH]: Creating physics proxy for {0}, shape {1}", // primName, (OpenMetaverse.SculptType)primShape.SculptType); List<Coord> coords; List<Face> faces; if (primShape.SculptEntry) { if (((OpenMetaverse.SculptType)primShape.SculptType) == SculptType.Mesh) { if (!useMeshiesPhysicsMesh) return null; if (!GenerateCoordsAndFacesFromPrimMeshData(primName, primShape, size, out coords, out faces)) return null; } else { if (!GenerateCoordsAndFacesFromPrimSculptData(primName, primShape, size, lod, out coords, out faces)) return null; } } else { if (!GenerateCoordsAndFacesFromPrimShapeData(primName, primShape, size, lod, out coords, out faces)) return null; } // Remove the reference to any JPEG2000 sculpt data so it can be GCed primShape.SculptData = Utils.EmptyBytes; int numCoords = coords.Count; int numFaces = faces.Count; // Create the list of vertices List<Vertex> vertices = new List<Vertex>(); for (int i = 0; i < numCoords; i++) { Coord c = coords[i]; vertices.Add(new Vertex(c.X, c.Y, c.Z)); } Mesh mesh = new Mesh(); // Add the corresponding triangles to the mesh for (int i = 0; i < numFaces; i++) { Face f = faces[i]; mesh.Add(new Triangle(vertices[f.v1], vertices[f.v2], vertices[f.v3])); } return mesh; }
/// <summary> /// creates a simple box mesh of the specified size. This mesh is of very low vertex count and may /// be useful as a backup proxy when level of detail is not needed or when more complex meshes fail /// for some reason /// </summary> /// <param name="minX"></param> /// <param name="maxX"></param> /// <param name="minY"></param> /// <param name="maxY"></param> /// <param name="minZ"></param> /// <param name="maxZ"></param> /// <returns></returns> private static Mesh CreateSimpleBoxMesh(float minX, float maxX, float minY, float maxY, float minZ, float maxZ) { Mesh box = new Mesh(); List<Vertex> vertices = new List<Vertex>(); // bottom vertices.Add(new Vertex(minX, maxY, minZ)); vertices.Add(new Vertex(maxX, maxY, minZ)); vertices.Add(new Vertex(maxX, minY, minZ)); vertices.Add(new Vertex(minX, minY, minZ)); box.Add(new Triangle(vertices[0], vertices[1], vertices[2])); box.Add(new Triangle(vertices[0], vertices[2], vertices[3])); // top vertices.Add(new Vertex(maxX, maxY, maxZ)); vertices.Add(new Vertex(minX, maxY, maxZ)); vertices.Add(new Vertex(minX, minY, maxZ)); vertices.Add(new Vertex(maxX, minY, maxZ)); box.Add(new Triangle(vertices[4], vertices[5], vertices[6])); box.Add(new Triangle(vertices[4], vertices[6], vertices[7])); // sides box.Add(new Triangle(vertices[5], vertices[0], vertices[3])); box.Add(new Triangle(vertices[5], vertices[3], vertices[6])); box.Add(new Triangle(vertices[1], vertices[0], vertices[5])); box.Add(new Triangle(vertices[1], vertices[5], vertices[4])); box.Add(new Triangle(vertices[7], vertices[1], vertices[4])); box.Add(new Triangle(vertices[7], vertices[2], vertices[1])); box.Add(new Triangle(vertices[3], vertices[2], vertices[7])); box.Add(new Triangle(vertices[3], vertices[7], vertices[6])); return box; }