string GenerateWsModel(string modelFilePath, bool onlyVisible, out bool wsModelGeneratedPerfectly) { wsModelGeneratedPerfectly = true; var materialPacks = _packFileService.FindAllWithExtentionIncludePaths(".material"); materialPacks = materialPacks.Where(x => x.Item2.Name.Contains(".xml.material")).ToList(); List <WsModelMaterial> materialList = new List <WsModelMaterial>(); foreach (var materialPack in materialPacks) { try { materialList.Add(new WsModelMaterial(materialPack.Item2, materialPack.Item1)); } catch (Exception e) { _logger.Here().Error("Error loading material for wsmodel generation - " + e.ToString()); } } var sb = new StringBuilder(); sb.Append("<model version=\"1\">\n"); sb.Append($"\t<geometry>{modelFilePath}</geometry>\n"); sb.Append("\t\t<materials>\n"); var lodNodes = _editableMeshNode.GetLodNodes(); for (int lodIndex = 0; lodIndex < lodNodes.Count; lodIndex++) { var meshes = _editableMeshNode.GetMeshesInLod(lodIndex, onlyVisible); for (int meshIndex = 0; meshIndex < meshes.Count; meshIndex++) { var materialFile = CreateKnownMaterial(meshes[meshIndex], materialList); if (materialFile == null) { materialFile = UnknownMaterial(meshes[meshIndex]); wsModelGeneratedPerfectly = false; } sb.Append($"\t\t\t<material part_index=\"{meshIndex}\" lod_index=\"{lodIndex}\">"); sb.Append(materialFile); sb.Append("</material>\n"); } } sb.Append("\t</materials>\n"); sb.Append("</model>\n"); return(sb.ToString()); }