public void LoadCollisionValues(MarioKart.MK7.KCL kcl, KCL.KCLRendering renderer)
        {
            Render = renderer;

            List <CollisionMaterial> Materials = new List <CollisionMaterial>();

            foreach (var model in kcl.Models)
            {
                foreach (var plane in model.Planes)
                {
                    string type = "Unknown";

                    switch (GameMaterialSet)
                    {
                    case KCL.GameSet.MarioKart8D:
                        type = ((KCL.CollisionType_MK8D)plane.CollisionType).ToString();
                        break;

                    case KCL.GameSet.MarioOdyssey:
                        type = ((KCL.CollisionType_MarioOdssey)plane.CollisionType).ToString();
                        break;
                    }

                    Materials.Add(new CollisionMaterial()
                    {
                        ID   = plane.CollisionType,
                        Type = type,
                    });
                }

                stListView1.SetObjects(Materials);
            }

            stListView1.SetTheme();
        }
示例#2
0
        public static void ExportCollisionFromObject(string ObjectDataFolder)
        {
            var opn = new OpenFileDialog()
            {
                InitialDirectory = Directory.Exists(ObjectDataFolder) ? ObjectDataFolder : null,
                Filter           = "szs file | *.szs",
                Title            = "Select an Object which has a collision model"
            };

            if (opn.ShowDialog() != DialogResult.OK)
            {
                return;
            }
            var szs = SARC.UnpackRam(YAZ0.Decompress(opn.FileName));

            foreach (string name in szs.Keys)
            {
                if (name.EndsWith(".kcl"))
                {
                    List <Color> typeColors = null;

                    string attributeFileName = Path.GetFileNameWithoutExtension(name) + "Attribute.byml";
                    if (szs.ContainsKey(attributeFileName))
                    {
                        typeColors = GetKCLColors(szs[attributeFileName]);
                    }

                    var sav = new SaveFileDialog()
                    {
                        FileName = name + ".obj",
                        Filter   = "obj file|*.obj"
                    };
                    if (sav.ShowDialog() != DialogResult.OK)
                    {
                        return;
                    }

                    var mod = new MarioKart.MK7.KCL(szs[name]).ToOBJ().toWritableObj();

                    if (typeColors != null)
                    {
                        for (int i = 0; i < mod.Materials.Count; i++)
                        {
                            if (i >= typeColors.Count)
                            {
                                break;
                            }
                            mod.Materials[i].Colors.normal.X = typeColors[i].R / 255f;
                            mod.Materials[i].Colors.normal.Y = typeColors[i].G / 255f;
                            mod.Materials[i].Colors.normal.Z = typeColors[i].B / 255f;
                        }
                    }

                    mod.WriteObj(sav.FileName);
                }
            }
        }
示例#3
0
 public void Read(byte[] file_data)
 {
     try
     {
         kcl = new MarioKart.MK7.KCL(file_data, Syroot.BinaryData.ByteOrder.LittleEndian);
     }
     catch
     {
         kcl = new MarioKart.MK7.KCL(file_data, Syroot.BinaryData.ByteOrder.BigEndian);
     }
     Read(kcl);
     Renderer.UpdateVertexData();
 }
示例#4
0
        private void Read(byte[] file_data)
        {
            data = file_data;

            try
            {
                Endianness = Syroot.BinaryData.ByteOrder.LittleEndian;
                kcl        = new MarioKart.MK7.KCL(file_data, Syroot.BinaryData.ByteOrder.LittleEndian);
            }
            catch
            {
                Endianness = Syroot.BinaryData.ByteOrder.BigEndian;
                kcl        = new MarioKart.MK7.KCL(file_data, Syroot.BinaryData.ByteOrder.BigEndian);
            }
            Read(kcl);
        }
示例#5
0
        public void Read(MarioKart.MK7.KCL kcl)
        {
            Nodes.Clear();
            Renderer.models.Clear();

            int CurModelIndx = 0;

            foreach (MarioKart.MK7.KCL.KCLModel mdl in kcl.Models)
            {
                KCLModel kclmodel = new KCLModel();

                kclmodel.Text = "Model " + CurModelIndx;

                int ft = 0;
                foreach (var plane in mdl.Planes)
                {
                    var triangle = mdl.GetTriangle(plane);
                    var normal   = triangle.Normal;
                    var pointA   = triangle.PointA;
                    var pointB   = triangle.PointB;
                    var pointC   = triangle.PointC;

                    Vertex vtx  = new Vertex();
                    Vertex vtx2 = new Vertex();
                    Vertex vtx3 = new Vertex();

                    vtx.pos  = new Vector3(Vec3D_To_Vec3(pointA));
                    vtx2.pos = new Vector3(Vec3D_To_Vec3(pointB));
                    vtx3.pos = new Vector3(Vec3D_To_Vec3(pointC));
                    vtx.nrm  = new Vector3(Vec3D_To_Vec3(normal));
                    vtx2.nrm = new Vector3(Vec3D_To_Vec3(normal));
                    vtx3.nrm = new Vector3(Vec3D_To_Vec3(normal));

                    KCLModel.Face face = new KCLModel.Face();
                    face.Text         = triangle.Collision.ToString();
                    face.MaterialFlag = triangle.Collision;

                    var     col      = MarioKart.MK7.KCLColors.GetMaterialColor(plane.CollisionType);
                    Vector3 ColorSet = new Vector3(col.R, col.G, col.B);

                    vtx.col  = new Vector4(ColorSet, 1);
                    vtx2.col = new Vector4(ColorSet, 1);
                    vtx3.col = new Vector4(ColorSet, 1);

                    kclmodel.faces.Add(ft);
                    kclmodel.faces.Add(ft + 1);
                    kclmodel.faces.Add(ft + 2);

                    ft += 3;

                    kclmodel.vertices.Add(vtx);
                    kclmodel.vertices.Add(vtx2);
                    kclmodel.vertices.Add(vtx3);
                }

                Renderer.models.Add(kclmodel);
                Nodes.Add(kclmodel);

                CurModelIndx++;
            }
        }
示例#6
0
        private void Read(MarioKart.MK7.KCL kcl)
        {
            Vector3 min = new Vector3();
            Vector3 max = new Vector3();

            Nodes.Clear();
            Renderer.OctreeNodes.Clear();
            Renderer.models.Clear();
            Renderer.KclFile = kcl;

            TreeNode modelTree = new TreeNode("Model Octree");

            LoadModelTree(modelTree, kcl.GlobalHeader.ModelOctrees);
            foreach (var node in modelTree.Nodes)
            {
                Renderer.OctreeNodes.Add((OctreeNode)node);
            }
            Nodes.Add(modelTree);

            int CurModelIndx = 0;

            foreach (MarioKart.MK7.KCL.KCLModel mdl in kcl.Models)
            {
                KCLModel kclmodel = new KCLModel();

                kclmodel.Text = "Model " + CurModelIndx;

                int ft = 0;
                foreach (var plane in mdl.Planes)
                {
                    var triangle = mdl.GetTriangle(plane);
                    var normal   = triangle.Normal;
                    var pointA   = triangle.PointA;
                    var pointB   = triangle.PointB;
                    var pointC   = triangle.PointC;

                    Vertex vtx  = new Vertex();
                    Vertex vtx2 = new Vertex();
                    Vertex vtx3 = new Vertex();

                    vtx.pos  = new Vector3(Vec3D_To_Vec3(pointA));
                    vtx2.pos = new Vector3(Vec3D_To_Vec3(pointB));
                    vtx3.pos = new Vector3(Vec3D_To_Vec3(pointC));
                    vtx.nrm  = new Vector3(Vec3D_To_Vec3(normal));
                    vtx2.nrm = new Vector3(Vec3D_To_Vec3(normal));
                    vtx3.nrm = new Vector3(Vec3D_To_Vec3(normal));

                    KCLModel.Face face = new KCLModel.Face();
                    face.Text         = triangle.Collision.ToString();
                    face.MaterialFlag = triangle.Collision;

                    var     col      = MarioKart.MK7.KCLColors.GetMaterialColor(plane.CollisionType);
                    Vector3 ColorSet = new Vector3(col.R, col.G, col.B);

                    vtx.col  = new Vector4(ColorSet, 1);
                    vtx2.col = new Vector4(ColorSet, 1);
                    vtx3.col = new Vector4(ColorSet, 1);

                    kclmodel.faces.Add(ft);
                    kclmodel.faces.Add(ft + 1);
                    kclmodel.faces.Add(ft + 2);

                    ft += 3;

                    kclmodel.vertices.Add(vtx);
                    kclmodel.vertices.Add(vtx2);
                    kclmodel.vertices.Add(vtx3);

                    #region FindMaxMin
                    if (triangle.PointA.X < min.X)
                    {
                        min.X = (float)triangle.PointA.X;
                    }
                    if (triangle.PointA.Y < min.Y)
                    {
                        min.Y = (float)triangle.PointA.Y;
                    }
                    if (triangle.PointA.Z < min.Z)
                    {
                        min.Z = (float)triangle.PointA.Z;
                    }
                    if (triangle.PointA.X > max.X)
                    {
                        max.X = (float)triangle.PointA.X;
                    }
                    if (triangle.PointA.Y > max.Y)
                    {
                        max.Y = (float)triangle.PointA.Y;
                    }
                    if (triangle.PointA.Z > max.Z)
                    {
                        max.Z = (float)triangle.PointA.Z;
                    }

                    if (triangle.PointB.X < min.X)
                    {
                        min.X = (float)triangle.PointB.X;
                    }
                    if (triangle.PointB.Y < min.Y)
                    {
                        min.Y = (float)triangle.PointB.Y;
                    }
                    if (triangle.PointB.Z < min.Z)
                    {
                        min.Z = (float)triangle.PointB.Z;
                    }
                    if (triangle.PointB.X > max.X)
                    {
                        max.X = (float)triangle.PointB.X;
                    }
                    if (triangle.PointB.Y > max.Y)
                    {
                        max.Y = (float)triangle.PointB.Y;
                    }
                    if (triangle.PointB.Z > max.Z)
                    {
                        max.Z = (float)triangle.PointB.Z;
                    }

                    if (triangle.PointC.X < min.X)
                    {
                        min.X = (float)triangle.PointC.X;
                    }
                    if (triangle.PointC.Y < min.Y)
                    {
                        min.Y = (float)triangle.PointC.Y;
                    }
                    if (triangle.PointC.Z < min.Z)
                    {
                        min.Z = (float)triangle.PointC.Z;
                    }
                    if (triangle.PointC.X > max.X)
                    {
                        max.X = (float)triangle.PointC.X;
                    }
                    if (triangle.PointC.Y > max.Y)
                    {
                        max.Y = (float)triangle.PointC.Y;
                    }
                    if (triangle.PointC.Z > max.Z)
                    {
                        max.Z = (float)triangle.PointC.Z;
                    }
                    #endregion
                }

                Renderer.Max = max;
                Renderer.Min = min;
                Renderer.models.Add(kclmodel);
                Nodes.Add(kclmodel);

                CurModelIndx++;
            }
        }