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(); }
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); } } }
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(); }
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); }
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++; } }
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++; } }