/// <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, float lod, bool convex) { // 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, out coords, out faces, convex)) return null; } else { if (!GenerateCoordsAndFacesFromPrimSculptData(primName, primShape, lod, out coords, out faces)) return null; } } else { if (!GenerateCoordsAndFacesFromPrimShapeData(primName, primShape, lod, out coords, out faces)) return null; } int numCoords = coords.Count; int numFaces = faces.Count; 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(coords[f.v1].X, coords[f.v1].Y, coords[f.v1].Z, coords[f.v2].X, coords[f.v2].Y, coords[f.v2].Z, coords[f.v3].X, coords[f.v3].Y, coords[f.v3].Z)); } coords.Clear(); faces.Clear(); if(mesh.numberVertices() < 3 || mesh.numberTriangles() < 1) { m_log.ErrorFormat("[MESH]: invalid degenerated mesh for prim " + primName + " ignored"); return null; } primShape.SculptData = Utils.EmptyBytes; return mesh; }