diff --git a/.vs/Switch_Toolbox/v15/.suo b/.vs/Switch_Toolbox/v15/.suo index 574d2cdf..c28015c3 100644 Binary files a/.vs/Switch_Toolbox/v15/.suo and b/.vs/Switch_Toolbox/v15/.suo differ diff --git a/.vs/Switch_Toolbox/v15/Server/sqlite3/storage.ide b/.vs/Switch_Toolbox/v15/Server/sqlite3/storage.ide index ff4a38b7..cf871632 100644 Binary files a/.vs/Switch_Toolbox/v15/Server/sqlite3/storage.ide and b/.vs/Switch_Toolbox/v15/Server/sqlite3/storage.ide differ diff --git a/.vs/Switch_Toolbox/v15/Server/sqlite3/storage.ide-wal b/.vs/Switch_Toolbox/v15/Server/sqlite3/storage.ide-wal index 46e82193..b23a573c 100644 Binary files a/.vs/Switch_Toolbox/v15/Server/sqlite3/storage.ide-wal and b/.vs/Switch_Toolbox/v15/Server/sqlite3/storage.ide-wal differ diff --git a/Switch_FileFormatsMain/FileFormats/BFRES/Bfres Structs/SubFiles/FMDL.cs b/Switch_FileFormatsMain/FileFormats/BFRES/Bfres Structs/SubFiles/FMDL.cs index 3c6d26dd..3e4af93c 100644 --- a/Switch_FileFormatsMain/FileFormats/BFRES/Bfres Structs/SubFiles/FMDL.cs +++ b/Switch_FileFormatsMain/FileFormats/BFRES/Bfres Structs/SubFiles/FMDL.cs @@ -452,32 +452,39 @@ namespace Bfres.Structs else Model.Export(FileName, GetResFile()); break; + case ".obj": + OBJ.ExportModel(FileName, this, GetTextures()); + break; default: - - List textures = new List(); - foreach (var mat in materials) - { - foreach (var texref in mat.Value.TextureMaps) - { - foreach (var bntx in PluginRuntime.bntxContainers) - { - if (bntx.Textures.ContainsKey(texref.Name)) - textures.Add(bntx.Textures[texref.Name]); - } - foreach (var ftexCont in PluginRuntime.ftexContainers) - { - if (ftexCont.ResourceNodes.ContainsKey(texref.Name)) - textures.Add((FTEX)ftexCont.ResourceNodes[texref.Name]); - } - } - } - AssimpSaver assimp = new AssimpSaver(); - assimp.SaveFromModel(this, FileName, textures, Skeleton, Skeleton.Node_Array.ToList()); + assimp.SaveFromModel(this, FileName, GetTextures(), Skeleton, Skeleton.Node_Array.ToList()); break; } } + private List GetTextures() + { + List textures = new List(); + foreach (var mat in materials) + { + foreach (var texref in mat.Value.TextureMaps) + { + foreach (var bntx in PluginRuntime.bntxContainers) + { + if (bntx.Textures.ContainsKey(texref.Name)) + textures.Add(bntx.Textures[texref.Name]); + } + foreach (var ftexCont in PluginRuntime.ftexContainers) + { + if (ftexCont.ResourceNodes.ContainsKey(texref.Name)) + textures.Add((FTEX)ftexCont.ResourceNodes[texref.Name]); + } + } + } + + return textures; + } + public override void Replace(string FileName) { AddOjects(FileName, GetResFile(), GetResFileU()); } diff --git a/Switch_FileFormatsMain/obj/Release/DesignTimeResolveAssemblyReferences.cache b/Switch_FileFormatsMain/obj/Release/DesignTimeResolveAssemblyReferences.cache index 7a6abf52..64d48c37 100644 Binary files a/Switch_FileFormatsMain/obj/Release/DesignTimeResolveAssemblyReferences.cache and b/Switch_FileFormatsMain/obj/Release/DesignTimeResolveAssemblyReferences.cache differ diff --git a/Switch_FileFormatsMain/obj/Release/FirstPlugin.Plg.dll b/Switch_FileFormatsMain/obj/Release/FirstPlugin.Plg.dll index ee064b65..a76f5a5d 100644 Binary files a/Switch_FileFormatsMain/obj/Release/FirstPlugin.Plg.dll and b/Switch_FileFormatsMain/obj/Release/FirstPlugin.Plg.dll differ diff --git a/Switch_FileFormatsMain/obj/Release/FirstPlugin.Plg.pdb b/Switch_FileFormatsMain/obj/Release/FirstPlugin.Plg.pdb index 3405f27c..08bbd58c 100644 Binary files a/Switch_FileFormatsMain/obj/Release/FirstPlugin.Plg.pdb and b/Switch_FileFormatsMain/obj/Release/FirstPlugin.Plg.pdb differ diff --git a/Switch_FileFormatsMain/obj/Release/Switch_FileFormatsMain.csprojAssemblyReference.cache b/Switch_FileFormatsMain/obj/Release/Switch_FileFormatsMain.csprojAssemblyReference.cache index 5f1343c1..ac1ea35f 100644 Binary files a/Switch_FileFormatsMain/obj/Release/Switch_FileFormatsMain.csprojAssemblyReference.cache and b/Switch_FileFormatsMain/obj/Release/Switch_FileFormatsMain.csprojAssemblyReference.cache differ diff --git a/Switch_Toolbox_Library/FileFormats/OBJ.cs b/Switch_Toolbox_Library/FileFormats/OBJ.cs new file mode 100644 index 00000000..6230b99f --- /dev/null +++ b/Switch_Toolbox_Library/FileFormats/OBJ.cs @@ -0,0 +1,99 @@ +using System; +using System.Collections.Generic; +using System.Text; +using System.IO; +using OpenTK; + +namespace Switch_Toolbox.Library +{ + public class OBJ + { + public static void ExportModel(string FileName, STGenericModel Model, List Textures) + { + string fileNoExt = Path.GetFileNameWithoutExtension(FileName); + + //Write model + StringBuilder writer = new StringBuilder(); + SaveMeshes(writer, Model, $"{fileNoExt}.mtl"); + File.WriteAllText(FileName, writer.ToString()); + + //Write materials + StringBuilder writerMtl = new StringBuilder(); + SaveMaterials(writer, Model); + File.WriteAllText($"{fileNoExt}.mtl", writerMtl.ToString()); + } + + private static void SaveMeshes(StringBuilder writer, STGenericModel Model, string MtlName) + { + writer.AppendLine($"mtllib {MtlName}"); + + int VertexID = 1; + foreach (STGenericObject mesh in Model.Nodes[0].Nodes) + { + writer.AppendLine($"o {mesh.Text}"); + writer.AppendLine($"g {mesh.Text}"); + + foreach (var v in mesh.vertices) + { + writer.AppendLine($"v {v.pos.X} {v.pos.Y} {v.pos.Z}"); + writer.AppendLine($"vn {v.nrm.X} {v.nrm.Y} {v.nrm.Z}"); + writer.AppendLine($"vt {v.uv0.X} {v.uv0.Y}"); + } + var mat = GetMaterial(mesh.MaterialIndex, Model); + + if (mat != null) + writer.AppendLine($"usemtl {mat.Text}"); + + for (int i = 0; i < mesh.faces.Count; i += 3) + { + int FaceInd0 = VertexID + mesh.faces[i]; + int FaceInd1 = VertexID + mesh.faces[i + 1]; + int FaceInd2 = VertexID + mesh.faces[i + 2]; + + writer.AppendLine($"f {FaceInd0}/{FaceInd0}/{FaceInd0}" + + $" {FaceInd1}/{FaceInd1}/{FaceInd1}" + + $" {FaceInd2}/{FaceInd2}/{FaceInd2}"); + } + } + } + + private static STGenericMaterial GetMaterial(int MaterialIndex, STGenericModel Model) + { + if (MaterialIndex < Model.Nodes[1].Nodes.Count) + return (STGenericMaterial)Model.Nodes[1].Nodes[MaterialIndex]; + else + return null; + } + + public static float Ns = -3.921569f; + public static Vector3 Ka = new Vector3(1.000000f, 1.000000f, 1.000000f); + public static Vector3 Kd = new Vector3(0.640000f, 0.640000f, 0.640000f); + public static Vector3 Ks = new Vector3(0.500000f, 0.500000f, 0.500000f); + public static Vector3 Ke = new Vector3(0.000000f, 0.000000f, 0.000000f); + public static float Ni = -1f; + public static float d = -1f; + public static float illum = 2; + + private static void SaveMaterials(StringBuilder writer, STGenericModel Model) + { + foreach (STGenericMaterial mat in Model.Nodes[1].Nodes) + { + writer.AppendLine($"newmtl {mat.Text}"); + writer.AppendLine($"Ns {Ns}"); + writer.AppendLine($"Ka {Ka}"); + writer.AppendLine($"Kd {Kd}"); + writer.AppendLine($"Ks {Ks}"); + writer.AppendLine($"Ke {Ke}"); + writer.AppendLine($"Ni {Ni}"); + writer.AppendLine($"d {d}"); + writer.AppendLine($"illum {illum}"); + + foreach (var tex in mat.TextureMaps) + { + if (tex.Type == STGenericMatTexture.TextureType.Diffuse) + writer.AppendLine($"map_Kd {tex.Name}.png"); + } + } + } + } +} diff --git a/Switch_Toolbox_Library/Switch_Toolbox_Library.csproj b/Switch_Toolbox_Library/Switch_Toolbox_Library.csproj index 3e58673f..151ab931 100644 --- a/Switch_Toolbox_Library/Switch_Toolbox_Library.csproj +++ b/Switch_Toolbox_Library/Switch_Toolbox_Library.csproj @@ -204,6 +204,7 @@ + Form