Ejemplo n.º 1
0
        //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);
        }
Ejemplo n.º 3
0
        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");
        }
Ejemplo n.º 4
0
        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);
            }
        }