/// <summary> /// Generates a basic mesh structure from a primitive /// A 'SimpleMesh' is just the prim's overall shape with no material information. /// </summary> /// <param name="prim">Primitive to generate the mesh from</param> /// <param name="lod">Level of detail to generate the mesh at</param> /// <returns>The generated mesh or null on failure</returns> public OMVR.SimpleMesh GenerateSimpleMesh(OMV.Primitive prim, OMVR.DetailLevel lod) { LibreMetaverse.PrimMesher.PrimMesh newPrim = GeneratePrimMesh(prim, lod, false); if (newPrim == null) { return(null); } SimpleMesh mesh = new SimpleMesh { Path = new Path(), Prim = prim, Profile = new Profile(), Vertices = new List <Vertex>(newPrim.coords.Count) }; foreach (Coord c in newPrim.coords) { mesh.Vertices.Add(new Vertex { Position = new Vector3(c.X, c.Y, c.Z) }); } mesh.Indices = new List <ushort>(newPrim.faces.Count * 3); foreach (LibreMetaverse.PrimMesher.Face face in newPrim.faces) { mesh.Indices.Add((ushort)face.v1); mesh.Indices.Add((ushort)face.v2); mesh.Indices.Add((ushort)face.v3); } return(mesh); }
/// <summary> /// Create a faceted mesh from prim shape parameters. /// Generates a a series of faces, each face containing a mesh and /// material metadata. /// A prim will turn into multiple faces with each being independent /// meshes and each having different material information. /// </summary> /// <param name="prim">Primitive to generate the mesh from</param> /// <param name="lod">Level of detail to generate the mesh at</param> /// <returns>The generated mesh</returns > public FacetedMesh GenerateFacetedMesh(Primitive prim, DetailLevel lod) { bool isSphere = ((OMV.ProfileCurve)(prim.PrimData.profileCurve & 0x07) == OMV.ProfileCurve.HalfCircle); LibreMetaverse.PrimMesher.PrimMesh newPrim = GeneratePrimMesh(prim, lod, true); if (newPrim == null) { return(null); } // copy the vertex information into OMVR.IRendering structures var omvrmesh = new OMVR.FacetedMesh { Faces = new List <OMVR.Face>(), Prim = prim, Profile = new OMVR.Profile { Faces = new List <OMVR.ProfileFace>(), Positions = new List <OMV.Vector3>() }, Path = new OMVR.Path { Points = new List <OMVR.PathPoint>() } }; var indexer = newPrim.GetVertexIndexer(); for (int i = 0; i < indexer.numPrimFaces; i++) { OMVR.Face oface = new OMVR.Face { Vertices = new List <OMVR.Vertex>(), Indices = new List <ushort>(), TextureFace = prim.Textures.GetFace((uint)i) }; for (int j = 0; j < indexer.viewerVertices[i].Count; j++) { var vert = new OMVR.Vertex(); var m = indexer.viewerVertices[i][j]; vert.Position = new Vector3(m.v.X, m.v.Y, m.v.Z); vert.Normal = new Vector3(m.n.X, m.n.Y, m.n.Z); vert.TexCoord = new OMV.Vector2(m.uv.U, 1.0f - m.uv.V); oface.Vertices.Add(vert); } for (int j = 0; j < indexer.viewerPolygons[i].Count; j++) { var p = indexer.viewerPolygons[i][j]; // Skip "degenerate faces" where the same vertex appears twice in the same tri if (p.v1 == p.v2 || p.v1 == p.v2 || p.v2 == p.v3) { continue; } oface.Indices.Add((ushort)p.v1); oface.Indices.Add((ushort)p.v2); oface.Indices.Add((ushort)p.v3); } omvrmesh.Faces.Add(oface); } return(omvrmesh); }