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