// Create from NUD public void CreateFromNUD(NUD n) { //Alrighty............................. int meshcount = Nodes.Count; // First transfer over the mesh polygons? int i = 0; List <BCH_Mesh> Meshes = new List <BCH_Mesh>(); List <Vertex> Verts = new List <Vertex>(); Console.WriteLine(n.Nodes.Count + " " + n.meshes.Count); foreach (NUD.Mesh nudmesh in n.meshes) { BCH_Mesh mesh = new BCH_Mesh(); mesh.Text = Nodes[i].Text; //nudmesh.Text;// Console.WriteLine(nudmesh.Text); mesh.MaterialIndex = ((BCH_Mesh)Nodes[i]).MaterialIndex; i++; Meshes.Add(mesh); foreach (NUD.Polygon nudpoly in nudmesh.Nodes) { BCH_PolyGroup pg = new BCH_PolyGroup(); pg.Text = "Polygroup"; mesh.Nodes.Add(pg); pg.Faces = new int[nudpoly.display.Length]; for (int k = 0; k < nudpoly.display.Length; k++) { pg.Faces[k] = nudpoly.display[k] + Verts.Count; } List <int> boneList = new List <int>(); foreach (NUD.dVertex v in nudpoly.vertdata) { Vertex vn = new Vertex(); vn.pos = v.pos; vn.nrm = v.nrm; vn.tx = v.uv; vn.col = v.col; vn.weight = v.weight.Xy; if (!boneList.Contains((int)v.node.X)) { boneList.Add((int)v.node.X); } if (!boneList.Contains((int)v.node.Y)) { boneList.Add((int)v.node.Y); } vn.bone = new Vector2(boneList.IndexOf((int)v.node.X), boneList.IndexOf((int)v.node.Y)); vn.bone = v.node.Xy; Verts.Add(vn); } pg.BoneList = boneList.ToArray(); } } //Fill out blank meshes while (Meshes.Count < meshcount) { BCH_Mesh mesh = new BCH_Mesh(); mesh.Text = Nodes[i].Text; mesh.MaterialIndex = ((BCH_Mesh)Nodes[i]).MaterialIndex; mesh.Nodes.Add(new BCH_PolyGroup() { Faces = new int[] { 0, 0, 0 }, BoneList = new int[] { 0 } }); Verts.Add(new Vertex()); Meshes.Add(mesh); i++; } Nodes.Clear(); Nodes.AddRange(Meshes.ToArray()); Vertices = Verts.ToArray(); }
public void OpenMBN(FileData f) { f.Endian = Endianness.Little; f.seek(0); int format = f.readShort(); f.skip(2);//0xFFFF int flags = f.readInt(); int mode = f.readInt(); int meshCount = f.readInt(); int length = 0; if (mode == 1) { //One Attribute int count = f.readInt(); for (int i = 0; i < count; i++) { VertexAttribute a = new VertexAttribute(); a.Read(f); Attributes.Add(a); } length = f.readInt(); } // Get Mesh Nodes /*List<BCH_Mesh> meshes = new List<BCH_Mesh>(); * foreach(BCH_Mesh m in Nodes) * { * meshes.Add(m); * foreach (BCH_Mesh m2 in m.Nodes) * meshes.Add(m); * }*/ for (int i = 0; i < meshCount; i++) { BCH_Mesh m = (BCH_Mesh)Nodes[i]; int polyCount = f.readInt(); for (int j = 0; j < polyCount; j++) { BCH_PolyGroup pg = new BCH_PolyGroup(); m.Nodes.Add(pg); int nodeCount = f.readInt(); int[] nodeList = new int[nodeCount]; pg.BoneList = (nodeList); for (int k = 0; k < nodeCount; k++) { nodeList[k] = f.readInt(); } pg.Count = (f.readInt()); if ((flags & 2) > 0) { f.readInt(); } } } if (format != 4) { f.align(32); } int stride = 0; foreach (VertexAttribute a in Attributes) { stride += _3DSGPU.getTypeSize(a.format) * _3DSGPU.getFormatSize(a.type); } // Vertex Bank Vertices = new Vertex[length / (stride + stride % 2)]; for (int vi = 0; vi < Vertices.Length; vi++) { Vertex v = new Vertex(); foreach (VertexAttribute a in Attributes) { //f.align(2); a.ReadVertex(f, ref v); } Vertices[vi] = v; } f.align(32); for (int i = 0; i < meshCount; i++) { BCH_Mesh m = (BCH_Mesh)Nodes[i]; int pi = 0; foreach (BCH_PolyGroup pg in m.Nodes) { pg.Text = "Polygroup_" + pi++; pg.Faces = new int[pg.Count]; for (int k = 0; k < pg.Count; k++) { pg.Faces[k] = f.readShort(); } f.align(32); } } }