public void Export(string Filename) { FileName = Filename; MeshedPrims.Clear(); if (string.IsNullOrEmpty(FileName)) { return; } WorkPool.QueueUserWorkItem(sync => { if (ExportTextures) { SaveTextures(); } for (int i = 0; i < Prims.Count; i++) { if (!CanExport(Prims[i])) { continue; } FacetedMesh mesh = MeshPrim(Prims[i]); if (mesh == null) { continue; } for (int j = 0; j < mesh.Faces.Count; j++) { Face face = mesh.Faces[j]; Primitive.TextureEntryFace teFace = mesh.Faces[j].TextureFace; if (teFace == null) { continue; } // Sculpt UV vertically flipped compared to prims. Flip back if (Prims[i].Sculpt != null && Prims[i].Sculpt.SculptTexture != UUID.Zero && Prims[i].Sculpt.Type != SculptType.Mesh) { teFace = (Primitive.TextureEntryFace)teFace.Clone(); teFace.RepeatV *= -1; } // Texture transform for this face Mesher.TransformTexCoords(face.Vertices, face.Center, teFace, Prims[i].Scale); } MeshedPrims.Add(mesh); } string msg; if (MeshedPrims.Count == 0) { msg = string.Format("Can export 0 out of {0} prims.{1}{1}Skipping.", Prims.Count, Environment.NewLine); } else { msg = string.Format("Exported {0} out of {1} objects to{2}{2}{3}", MeshedPrims.Count, Prims.Count, Environment.NewLine, FileName); } GenerateCollada(); File.WriteAllText(FileName, DocToString(Doc)); OnProgress(msg); }); }