//Exports the collision model as obj and reimports it into a new generated collision file. static void ReimportCollisonTPGC(string fileName) { var kcl = new KCLFile(fileName); Dictionary <int, ushort> materialIds = new Dictionary <int, ushort>(); for (int i = 0; i < kcl.Models[0].Prisms.Length; i++) { materialIds.Add(i, kcl.Models[0].Prisms[i].CollisionFlags); } var obj = kcl.CreateGenericModel(); //Export the kcl to a generic object file obj.Save($"{fileName}.obj"); var settings = new CollisionImportSettings() { //Octree Settings PaddingMax = new System.Numerics.Vector3(1, 1, 1), PaddingMin = new System.Numerics.Vector3(-1, -1, -1), MaxRootSize = 1024, MinRootSize = 128, MinCubeSize = 128, MaxTrianglesInCube = 50, //Model Settings PrismThickness = 1, }; var triangles = obj.ToTriangles(); kcl = new KCLFile(triangles, FileVersion.VersionGC, true, settings); for (int i = 0; i < kcl.Models[0].Prisms.Length; i++) { kcl.Models[0].Prisms[i].CollisionFlags = materialIds[i]; } kcl.Save($"{fileName}.new.kcl"); }
static async Task <KclResult> ImportObjectFile(MaterialSetForm form, ObjModel objectFile) { KclResult kcl = new KclResult(); await Task.Run(() => { var matDictionary = form.Result; var endianness = form.GetEndianness; var version = form.GetVersion; var preset = MaterialSetForm.ActiveGamePreset; //A small quick hack if (preset.GameTitle.Contains("Mario Galaxy")) { version = FileVersion.VersionGC; } var settings = new CollisionImportSettings() { SphereRadius = preset.SphereRadius, PrismThickness = preset.PrismThickness, PaddingMax = new Vector3(preset.PaddingMax), PaddingMin = new Vector3(preset.PaddingMin), MaxRootSize = preset.MaxRootSize, MinRootSize = preset.MinRootSize, MinCubeSize = preset.MinCubeSize, MaxTrianglesInCube = preset.MaxTrianglesInCube, }; foreach (var mesh in objectFile.Meshes) { for (int f = 0; f < mesh.Faces.Count; f++) { if (form.UseObjectMaterials) { if (matDictionary.ContainsKey(mesh.Faces[f].Material)) { mesh.Faces[f] = new ObjFace(mesh.Faces[f], matDictionary[mesh.Faces[f].Material]); } } else if (matDictionary.ContainsKey(mesh.Name)) { mesh.Faces[f] = new ObjFace(mesh.Faces[f], matDictionary[mesh.Name]); } } } var triangles = objectFile.ToTriangles(); //Important that we update attribute data after triangles are setup //Some attribute files require the triangles for configuring. form.UpdateMaterialAttributes(triangles, endianness); kcl.AttributeFile = form.MaterialAttributeFile; if (version != FileVersion.Version2 && triangles.Count > ushort.MaxValue / 4) { MessageBox.Show($"Version 1 KCL (Wii, GC, DS, 3DS) must be below {ushort.MaxValue / 4} polys! Poly Count: {triangles.Count}"); } else { kcl.KclFie = new KCLFile(triangles, version, endianness, settings); } }); return(kcl); }
static void ReimportCollison(string fileName, FileVersion version, bool bigEndian, CollisionImportSettings settings = null) { var kcl = new KCLFile(fileName); Console.WriteLine($"Smallest Cube Size {kcl.Models[0].GetMinCubeSize()}"); Console.WriteLine($"Max Tri {kcl.Models[0].GetMaxTriangleCount()}"); Console.WriteLine($"Padding Size {kcl.Models[0].GetCoordinatePadding()}"); Console.WriteLine($"Depth {kcl.Models[0].GetMaxOctreeDepth()}"); var obj = kcl.CreateGenericModel(); obj.Save($"{fileName}.obj"); var triangles = obj.ToTriangles(); kcl = new KCLFile(triangles, version, bigEndian, settings); kcl.Save($"{fileName}.new.kcl"); }
static void Main(string[] args) { var cmdArgs = new CommandLineArguments(); if (args.Length == 0 || args.Contains("-h")) { cmdArgs.PrintHelp(); return; } if (args.Contains("-adv")) { cmdArgs.PrintAdvanced(); return; } for (int i = 0; i < args.Length; i++) { if (args[i] == "-import") { cmdArgs.Import = true; } if (args[i] == "-export") { cmdArgs.Export = true; } if (args[i].EndsWith(".obj")) { cmdArgs.ObjectFilePath = args[i]; } if (args[i].EndsWith(".kcl")) { cmdArgs.CollisionFile = args[i]; } if (args[i] == "-meshAtt") { //2 required arguments afterwards cmdArgs.MeshesToAttributes.Add(args[i + 1], ushort.Parse(args[i + 2])); } if (args[i] == "-matAtt") { //2 required arguments afterwards cmdArgs.MaterialsToAttributes.Add(args[i + 1], ushort.Parse(args[i + 2])); } //Endianness if (args[i] == "-le") { cmdArgs.BigEndian = false; } //Platform if (args[i] == "-ds") { cmdArgs.IsDS = true; } if (args[i] == "-wii") { cmdArgs.IsWii = true; } if (args[i] == "-gcn") { cmdArgs.IsGCN = true; } if (args[i] == "-3ds") { cmdArgs.Is3DS = true; } //Octree and prism settings if (args[i] == "-padding") { cmdArgs.PaddingSize = float.Parse(args[i + 1]); } if (args[i] == "-max_root") { cmdArgs.MaxRootSize = int.Parse(args[i + 1]); } if (args[i] == "-min_root") { cmdArgs.MinRootSize = int.Parse(args[i + 1]); } if (args[i] == "-min_cube") { cmdArgs.MinCubeSize = int.Parse(args[i + 1]); } if (args[i] == "-thickness") { cmdArgs.PrismThickness = int.Parse(args[i + 1]); } if (args[i] == "-radius") { cmdArgs.SphereRadius = int.Parse(args[i + 1]); } } if (cmdArgs.Export && !string.IsNullOrEmpty(cmdArgs.CollisionFile)) { Console.WriteLine($"Exporting OBJ from KCL {cmdArgs.CollisionFile} obj {cmdArgs.ObjectFilePath}"); var kcl = new KCLFile(cmdArgs.CollisionFile); var obj = kcl.CreateGenericModel(); //Export the kcl to a generic object file obj.Save(cmdArgs.ObjectFilePath); } if (cmdArgs.Import && !string.IsNullOrEmpty(cmdArgs.ObjectFilePath)) { Console.WriteLine($"Importing OBJ to KCL {cmdArgs.ObjectFilePath}"); var settings = new CollisionImportSettings() { //Octree Settings PaddingMax = new System.Numerics.Vector3(cmdArgs.PaddingSize), PaddingMin = new System.Numerics.Vector3(-cmdArgs.PaddingSize), MaxRootSize = cmdArgs.MaxRootSize, MinRootSize = cmdArgs.MinRootSize, MinCubeSize = cmdArgs.MinCubeSize, MaxTrianglesInCube = cmdArgs.MaxTrianglesInCube, //Model Settings PrismThickness = cmdArgs.PrismThickness, SphereRadius = cmdArgs.SphereRadius, }; FileVersion version = FileVersion.Version2; if (cmdArgs.IsDS) { version = FileVersion.VersionDS; } if (cmdArgs.IsWii) { version = FileVersion.VersionWII; } if (cmdArgs.IsGCN) { version = FileVersion.VersionGC; } if (cmdArgs.Is3DS) { version = FileVersion.VersionWII; } if (cmdArgs.Is3DS) { cmdArgs.BigEndian = false; } var obj = new ObjModel(cmdArgs.ObjectFilePath); var kcl = new KCLFile(obj.ToTriangles(), version, cmdArgs.BigEndian, settings); kcl.Save(cmdArgs.CollisionFile); } }